【课后练习】LaunchPad课后练习十一之LCD1602显示汉字详解

常见泽1   2012-6-4 14:17 楼主

课后练习十一之LCD1602显示汉字详解

1. 液晶显示中的DDRAMCGROMCGRAM的作用(部分来源于网络)

DDRAM显示用ram,直接和屏幕上的点相对应.屏幕上的一个点和ddram中的一个位对应,字符屏的ddram和图形屏的ddram有一点点区别。

第一行的内容对应DDRAM80H8FH内容

第二行的内容对应DDRAMC0HCFH内容

2.jpg

 

CGROM 中存储了一些标准的  字符的字模编码,是液晶屏出厂时固化在控制芯片中的,用户不能改变其中的存储内容,只能读取调用,包含有标准的ASCII码、日文字符和希腊文字符

 

CGRAM 是控制芯片留给用户,用以存储用户自己设计的字模编码。为了便于理解,可以如下打一比方:CGROMCGRAM中存储的字模信息相当于厨房中的食品,CGROM是厨房中现成的熟食,CGRAM是用户自行制作的菜肴,这些食品都要通过托盘转移一下,才能送到餐桌上食用;类似的字模编码都要先被读取到对应的DDRAM中,经如上中转以后,屏幕的相应位置才显示出字符。对于字符屏,要显示某个字符时,往ddram里写字符的索引(一般都是ascii码)就可以完成显示。比如你写0x38,则显示为数字8

(网上摘抄,写的很好!!!!!)

3.JPG

由上两条指令可知DDRAM地址(DB7赋值1),所以地址从0x80开始

                            可知CGRAM地址(DB6赋值1),所以地址从0x40开始

 

4.jpg

 

首先:我们要弄清楚一个概念,其实我们使用1602显示中文汉字,就是利用其内部的自定义字节空间,我们都知道LCD1602内部有一个64字节的自定义CGRAM、也、、、,这个64字节的CGRAM是给我们提供写入数据的,从我们上面介绍的可知,CGRAM的地址为0x40.所以当我们要写入数据时,要先写入一条地址命令 write_com(0x040);
然后把你要写入的数据通过写数据命令写入  write_dat(数据);

 

其次就是要把我们的自定义汉字、字符显示在LCD1602上了。、这个地址是从0x00开始,因为最多只能8个字符  write_dat(0x00—0x07

2. 取模

首先取得想要的中文或者图形的字模数组。通过字模软件不能直接提取5*8点阵的字模数据,可以通过手动提取的方法。如下图所示,对应一个字符显示区域。每8个字节,组成一个点阵数组。

5.JPG

 

3. 实验原理图与结果

1.jpg

 

20120602223643.jpg

 

课后练习十一之LCD1602显示汉字详解.pdf (454.8 KB)
(下载次数: 1172, 2012-6-4 14:17 上传)

 

 

 

 

 

 

 

回复评论 (32)

  1. /***********************************************
    **** LAUNCH PAD 学习之LCD显示汉字 ***
    **** MCU: MSP430G2452 ***
    **** 作者: 常见泽 ***
    **** ***
    **** ***
    **** 2012.06.02.21:08 ***
    **** 实验现象:LCD 2012年6月2日 ***
    **** ***
    **** P1.0~P1.7接LCD数据口 P2.0 P2.1 en rs ***
    ***********************************************/

    #include <msp430g2452.h>

    unsigned char table[] ={"0123456789"};
    unsigned char hanzi1[8]={0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02};//年
    unsigned char hanzi2[8]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x11};//月
    unsigned char hanzi3[8]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00};//日

    unsigned char num;


    void delay_1ms(void)
    {
    unsigned int i;
    for (i=0;i<1140;i++);
    }


    void delay_nms(unsigned int n)
    {
    unsigned int i=0;
    for (i=0;i<n;i++)
    delay_1ms();
    }


    void write_com(unsigned int com)
    {
    //lcdrs = 0;
    P2OUT&= 0xfd;
    P1OUT = com;
    delay_nms(5);
    //lcden = 1;
    P2OUT|= 0x01;
    delay_nms(5);
    P2OUT&= 0xfe;
    }

    void write_dat(unsigned int dat)
    {
    //lcdrs = 1;
    P2OUT |= 0x02;
    P1OUT = dat;
    delay_nms(5);
    //lcden=1;
    P2OUT|= 0x01;
    delay_nms(5);
    // lcden=0;
    P2OUT&= 0xfe;

    }
    void init()
    {
    write_com(0x38);//
    write_com(0x0f);//
    write_com(0x01);//
    write_com(0x06);//
    // write_com(0x07);//整屏移动
    delay_nms(10);

    }

    void CGRAM_LCD(unsigned char *hz,unsigned char temp)
    {
    unsigned char s;
    for(s=0;s<8;s++)
    {

    write_com(temp+s);

    write_dat(*(hz+s));
    }
    }
    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    P1DIR |= 0xff; // P1.2 output
    P2DIR |= 0xff;
    init();
    CGRAM_LCD(hanzi1,0x40);
    CGRAM_LCD(hanzi2,0x48);
    CGRAM_LCD(hanzi3,0x50);

    write_com(0x80);
    write_dat(table[2]);
    delay_nms(100);

    write_com(0x80+0x01);
    write_dat(table[0]);
    delay_nms(100);

    write_com(0x80+0x02);
    write_dat(table[1]);
    delay_nms(100);

    write_com(0x80+0x03);
    write_dat(table[2]);
    delay_nms(100);

    write_com(0x80+0x04);
    write_dat(0);
    delay_nms(100);

    write_com(0x80+0x06);
    write_dat(table[6]);
    delay_nms(100);

    write_com(0x80+0x07);
    write_dat(1);
    delay_nms(100);

    write_com(0x80+0x09);
    write_dat(table[2]);
    delay_nms(100);

    write_com(0x80+0x0a);
    write_dat(2);
    while(1);
    }
点赞  2012-6-4 14:17
这个必须支持!
正着点1602呢  
被楼主抢前面了
点赞  2012-6-4 20:08

回复 板凳 柠檬酸钠 的帖子

没事 可以继续发的 每个人的规范不一样嘛 加油
点赞  2012-6-5 08:47
点赞  2012-6-5 14:09

回复 5楼 鑫海宝贝 的帖子

多谢鑫海兄弟
点赞  2012-6-5 15:29
请问楼主老兄!LaunchPad到屏的硬件连接能不能贴一下!非常感谢!
点赞  2012-6-9 16:50

回复 7楼 乌合之众 的帖子

上面i贴了的哇在传给你下 上面标的就是lauchpad管脚

 

111.jpg

点赞  2012-6-9 17:04

子曰:学而不厌,诲人不倦!
点赞  2012-6-9 17:19
不错 顶啊
点赞  2012-6-9 22:15

回复 9楼 最美的太阳 的帖子

一起努力 哈哈
点赞  2012-6-10 09:34

回复 10楼 ljjiayou 的帖子

谢谢啊
点赞  2012-6-10 09:35
显示汉字还真没试过,好好学习喽
点赞  2012-6-10 13:02

回复 13楼 董宝君 的帖子

是啊,之前都不知道1602还能显示汉字。。。肤浅了。楼主给力!!!哈哈
点赞  2012-6-11 10:31
很有用的内容,谢谢。
点赞  2012-6-11 11:44

回复 15楼 ceec 的帖子

更多的花样 还要靠你挖掘的哇 期待你的大作
点赞  2012-6-11 17:02
1602 需要用3.3v的吗?
点赞  2012-6-28 10:10
显示汉字 学习下
点赞  2012-6-28 11:50

回复 17楼 yagesi104 的帖子

看看我的原理图  我用的是5V的
我看看看我的液晶手册 电压是4-5v
点赞  2012-6-28 12:22

回复 17楼 yagesi104 的帖子

3.3V可以跑,我用stm32接过1602,当时就是3.3V供电。
点赞  2012-6-28 14:11
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复