高档加肥加大女装:ARM与网络音频(四):LCD12864

来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 23:02:25

LCD12864编程学习

一:LCD显示原理:点阵LCD的显示原理

     在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。

     那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:

图1 “A”字模图

     而中文的“你”在字模中的记载却如图2所示:

图2 “你”字模图

二:LCD12864字模软件的使用

字模zimo221.exe可以从网络上下载,在使用时需注意:选纵向取模和字节倒序及保留要选上。具体设置如下:

三:lcd12864原理

 

 

关键要注意下载其PDF文档使用手册

上图有助于理解LCD显示时的X,Y坐标的设置。

 

 

四:LCD12864时序图:

 

软件流程图

 

 

写操作时序

 

读操作时序

 

 

LCD12864的读写可以分为命令操作时序与数据操作时序

 

 

 

 

对照下面程序理解LCD12864的初始化

注意对照时序图:

#include                                                            //包含头文件
#include 
 
#define uchar unsigned char                            //简化整型,字符型变量书写
#define uint  unsigned int
 
#define LCD_data  P0                                              // 引脚定义
sbit LCD_RS  =  P2^2;      
sbit LCD_RW  =  P2^3;      
sbit LCD_EN  =  P2^4;      
sbit LCD_PSB =  P2^5;          
 
                                                             
 
void delay_ms(unsigned int ms)       //延时函数     1ms
{
               unsigned int i,j;
               for(j=0;j<=ms;j++)
               {
                               for(i=0;i<=120;i++)
                               {}
               }
}
                                                                                                             
void delay4us()                                                  //延时函数     4Us
{
               _nop_();
               _nop_();
               _nop_();
               _nop_();
}
 
 
 
void lcd_checkBusy(void)                              //检测忙标志
{                                                                                                                                                      
               unsigned char busy;
               do{
                               LCD_EN = 0;
                               LCD_RS = 0;
                               LCD_RW = 1;
                               delay4us();
                               LCD_EN = 1;       //在使能端的一个上升沿读取LCD数据
                               busy = P0;                                                            
                               delay4us();
                               LCD_EN = 0;
               }
               while(busy&0x80);       //判断最高位是否为0,为0则处于空闲状态
}
 
 
 
void lcd_wcmd(uchar cmd)               //写指令函数
{                          
    lcd_checkBusy();                        //检测忙碌状态
    LCD_RS = 0;                             //RS至低,指令操作
    LCD_RW = 0;                            //RW至低,写操作
    LCD_EN = 0;
    delay4us();
    P0 = cmd;                                   //指令数据
    delay4us();                                                                 
    LCD_EN = 1;                             //给使能端一个上升沿保存数据
    delay4us();
    LCD_EN = 0;  
}
 
 
 
void lcd_wdat(uchar dat)    //写数据函数
{ 
    lcd_checkBusy();            //检测忙碌状态     
    LCD_RS = 1;                                             //RS至高,数据操作
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;                                     //LCD要显示的数据
    delay4us();
    LCD_EN = 1;                                             //给使能端一个上升沿保存数据
    delay4us();
    LCD_EN = 0; 
}
 
 
 
void lcd_init()                        //初始化LCD
{ 
    LCD_PSB = 1;         //选择并行模式    
    lcd_wcmd(0x30);      //初级指令集
    delay_ms(5);
    lcd_wcmd(0x0C);      //开显示
    delay_ms(5);
    lcd_wcmd(0x01);      //清屏
    delay_ms(5);
}
 
 
 
在主函数中调用即可。(这个初始化函数设定屏为文本格式)