带字库LCD12864操作源代码
/************************************** 带字库LCD12864操作源代码 **************************************/ //文件12864.h #ifndef _DSP12864_H_ #define _DSP12864_H_ //#include "dsp12864.h" #define P_184RS PC5_OUT #define P_184RW PC4_OUT #define P_184EN PC3_OUT //-----X 以字为单位 共8个字----- #define LX1 0 #define LX2 1 #define LX3 2 #define LX4 3 #define LX5 4 #define LX6 5 #define LX7 6 #define LX8 7 //-----Y------------------------- #define LY1 1 #define LY2 2 #define LY3 3 #define LY4 4 //========================================= uint8 CheckLcdBusy(void); void WriteDataLCD(uint8 WDLCD); void WriteCommandLCD(uint8 WCLCD); uint8 ReadDataLCD(void); extern void LCDInit(void); extern void LCDClear(void); extern void DisplayOneChar(uint8 X, uint8 Y, uint8 DData); extern void DisplayListChar(uint8 X, uint8 Y, uint8 *DData); extern void DisplayImage(uint8 *DData); #endif //文件12864.C #include "global.h" #include "dsp12864.h" #define LCD_RS_HIGH P_184RS = 1 //RS 数据 命令切换 #define LCD_RS_LOW P_184RS = 0 #define LCD_RW_HIGH P_184RW = 1 //Read #define LCD_RW_LOW P_184RW = 0 //Write #define LCD_EN_HIGH P_184EN = 1 //ENABLE #define LCD_EN_LOW P_184EN = 0 #define LcdBusyBit 0x80 //用于检测LCD状态字中的Busy标识 #define DLY5MS 125 //#define DLY1MS 25 #define DLY100US 2 //延时函数5MS ok void DelayLcdMs(uint8 TDly) { uint8 i,j ; for(i=100;i>0;i--) for(j=TDly;j>0;j--); } //************************************* // 函数名称:LcdDat // 函数功能:写数据到IO // 入口参数:12864的数据 // 返回值 :无 //*************************************** void WriteLcdIo(uint8 Dat) { uint8 Tmp ; Tmp = Dat & 0xfc; if(Dat & 0x02) { Tmp |= 0x01 ; } PD_ODR = Tmp ; if(Dat & 0X01) { PC7_OUT = 1 ; } else { PC7_OUT = 0 ; } } //************************************* // 函数名称:ReadLcdIo // 函数功能:读LCD IO 的数据 // 入口参数:无 // 返回值 :LCD的数据 //*************************************** void SetLcdIo(void) { PD_ODR = 0xff ; PC7_OUT = 1 ; _asm("nop");_asm("nop");_asm("nop");_asm("nop"); _asm("nop");_asm("nop");_asm("nop");_asm("nop"); } uint8 ReadLcdIo(void) { uint8 Tmp=0 ; Tmp = PD_IN & 0Xfc ; if(PD_IN & 0x01) { Tmp |= 0X02 ; } if(PC_IN & 0x80) { Tmp |= 0X01 ; } return Tmp ; } //************************************* // 函数名称:CheckLcdBusy // 函数功能:读12864的状态 // 入口参数:无 // 出口参数:无 // 返回值 :所读的数据 //*************************************** uint8 CheckLcdBusy(void) { uint8 Tmp ; SetLcdIo() ; //把IO置高 LCD_RS_LOW ; LCD_RW_HIGH ; LCD_EN_HIGH ; do{ Tmp = ReadLcdIo() ; }while (Tmp & LcdBusyBit); //检测忙信号 LCD_EN_LOW ; return(Tmp); } //************************************** // 函数名称:WriteCommandLCD // 函数功能:写命令到12864 // 入口参数:要写的数据 // 出口参数:无 // 返回值 :无 //*************************************** void WriteCommandLCD(uint8 Dat) //BuysC为0时忽略忙检测 { CheckLcdBusy(); //检测忙 LCD_RS_LOW ; LCD_RW_LOW ; WriteLcdIo(Dat) ;//写数据到IO LCD_EN_HIGH ; DelayLcdMs(DLY100US) ; LCD_EN_LOW ; } //************************************* // 函数名称:写数据 // 函数功能:写数据到12864 // 入口参数:要写的数据 // 出口参数:无 // 返回值 :无 //*************************************** void WriteDataLCD(uint8 Dat) { CheckLcdBusy(); //检测忙 LCD_RS_HIGH ; LCD_RW_LOW ; WriteLcdIo(Dat) ;//写数据到IO LCD_EN_HIGH ; DelayLcdMs(DLY100US) ; LCD_EN_LOW ; } //************************************* // 函数名称:ReadDataLCD // 函数功能:读12864的数据 // 入口参数:无 // 出口参数:无 // 返回值 :所读的数据 //*************************************** uint8 ReadDataLCD(void) { uint8 Tmp ; SetLcdIo() ; //把IO置高 LCD_RS_HIGH ; LCD_RW_HIGH ; LCD_EN_LOW ; DelayLcdMs(DLY100US) ; LCD_EN_HIGH ; Tmp = ReadLcdIo() ; return(Tmp); } //************************************* // 函数名称:LCDInit // 函数功能:12864初始化设置 // 入口参数:无 // 出口参数:无 // 返回值 :无 //*************************************** void LCDInit(void) //LCM初始化 { WriteCommandLCD(0x30); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCD(0x01); //显示清屏 WriteCommandLCD(0x06); // 显示光标移动设置 WriteCommandLCD(0x0C); // 显示开及光标设置 } //************************************* // 函数名称:LCDClear // 函数功能:12864清屏设置 // 入口参数:无 // 出口参数:无 // 返回值 :无 //*************************************** void LCDClear(void) //清屏 { WriteCommandLCD(0x01); //显示清屏 WriteCommandLCD(0x34); // 显示光标移动设置 WriteCommandLCD(0x30); // 显示开及光标设置 } //************************************* // 函数名称:DisplayOneChar // 函数功能:按指定位置显示一个字符 // 入口参数:显示位置 数据 // 出口参数:无 // 返回值 :无 //*************************************** void DisplayOneChar(uint8 X, uint8 Y, uint8 Dat) { if(Y<1)Y=1; else if(Y>4)Y=4; X &= 0x0F; //限制X不能大于16,Y不能大于1 switch(Y) { case 1:X|=0X80;break; case 2:X|=0X90;break; case 3:X|=0X88;break; case 4:X|=0X98;break; } WriteCommandLCD(X); //这里不检测忙信号,发送地址码 WriteDataLCD(Dat); } //************************************* // 函数名称:DisplayOneChar // 函数功能:按指定位置显示一串字符 // 入口参数:显示位置 数据 // 出口参数:无 // 返回值 :无 //*************************************** void DisplayListChar(uint8 X, uint8 Y, uint8 *DData) { uint8 ListLength=0; if(Y<1)Y=1; else if(Y>4)Y=4; X &= 0x0F; //限制X不能大于16,Y在1-4之内//+++++ x --> x2 switch(Y) { case 1:X |= 0X80; break; //根据行数来选择相应地址 case 2:X |= 0X90; break; case 3:X |= 0X88; break; case 4:X |= 0X98; break; } WriteCommandLCD(X); //发送地址码 while (DData[ListLength] > 0)// '\0'=0若到达字串尾则退出 { WriteDataLCD(DData[ListLength]); // ListLength++; } } //************************************* // 函数名称:DisplayImage // 函数功能:图形显示122*32 // 入口参数:显示位置 数据 // 出口参数:无 // 返回值 :无 //*************************************** void DisplayImage(uint8 *DData) { uint8 x,y,i; uint16 tmp=0; for(i=0;i<9;i+=8) { //分两屏,上半屏和下半屏,因为起始地址不同,需要分开 for(x=0;x<32;x++)//32行 { WriteCommandLCD(0x34); WriteCommandLCD((0x80+x));//列地址 WriteCommandLCD((0x80+i));//行地址 下半屏 即第三行地址0X88 WriteCommandLCD(0x30); for(y=0;y<16;y++) { WriteDataLCD(DData[tmp+y]);//读取数据写入LCD } tmp+=16; } } WriteCommandLCD(0x36); //扩充功能设定 WriteCommandLCD(0x30); }
补充:软件开发 , C++ ,