www.pudn.com > lcd12864arry.zip > lcd.c
#include#include "hat500_zk12.h" #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define BIT0 0X01 #define BIT1 0X02 #define BIT2 0X04 #define BIT3 0X08 #define BIT4 0X10 #define BIT5 0X20 #define BIT6 0X40 #define BIT7 0X80 #define LCD_DATA DDRC #define LCD_DATA_IN PINC #define LCD_DATA_OUT PORTC #define LCD_CS2 PORTA.0 #define LCD_CS1 PORTD.1 #define LCD_EN PORTD.2 #define LCD_RS PORTD.3 #define LCD_RW PORTD.4 /***********常用操作命令和参数定义***************/ #define DISPON 0x3f /*显示on */ #define DISPOFF 0x3e /*显示off */ #define DISPFIRST 0xc0 /*显示起始行定义 */ #define SETX 0xB8 /*X定位设定指令(页) */ #define SETY 0x40 /*Y定位设定指令(列) */ extern uchar TotelStrCount; //84个字符计数 extern uchar row; //行0,2,4,6 extern uchar col; //0-127 extern uchar digit; //为反相的位数 extern uchar DisplayBuffer[]; //84个字符 extern uchar ucDisplayStatus; //=0不反相,=1时反相 void LcdPutScreen(); void LcdPutLine(uchar ucRevReg); void Putedot(uchar flash *p, uchar ucRevReg); void Putcdot(uchar flash *p, uchar ucRevReg); void Lcmcls(void); void Wrdata(uchar X); void Wrcmd(uchar X); void Wtcom(void); void Lcminit(void); void LcdPutPara(); #pragma optsize- //显示参数调整行 digit为反相的位数 void LcdPutPara( void ) { uchar i; uchar flash *p; //写上半个字符 LCD_CS1 = 1; LCD_CS2 = 0; Wrcmd(row|SETX); Wrcmd(col|SETY); for (i = 0; i < 21; i++) { if (DisplayBuffer[TotelStrCount] == 0x80) { i++; TotelStrCount++; p = Tab_HZ12; p += (uint)DisplayBuffer[TotelStrCount] * 24; /*每个字符24字节 */ Putcdot(p,0); } else if(i == digit) { p = TAB_ASC616; p += (uint)DisplayBuffer[TotelStrCount] * 12; /*每个字符24字节 */ Putedot(p,1); } else { p = TAB_ASC616; p += (uint)DisplayBuffer[TotelStrCount] * 12; /*每个字符24字节 */ Putedot(p,0); } TotelStrCount++; } TotelStrCount -= 21; //写下半个字符 LCD_CS1 = 1; LCD_CS2 = 0; row++; col = 1; Wrcmd(row|SETX); Wrcmd(col|SETY); for (i = 0; i < 21; i++) { if (DisplayBuffer[TotelStrCount] == 0x80) { i++; TotelStrCount++; p = Tab_HZ12; p += (uint)DisplayBuffer[TotelStrCount] * 24 + 12; /*每个字符24字节 */ Putcdot(p,0); } else if(i == digit) { p = TAB_ASC616; p += (uint)DisplayBuffer[TotelStrCount] * 12 + 6; /*每个字符24字节 */ Putedot(p,1); } else { p = TAB_ASC616; p += (uint)DisplayBuffer[TotelStrCount] * 12 + 6; /*每个字符24字节 */ Putedot(p,0); } TotelStrCount++; } } /*显示四行 当ucDisplayStatus=1时第1行反相 当ucDisplayStatus=2时第2行反相 当ucDisplayStatus=3时第3行反相 第4行: 当ucDisplayStatus=4时反相 当ucDisplayStatus !=4 同时digit = 0xff 时不反相 当ucDisplayStatus !=4 同时digit = (0-21)时对应位反相 */ void LcdPutScreen() { col = 1; row = 0; TotelStrCount = 0; if(ucDisplayStatus == 1) { LcdPutLine(1); } else { LcdPutLine(0); } col = 1; row = 2; if(ucDisplayStatus == 2) { LcdPutLine(1); } else { LcdPutLine(0); } col = 1; row = 4; if(ucDisplayStatus == 3) { LcdPutLine(1); } else { LcdPutLine(0); } col = 1; row = 6; if(ucDisplayStatus == 4) { LcdPutLine(1); } else if(digit == 0xff) { LcdPutLine(0); } else { LcdPutPara(); } /* 清除第一列及最后一列 */ LCD_CS1 = 1; LCD_CS2 = 0; for(row = 0; row < 8; row++) { col = 0; Wrcmd(row|SETX); Wrcmd(col|SETY); Wrdata(0); } LCD_CS1 = 0; LCD_CS2 = 1; for(row = 0; row < 8; row++) { col = 63; Wrcmd(row|SETX); Wrcmd(col|SETY); Wrdata(0); } } void LcdPutLine(uchar ucRevReg) { uchar i; uchar flash *p; //写上半个字符 LCD_CS1 = 1; LCD_CS2 = 0; Wrcmd(row|SETX); Wrcmd(col|SETY); for (i = 0; i < 21; i++) { if (DisplayBuffer[TotelStrCount] == 0x80) { i++; TotelStrCount++; p = Tab_HZ12; p += (uint)DisplayBuffer[TotelStrCount] * 24; /*每个字符24字节 */ Putcdot(p,ucRevReg); } else { p = TAB_ASC616; p += (uint)DisplayBuffer[TotelStrCount] * 12; /*每个字符24字节 */ Putedot(p,ucRevReg); } TotelStrCount++; } TotelStrCount -= 21; //写下半个字符 LCD_CS1 = 1; LCD_CS2 = 0; row++; col = 1; Wrcmd(row|SETX); Wrcmd(col|SETY); for (i = 0; i < 21; i++) { if (DisplayBuffer[TotelStrCount] == 0x80) { i++; TotelStrCount++; p = Tab_HZ12; p += (uint)DisplayBuffer[TotelStrCount] * 24 + 12; /*每个字符24字节 */ Putcdot(p,ucRevReg); } else { p = TAB_ASC616; p += (uint)DisplayBuffer[TotelStrCount] * 12 + 6; /*每个字符12字节 */ Putedot(p,ucRevReg); } TotelStrCount++; } } /****************************************/ /* 半角字符点阵码数据输出 */ /****************************************/ void Putedot(uchar flash *p, uchar ucRevReg) { uchar i; uchar cbyte; if(ucRevReg == 0) { for(i = 0; i < 6; i++) { cbyte = *p++; /*半个字符输出,6列 */ if((col++) == 64) { //若COL>64则换右半屏,同时置列为0 LCD_CS1 = 0; LCD_CS2 = 1; Wrcmd(row|SETX); Wrcmd(SETY); } Wrdata(cbyte); /*写输出一字节 */ } } else { for(i = 0; i < 6; i++) { cbyte = ~(*p++); /*半个字符输出,6列 */ if((col++) == 64) { //若COL>64则换右半屏,同时置列为0 LCD_CS1 = 0; LCD_CS2 = 1; Wrcmd(row|SETX); Wrcmd(SETY); } Wrdata(cbyte); /*写输出一字节 */ } } } /****************************************/ /* 全角字符点阵码数据输出 */ /****************************************/ void Putcdot(uchar flash *p, uchar ucRevReg) { uchar i; uchar cbyte; if(ucRevReg == 0) { for(i = 0; i < 12; i++) { cbyte = *p++; /*半个字符输出,12列 */ if((col++) == 64) { //若COL>64则换右半屏,同时置列为0 LCD_CS1 = 0; LCD_CS2 = 1; Wrcmd(row|SETX); Wrcmd(SETY); } Wrdata(cbyte); /*写输出一字节 */ } } else { for(i = 0; i < 12; i++) { cbyte = ~(*p++); /*半个字符输出,12列 */ if((col++) == 64) { //若COL>64则换右半屏,同时置列为0 LCD_CS1 = 0; LCD_CS2 = 1; Wrcmd(row|SETX); Wrcmd(SETY); } Wrdata(cbyte); /*写输出一字节 */ } } } /****************************************/ /* 清屏,全屏幕清零 */ /****************************************/ void Lcmcls(void) { LCD_CS1 = 1; LCD_CS2 = 1; for(row = 0; row < 8; row++) { Wrcmd(row|SETX); Wrcmd(col|SETY); for(col = 0; col < 64; col++) { Wrdata(0); //清屏 } } } /****************************************/ /* 数据写输出 */ /****************************************/ void Wrdata(uchar X) { Wtcom(); LCD_DATA_OUT = X; /*数据输出到数据口 */ LCD_RS = 1; LCD_RW = 0; LCD_EN = 1; delay_us(1); LCD_EN = 0; } /********************************/ /* 命令输出 */ /********************************/ void Wrcmd(uchar X) { Wtcom(); LCD_DATA_OUT = X; /*数据输出到数据口 */ LCD_RS = 0; LCD_RW = 0; LCD_EN = 1; delay_us(1); //delay LCD_EN = 0; } void Wtcom(void) { LCD_DATA = 0; //置口为输入 LCD_DATA_OUT = 0xFF; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delay_us(1); //delay while(PINC.7); LCD_EN = 0; LCD_DATA = 0xff; //置口为输出 } /********************************/ /*液晶屏初始化 */ /********************************/ void Lcminit(void) { LCD_DATA = 0xff; //LCD数据口置为输出 LCD_DATA_OUT = 0xff; //LCD数据口置为1 DDRA |= (1<<0); //LCD_CS2置为输出 DDRD |= (1<<1); //LCD_CS1置为输出 DDRD |= (1<<2); //LCD_EN置为输出 DDRD |= (1<<3); //LCD_RS置为输出 DDRD |= (1<<4); //LCD_RW置为输出 LCD_CS1 = 1; LCD_CS2 = 1; LCD_EN = 0; Wrcmd(DISPFIRST); /*定义显示起始行为零 */ Wrcmd(DISPON); /*打开显示屏 */ Wrcmd(DISPFIRST); Wrcmd(DISPON); Lcmcls(); //LCD清屏 LCD_CS1 = 0; LCD_CS2 = 0; } #pragma optsize+