  | 
      
        
          1樓
          巨大八爪鱼
          2013-9-19 00:15
          
          
           
         
        【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); }*/
   
       | 
    
    
        | 
      
        
          2樓
          巨大八爪鱼
          2013-9-19 00:15
          
          
           
         
        【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();*/
   
       | 
    
    
        | 
      
        
          3樓
          巨大八爪鱼
          2013-9-19 00:15
          
          
           
         
        【主程序】 【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); }
   
       | 
    
    
        | 
      
        
          4樓
          巨大八爪鱼
          2013-9-19 00:18
          
          
           
         
        該庫的使用方法很簡單。 在主函數中先設置埠(DDRA、DDRC),然後執行LCD12864_Initial();初始化液晶   然後在程序的任意位置都可以輸入: LCD12864_Goto(0,0);  LCD12864_PrintString("要顯示的文字sss");   goto是跳至第y行第x個漢字上,如果調用Goto(1,0)則跳到第1行第2個字符上,每個字符是兩個空格的大小!   PrintString是一個極其方便的函數。 PrintNumber函數目前只能顯示一位數  
       | 
    
    
        | 
      
        
          5樓
          巨大八爪鱼
          2013-9-19 00:21
          
          
           
         
        本人決定以後在設計單片機函數庫時,不管是avr還是c51,不管是1602還是12864,凡是液晶的操作,函數名都大同小異。 比如: LCD12864_Goto(0,0);  LCD12864_PrintString("要顯示的文字sss"); LCD1602_Goto(0,0);  LCD1602_PrintString("要顯示的文字sss");   具體的使用方法都是先在主函數中初始化埠,然後調用goto和printstring或writedata(顯示單個字符)函數來顯示字符。  
       | 
    
    
        | 
      
        
          6樓
          巨大八爪鱼
          2013-9-19 00:22
          
          
           
         
        這個12864液晶弄了我今晚6個小時的時間!百度上很難找到有用的資料,我試了很多程序都不行。   所以本人打算建立一個單片機程序庫。  
       |