125008301 发表于 2008-4-16 16:29:33

[已解决]P196:关于LCD一段程序 难以明白

void define_char(byte flash *pc,byte char_code)
{
byte i,a;
a=(char_code<<3)|0x40;
for(i=0;i<8;i++)lcd_write_byte(a++,*pc++)
}

/*********这段程序我想了很久也想不明白,马潮老师能否详细解释一下啊*****************/【THANK YOU】

mljda 发表于 2008-4-16 17:40:49

void define_char(byte flash *pc,byte char_code)/*pc是指向flash空间的字节型指针*/
{
byte i,a;
a=(char_code<<3)|0x40; /* 应该是编号,换算成LCD的地址 */
for(i=0;i<8;i++)lcd_write_byte(a++,*pc++) /* 输出字符,应为一般因为字符是8*8点阵所以输出8次 */
}
把PC指向的FLASH字符串对应的点阵数据,输出到LCD

a=(char_code<<3)|0x40;
左移3及把编号乘以8,则的字符每一列的地址
第0个字符起始地址 则LCD的地址0*8=0
第3个字符起始地址 则LCD的地址3*8=24

0x40--0b0100 0000表示这个是地址指令。要看什么LCD了。还有lcd_write_byte

125008301 发表于 2008-4-16 17:58:29

mljda 技术是人性------------------挺喜欢帮助人的 thankyou

machao 发表于 2008-4-16 21:04:38

LZ,本专栏是讨论AVR的专栏.你问的都是C的问题.建议你把基础的东西打牢固.

125008301 发表于 2008-4-16 21:20:21

马潮 老师啊 但是这个LCD的c涉及到硬件的问题啊 所以 真的看不明白 就算我看在学习的c语言书籍都是比较基础的 自从在这个论坛我问了问题之后啊 发觉自己懂了很多硬件配合软件的东西啊 但是我知道 有些人都同我一样有时里面的例子看不明啊 在学校没有人可以帮到我啊 所以 我将我的希望放到论坛上啊 所以马潮老师能体谅一下 我以后会注意点啊

bambooflute 发表于 2009-8-15 19:23:52

HD44780器件手册.pdf里有相应的显示RAM地址,能说明程序中0x40的作用。

http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_471175.jpg
LCD 16X2 显示RAM地址 (原文件名:char.jpg)

machao 发表于 2009-8-16 03:48:30

5楼解释是错的,上面的地址是显示地址DDRAM。

lcd_write_byte()是向CGRAM中写数据,(字符点阵数据),CGRAM的地址为0x40-0x7F!

http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_471393.jpg
(原文件名:未标题-2 拷贝.jpg)


在下面代码中
void define_char(byte flash *pc,byte char_code)
{
   byte i,a;
   a=(char_code<<3)|0x40;
   for(i=0;i<8;i++)lcd_write_byte(a++,*pc++)
}

char_code的值只能是0-7,左移3位是图中DB5、DB4、DB3,0x40是DB6。DB2、DB1、DB0从0-7,8个字节,放一个字符的点阵图。

===============================================
为什么不认真看HD44780手册?光盘中的资料难道没有用?代码只是是参考,是帮助学习和理解的。

bambooflute 发表于 2009-8-16 13:53:42

我错了,张冠李戴了,刚入门看datasheet没准心, 以后要更加认真看,避免这种错误!

http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_471456.jpg
CGRAM ADDRESS的说明 (原文件名:HD44780.pdf中CGRAM ADDRESS.jpg)

machao 发表于 2009-8-16 13:57:12

共64个字节放8个字符的点阵数据
页: [1]
查看完整版本: [已解决]P196:关于LCD一段程序 难以明白