4470|12

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

1602电子钟程序问题 [复制链接]

我准备做一个电子钟,源程序是网上下载的调试通过。但对于程序的某些地方不明白。忘各位前辈指教!!
//液晶字符输入的位置************************
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的芯片资料我看了很多地方还是难以理解!

要源程序的话留个言先!

最新回复

额,是7楼对了,刚才没看清呵呵  详情 回复 发表于 2009-8-24 09:42
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

  1. /**************
  2. LCD_Write()贴出来看看
  3. 好像1602第一行地址从0x80可以
  4. 第二行地址0x80+0x40

  5. void LcdXY(uchar y,uchar x)
  6. {
  7.     uchar addr;
  8.     addr=(y-1)*0x40+(x-1);
  9.     WriteCom(addr|0x80,1);
  10. }

  11. ***************/
复制代码
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

  1. //贴一个
  2. #include
  3. #include
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. uchar code    welcom[16]={"    Welcome!    "};
  7. uchar idata    timer[16]={"    22:55:33    "};
  8. uchar timecount;

  9. sbit RS=P1^0;
  10. sbit RW=P1^1;
  11. sbit EN=P1^2;

  12. bit timeflag;

  13. void delay(uint time)
  14. {
  15.     uint x,y;
  16.     for(x=time;x>0;x--)
  17.       for(y=112;y>0;y--);
  18. }

  19. bit LcdBusy(void)
  20. {
  21.     bit result;
  22.     EN = 0;
  23.     RS = 0;
  24.     RW = 1;
  25.     EN = 1;
  26.     _nop_();
  27.     _nop_();
  28.     _nop_();
  29.     _nop_();
  30.     result=(bit)(P2&0x80);
  31.     _nop_();
  32.     EN=0;
  33.     return result;
  34. }

  35. void WriteData(uchar Data)
  36. {
  37.     while(LcdBusy());
  38.     RS = 1;
  39.     RW = 0;
  40.     EN = 0;;
  41.     P2 = Data;
  42.     _nop_();
  43.     EN = 1;
  44.     _nop_();
  45.     EN = 0;
  46. }

  47. void WriteCom(uchar Com,bit test)
  48. {
  49.     if(test)
  50.       while(LcdBusy());
  51.     RS = 0;
  52.     RW = 0;
  53.     EN = 0;
  54.     P2 = Com;
  55.     _nop_();
  56.     EN = 1;
  57.     _nop_();
  58.     EN = 0;
  59. }

  60. void IntiLcd(void)
  61. {
  62.     delay(15);
  63.     WriteCom(0x38,0);
  64.     delay(5);
  65.     WriteCom(0x38,0);
  66.     delay(5);
  67.     WriteCom(0x38,0);
  68.     WriteCom(0x38,1);
  69.     WriteCom(0x08,1);
  70.   /*WriteCom(0x01,1);*/
  71.     WriteCom(0x06,1);
  72.     WriteCom(0x0c,1);
  73. }

  74. void LcdXY(uchar y,uchar x)
  75. {
  76.     uchar addr;
  77.     addr=(y-1)*0x40+(x-1);
  78.     WriteCom(addr|0x80,1);
  79. }

  80. void DisString(uchar *Matric)
  81. {
  82.     uchar i;
  83.     for(i=0;i<16;i++)
  84.       WriteData(Matric[i]);
  85. }

  86. void timer0(void)interrupt 1
  87. {
  88.     TH0 = (65536-50000)/256;
  89.     TL0 = (65536-50000)%256;

  90.     if(++timecount>=20)
  91.     {
  92.        timecount =0;
  93.        timeflag  =1;
  94.     }
  95. }

  96. void Watch(void)
  97. {
  98.      if(timeflag)
  99.        {
  100.           timeflag=0;
  101.           if(++timer[11]>=':')
  102.           {
  103.              timer[11]='0';
  104.              if(++timer[10]>='6')
  105.              {
  106.                 timer[10]='0';
  107.                 if(++timer[8]>=':')
  108.                  {
  109.                     timer[8]='0';
  110.                     if(++timer[7]>='6')
  111.                     {
  112.                        timer[7]='0';
  113.                        if(++timer[5]>=':')
  114.                        {
  115.                           timer[5]='0';
  116.                           timer[4]++;
  117.                        }
  118.                        if((timer[5]>='4')&&(timer[4]>='2'))
  119.                        {
  120.                           timer[5]='0';
  121.                           timer[4]='0';
  122.                        }
  123.                     }
  124.                  }  
  125.              }
  126.           }
  127.           LcdXY(2,1);
  128.           DisString(timer);
  129.        }
  130. }

  131. void Inti(void)
  132. {
  133.     TMOD = 0x01;
  134.     TH0  = (65536-50000)/256;
  135.     TL0  = (65536-50000)%256;
  136.     EA   = 1;
  137.     ET0  = 1;
  138.    
  139.     timecount =0;
  140.     timeflag  =0;
  141. }

  142. int main()
  143. {  
  144.     Inti();
  145.     IntiLcd();
  146.     LcdXY(1,1);
  147.     DisString(welcom);
  148.     LcdXY(2,1);
  149.     DisString(timer);
  150.     TR0=1;
  151.     while(1)
  152.     {
  153.        Watch();
  154.     }
  155.     return 0;
  156. }
复制代码
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
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();       
}
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用楼主 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();       
}
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
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,  明白了吗
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

7
 
不了解,帮顶
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
五楼前面讲对了,但后面理解错了。
减法运算转化成补码的加法运算,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第二行的显示地址。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
帮顶
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 5 楼 wslxs2008 的回复:
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,? 明白了吗
谢谢,我明白了,向您学习!
 
 
 

回复

97

帖子

7

TA的资源

一粒金砂(初级)

11
 
引用 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第二行的显示地址。
你的意见我也采纳,现在终于对液晶的工作原理了解了!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

12
 
恩,五楼的说对了,领教
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

13
 
额,是7楼对了,刚才没看清呵呵
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表
  缈昏瘧锛�