我准备做一个电子钟,源程序是网上下载的调试通过。但对于程序的某些地方不明白。忘各位前辈指教!!
//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x); //第二行
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40)); //第一行
}
问题:在以上函数中,LCD_COMMAND取1,X是取值12,但是12减0x40怎么?这是小减大啊!还有这个第一行第二行怎么决定的!关于1602的芯片资料我看了很多地方还是难以理解!
要源程序的话留个言先!
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}
引用: 引用楼主 westat1987 的回复:
我准备做一个电子钟,源程序是网上下载的调试通过。但对于程序的某些地方不明白。忘各位前辈指教!!
//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);? ? ? ? ? //第二行
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));? ? //第一行
}
问题:在以上函数中,LCD_COMMAND取1,X是取值12,但是12减0x40怎么?这是小减大啊!还有这个第一行第二行怎么决定的!关于1602的芯片资料我看了很多地方还是难以理解!
要源程序的话留个言先!
LCD_Write在这里!
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}
if(y==0) ,y=0或1是用来判断是向显示器的第一还是第二行写要显示的数据
LCD_Write(LCD_COMMAND,0x80|x); 而第一行的列地址是从0x80—0x8f,从左到右对应屏幕上每个位刚好16个, 0x80|x代表0x80+x,x为0到15的任一数
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
第二行就是0x40到0x4f,0x80|(x-0x40代表0x80+x-0x40,也就是0x40+x, 明白了吗
五楼前面讲对了,但后面理解错了。
减法运算转化成补码的加法运算,x-0x40=x+0xc0,所以0x80|(x-0x40)=0x80|(x+0xc0),实际上就等于0xc0|x,LCD_Write(LCD_COMMAND,0x80|(x-0x40))=LCD_Write(LCD_COMMAND,0xc0|x); 0xc0也就是LCD第二行的显示地址。
引用: 引用 7 楼 licsyhzs 的回复:
五楼前面讲对了,但后面理解错了。
减法运算转化成补码的加法运算,x-0x40=x+0xc0,所以0x80|(x-0x40)=0x80|(x+0xc0),实际上就等于0xc0|x,LCD_Write(LCD_COMMAND,0x80|(x-0x40))=LCD_Write(LCD_COMMAND,0xc0|x); 0xc0也就是LCD第二行的显示地址。
你的意见我也采纳,现在终于对液晶的工作原理了解了!