|
LCD驱动芯片1335控制器C51源程
/*include files */ #i nclude "w78e58.h" //#i nclude "zimo.h" //这是自己做的一个汉字库, 可以在本站下载一个字模程序,添加汉字。 世纪开发网:21hf.com*/ #i nclude "stdio.h" #i nclude "stdlib.h" #i nclude "math.h" #i nclude "absacc.h" #i nclude "intrins.h" #i nclude "string.h"
/*define function*/ #define HIBYTE(V1) ((BYTE)((V1)>>8)) #define LOBYTE(V1) ((BYTE)((V1)&0Xff)) #define MAKEWORD(V1,V2) ((((WORD)(V1))<<8)+(WORD)(V2))
/*define SED1335 port address*/ #define SEDWRCOM XBYTE[0X1100] //写指令代码 #define SEDRDCSR XBYTE[0X1100] //读光标指针 #define SEDWRDAT XBYTE[0X1000] // 写指令参数和显示数据
/*define LCD code */ #define SYSSET 0x40 #define SCROLL 0x44 #define SLEEP 0x53 #define DISPON 0x59 #define DISPOFF 0x58 #define OVLAY 0x5b #define HDOTSCR 0x5a #define CSRFORM 0x5d #define CGRAMADR 0x5c #define CSRRGT 0x4c #define CSRLFT 0x4d #define CSRUP 0x4e #define CSRDOWN 0x4f #define CSRW 0x46 #define CSRR 0x47 #define MWRITE 0x42 #define MREAD 0x43 #define AP 30
/*define screen flag*/ BOOL FG_FIRST=0; BOOL FG_MAIN=0; BOOL FG_PWD=0; BOOL FG_PRG=0; BOOL FG_PRG1=0; BOOL FG_PRG2=0; BOOL FG_PRG3=0; BOOL FG_CYCLE=0; BOOL FG_LIMIT=0; BOOL FG_TIME=0; BOOL FG_INPUT=0; BOOL FG_OUTPUT=0; BOOL FG_PID=0; BOOL FG_SELFCTL=0; BOOL FG_VARY=0;
/*LCD initial parameters*/ BYTE code SYSTAB[8]={0x30,0x87,0x0f,0x1d,0x4c,0xa0,0x1e,0x00}; BYTE code SCRTAB[10]={0x00,0x00,0xa0,0x00,0x40,0xa0,0x00,0x80,0x00,0x00};
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /*START OF THE PROGRAME*/ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*SBUROUTINES OF LCD DRIVE*/ void WLCDCOM(BYTE com ) //写LCD控制命令 { SEDWRCOM=com; _nop_(); }
void WLCDDATA(BYTE ref ) //写LCD控制参数和显示字符数据 { SEDWRDAT=ref; _nop_(); }
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); } } }
void CLRSCREEN(void) //清除显示屏幕 { WORD i,j; WLCDCOM(CSRRGT); WLCDCOM(CSRW); WLCDDATA(0X00); WLCDDATA(0X00); WLCDCOM(MWRITE); for(i=0;i<0xa0;i++) { for(j=0;j { WLCDDATA(0x00); } } }
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;} }
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;} }
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 { 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;} } }
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 { 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;} } }
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 { 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;}
} }
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]); } WLCDCOM(HDOTSCR); WLCDDATA(0X00); WLCDCOM(OVLAY); WLCDDATA(0X1c); WLCDCOM(DISPOFF); WLCDDATA(0X56); CLRVRAM(); WLCDCOM(CSRFORM); WLCDDATA(0X07); WLCDDATA(0X8f); WLCDCOM(DISPON); WLCDDATA(0X16);
}
/*DELAY SUBROUTINES*/ void DELAYX1MS(WORD count) //延时count毫秒 { BYTE i,j;
for(i=0;i for(j=0;j<120;j++) ; }
void CLRFG(void)//清除标志位 { FG_FIRST=0; FG_MAIN=0; FG_PRG=0; FG_PRG1=0; FG_PRG2=0; FG_PRG3=0; FG_CYCLE=0; FG_LIMIT=0; FG_TIME=0; FG_INPUT=0; FG_OUTPUT=0; FG_PID=0; FG_SELFCTL=0; FG_VARY=0;
}
/* void FLASH() { FILLBLOCK(7,0,2); DELAYX1MS(15); CLRBLOCK(7,0,2); DELAYX1MS(8); WNUMBER(7,0,C_NUM,1); WNUMBER(8,0,C_NUM,2); DELAYX1MS(15); } */
void DISPPWD(void) { // CLRFG(); CLRSCREEN(); WLCDCHR(2,64,C_PASSWORD,5); WBLOCK(12,64,C_COLON,1); FG_PWD=1; }
void DISPPRG(void) //编程的第一界面 { CLRFG(); CLRSCREEN(); WLCDCHR(0,0,C_ROUT,2); WBLOCK(4,0,C_COLON,1);
WLCDCHR(1,144,C_PROG,2); WLCDCHR(9,144,C_CANCEL,2); WLCDCHR(17,144,C_ENTER,2); WLCDCHR(25,144,C_MAIN,2); FG_PRG=1; }
void DISPCYCLE(void) { CLRFG(); CLRSCREEN(); WLCDCHR(0,16,C_CYCLE,2); WLCDCHR(4,16,C_STSEG,2);
WLCDCHR(10,16,C_CYCLE,2); WLCDCHR(14,16,C_ENDSEG,2);
WLCDCHR(20,16,C_CYCLE,2); WLCDCHR(24,16,C_TIMES,2);
WLCDCHR(9,144,C_CANCEL,2); WLCDCHR(17,144,C_ENTER,2); WLCDCHR(25,144,C_MAIN,2); FG_CYCLE=1; }
main() { BYTE i; INITLCD(); CLRSCREEN(); WNUMBER(6,32,C_LETTER,3); }
|