📄 lcd320240.c
字号:
//由FLASHMAN编写,近日在搞触摸屏,欢迎交流,QQ28479691
//2005-11-09
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char // 0~255
#define uint unsigned int // 0~65535
#define LCDBUS P1
sbit BUSY = P3^0; //忙位检测,进入写入操作时必须检测此位,有效电平可设置
sbit _RES = P3^5;
sbit RS = P3^1;
sbit _WR = P3^7;
sbit _RD = P3^6;
sbit _CS = P3^4;
uchar code TextLogo[]={ //将写入的字
"acbdefghijklmnopqrstuvwxyzabcdefghijklmn"
"ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN"
"1234567890123456789012345678901234567890"
};
void delayms(uint m) // 11.0592MHz
{
uchar j;
uint i;
for(i=0; i<m; i++)
for(j=0; j<109; j++)
_nop_();
}
void SdCmd(uchar Command) //发送命令
{
while(BUSY);
RS = 0; //写入命令寄存器
LCDBUS = Command;
_CS = 0; //片选
_nop_();
_WR = 0; //写入
_nop_();
_WR = 1;
_nop_();
_CS = 1;
}
void SdData(uchar DData) //发送数据
{
while(BUSY);
RS = 1; //写入数据寄存器
LCDBUS = DData;
_CS = 0; //片选有效
_nop_();
_WR = 0; //写入
_nop_();
_WR = 1;
_nop_();
_CS = 1;
}
void WriteTextScreen(uchar *TxtData,uchar line)
{
//字符显示,可显示40列*30行=1200个字,共显示line行
uchar TempData;
uchar i,j;
SdCmd(0x20);SdCmd(0x27); //工作视窗右边位置X=320/8-1=39=0x27
SdCmd(0x30);SdCmd(0x30); //工作视窗低边位置Y=240-1=239=0xEF
SdCmd(0x40);SdCmd(0x00); //工作视窗左边位置SS=0
SdCmd(0x50);SdCmd(0x00); //工作视窗顶边位置SC=0 (SS,SC)可以看作原点,(X,Y)可以看作显示区的另外一边
SdCmd(0x60); SdCmd(0x00); // 光标的X地址(范围:0到64 ,默认为0)
SdCmd(0x70); SdCmd(0x00); // 光标的Y地址(范围:0到255,默认为0),光标即当前位置
SdCmd(0x00); SdCmd(0xCD); // 令第三位CG=1,接受字符显示,此位为显示字符的关建位
for (j=0; j<line; j++) //line行数
{
for(i=0; i<40; i++)
{
TempData=(*(TxtData++));
SdData(TempData); //写入一位数据光标就自动向下移动,估计到了工作视窗右边就自动向下移动一行
}
}
}
void ClrLCD()
{
uchar i,j;
SdCmd(0x20);SdCmd(0x27); //工作视窗右边位置X=320/8-1=39=0x27
SdCmd(0x30);SdCmd(0xef); //工作视窗低边位置Y=240-1=239=0xEF
SdCmd(0x40);SdCmd(0x00); //工作视窗左边位置SS=0
SdCmd(0x50);SdCmd(0x00); //工作视窗顶边位置SC=0 (SS,SC)可以看作原点,(X,Y)可以看作显示区的另外一边
SdCmd(0x60); SdCmd(0x00); // 光标的X地址(范围:0到64 ,默认为0)
SdCmd(0x70); SdCmd(0x00); // 光标的Y地址(范围:0到255,默认为0),光标即当前位置
SdCmd(0x00); SdCmd(0xCD); // 令第三位CG=1,接受字符显示,此位为显示字符的关建位
for(j=0;j<15;j++)
for(i=0;i<40;i++)SdData(' ');
}
void initLCDM(void)
{
_RES = 0;
delayms(1); //硬件复位
_RES = 1;
SdCmd(0x00);SdCmd(0xCD); // 电源设置(关键)
SdCmd(0x08);SdCmd(0x73); // 视窗设置时钟频率设置(关键)
SdCmd(0x10);SdCmd(0xE9); // 光标设置
SdCmd(0x18);SdCmd(0x10); //光标高度CR和行距DY设定
SdCmd(0x20);SdCmd(0x27); //工作视窗右边位置X=320/8-1=39=0x27
SdCmd(0x30);SdCmd(0xef); //工作视窗低边位置Y=240-1=239=0xEF
SdCmd(0x40);SdCmd(0x00); //工作视窗左边位置SS=0
SdCmd(0x50);SdCmd(0x00); //工作视窗顶边位置SC=0 (SS,SC)可以看作原点,(X,Y)可以看作显示区的另外一边
SdCmd(0x28);SdCmd(0x27); //显示视窗右边位置A==320/8-1=39=0x27
SdCmd(0x38);SdCmd(0xEF); //显示视窗底边位置B=240-1=239=0xEF
SdCmd(0x48);SdCmd(0x00); //显示视窗左边位置C=0
SdCmd(0x58);SdCmd(0x00); //显示视窗顶边位置D=0 可以看出显示视窗和工作视窗是重合的
//显示视窗与工作视窗的区别:显示视窗由LCD的点阵决定,工作视窗是用户自定义的活动窗口,等于或大于显示视窗
//工作视窗可以控制显示区域换行,左\右\底三边,但对于顶边是控制不了
//工作视窗在显示视窗内,这样就可以画定一块区域来进行操作,而不影响其他显示
//RA8802有9.6k字节的显示内存,320*240共需9600个字节,即9.375K,刚好够用
SdCmd(0x60); SdCmd(0x00); // 光标的X地址(范围:0到64 ,默认为0)
SdCmd(0x70); SdCmd(0x00); // 光标的Y地址(范围:0到255,默认为0) 光标的坐标(X,Y)要落在工作区里
SdCmd(0x80);SdCmd(0x33); //光标闪烁时间BT=设定值/帧频
SdCmd(0x90);SdCmd(0x0C); //液晶工作时钟周期CK=系统频率*4/(列数*行数*帧频)
SdCmd(0xB0);SdCmd(0x27); //设定行中断地址,当光标位置CPXR=INTX中断发生
SdCmd(0xB8);SdCmd(0xEF); //设定列中断地址,当光标位置CPXR=INTY中断发生
SdCmd(0xA0);SdCmd(0x08); //BSY,INA,INX,INY,MSZ,MSA,MSX,MSY 命令字设置(关键)
SdCmd(0xC0);SdCmd(0xF0); //AZEN,AZOE,ADET,AS 触摸功能设置
SdCmd(0xD0);SdCmd(0x2f); //液晶显示对比度设置(关键)
SdCmd(0xE0);SdCmd(0x00); //设置写入显示内存的数据(关键)
SdCmd(0xF0);SdCmd(0xA0); //字库语言选择,内部简体字库(关键)
delayms(30); //要根据所用晶振的不同来调节,否则可难导致无法正常显示
ClrLCD(); //清屏
}
void main()
{
SP=0x60;
initLCDM();
WriteTextScreen(TextLogo,3);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -