www.pudn.com > t6963.rar > 8.23.c
#include#include #include"ZK.h" #include #define uchar unsigned char #define uint unsigned int #define C_ADD XBYTE[0x0100]//指令通道地址 #define D_ADD XBYTE[0x0000]//数据通道地址 #define CR 30//显示区宽度,32字节 //sbit RD=P3^7; //sbit WR=P3^6; void delay(int i){ while(i--); } /*----------------------------------------------------------------------------------------- **函数名:ReadStateWord() **功能:读取状态字 **参数:void **返回:uchar 液晶状态字 ------------------------------------------------------------------------------------------*/ uchar ReadStateWord(){ uchar a=0; a=C_ADD; return a; } /*---------------------------------------------------------------------------------------- **函数名:Test_S1_S0() **功能:判断状态位S1,S0(读写指令与读写数据状态) **参数:void **返回:bit 0:忙,1:准备好 ------------------------------------------------------------------------------------------*/ bit Test_S1_S0(void){ if((ReadStateWord()&0x03)==0x03) return 1; else return 0; } /*---------------------------------------------------------------------------------------- **函数名:Test_S2() **功能:判断状态位S2(数据自动读状态) **参数:void **返回:bit 0:忙,1:准备好 ------------------------------------------------------------------------------------------*/ bit Test_S2(void){ if((ReadStateWord()&0x04)==0x04) return 1; else return 0; } /*---------------------------------------------------------------------------------------- **函数名:Test_S3() **功能:判断状态位S3(数据自动写状态) **参数:void **返回:bit 0:忙,1:准备好 ------------------------------------------------------------------------------------------*/ bit Test_S3(void){ if((ReadStateWord()&0x08)==0x08) return 1; else return 0; } /*---------------------------------------------------------------------------------------- **函数名:Test_S6() **功能:判断状态位S6(屏读/拷屏状态) **参数:void **返回:bit 0:正确,1:出错 ------------------------------------------------------------------------------------------*/ bit Test_S6(void){ if((ReadStateWord()&0x40)==0x40) return 1; else return 0; } /*---------------------------------------------------------------------------------------- **函数名:WriteCommand_0() **功能:写入无参数指令 **参数:comm 写入的指令数据 **返回:void ------------------------------------------------------------------------------------------*/ void WriteCommand_0(uchar comm){ while(Test_S1_S0()==0); C_ADD=comm;//???????????????? } /*---------------------------------------------------------------------------------------- **函数名:WriteData() **功能:写入数据 **参数:dat写入的指令数据 **返回:void ------------------------------------------------------------------------------------------*/ void WriteData(uchar dat){ while(Test_S1_S0()==0); D_ADD=dat;//???????????????? } /*---------------------------------------------------------------------------------------- **函数名:AutoWriteData() **功能:写入数据 **参数:dat写入的指令数据 **返回:void ------------------------------------------------------------------------------------------*/ void AutoWriteData(uchar dat){ while(Test_S3()==0); D_ADD=dat;//???????????????? } /*---------------------------------------------------------------------------------------- **函数名:WriteCommand_1() **功能:写入单字节参数指令 **参数:uchar data1 参数 uchar comm 指令数据 **返回:void ------------------------------------------------------------------------------------------*/ void WriteCommand_1(uchar data1,uchar comm){ while(Test_S1_S0()==0); D_ADD=data1; while(Test_S1_S0()==0); C_ADD=comm;//??????????? } /*---------------------------------------------------------------------------------------- **函数名:WriteCommand_2() **功能:写入双字节参数指令 **参数:uchar data1 参数1;uchar data2 参数2;uchar comm 指令数据 **返回void ------------------------------------------------------------------------------------------*/ void WriteCommand_2(uchar data1,uchar data2,uchar comm){ while(Test_S1_S0()==0); D_ADD=data1; while(Test_S1_S0()==0); D_ADD=data2; while(Test_S1_S0()==0); C_ADD=comm;//////////?????????? } /*---------------------------------------------------------------------------------------- **函数名:ReadData() **功能:读出数据 **参数:void **返回uchar 读出的数据 ------------------------------------------------------------------------------------------*/ uchar ReadData(){ uchar dat; while(Test_S1_S0()==0); dat=D_ADD; return dat; } /*---------------------------------------------------------------------------------------- **函数名:LCD_init() **功能:LCD初始化程序 **参数:void **返回void ------------------------------------------------------------------------------------------*/ void LCD_init(){ WriteCommand_2(0x00,0x00,0x40);//设置文本显示区域首地址 WriteCommand_2(0x1e,0x00,0x41);//设置文本显示区域宽度 WriteCommand_2(0x00,0x08,0x42);//设置图形显示区域首地址 0x0800 WriteCommand_2(0x1e,0x00,0x43);//设置图形显示区域宽度 WriteCommand_0(0xa7);//光标形状设置 WriteCommand_0(0x80);//显示方式设置逻辑"或"合成。。。。。。。。。。 //WriteCommand_2(0x00,0x00,0x21);//设置光标地址 //WriteCommand_0(0xa7); //设置光标的形状 WriteCommand_0(0x9c);//显示开关设置 开图形显示 } /*---------------------------------------------------------------------------------------- **函数名:LCD_Clear() **功能:LCD清屏 **参数:void **返回void ------------------------------------------------------------------------------------------*/ void LCD_Clear(){ uchar u=0xff; uint i; WriteCommand_2(0x00,0x00,0x24);//设置显示存储器首地址 delay(1000); WriteCommand_0(0xb0);//设置自动写方式 for(i=0;i<7618;i++){/* 清8K存储器 */ AutoWriteData(0x00); } WriteCommand_0(0xb2);//退出自动写方式 } /*---------------------------------------------------------------------------------------- **函数名:CreateCGRAM() **功能:建立CGRAM子程序 **参数: uchar c_code 第一汉字代码0.1.2.3 uchar start_code 起始码 譬如0x80 uchar num 写入汉字数目 bit direction 代表方向: 1 写入正显码 0写入反显码 **返回void ------------------------------------------------------------------------------------------*/ void CreateCGRAM(uchar c_code,uchar start_code,uchar num,bit direction){ uint i; uint add; add=(0x03<<11)|(start_code<<3); WriteCommand_2(0x03,0x00,0x22);//设置CGRAM偏置地址 //WriteCommand_2(0x00,0x1c,0x24);//设置存储器地址指针 WriteCommand_2(add%256,add/256,0x24);//设置存储器地址指针 WriteCommand_0(0xb0);//设置自动写方式 for(i=32*c_code;i<32*(c_code+num);i++){ if(direction) AutoWriteData(ZK[i]); else AutoWriteData(~ZK[i]); } WriteCommand_0(0xb2);//退出自动写方式 } /*---------------------------------------------------------------------------------------- **函数名:CharactorWriteIn_T() **功能: 文本方式写入汉字 **参数:uchar x:X坐标(0----29) uchar y:Y坐标(0----15) uchar c_code:汉字字符代码 **返回void ------------------------------------------------------------------------------------------*/ void CharactorWriteIn_T(uchar x,uchar y,uchar c_code){ uint j; j=CR*y+x; WriteCommand_2(j%256,j/256,0x24);//设置显示地址指针 WriteCommand_1(c_code,0xc0);//写入左上半部汉字代码 WriteCommand_1(c_code+2,0xc0);//写入右上半部汉字代码 j=j+CR;// 显示RAM地址修正 WriteCommand_2(j%256,j/256,0x24);//设置显示地址指针 WriteCommand_1(c_code+1,0xc0);//写入左下半部汉字代码 WriteCommand_1(c_code+3,0xc0);//写入左下半部汉字代码 } /*---------------------------------------------------------------------------------------- **函数名:CharactorWriteIn_G() **功能: 图形方式写入汉字 **参数:uchar x:X坐标(0----29)中的偶数0,2,4,6...........28 uchar y:Y坐标(0----3) uchar *p指向汉字字模指针 //uchar code_c 汉字字符代码 **返回void ------------------------------------------------------------------------------------------*/ void CharactorWriteIn_G(uint code_c/*uchar *p*/,uchar x,uchar y,bit direction){ uint StartAddr; uchar i; StartAddr=CR*y*16+x+0x0800;//计算显示内存地址 for(i=0;i<16;i++){ WriteCommand_2( StartAddr%256, StartAddr/256,0x24);//设置显示地址指针 if(direction) WriteCommand_1(ZK[code_c*32+i],0xc0); //写入左半部数据 0xc0写以后地址加1 else WriteCommand_1(~ZK[code_c*32+i],0xc0); //写入左半部数据 0xc0写以后地址加1 // WriteCommand_1(*p++,0xc0); //写入右半部数据 0xc4写以后地址不变 StartAddr+=CR; } StartAddr=CR*y*16+x+0x0800+1;//计算显示内存地址 for(i=16;i<32;i++){ WriteCommand_2( StartAddr%256, StartAddr/256,0x24);//设置显示地址指针 if(direction) WriteCommand_1(ZK[code_c*32+i],0xc0); //写入右半部数据 0xc4写以后地址不变 else WriteCommand_1(~ZK[code_c*32+i],0xc0); //写入左半部数据 0xc0写以后地址加1 // WriteCommand_1(*p++,0xc0); //写入右半部数据 0xc4写以后地址不变 StartAddr+=CR; } } /*----------------------------------------------------------------------------------------- **函数名:CharDispay() **功能: 在(X,Y)处显示英文字符 按CGROM形式 **参数:uchar x:X坐标(0----29) uchar y:Y坐标(0----127) uchar str 显示字符的ASII码 **返回void -------------------------------------------------------------------------------------------*/ void CharDisplay(uchar chr,uchar x,uchar y){ uchar discode; if(chr>=48&&chr<=57)discode=0x10+chr-48;//得到数字显示码 else if(chr>=65&&chr<=90)discode=0x21+chr-65;//A--Z显示码 else if(chr>=97&&chr<=122)discode=0x41+chr-97;//a--z显示码 else{ switch(chr){ //其它符号显示 case '!':discode=0x01; break; case '%': discode=0x05;break; case '&': discode=0x06;break; case '(': discode=0x08;break; case ')': discode=0x09;break; case '*': discode=0x0a;break; case '+': discode=0x0b;break; case '-': discode=0x0d;break; case '.': discode=0x0e;break; case '/': discode=0x0f;break; default:break; } } WriteCommand_2((y*30+x)%256,(y*30+x)/256,0x24); WriteCommand_1(discode,0xc0); } /*----------------------------------------------------------------------------------------- **函数名:CharDispay_G() **功能: 在(X,Y)处显示英文字符 图形形式 **参数:uchar x:X坐标(0----29) uchar y:Y坐标(0----3) uchar chr 符号的ASCII码 **返回void -------------------------------------------------------------------------------------------*/ void CharDisplay_G(uchar chr,uchar x,uchar y,bit direction){ uint StartAddr; uchar i; uchar discode; if(chr>=48&&chr<=57)discode=chr-48;//得到数字显示码 else if(chr>=65&&chr<=90)discode=42+chr-65;//A--Z显示码 else if(chr>=97&&chr<=122)discode=68+chr-97;//a--z显示码 else{ switch(chr){ //其它符号显示 case '!':discode=10; break; case '%': discode=14;break; case '&': discode=15;break; case '(': discode=17;break; case ')': discode=18;break; case '*': discode=19;break; case '+': discode=20;break; case '-': discode=23;break; case '.': discode=22;break; case ' ':discode=35;break; default:break; } } StartAddr=CR*y*16+x+0x0800;//计算显示内存地址 for(i=0;i<16;i++){ WriteCommand_2( StartAddr%256, StartAddr/256,0x24);//设置显示地址指针 if(direction) WriteCommand_1(ZK[discode*16+i],0xc0); //写入左半部数据 0xc0写以后地址加1 else WriteCommand_1(~ZK[discode*16+i],0xc0); //写入左半部数据 0xc0写以后地址加1 // WriteCommand_1(*p++,0xc0); //写入右半部数据 0xc4写以后地址不变 StartAddr+=CR; } } /*----------------------------------------------------------------------------------------- **函数名:StrDisplay() **功能: 从 (X,Y)开始处显示一行英文字符串 **参数:uchar x:X坐标(0----29) uchar y:Y坐标(0----7) uchar p[] 显示的字符串数组 bit direction 显示方向 1,正向;0反向 **返回void -------------------------------------------------------------------------------------------*/ void StrDisplay(uchar p[],uchar x,uchar y){ uchar i,u; u=strlen(p); for(i=0;i