12864 C語言程序 帶詳細註解

12864 C語言程序 帶詳細註解 作者 hyhv126 日期 2010-8-31 0:19:00

/*Allen.H 2010-8-30*/

/*逐字顯示漢字*/
#i nclude <reg52.h>
#i nclude <intrins.h>

#define uchar unsigned char
#define uint  unsigned int
/*TS12864A-3 端口定義*/
#define LCD_data  P0             //數據口
sbit LCD_RS  =  P2^4;            //寄存器選擇輸入
sbit LCD_RW  =  P2^5;            //液晶讀/寫控制
sbit LCD_E   =  P2^6;            //液晶並行使能控制
sbit LCD_PSB =  P2^1;            //串/並方式控制

 

uchar code dis1[] = {
"你好色彩日格科技" //寫英文字符的話一行寫16個
"我們的未來不是夢"
"讓世界更美好美麗"
"品質卓越至尊服務"
};

 

#define delayNOP(); {_nop_();_nop_();_nop_();};

void delay(int);
bit lcd_busy();
void lcd_init();
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar cmd);
void lcd_pos(uchar X,uchar Y); 

/* 主程序  */

void main()
 { 
    uchar i;
 unsigned int j=0,k;

   P0=0x00;    //初始化數據口
    lcd_init(); //初始化LCD            
 while(1)      
  {
    i = 0;
  
    delayNOP();
    delayNOP();
    delayNOP();
    delayNOP();
    delayNOP();
    lcd_pos(0,0); //定位到第一行第一個字符地址
        delay(15);//改變這個時間可以改變垂直方向的顯示,
       //時間短就是動態顯示,四行同時顯示,時間不合適就會閃爍
    for(j=0;j<16;j++)      //顯示8個漢字,每個漢字兩個字符寬,
          //若是英文的話,數組中一行輸入16個字符
    {                  
           lcd_wdat(dis1[i]);
           i++;
       for(k=25000;k>0;k--);//改變時間控制逐字輸出
    }
   
    lcd_pos(1,0);
    delay(15);
    for(j=16;j<32;j++)
    {                  
           lcd_wdat(dis1[i]);
           i++;
    for(k=25000;k>0;k--);
    }
    
    lcd_pos(2,0);
    delay(15);
    for(j=32;j<48;j++)
    {                  
           lcd_wdat(dis1[i]);
           i++;
    for(k=25000;k>0;k--);
    }
   
    lcd_pos(3,0);
    delay(15);
    for(j=48;j<64;j++)
    {                  
           lcd_wdat(dis1[i]);
           i++;
    for(k=25000;k>0;k--);
    }

 }
}

void delay(int ms)
{
    while(ms--)
 {
      uchar i;
   for(i=0;i<250;i++)  //0.5ms
    {
     _nop_();     
  _nop_();
 // _nop_();
 // _nop_();
    }
 }
}  

 

/*寫指令數據到LCD  RS=L,RW=L,E=脈衝,D0-D7=指令碼。只有LCD_RS的值不同
故這個函數可以和下面的寫數據的函數寫到一起,用兩個參數,讀者自己改寫*/

void lcd_wcmd(uchar cmd)
{                         

    LCD_RS = 0;//並行指令選擇打開
    LCD_RW = 0;//寫
   
 delayNOP();
    delayNOP();
 delayNOP();
   // P0 = cmd;
 
    LCD_E = 1;//打開並口
 delayNOP();
 _nop_();
  P0 = cmd;
    delayNOP();
 delayNOP();
    LCD_E = 0; //關閉並口 這個函數怎麼寫,完全參照時序圖去寫, 
   
}

/*寫顯示數據到LCD RS=H,RW=L,E=脈衝,D0-D7=數據。*/

void lcd_wdat(uchar dat)
{                         

    LCD_RS = 1;
    LCD_RW = 0;

 delayNOP();
    delayNOP();
 delayNOP();
    //P0 = dat;
 

 LCD_E = 1;
 delayNOP();
 _nop_();
 P0 = dat;
    delayNOP();
 delayNOP();
    LCD_E = 0;
}

/*  LCD顯示漢字初始化設定,只設必須的,若顯示圖片初始化設定得另外設定 */

void lcd_init()
{
 unsigned int i;
    LCD_PSB = 1;         //並口方式
   
    lcd_wcmd(0x34);      //擴充指令操作 0011xRGL  R=1擴充指令G=0關閉繪圖顯示L=0
 for(i=400;i>0;i--);
    lcd_wcmd(0x30);      //基本指令操作
   for(i=400;i>0;i--);
   lcd_wcmd(0x08);  //睡眠模式
   for(i=400;i>0;i--);
    lcd_wcmd(0x0C);      //顯示開,關光標00001DCB  D=1整體顯示,C=0關光標,B=0關遊標位置
    for(i=80;i>0;i--);
    lcd_wcmd(0x01);      //清除LCD的顯示內容
    delay(20);    //改變啓動時間長短
/* lcd_wcmd(0x02);     
    delay(5);
 lcd_wcmd(0x80);     
    delay(5);*/
}

 

 

//設定顯示位置

void lcd_pos(uchar X,uchar Y)
{                         
   uchar  pos;
   if (X==0)
    {X=0x80;}   //參照12864PDF文檔設定
   else if (X==1)
    {X=0x90;}
   else if (X==2)
    {X=0x88;}
   else if (X==3)
   {X=0x98;}
   pos = X+Y ; 
    lcd_wcmd(pos);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章