打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ARM与网络音频(四):LCD12864

LCD12864编程学习

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

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

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

1 “A”字模图

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

2 “字模图

二:LCD12864字模软件的使用

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

三:lcd12864原理

 

 

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

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

 

 

四:LCD12864时序图:

 

软件流程图

 

 

写操作时序

 

读操作时序

 

 

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

 

 

 

 

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

注意对照时序图:

#include <reg52.h>                                                           //包含头文件
#include <intrins.h>
 
#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);
}
 
 
 
在主函数中调用即可。(这个初始化函数设定屏为文本格式)

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
LCD12864驱动程序
stm32驱动 LCD1602
基于51单片机的LCD1602四数据线驱动程序
红外遥控怎么做?看完这篇你该试试手
LCD1602液晶使用介绍
关于LCD的一点总结 -- water的学习笔记
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服