打印

【已解决,呵呵】1602中自定义字符的学习疑问

[复制链接]
1605|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
半日浮生|  楼主 | 2012-11-28 10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 半日浮生 于 2012-11-28 14:30 编辑

最近学习1602中关于自定义字符中还有一些疑问,写出来希望大家能讨论下也同时帮我解决下。。。
下面是一个程序:
#i nclude<reg51.h>    //包含头文件,这个嘛,就不用多说了~~
#define uint unsigned int  //预定义一下
#define uchar unsigned char
sbit rs=P2^6;    //1602的数据/指令选择控制线
sbit rw=P2^5;        //1602的读写控制线
sbit en=P2^7;        //1602的使能控制线
uchar code table[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
                    0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
                    0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
                    0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
                    0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
                    0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
                    0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
                    0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心图案
/*uchar  code table1[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//字符℃ */
uchar code table2[]="LCD1602 check ok"; //要显示的内容1放入数组tablel
uchar code table1[]="study up";             //要显示的内容2放入数组table1
void delay(uint n)                              
{
    uint x,y;
    for(x=n;x>0;x--)
       for(y=110;y>0;y--);
}
void lcd_wcom(uchar com)                  
{
    rs=0;
    rw=0;
en=1;  
    delay(2);     
P0=com;   
    en=0;
}
void lcd_wdat(uchar dat)               
{
    rs=1;
    rw=0;
   en=1;
    delay(2);     
P0=dat;     
    en=0;
}
void lcd_init()                     
{
         lcd_wcom(0x38);            
         lcd_wcom(0x0c);           
         lcd_wcom(0x06);            
         lcd_wcom(0x01);            
}
void main()
{     
    char m=0;
    lcd_init();
   lcd_wcom(0x40);             //设定CGRAM地址 【1】
    for(m=0;m<64;m++)    //将心型代码写入CGRAM中
    {
            lcd_wdat(table[m]);           
    }
    lcd_wcom(0x85);        //设定上排的显示位置
    for(m=0;m<4;m++)        //显示心型图案的上半部分
    {
            lcd_wdat(m);       //【2】
    }
    lcd_wcom(0xc5);        //将显示坐标转移到下排和上排相对应的地方
    for(m=4;m<8;m++)        //显示心型图案的下半部分
    {
            lcd_wdat(m);
    }
    while(1);
}

以上的程序烧到单片机中能正常显示出一个心形图案,但就是上面画线的【1】【2】,我还有些不大明白。
【1】字模写入自定义字符的CGRAM数据地址是0x00-0x3f,怎么会是0x40呢?(那就看下写入到CGRAM中数据的指令格式吧,O(∩_∩)O哈哈~。。这个我是在写博文的时候突然想到了,以前把它给忽略了。。)
设定CGRAM地址指令


功能:设定下一个要存入数据的CGRAM的地址。
【2】、我是把P0口与1602的DB0-DB7连接在一起的,【2】中相当于直接把0~3直接送到P0,然后到1602的DR,  它如何把自定义的字符显示出来的呢?0~3是不是字符码?


希望懂的朋友们指点下,问题解决后,我也会把解决方法写出来,供其他人学习,O(∩_∩)O~


问题已经解决,我在上传个比较好的1602的资料。。

LCD1602液晶完整中文资料.pdf

344.18 KB

1602全过程C语言编程显示很全的哦.rar

1.2 MB

相关帖子

沙发
半日浮生|  楼主 | 2012-11-28 10:58 | 只看该作者
[img][/img]

使用特权

评论回复
板凳
ayb_ice| | 2012-11-28 11:13 | 只看该作者
多看几遍手册,自然明白了

搞清楚CGROM,CGRAM,DDRAM。。。。就明白了

使用特权

评论回复
地板
半日浮生|  楼主 | 2012-11-28 11:43 | 只看该作者
3# ayb_ice
其实第一个写入到地址0x40,我已经明白了,是指令格式的问题。DB7DB6必须为01的,但第二个还是不太明白。。

使用特权

评论回复
5
半日浮生|  楼主 | 2012-11-28 14:15 | 只看该作者
哈哈。。问题【2】我又搞定啦,,,虽然是小问题,但还是很开心,很有成就感啊。。

其实, lcd_wdat(m);中的m指代的就是字符发生存储器(CGROM)中的0x00~0x0f的地址。还有我一开始错误的认为,P0='A',是把41h直接放到DDRAM中,其实不是的,它是先用41h在CGROM找到对应的点阵信息,然后才能显示的啊。。。。。。唉。。当浮一大白啊。。。O(∩_∩)O哈哈~。。

使用特权

评论回复
6
hailin1530| | 2013-5-2 18:45 | 只看该作者
hhe 知道了 谢谢楼主

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:知其道,守其妙!

8

主题

93

帖子

0

粉丝