|
【程序库】AVR单片机操作普通12864液晶的程序库(目前只支持显示字) |
一派护法 十九级 |
【LCD12864.c】 #include <iom16v.h> #include <macros.h> #include "LCD12864.h" void LCD12864_Initial(void) { LCD12864_WriteCmd(0x06); //光标设置,读或写一个字符后,地址指针加一,光标加一,整屏不移动 LCD12864_WriteCmd(0x0c); //显示开关控制,开显示,光标不显示,光标不闪烁 LCD12864_Clear(); } void LCD12864_Clear(void) { LCD12864_WriteCmd(0x30); LCD12864_WriteCmd(0x01); } void LCD12864_ChkBusy(void) { LCD12864_DATD=~BIT(7); //检测忙信号时,PX7变成了输入口 LCD12864_DAT=0xf2; LCD12864_RS0; LCD12864_RW1; LCD12864_E1; while (LCD12864_BSY); //注意:如果不改变DDRX,程序将卡死在这里! LCD12864_E0; LCD12864_DATD=0xff; //恢复PX7为输出口 } void LCD12864_WriteCmd(unsigned char Data) { LCD12864_ChkBusy(); LCD12864_RS0; LCD12864_RW0; LCD12864_DAT=Data; LCD12864_E1; LCD12864_E0; } void LCD12864_WriteData(unsigned char Data) { LCD12864_ChkBusy(); LCD12864_RS1; LCD12864_RW0; LCD12864_DAT=Data; LCD12864_E1; LCD12864_E0; } void LCD12864_Goto(unsigned char x, unsigned char y) { switch (y) { case 1: LCD12864_WriteCmd(0x90+x); break; case 2: LCD12864_WriteCmd(0x88+x); break; case 3: LCD12864_WriteCmd(0x98+x); break; default: LCD12864_WriteCmd(0x80+x); break; } } void LCD12864_PrintString(char* pStr) { while (*pStr!='\0') { LCD12864_WriteData(*pStr); pStr++; } } /*void LCD12864_PrintNumber(unsigned char num) { LCD12864_WriteData('0'+num); }*/
|
一派护法 十九级 |
【LCD12864.h】 #define LCD12864_DAT PORTA #define LCD12864_DATD DDRA #define LCD12864_BSY PINA&BIT(7) #define LCD12864_RS0 PORTC&=~BIT(0) #define LCD12864_RS1 PORTC|=BIT(0) #define LCD12864_RW0 PORTC&=~BIT(1) #define LCD12864_RW1 PORTC|=BIT(1) #define LCD12864_E0 PORTC&=~BIT(2) #define LCD12864_E1 PORTC|=BIT(2) /* #define LCD12864_CS10 PORTC&=~BIT(3); #define LCD12864_CS11 PORTC|=BIT(3); #define LCD12864_CS20 PORTC&=~BIT(4); #define LCD12864_CS21 PORTC|=BIT(4); #define LCD12864_RST0 PORTC&=~BIT(5); #define LCD12864_RST1 PORTC|=BIT(5); */ void LCD12864_Initial(void); void LCD12864_Clear(void); void LCD12864_ChkBusy(void); void LCD12864_WriteCmd(unsigned char Data); void LCD12864_WriteData(unsigned char Data); void LCD12864_Goto(unsigned char x, unsigned char y); void LCD12864_PrintString(char* pStr); void LCD12864_PrintNumber(unsigned char num); /*void LCD12864_ShowCursor(); void LCD12864_HideCursor(); void LCD12864_GetCursor(unsigned char* x, unsigned char* y); unsigned char LCD12864_CursorVisible();*/
|
一派护法 十九级 |
【主程序】 【main.c】 #include <iom16v.h> #include <macros.h> #include "LCD12864.h" //AVR程序中,函数定义时如果无参数,必须在括号中写void //否则编译时会警告 void main(void) { //端口设置 DDRA=DDRC=PORTA=PORTC=0xff; LCD12864_Initial(); /*LCD12864_Goto(0,0); LCD12864_PrintString("在检测液晶的忙信"); LCD12864_Goto(0,1); LCD12864_PrintString("号时千万别忘了设"); LCD12864_Goto(0,2); LCD12864_PrintString("置DDRA=~BIT(7)哦"); LCD12864_Goto(0,3); LCD12864_PrintString("否则程序会卡死的");*/ LCD12864_Goto(1,0); LCD12864_PrintString("Time Server"); LCD12864_Goto(0,1); LCD12864_PrintString("Date:09/19/2013"); LCD12864_Goto(0,2); LCD12864_PrintString("Time:12:16:55 AM"); LCD12864_Goto(0,3); LCD12864_PrintString("Thursday 26.3℃"); while (1); }
|
一派护法 十九级 |
该库的使用方法很简单。 在主函数中先设置端口(DDRA、DDRC),然后执行LCD12864_Initial();初始化液晶 然后在程序的任意位置都可以输入: LCD12864_Goto(0,0); LCD12864_PrintString("要显示的文字sss"); goto是跳至第y行第x个汉字上,如果调用Goto(1,0)则跳到第1行第2个字符上,每个字符是两个空格的大小! PrintString是一个极其方便的函数。 PrintNumber函数目前只能显示一位数
|
一派护法 十九级 |
本人决定以后在设计单片机函数库时,不管是avr还是c51,不管是1602还是12864,凡是液晶的操作,函数名都大同小异。 比如: LCD12864_Goto(0,0); LCD12864_PrintString("要显示的文字sss"); LCD1602_Goto(0,0); LCD1602_PrintString("要显示的文字sss"); 具体的使用方法都是先在主函数中初始化端口,然后调用goto和printstring或writedata(显示单个字符)函数来显示字符。
|
一派护法 十九级 |
这个12864液晶弄了我今晚6个小时的时间!百度上很难找到有用的资料,我试了很多程序都不行。 所以本人打算建立一个单片机程序库。
|