本帖最后由 半日浮生 于 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的资料。。 |