{
switch(screen) { case 0: cs1=1; cs2=1; break; case 1: cs1=1; cs2=0; break; case 2: cs1=0; cs2=1; break; }
}
/*-----清屏:screen: 0-全屏,1-左屏,2-右-----*/ void LCD_Clr(uchar screen) { unsigned char i,j;
Select_Screen(screen); for(i=0;i<8;i++) {Set_Line(i);
for(j=0;j<128;j++) { Write_Dat(0x00); } } }
/*-----初始化LCD------*/ void LCD_Init(void)
{ uchar i=250; //延时 while(i--);
Select_Screen(0);
Set_OnOff(0); //关显示 LCD_Clr(0); //清屏 Select_Screen(0);
Set_OnOff(1); //开显示 Select_Screen(0);
Set_StartLine(0); //开始行:0 RST = 1;
}
// 在指定位置显示字符:x=0-120(字母、数字)/0-112(汉字),y=0-6
void Out_Char(uchar x, uchar y, bit mode, char *fmt) //mode: 1 正常显示,0 反白显示 {
int c1,c2,cData;
uchar i=0,j,uLen;
uchar k;
uLen=strlen(fmt);
while(i c1 = fmt[i]; c2 = fmt[i+1]; if(c1>=0 && c1<128 )// ASCII { if(c1 < 0x20) { switch(c1) { case 13: case 10: // 回车或换行 i++; //if(y < (LCD_Y_MAX - (2 HZ_CHR_HEIGHT))) if (y<7) {x=0; y+=2;} continue; case 8: // 退格 i++; if(y>ASC_CHR_WIDTH) y-=ASC_CHR_WIDTH; cData = 0x00; break; } } for(j=0;j { if(fmt[i] == ASC_16[j].Index_Char[0]) break; } for(k=0;k<2*ASC_CHR_WIDTH;k++) { if(j < sizeof(ASC_16)/sizeof(ASC_16[0])) { if (mode == 1) cData=ASC_16[j].Msk_Char[k]; //正常 * else cData=~ASC_16[j].Msk_Char[k]; //反白 } else cData=0; if (k { Select_Screen(1); //选择左半屏 Set_Column(x+k); } else { Select_Screen(2); //选择右半屏 Set_Column(x+k-64); } Set_Line(y); } else //字符下半部 { if ((x+k-ASC_CHR_WIDTH)<64) { Select_Screen(1); //选择左半屏 Set_Column(x+k-8); } else { Select_Screen(2); //选择右半屏 Set_Column((x+k-8)-64); } Set_Line(y+1); } Write_Dat(cData); } if(c1 != 8) // 非退格 x+=ASC_CHR_WIDTH; } else //汉字 { for(j=0;j if(fmt[i] == GB_16[j].Index_GB16[0] GB_16[j].Index_GB16[1]) break; && fmt[i+1] == } for(k=0;k<2*HZ_CHR_WIDTH;k++) { if(j < sizeof(GB_16)/sizeof(GB_16[0])) { if (mode == 1) cData=GB_16[j].Msk_GB16[k]; else cData=~GB_16[j].Msk_GB16[k]; } else cData=0; if (k { Select_Screen(1); //选择左半屏 Set_Column(x+k); } else { Select_Screen(2); //选择右半屏 Set_Column(x+k-64); } Set_Line(y); } else //汉字下半部 { if ((x+k-HZ_CHR_WIDTH)<64) { Select_Screen(1); //选择左半屏 Set_Column(x+k-HZ_CHR_WIDTH); } else { Select_Screen(2); //选择右半屏 Set_Column((x+k-HZ_CHR_WIDTH)-64); } Set_Line(y+1); } Write_Dat(cData); } x+=HZ_CHR_WIDTH; i++; } i++; } } /** lcd.h **/ #ifndef __LCD__H #define __LCD__H /*KS0108 128*64 LCD C语言驱动 LCD引脚定义 1---GND 2---VCC 3---VLCD 4---D/I 5---R/W 6---E 7到14---D0-D7 15--CS1 16--CS2 17--RESET 18--VEE 19--SW 20--NC*/ /*-----端口定义-----*/ #define DataPort P0 // LCD数据线D0-D7 sbit DI = P2^0; // 数据\\指令 选择 RS sbit RW = P2^4; // 读\\写 选择 sbit EN = P2^1; // 读\\写使能
基于at89s52单片机用12864液晶lcd显示带ds18b20测温的万年历电子时钟



