⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd320240.c

📁 RA8802 是一個中英文文字與繪圖模式的點矩陣液晶顯示(LCD)控制器
💻 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 + -