📄 amp506.c
字号:
/******************** (C) COPYRIGHT 2008 FUDANTIANXIN********************
* File Name : AMP506.c
* Author : 上海复旦天欣科教仪器有限公司 周春明 ZCM
* Version : V1.0
* Date : 11/5/2008
* Description : FD-STM32-B实验箱:LCD(AM-320240N1TMQW-W0H)
********************************************************************************
* 接口:
* 使用STM32的FSMC的BANK1的第四部分,即外部地址为0X6C000000
* A0接LCD的RS引脚,控制数据和命令
*******************************************************************************/
//#include "stm32f10x_lib.h"
#include "AMP506.h"
#include "AMP506_font.h"
#include "main.h"
/****************************************************************************
* 名 称:void AMP506_Initializtion()
* 功 能:初始化 AMP506 控制器
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:AMP506_Initializtion();
****************************************************************************/
void AMP506_Initializtion(void)
{
/* 配置LCD的控制引脚 --------------------------------------------*/
AMP506_CtrlLinesConfig();
/* 配置FSMC的并行接口 -------------------------------------*/
AMP506_FSMCConfig();
AMP506_Delay(100);
/* Start Initial Sequence ----------------------------------------------------*/
AMP506_Command_Write(R64, 0x12); /*[7:6]保留
[5] PLL control pins to select out frequency range
0: 20MHz ~ 100MHz 1: 100MHz ~ 300MHz
[4:3] Reserved
[2:1] Output Driving Capability
00: 4mA 01: 8mA 10: 12mA 11: 16mA
[0] Output slew rate
0: Fast 1: Slow*/
AMP506_Command_Write(R65, 0x01); //Set PLL=40Mhz * (0x42) / (0x41)
AMP506_Command_Write(R66, 0x01); /*0x41 [7:6] Reserved [5:0] PLL Programmable
pre-divider, 6bit(1~63)
0x42 [7:6] Reserved [5:0] PLL Programmable loop
divider, 6bit(1~63)*/
AMP506_Command_Write(R0, 0x00);//REG[0:7]为配置窗口大小
AMP506_Command_Write(R1, 0x00);
AMP506_Command_Write(R2, 0x01);
AMP506_Command_Write(R3, 0x3f);
AMP506_Command_Write(R4, 0x00);
AMP506_Command_Write(R5, 0x00);
AMP506_Command_Write(R6, 0x01);
AMP506_Command_Write(R7, 0xe0);
AMP506_Command_Write(R8, 0x01); //REG[8:9]用来计算RAM的行地址
AMP506_Command_Write(R9, 0x40);
AMP506_Command_Write(R10, 0x00); //REG[10:12]为MEMERY写开始地址
AMP506_Command_Write(R11, 0x00);
AMP506_Command_Write(R12, 0x00);
AMP506_Command_Write(R16, 0x0D);
AMP506_Command_Write(R17, 0x05);
AMP506_Command_Write(R18, 0x00);
AMP506_Command_Write(R19, 0x00);
AMP506_Command_Write(R20, 0x00);
AMP506_Command_Write(R21, 0x10);
AMP506_Command_Write(R22, 0x00);
AMP506_Command_Write(R23, 0x38);
AMP506_Command_Write(R24, 0x01);
AMP506_Command_Write(R25, 0x40);
AMP506_Command_Write(R26, 0x01);
AMP506_Command_Write(R27, 0xB8);
AMP506_Command_Write(R28, 0x00);
AMP506_Command_Write(R29, 0x00);
AMP506_Command_Write(R30, 0x00);
AMP506_Command_Write(R31, 0x08);
AMP506_Command_Write(R32, 0x00);
AMP506_Command_Write(R33, 0x12);
AMP506_Command_Write(R34, 0x00);
AMP506_Command_Write(R35, 0xF0);
AMP506_Command_Write(R36, 0x01);
AMP506_Command_Write(R37, 0x09);
AMP506_Command_Write(R38, 0x00); //REG[38:40]为MEMERY读开始地址
AMP506_Command_Write(R39, 0x00);
AMP506_Command_Write(R40, 0x00);
AMP506_Command_Write(R41, 0x01);
AMP506_Command_Write(R45, 0x08); //控制LCD的电源开或关
AMP506_Command_Write(R48, 0x00); //REG[48:49]为水平偏移地址
AMP506_Command_Write(R49, 0x00);
AMP506_Command_Write(R50, 0x00); //REG[50:51]为垂直偏移地址
AMP506_Command_Write(R51, 0x00);
AMP506_Command_Write(R52, 0x01); //REG[52:53]为在MEMERY中的水平分辨率
AMP506_Command_Write(R53, 0x40);
AMP506_Command_Write(R54, 0x01); //REG[54:55]为在MEMERY中的垂直分辨率
AMP506_Command_Write(R55, 0xE0);
}
/****************************************************************************
* 名 称:void AMP506_SetCursor(u16 x,u16 y)
* 功 能:设置屏幕座标
* 入口参数:x 行座标
* y 列座标
* 出口参数:无
* 说 明:
* 调用方法:AMP506_SetCursor(10,10);
****************************************************************************/
void AMP506_SetCursor(u16 Xpos,u8 Ypos)
{
if((Xpos<320)&(Ypos<240))
{
u32 MemeryAddr;
MemeryAddr = Ypos*320+Xpos;
AMP506_Command_Write(R10, (MemeryAddr>>16)&0x03); //REG[10:12]为MEMERY写开始地址
AMP506_Command_Write(R11, (MemeryAddr>>8)&0xff);
AMP506_Command_Write(R12, MemeryAddr);
}
}
/****************************************************************************
* 名 称:void AMP506_SetWindows(u16 StartX,u16 StartY,u16 EndX,u16 EndY)
* 功 能:设置窗口区域
* 入口参数:StartX 行起始座标
* StartY 列起始座标
* EndX 行结束座标
* EndY 列结束座标
* 出口参数:无
* 说 明:
* 调用方法:AMP506_SetWindows(0,0,100,100);
****************************************************************************/
void AMP506_SetWindows(u16 S_X,u16 S_Y,u16 E_X,u16 E_Y)
{
AMP506_80Mode_Command_SendAddress(0x00); //使用连续写的方式,配置了REG[0]~REG[7]
AMP506_80Mode_Command_SendData((S_X)>>8);
AMP506_80Mode_Command_SendData(S_X);
AMP506_80Mode_Command_SendData((E_X-1)>>8);
AMP506_80Mode_Command_SendData(E_X-1);
AMP506_80Mode_Command_SendData(S_Y>>8);
AMP506_80Mode_Command_SendData(S_Y);
AMP506_80Mode_Command_SendData((E_Y-1)>>8);
AMP506_80Mode_Command_SendData(E_Y-1);
}
/****************************************************************************
* 名 称:void AMP506_Clear(u16 dat)
* 功 能:将屏幕填充成指定的颜色,如清屏,则填充 0xffff
* 入口参数:dat 填充值
* 出口参数:无
* 说 明:
* 调用方法:AMP506_Clear(0xffff);
****************************************************************************/
void AMP506_Clear(u16 Dat16bit)
{
u32 k,l;
AMP506_SetWindows(0,0,320,240); //设定显示区域
AMP506_SetCursor(0,0);
AMP506_80Mode_Command_SendAddress(0xc1); //_DisplayRAM_WriteEnable_
for(k=0;k<240*2;k++) //这里的*2是必须要写的,因为每行都是来回两趟。不写只能显示一半
{
for(l=0;l<320;l++)
{
AMP506_80Mode_16Bit_Memory_SendData(Dat16bit); //为每个像素点填入颜色
}
}
AMP506_80Mode_Command_SendAddress(0x80); // DisplayRAM_WriteDisable _
}
/****************************************************************************
* 名 称:u16 AMP506_GetPoint(u16 x,u16 y)
* 功 能:获取指定座标的颜色值
* 入口参数:x 行座标
* y 列座标
* 出口参数:当前座标颜色值
* 说 明:
* 调用方法:i=AMP506_GetPoint(10,10);
****************************************************************************/
u16 AMP506_GetPoint(u16 x,u8 y)
{
AMP506_SetCursor(x,y);
return (0);
}
/****************************************************************************
* 名 称:void AMP506_SetPoint(u16 x,u16 y,u16 PointColor)
* 功 能:在指定座标画点
* 入口参数:x 行座标
* y 列座标
* point 点的颜色
* 出口参数:无
* 说 明:
* 调用方法:AMP506_SetPoint(10,10,0x0fe0);
****************************************************************************/
void AMP506_SetPoint(u16 x,u8 y,u16 PointColor)
{
if ( (x>320)||(y>240) ) return;
AMP506_SetCursor(x,y);
// for(u8 i=0;i<2;i++)
//{
AMP506_80Mode_Command_SendAddress(0xc1); //_DisplayRAM_WriteEnable_
AMP506_80Mode_16Bit_Memory_SendData(PointColor);
AMP506_80Mode_Command_SendAddress(0x80); // DisplayRAM_WriteDisable _
//}
}
/****************************************************************************
* 名 称:void AMP506_DrawPicture(u16 StartX,u16 StartY,u16 EndX,u16 EndY,u16 *pic)
* 功 能:在指定座标范围显示一副图片
* 入口参数:StartX 行起始座标
* StartY 列起始座标
* EndX 行结束座标
* EndY 列结束座标
pic 图片头指针
* 出口参数:无
* 说 明:图片取模格式为水平扫描,16位颜色模式
* 调用方法:AMP506_DrawPicture(0,0,100,100,(u16*)demo);
****************************************************************************/
void AMP506_DrawPicture(u16 StartX,u8 StartY,u16 EndX,u8 EndY,uc8 *Dat8bit)
{
u16 k,l,TempX,TempY;
TempX=EndX-StartX;
TempY=EndY-StartY;
AMP506_SetWindows(StartX,StartY,EndX,EndY);
AMP506_SetCursor(StartX,StartY);
AMP506_80Mode_Command_SendAddress(0xc1); //_DisplayRAM_WriteEnable_
for(k=0;k<TempY;k++)
{
for(l=0;l<TempX;l++)
{
AMP506_80Mode_Command_SendData(*Dat8bit++); //送入高8位
AMP506_80Mode_Command_SendData(*Dat8bit++); //送入低8位 //为每个像素点填入颜色
}
}
AMP506_80Mode_Command_SendAddress(0x80); // DisplayRAM_WriteDisable _
}
/****************************************************************************
* 名 称:AMP506_DrawChar(u16 Xpos, u8 Ypos, uc8 *c ,u16 charColor ,u16 bkColor)
* 功 能:在指定座标显示一个16x22点阵的ascii字符
* 入口参数:x 行座标
* y 列座标
* charColor 字符的颜色
* bkColor 字符背景颜色
* c 要显示的字符
* 出口参数:无
* 说 明:显示范围限定为可显示的ascii码
* 调用方法:AMP506_DrawChar(300, 200, Point ,0xffff ,0x0000);
****************************************************************************/
void AMP506_DrawChar(u16 Xpos, u8 Ypos, uc8 *c ,u16 charColor ,u16 bkColor)
{
u32 index = 0, i = 0;
u16 Xaddress = 0;
u8 Yaddress = 0;
u8 j=0;
u8 temp;
Xaddress = Xpos;
Yaddress = Ypos;
for(index = 0; index <60; index++)
{
temp = c[index];
for(i = 0; i < 8; i++)
{
if((temp & (1 << (7-i))) == 0x00)
{
for(j=0;j<4;j++)
{
AMP506_SetCursor(Xaddress, Yaddress);
AMP506_80Mode_Command_SendAddress(0xc1); //开显示缓冲区的写使能
AMP506_80Mode_16Bit_Memory_SendData(bkColor);
AMP506_80Mode_Command_SendAddress(0x80); //关显示缓冲区的写使能
}
}
else
{
for(j=0;j<4;j++)
{
AMP506_SetCursor(Xaddress, Yaddress);
AMP506_80Mode_Command_SendAddress(0xc1); //开显示缓冲区的写使能
AMP506_80Mode_16Bit_Memory_SendData(charColor);
AMP506_80Mode_Command_SendAddress(0x80); //关显示缓冲区的写使能
}
}
Xaddress++;
}
if((Xaddress-Xpos) == 24)
{
Xaddress = Xpos;
Yaddress = Yaddress+1;
}
}
}
/****************************************************************************
* 名 称:AMP506_DrawCharEn(u16 Xpos, u8 Ypos, uc8 *c ,u16 charColor ,u16 bkColor)
* 功 能:在指定座标显示一个16x22点阵的ascii字符
* 入口参数:x 行座标
* y 列座标
* charColor 字符的颜色
* bkColor 字符背景颜色
* c 要显示的字符
* 出口参数:无
* 说 明:显示范围限定为可显示的ascii码
* 调用方法:AMP506_DrawCharEn(300, 200, Point ,0xffff ,0x0000);
****************************************************************************/
void AMP506_DrawCharEn(u16 Xpos, u8 Ypos, uc8 *c ,u16 charColor ,u16 bkColor)
{
u32 index = 0, i = 0;
u16 Xaddress = 0;
u8 Yaddress = 0;
u8 j=0;
u8 temp;
Xaddress = Xpos;
Yaddress = Ypos;
for(index = 0; index <44; index++)
{
temp = c[index];
for(i = 0; i < 8; i++)
{
if((temp & (1 << (7-i))) == 0x00)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -