學習LCD顯示的筆記

 1、1602LCD:即表示一行顯示16個字符,共兩行。

12864:橫着128點,豎着64點
2、1602LCD接口信號說明:
編號符號     引腳說明
1      Vss:電源地
2      VDD:電源正極
3      VL:液晶顯示偏壓信號
4      RS:數據/命令選擇端(H/L)
5     R/W:讀寫選擇端(H/L)
6     E:     使能信號(讓這個液晶工作的新號)
7     D0:     Date I/O
8     D1:     Date I/O
9     D2:     Date I/O
10     D3:     Date I/O
11     D4:     Date I/O
12     D5:     Date I/O
13     D6:     Date I/O
14     D7:     Date I/O
15     BLA:     背光源正極 
16     BLK:     背光源負極
3、控制接口說明:(HD447及兼容芯片)
(1)基本操作時序:
1.1讀狀態:
1.2寫指令:RS=L,RW=L,D0~D7=指令碼,E=高脈衝
1.3讀指令
1.4寫數據:RS=H,RW=L,D0~D7=指令碼,E=高脈衝
4、顯示開/關及光標設置
指令碼:00001DCB功能:D=1開顯示;D=0關顯示;C=1顯示光標;C=0不顯示光標;B=1光標閃爍;B=0光標不顯示
000001NS功能:N=1當讀或寫一個字符後地址指針加一,且光標加一N=0當讀或寫一個字符後地址指針減一,且光標減一S=1當寫一個字符,整屏顯示左移
如果D=0,則LCD上不顯示任何東西。
5、LED1 = ~ LED1;          //LED顯示取反,產生的效果:第一次按得時候亮,下一次按得時候滅。
6、12864LCD引腳說明:
編號符號     引腳說明
1      Vss:電源地
2      VDD:電源正極
3      V0:   LCD驅動電壓輸入端
4      RS(CS):並行的數據/命令選擇端(H/L);串行口的片選信號
5     R/W(CLK):並行的讀寫選擇端(H/L);串行的數據口
6     E:     並行的使能信號(讓這個液晶工作的新號);串行口同步時鐘
7     DB0:     Date I/O
8     DB1:     Date I/O
9     DB2:     Date I/O
10     DB3:     Date I/O
11     DB4:     Date I/O
12     DB5:     Date I/O
13     DB6:     Date I/O
14     DB7:     Date I/O
15    PSB:      並/串行口選擇;H-並行;L-串行
16    NC:         空腳
17   /RET:         復位 低電平有效
18   NC
15     LED-A:     背光源正極(LED+5V)
16     LED-K:     背光源負極(LED-0V)

 

8位並行連接時序圖
MPU寫資料到模塊:
MPU從模塊讀出數據:
串行連接時序圖:
程序如下:
/********************************************************************
* 名稱 : write_com()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
**********************************************************************
*/
void write_com(unsigned char cmdcode)
{
        CS = 1;
        sendbyte(0xf8);         //11111abc a如果高表示從LCD讀數據,低
表示往LCD寫數據。 b 高表示顯示數據,低表示控制指令 c 固定爲0
        sendbyte(cmdcode & 0xf0);       //取cmdcode的高四位
        sendbyte((cmdcode << 4) & 0xf0);        //取cmdcode的第四位
        delay(2);
}
/********************************************************************
* 名稱 : write_data()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
**********************************************************************
*/
void write_data(unsigned char Dispdata)
{
        CS = 1;
        sendbyte(0xfa);
        sendbyte(Dispdata & 0xf0);
        sendbyte((Dispdata << 4) & 0xf0);
        delay(2);
}
五、指令說明
模塊控制芯片提供兩套控制命令,基本指令和擴充指令如下:
指令表1:(RE=0:基本指令)

 

                  指 令 碼 功 能
RS R/W D7 D6 D5 D4 D3 D2 D1 D0  
清除
顯示
0 0 0 0 0 0 0 0 0 1 將DDRAM填滿"20H",並且設定DDRAM的地址計數器(AC)到"00H"
地址
歸位
0 0 0 0 0 0 0 0 1 X 設定DDRAM的地址計數器(AC)到"00H",並且將遊標移到開頭原點位置;這個指令不改變DDRAM 的內容
顯示狀態開/關 0 0 0 0 0 0 1 D C B
D=1: 整體顯示 ON
C=1: 遊標ON    
B=1:遊標位置反白允許
進入點
設定
0 0 0 0 0 0 0 1 I/D S 指定在數據的讀取與寫入時,設定遊標的移動方向及指定顯示的移位
遊標或顯示移位控制 0 0 0 0 0 1 S/C R/L X X 設定遊標的移動與顯示的移位控制位;這個指令不改變DDRAM 的內容
功能
設定
0 0 0 0 1 DL X RE X X
DL=0/1:4/8位數據
RE=1: 擴充指令操作
RE=0: 基本指令操作
設定CGRAM
地址
0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 設定CGRAM 地址
設定DDRAM
地址
0 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0
設定DDRAM 地址(顯示位址)
第一行:80H-87H
第二行:90H-97H
讀取忙標誌和地址 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 讀取忙標誌(BF)可以確認內部動作是否完成,同時可以讀出地址計數器(AC)的值
寫數據到RAM 1 0 數據 將數據D7——D0寫入到內部的RAM (DDRAM/CGRAM/IRAM/GRAM)
讀出RAM的值 1 1 數據
從內部RAM讀取數據D7——D0
(DDRAM/CGRAM/IRAM/GRAM)
指令表2:(RE=1:擴充指令)

 

                  指 令 碼 功 能
RS R/W D7 D6 D5 D4 D3 D2 D1 D0  
待命
模式
0 0 0 0 0 0 0 0 0 1
進入待命模式,執行其他指令都棵終止
待命模式
捲動地址開關開啓 0 0 0 0 0 0 0 0 1 SR
SR=1:允許輸入垂直捲動地址
SR=0:允許輸入IRAM和CGRAM地址
反白
選擇
0 0 0 0 0 0 0 1 R1 R0 選擇2行中的任一行作反白顯示,並可決定反白與否。初始值R1R0=00,第一次設定爲反白顯示,再次設定變回正常
睡眠
模式
0 0 0 0 0 0 1 SL X X
SL=0:進入睡眠模式
SL=1:脫離睡眠模式
擴充
功能
設定
0 0 0 0 1 CL X RE G 0
CL=0/1:4/8位數據
RE=1: 擴充指令操作
RE=0: 基本指令操作
G=1/0:繪圖開關
設定繪圖RAM
地址
0 0 1
0
AC6
0
AC5
0
AC4
AC3
AC3
AC2
AC2
AC1
AC1
AC0
AC0
設定繪圖RAM
先設定垂直(列)地址AC6AC5…AC0
再設定水平(行)地址AC3AC2AC1AC0
將以上16位地址連續寫入即可
備註:當IC1在接受指令前,微處理器必須先確認其內部處於非忙碌狀態,即讀取BF標誌時,BF需爲零,方可接受新的指令;如果在送出一個指令前並不檢查BF標誌,那麼在前一個指令和這個指令中間必須延長一段較長的時間,即是等待前一個指令確實執行完成。
一下是配套光盤上的程序,我做了一點註釋。。
/********************************************************************
* 文件名  : 串行12864顯示.c
* 描述    :  該程序實現了12864以串行的方式進行通信。
* 創建人  : 東流,2009年4月10日
* 版本號  : 2.0
**********************************************************************

*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit CS=P2^5;       //片選信號
sbit SID=P2^6;          //數據信號
sbit SCLK=P2^7;         //時鐘信號
sbit RST=P2^2;          //復位信號
sbit CH = P2^4;         //並行、串行選擇信號

/********************************************************************
* 名稱 : delay()
* 功能 : 延時,延時時間爲 100us * t。這是通過軟件延時,有一定誤差。
* 輸入 : t
* 輸出 : 無
**********************************************************************

*/
void delay(unsigned int t)
{
        unsigned int i,j;
        for(i=0; i<t;  i++)
    for(j=0; j<10; j++);
}

/********************************************************************
* 名稱 : sendbyte()
* 功能 : 按照液晶的串口通信協議,發送數據
* 輸入 : zdata
* 輸出 : 無
**********************************************************************

*/
void sendbyte(unsigned char zdata)
{
        unsigned int i;
        for(i=0; i<8; i++)
        {
                if((zdata << i) & 0x80)
                {
                        SID = 1;
                }
                else
                {
                        SID = 0;
                }
                SCLK = 0;
                SCLK = 1;
        }
}

/********************************************************************
* 名稱 : write_com()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
**********************************************************************

*/
void write_com(unsigned char cmdcode)
{
        CS = 1;
        sendbyte(0xf8);         //11111abc a如果高表示從LCD讀數據,低表示往LCD寫數據。 b 高表示顯示數據,低表示控制指令 c 固定爲0
        sendbyte(cmdcode & 0xf0);       //取cmdcode的高四位
        sendbyte((cmdcode << 4) & 0xf0);        //取cmdcode的第四位
        delay(2);
}

/********************************************************************
* 名稱 : write_data()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
**********************************************************************

*/
void write_data(unsigned char Dispdata)
{
        CS = 1;
        sendbyte(0xfa);
        sendbyte(Dispdata & 0xf0);
        sendbyte((Dispdata << 4) & 0xf0);
        delay(2);
}

/********************************************************************
* 名稱 : lcdinit()
* 功能 : 初始化函數
* 輸入 : cmdcode
* 輸出 : 無
**********************************************************************

*/
void lcdinit()
{  
        RST = 0;
        delay(100);
        RST = 1;
        delay(20000);
        write_com(0x30);        //功能設定,001(DL)X(0或RE)XXDL必須爲1RE=1:擴展指令集動作,RE=0:基本指令集動作
        delay(50);
        write_com(0x0c);        //捲動地址或IRAM地址選擇:0000001SR。SR=1,允許輸入垂直捲動地址,SR=0:允許輸入IRAM地址
        delay(50);
}

/********************************************************************
* 名稱 : hzkdis()
* 功能 : 顯示字符串
* 輸入 : *s
* 輸出 : 無
**********************************************************************

*/
void hzkdis(unsigned char code *s)
{  
        while(*s > 0)
    {
                write_data(*s);
                s++;
                delay(50);
    }
}

/********************************************************************
* 名稱 : Test()
* 功能 : 顯示子函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************

*/
void Test()
{  
        write_com(0x03);
        delay(50);    
        write_com(0x81);        //寫地址
        hzkdis("   HOT-51");
        write_com(0x91);
        hzkdis("單片機開發板");
        write_com(0x89);
        hzkdis("          ");
        write_com(0x98);
        hzkdis("    東流電子");
}


/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************

*/
void Main()
{
        CH = 0;         //選擇是串口
        delay(1);
        lcdinit();
        delay(10);
        while(1)
        {
                Test();
                delay(5000);
        }
}
/********************************************************************
* 文件名  : 定時器的使用.c
* 描述    :  
* 創建人  : 東流,2009年4月8日
* 版本號  : 2.0
**********************************************************************
*/
#include <reg52.h>
#include <string.h>

#define uchar unsigned char
#define uint  unsigned int

uchar code IC_DAT[];
uchar code pic1[];
uchar code pic2[];
uchar code pic3[];

sbit RS  = P2^5;        //並行的指令/數據選擇信號
sbit WRD = P2^6;        //讀寫選擇信號
sbit E   = P2^7;        //使能信號
sbit PSB = P2^2;        //並/串行接口選擇 高爲並,低爲串
sbit RES = P2^4;        //復位,低電平有效

void TransferData(char data1,bit DI);
void display(void);
void display_grapic(void);
void delayms(uint n);
void DisplayLine(uchar line1,uchar line2);
void DisplayGraphic(uchar code *adder);
void delay(uint m);
void lcd_mesg(uchar code *adder1);

uchar code IC_DAT[]={
"     HOT-51     "  
"                "
"  單片機開發板  "
"    東流電子    "
};

uchar code IC_DAT2[]={
"  白日依山盡,  "                    //0x80
"  欲窮千里目,  "                    //0x90
"  黃河入海流。  "                    //0x88
//"  更上一層樓。  "                  //0x98
"一二三四五六七八九十"    
};

/********************************************************************
* 名稱 : Convert(uchar In_Date)
* 功能 : 因爲電路設計時,P0.0--P0.7接法剛好了資料中的相反,所以設計該
函數。
* 輸入 : 1602資料上的值
* 輸出 : 送到1602的值
**********************************************************************
*/
unsigned char Convert(unsigned char In_Date)
{
    unsigned char i, Out_Date = 0, temp = 0;
    for(i=0; i<8; i++)
    {
        temp = (In_Date >> i) & 0x01;
        Out_Date |= (temp << (7 - i));
    }
    return Out_Date;
}

void initinal(void)           //LCD字庫初始化程序
{
           delay(40);             //大於40MS的延時程序
           PSB=1;                 //設置爲8BIT並口工作模式
           delay(1);              //延時
           RES=0;                 //復位
           delay(1);              //延時
           RES=1;                 //復位置高
           delay(10);
           TransferData(0x30,0);  //Extended Function Set :8BIT設
置,RE=0: basic instruction set, G=0 :graphic display OFF
////功能設定,001(DL)X(0或RE)XXDL必須爲1RE=1:擴展指令集動作,RE=0:基
本指令集動作
           delay(100);            //大於100uS的延時程序
           TransferData(0x30,0);  
           delay(37);             ////大於37uS的延時程序
           TransferData(0x08,0);  //顯示狀態開/關00001DCB;D=1,整體顯示
ON,C=1,遊標ON B=1:遊標位置ON
           delay(100);            //大於100uS的延時程序
           TransferData(0x10,0);  //設定DDRAM,1ACACACACACACACAC,設定
DDRAM地址計數器(AC)
           delay(100);            //大於100uS的延時程序
           TransferData(0x0C,0);  //Display Control,D=1,顯示開,關閉遊
標,關閉遊標位置
           delay(100);            //大於100uS的延時程序
           TransferData(0x01,0);  //Display Clear清除顯示
           delay(10);             //大於10mS的延時程序
           TransferData(0x06,0);  //Enry Mode Set,光標從右向左加1位移
動    進入點設置
           delay(100);            //大於100uS的延時程序
          }

/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void     initina2(void)           //LCD顯示圖片(擴展)初始化程序
          {
           delay(40);             //大於40MS的延時程序
           PSB=1;                 //設置爲8BIT並口工作模式
           delay(1);              //延時
           RES=0;                 //復位
           delay(1);              //延時
           RES=1;                 //復位置高
           delay(10);

           TransferData(0x36,0);  //Extended Function Set RE=1:
extended instruction功能設置
           delay(100);            //大於100uS的延時程序
           TransferData(0x36,0);  //Extended Function Set:RE=1:
extended instruction set
           delay(37);             ////大於37uS的延時程序
           TransferData(0x3E,0);  //EXFUNCTION(DL=8BITS,RE=1,G=1)功能
設置
           delay(100);            //大於100uS的延時程序
           TransferData(0x01,0);  //CLEAR SCREEN清屏
           delay(100);            //大於100uS的延時程序
          }

/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void    main(void)
     {
         while(1)
            {
                  initina2();            //調用LCD顯示圖片(擴展)初始化
程序
  
          DisplayGraphic(pic2);  //顯示圖片2
          delayms(200);                   

          initinal();                    //調用LCD字庫初始化程序
          delay(100);            //大於100uS的延時程序
          lcd_mesg(IC_DAT);      //顯示中文漢字1
          delayms(240);
          delayms(240);
          
          initinal();                    //調用LCD字庫初始化程序
          delay(100);            //大於100uS的延時程序
          lcd_mesg(IC_DAT2);     //顯示中文漢字2
          delayms(240);
                  delayms(240);
                  initinal();  
        }
      }

/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void   lcd_mesg(unsigned char code *adder1)
{
        unsigned char i;
        TransferData(0x80,0);  //Set Graphic Display RAM Address設置
DDRAM地址,第一行
        delay(100);
        for(i=0;i<32;i++)
                {
                        TransferData(*adder1,1);        //傳輸數據
                        adder1++;
                }

        TransferData(0x90,0);  //Set Graphic Display RAM Address第二行
        delay(100);
        for(i=32;i<64;i++)
                {
                        TransferData(*adder1,1);
                        adder1++;
                }
}

/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void    TransferData(char data1,bit DI)  //傳送數據或者命令,當DI=0是,
傳送命令,當DI=1,傳送數據.
          {
            WRD=0;
            RS=DI;
            delay(1);
            P0=Convert(data1);
            E=1;
            delay(1);
            E=0;
           }

/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void    delayms(unsigned int n)            //延時10×n毫秒程序
                   {
                      unsigned int i,j;
                      for(i=0;i<n;i++)
                         for(j=0;j<2000;j++);
                   }

/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void    delay(unsigned int m)            //延時程序
                   {
                      unsigned int i,j;
                      for(i=0;i<m;i++)
                         for(j=0;j<10;j++);
                   }

/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void DisplayGraphic(unsigned char code *adder)
{

   int i,j;//*******顯示上半屏內容設置
   for(i=0;i<32;i++)              //
    {
      TransferData((0x80 + i),0); //SET  垂直地址 VERTICAL ADD
      TransferData(0x80,0);       //SET  水平地址 HORIZONTAL ADD
      for(j=0;j<16;j++)
       {
         TransferData(*adder,1);
         adder++;
       }
    }      
//***
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章