www.pudn.com > 320.rar > lcd.c
/********************************************************************************************************* ** 320240ALCD控制 ** ** **--------------当前版本信息---------------------------------------------------------------------------- ** 文件名: lcd.c ** 创建人: 刘明宇 ** 日 期: 2005年10月11日 ** 描 述: LCD320240A控制的主文件 ** 硬件连接 ** 51 lcd ** P0~7-------->D0~7 ** P2.7-------->cs ** P2.6-------->A0 ** P1.0-------->Res ** wr -------->wr ** rd -------->rd ** **--------------历史版本信息---------------------------------------------------------------------------- ** 无 **------------------------------------------------------------------------------------------------------ ** 修改人: ** 日 期: ** 描 述: ** **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ #include#include #include #include #include "lcd.h" #include "disdata.h" /*LCD initial parameters*/ /* 在下面的数据里面,第四个0x27对应是显示的横向范围,8位除去 -------------------240128的SYSTEM SET 参数------------------------------- unsigned char SYSTAB[8]={0x30,0x87,0x09,0x1d,0x64,0xa0,0x1e,0x00}; unsigned char SCRTAB[10]={0x00,0x00,0xa0,0x00,0x00,0xa0,0x00,0x80,0x00,0x00}; Uchar code ParaSysTable8[]= { 0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00 // P1-P8参数 }; */ BYTE code SYSTAB[8]={0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00}; //BYTE code SYSTAB[8]={0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00}; BYTE code SCRTAB[10]={0x00,0x00,0xf0,0x00,0x40,0xf0,0x00,0x80,0x00,0x00}; /**************************************************************************** * 名称:main * 功能:主函数 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void main(void) { BYTE i; serial_init(); Lcd_res=0; Lcd_res=1; test_serial(); INITLCD(); CLRSCREEN(); FULLSCREEN(); while(1) { sam1(); delaylong(50000); CLRSCREEN(); delaylong(10000); FULLSCREEN(); delaylong(10000); } } /*************************SBUROUTINES OF LCD DRIVE**************************/ /**************************************************************************** * 名称:WLCDCOM * 功能:写LCD控制命令 * 入口参数:com * 出口参数:无 ****************************************************************************/ void WLCDCOM(BYTE com ) //写LCD控制命令 { SEDWRCOM=com; _nop_(); } /**************************************************************************** * 名称:WLCDDATA * 功能:写LCD控制参数和显示字符数据 * 入口参数:ref * 出口参数:无 ****************************************************************************/ void WLCDDATA(BYTE ref ) //写LCD控制参数和显示字符数据 { SEDWRDAT=ref; _nop_(); } /**************************************************************************** * 名称:CLRVRAM * 功能:显示存储器清零 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void CLRVRAM(void) //显示存储器清零 { WORD i,j; WLCDCOM(CSRRGT); WLCDCOM(CSRW); WLCDDATA(0x00); WLCDDATA(0x00); WLCDCOM(MWRITE); for(i=0;i<=0xff;i++) { for(j=0;j<=0xff;j++) { WLCDDATA(0x00); } } } /**************************************************************************** * 名称:CLRSCREEN * 功能:清除显示屏幕 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void CLRSCREEN(void) //清除显示屏幕 { WORD i,j; //BYTE a; WLCDCOM(CSRRGT); WLCDCOM(CSRW); WLCDDATA(0X00); WLCDDATA(0X00); WLCDCOM(MWRITE); /* for(i=0;i<0xa0;i++) { for(j=0;j<0x1e0;j++) { WLCDDATA(0x00); } }*/ for(i=0;i<9600;i++) { WLCDDATA(0x00); } } /**************************************************************************** * 名称:WNUMBER * 功能:显示0~9等10个数字 * 入口参数:... * 出口参数:无 ****************************************************************************/ void WNUMBER(BYTE x,BYTE y,BYTE (*p)[16],BYTE num ) //功能:显示0~9等10个数字,num为要显示的数字的值(16×8) //x坐标寄存器(字节),y坐标寄存器(点行) { WORD temp; BYTE hi,lo; BYTE a,b,c; temp=y*AP; hi=HIBYTE(temp); lo=LOBYTE(temp); lo=x+lo; if(CY==1) {hi+=0x01;CY=0;} WLCDCOM(CSRDOWN); WLCDCOM(CSRW); WLCDDATA(lo); WLCDDATA(hi); WLCDCOM(MWRITE); for(c=0;c<16;c++) { WLCDDATA(*(*(p+num)+c)); } lo=lo+0x01; if(CY==1) {hi+=0x01;CY=0;} } /**************************************************************************** * 名称:WBLOCK * 功能:显示16×8点字符 * 入口参数:... * 出口参数:无 ****************************************************************************/ void WBLOCK(BYTE x,BYTE y,BYTE (*p)[16],BYTE num ) //功能:显示16×8点字符,num为要显示的字符块长度 //x坐标为低8位寄存器(字节),y坐标寄存器(点行) { WORD temp; BYTE hi,lo; BYTE a,b,c; temp=y*AP; hi=HIBYTE(temp); lo=LOBYTE(temp); lo=x+lo; if(CY==1) {hi+=0x01;CY=0;} WLCDCOM(CSRDOWN); WLCDCOM(CSRW); WLCDDATA(lo); WLCDDATA(hi); WLCDCOM(MWRITE); for(c=0;c<16;c++) { WLCDDATA(*(*(p+num-1)+c)); } lo=lo+0x01; if(CY==1) {hi+=0x01;CY=0;} } /**************************************************************************** * 名称:FILLBLOCK * 功能:显示16×16字符 * 入口参数:... * 出口参数:无 ****************************************************************************/ void FILLBLOCK(BYTE x,BYTE y,BYTE len ) //功能:显示16×16字符,len为要显示的字符块的长度 //x坐标为低8位寄存器(字节),y坐标寄存器(点行) { WORD temp; BYTE hi,lo; BYTE a,b; temp=y*AP; hi=HIBYTE(temp); lo=LOBYTE(temp); lo=x+lo; if(CY==1) {hi+=0x01;CY=0;} for(b=0;b<0x10;b++)//**************************************************************这里要改 { WLCDCOM(CSRDOWN); WLCDCOM(CSRW); WLCDDATA(lo); WLCDDATA(hi); WLCDCOM(MWRITE); for(a=0;a<16;a++) { WLCDDATA(0xff); } lo=lo+0x01; if(CY==1) {hi+=0x01;CY=0;} } } /**************************************************************************** * 名称:CLRBLOCK * 功能:清除16×8字符快 * 入口参数:... * 出口参数:无 ****************************************************************************/ void CLRBLOCK(BYTE x,BYTE y,BYTE len ) //清除16×8字符快,len为要清除的字符块的长度 //x坐标寄存器(字节),y坐标寄存器(点行) { WORD temp; BYTE hi,lo; BYTE a,b; temp=y*AP; hi=HIBYTE(temp); lo=LOBYTE(temp); lo=x+lo; if(CY==1) {hi+=0x01;CY=0;} for(b=0;b<0x10;b++)//**********************************************************这里要改 { WLCDCOM(CSRDOWN); WLCDCOM(CSRW); WLCDDATA(lo); WLCDDATA(hi); WLCDCOM(MWRITE); for(a=0;a<16;a++) { WLCDDATA(0x00); } lo=lo+0x01; if(CY==1) {hi+=0x01;CY=0;} } } /**************************************************************************** * 名称:WLCDCHR * 功能:显示16×32字符 * 入口参数:... * 出口参数:无 ****************************************************************************/ void WLCDCHR(BYTE x,BYTE y,BYTE (*p)[32],BYTE num ) //功能:显示16×32字符,num为要显示字符数组的第一维的值 //x坐标寄存器(字节),y坐标寄存器(点行) { WORD temp; BYTE hi,lo; BYTE a,b,c; temp=y*AP; hi=HIBYTE(temp); lo=LOBYTE(temp); lo=x+lo; if(CY==1) {hi+=0x01;CY=0;} WLCDCOM(CSRDOWN); for(a=0;a<0x10;a++)//**********************************************************这里要改 { WLCDCOM(CSRW); WLCDDATA(lo); WLCDDATA(hi); WLCDCOM(MWRITE); for(c=0;c<0x20;c+=2) { WLCDDATA(*(*(p+a)+c)); } lo=lo+0x01; if(CY==1) {hi+=0x01;CY=0;} WLCDCOM(CSRW); WLCDDATA(lo); WLCDDATA(hi); WLCDCOM(MWRITE); for(c=1;c<0x20;c+=2) { WLCDDATA(*(*(p+a)+c)); } lo=lo+0x01; if(CY==1) {hi+=0x01;CY=0;} } } /**************************************************************************** * 名称:INITLCD * 功能:初始化LCD显示参数以及界面 * 入口参数:... * 出口参数:无 ****************************************************************************/ void INITLCD(void) //初始化LCD显示参数以及界面 { WORD a,b,c; WLCDCOM(SYSSET); for(b=0;b<8;b++) { WLCDDATA(SYSTAB[b]); } WLCDCOM(SCROLL); for(b=0;b<10;b++) { WLCDDATA(SCRTAB[b]); //WLCDDATA(0x00); } WLCDCOM(HDOTSCR); WLCDDATA(0X00); WLCDCOM(OVLAY); WLCDDATA(0X1c); WLCDCOM(DISPOFF); WLCDDATA(0X56); CLRVRAM(); WLCDCOM(CSRFORM); WLCDDATA(0X07); WLCDDATA(0X8f); WLCDCOM(DISPON); WLCDDATA(0X16); } /**************************************************************************** * 名称:FULLSCREEN * 功能:清除显示屏幕 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void FULLSCREEN(void) //清除显示屏幕 { //WORD i,j; WORD i; //BYTE a; WLCDCOM(CSRRGT); WLCDCOM(CSRW); WLCDDATA(0X00); WLCDDATA(0X00); WLCDCOM(MWRITE); /* for(i=0;i<320;i++) { for(j=0;j<30;j++) { WLCDDATA(0xff); } }*/ for(i=0;i<9600;i++) { WLCDDATA(0xff); } } /**************************************************************************** * 名称:FULLSCREEN * 功能:清除显示屏幕 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void sam1(void) { WORD i; WLCDCOM(CSRRGT); WLCDCOM(CSRW); WLCDDATA(0X00); WLCDDATA(0X00); WLCDCOM(MWRITE); for(i=0;i<320*5*2;i++) { WLCDDATA(Bmp1[i]); } for(i=0;i<320*5*2;i++) { WLCDDATA(Bmp1[i]); } for(i=0;i<320*5*2;i++) { WLCDDATA(Bmp1[i]); } }