学习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++;
       }
    }      
//***
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章