半日浮生的笔记 https://passport2.21ic.com/?897983 [收藏] [复制] [RSS]

日志

1602学习中关于自定义字符的疑问

已有 594 次阅读2012-11-28 01:53 |系统分类:单片机

最近学习1602中关于自定义字符中还有一些疑问,写出来希望大家能讨论下也同时帮我解决下。。。


下面是一个程序:


#include<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~


路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

发表评论 评论 (2 个评论)

回复 xlhtracy 2012-11-28 03:01
可以到论坛交流 那边大虾很多
回复 半日浮生 2012-11-28 06:16
哈哈。。问题【2】我又搞定啦,,,虽然是小问题,但还是很开心,很有成就感啊。。 其实, lcd_wdat(m);中的m指代的就是字符发生存储器(CGROM)中的0x00~0x0f的地址。还有我一开始错误的认为,P0='A',是把41h直接放到DDRAM中,其实不是的,它是先用41h在CGROM找到对应的点阵信息,然后才能显示的啊。。。。。。唉。。当浮一大白啊。。。O(∩_∩)O哈哈~。。