找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1689|回复: 5
打印 上一主题 下一主题
收起左侧

LCD秒表 谁能帮我看看这个程序有错误 就差一点实现不了

[复制链接]
回帖奖励 15 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:433060 发表于 2018-12-6 20:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define delaynop(){_nop_;_nop_;_nop_;_nop_;}
sbit LCD_RS = P2^0;  //寄存器选择(RS=0,命令寄存器;RS=1,数据寄存器)            
sbit LCD_RW = P2^1;  //读写端(RW=1,读;RW=0,写)
sbit LCD_EP = P2^2;

void delay(int ms)
  {                    //延时子程序
     int i;
      while(ms--)
       {
           for(i = 0; i< 120; i++) ;

          }
          }

/****************查忙函数************************/   
  bit lcd_bz()
    {                        
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EP = 1;
     _nop_();
     _nop_();                                                  
     _nop_();
     _nop_();
     result = (bit)(P0 & 0x80);  //检测P0最高位是否为1
     LCD_EP = 0;
     return result;//返回查忙结果
    }

/****************写命令函数************************/  
void lcd_wcmd(uchar cmd)
{                          // 写入指令数据到LCD
         while(lcd_bz());
          LCD_RS = 0;
         LCD_RW = 0;
         LCD_EP = 0;
         _nop_();
         _nop_();
         P0 = cmd; //将8位指令通过P0口传给1602
         _nop_();
         _nop_(); //用于产生一个脉冲宽度
         _nop_();
         _nop_();
         LCD_EP = 1;
        _nop_();
        _nop_();
        _nop_();
         _nop_();
         LCD_EP = 0;  
         }
/*****设定显示位置***********/        
     void lcd_pos(uchar pos)
     {                        
       lcd_wcmd(pos | 0x80);
      }

/****************写数据函数************************/  
   void lcd_wdat(uchar dat)
     {                   //写入字符显示数据到LCD
       while(lcd_bz());
       LCD_RS = 1;
       LCD_RW = 0;
       LCD_EP = 0;
       P0 = dat;  //将8位数据通过P0口传给1602
       _nop_();
       _nop_();   //用于产生一个脉冲宽度
        _nop_();
       _nop_();
        LCD_EP = 1;
       _nop_();
       _nop_();
        _nop_();
        _nop_();
       LCD_EP = 0;
        }
  /*******LCD初始化设定*********/         
      void lcd_init()
      {                  
        lcd_wcmd(0x38);     //16*2显示,5*7点阵,8位数据
        delay(1);
        lcd_wcmd(0x0c);     //显示开,关光标
        delay(1);
        lcd_wcmd(0x06);     //移动光标
        delay(1);                                                     
        lcd_wcmd(0x01);     //清除LCD的显示内容
        delay(1);
         }


sbit k1=P1^0;
sbit k2=P1^1;

uchar keycount=0;
uchar code msg1[]={"second watch 0"};
uchar code msg2[]={">>>>         "};
uchar code prompts[][16]={
{"::1---->      "},
{"::1---->::2"   },
{"::1->2::3-->  "},
{"::1->2::3-->4 "},
};
uchar time_buffer[]={0,0,0,0};
uchar LCD_display_buffer[]={"00:00:00:00"};


void show_second()
{
uchar i;
lcd_pos(0x45);
for(i=3;i!=0xff;i--)
{
LCD_display_buffer[2*i+1]=time_buffer[i]/10+'0';
LCD_display_buffer[2*i]=time_buffer[i]%10+'0';
lcd_wdat(LCD_display_buffer[2*i+1]);
lcd_wdat(LCD_display_buffer[2*i]);
lcd_wdat(":");
}
}

void time0() interrupt 1 using 0
{
TH0=-10000/256;
TL0=-10000%256;
time_buffer[0]++;
if (time_buffer[0]==100)
{
time_buffer[0]=0;
time_buffer[1]++;
}

if (time_buffer[1]==60)
{
time_buffer[1]=0;
time_buffer[2]++;
}

if (time_buffer[2]==60)
{
time_buffer[2]=0;
time_buffer[3]++;
}

if (time_buffer[3]==24)
{
time_buffer[3]=0;
}
}


  void display_string(uchar * str,uchar lineno)       
{
uchar k;
lcd_pos(lineno);
for(k=0;k<16;k++)
lcd_wdat(str[k]);
}

void main()
{
uchar i;
IE=0X82;
TMOD=0X01;
TH0=-10000/256;
TL0=-10000%256;
lcd_init();
display_string(msg1,0x00);
display_string(msg2,0x40);
EA=1;
ET0=1;
while(1)
{
if(k1==0)
{
delay(100);
i=++keycount;
switch(i)
{
case1:
case3:TR0=1;
       display_string(prompts[i-1],0);
           break;
case2:
case4:TR0=0;
       display_string(prompts[i-1],0);
           break;
           default:TR0=0;
           break;
}
while(k1==0);
}
else
if(k2==0)
{
TR0=0;
keycount=0;
for(i=0;i<4;i++)
time_buffer[i]=0;
display_string(msg1,0);
delay(100);
while(k2==0);
}
show_second();
}               
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:441271 发表于 2018-12-6 21:49 | 只看该作者
我只是来赚黑币而已,这个程序好长,没时间看完,不过感觉TH0=-10000/256;这个怪怪的,为什么是负的。。
回复

使用道具 举报

板凳
ID:155507 发表于 2018-12-6 23:05 | 只看该作者
给你改了,对比一下就知道哪里错了。



  1. #include<reg51.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. #define delaynop() {_nop_;_nop_;_nop_;_nop_;}

  6. sbit LCD_RS = P2^0;  //寄存器选择(RS=0,命令寄存器;RS=1,数据寄存器)            
  7. sbit LCD_RW = P2^1;  //读写端(RW=1,读;RW=0,写)
  8. sbit LCD_EP = P2^2;

  9. void delay(int ms)
  10. {                    //延时子程序
  11.         int i;
  12.         while(ms--)
  13.         {
  14.                 for(i = 0; i< 120; i++) ;

  15.         }
  16. }

  17. /****************查忙函数************************/   
  18. bit lcd_bz()
  19. {                        
  20.         bit result;
  21.         LCD_RS = 0;
  22.         LCD_RW = 1;
  23.         LCD_EP = 1;
  24.         _nop_();
  25.         _nop_();                                                  
  26.         _nop_();
  27.         _nop_();
  28.         result = (bit)(P0 & 0x80);  //检测P0最高位是否为1
  29.         LCD_EP = 0;
  30.         return result;//返回查忙结果
  31. }

  32. /****************写命令函数************************/  
  33. void lcd_wcmd(uchar cmd)
  34. {                          // 写入指令数据到LCD
  35.         while(lcd_bz());
  36.         LCD_RS = 0;
  37.         LCD_RW = 0;
  38.         LCD_EP = 0;
  39.         _nop_();
  40.         _nop_();
  41.         P0 = cmd; //将8位指令通过P0口传给1602
  42.         _nop_();
  43.         _nop_(); //用于产生一个脉冲宽度
  44.         _nop_();
  45.         _nop_();
  46.         LCD_EP = 1;
  47.         _nop_();
  48.         _nop_();
  49.         _nop_();
  50.         _nop_();
  51.         LCD_EP = 0;  
  52. }
  53. /*****设定显示位置***********/        
  54. void lcd_pos(uchar pos)
  55. {                        
  56.         lcd_wcmd(pos | 0x80);
  57. }

  58. /****************写数据函数************************/  
  59. void lcd_wdat(uchar dat)
  60. {                   //写入字符显示数据到LCD
  61.         while(lcd_bz());
  62.         LCD_RS = 1;
  63.         LCD_RW = 0;
  64.         LCD_EP = 0;
  65.         P0 = dat;  //将8位数据通过P0口传给1602
  66.         _nop_();
  67.         _nop_();   //用于产生一个脉冲宽度
  68.         _nop_();
  69.         _nop_();
  70.         LCD_EP = 1;
  71.         _nop_();
  72.         _nop_();
  73.         _nop_();
  74.         _nop_();
  75.         LCD_EP = 0;
  76. }
  77. /*******LCD初始化设定*********/         
  78. void lcd_init()
  79. {                  
  80.         lcd_wcmd(0x38);     //16*2显示,5*7点阵,8位数据
  81.         delay(1);
  82.         lcd_wcmd(0x0c);     //显示开,关光标
  83.         delay(1);
  84.         lcd_wcmd(0x06);     //移动光标
  85.         delay(1);                                                     
  86.         lcd_wcmd(0x01);     //清除LCD的显示内容
  87.         delay(1);
  88. }


  89. sbit k1=P1^0;
  90. sbit k2=P1^1;

  91. uchar keycount=0;
  92. uchar code msg1[]={"second watch 0"};
  93. uchar code msg2[]={">>>>         "};
  94. uchar code prompts[][16]={
  95.         {"::1---->      "},
  96.         {"::1---->::2"   },
  97.         {"::1->2::3-->  "},
  98.         {"::1->2::3-->4 "},
  99. };
  100. uchar time_buffer[]={0,0,0,0};
  101. uchar LCD_display_buffer[]={"00:00:00:00"};


  102. void show_second()
  103. {
  104.         uchar i;
  105.         lcd_pos(0x45);
  106.         for(i=3;i!=0xff;i--)
  107.         {
  108.                 LCD_display_buffer[2*i+1]=time_buffer[i]/10+'0';
  109.                 LCD_display_buffer[2*i]=time_buffer[i]%10+'0';
  110.                 lcd_wdat(LCD_display_buffer[2*i+1]);
  111.                 lcd_wdat(LCD_display_buffer[2*i]);
  112.                 lcd_wdat(':');
  113.         }
  114. }

  115. void time0() interrupt 1 using 0
  116. {
  117.         TH0=-10000/256;
  118.         TL0=-10000%256;
  119.         time_buffer[0]++;
  120.         if (time_buffer[0]==100)
  121.         {
  122.                 time_buffer[0]=0;
  123.                 time_buffer[1]++;
  124.         }

  125.         if (time_buffer[1]==60)
  126.         {
  127.                 time_buffer[1]=0;
  128.                 time_buffer[2]++;
  129.         }

  130.         if (time_buffer[2]==60)
  131.         {
  132.                 time_buffer[2]=0;
  133.                 time_buffer[3]++;
  134.         }

  135.         if (time_buffer[3]==24)
  136.         {
  137.                 time_buffer[3]=0;
  138.         }
  139. }


  140. void display_string(uchar * str,uchar lineno)        
  141. {
  142.         uchar k;
  143.         lcd_pos(lineno);
  144.         for(k=0;k<16;k++)
  145.         lcd_wdat(str[k]);
  146. }

  147. void main()
  148. {
  149.         uchar i;
  150.        
  151.         IE=0x82;
  152.         TMOD=0x01;
  153.         TH0=-10000/256;
  154.         TL0=-10000%256;
  155.         lcd_init();
  156.         display_string(msg1,0x00);
  157.         display_string(msg2,0x40);
  158.         EA=1;
  159.         ET0=1;
  160.         while(1)
  161.         {
  162.                 if(k1==0)
  163.                 {
  164.                         delay(100);
  165.                         i=++keycount;
  166.                         switch(i)
  167.                         {
  168.                         case 1:
  169.                         case 3: TR0=1;
  170.                                 display_string(prompts[i-1],0);
  171.                                 break;
  172.                         case 2:
  173.                         case 4: TR0=0;
  174.                                 display_string(prompts[i-1],0);
  175.                                 break;
  176.                         default:TR0=0;
  177.                                 break;
  178.                         }
  179.                         while(k1==0);
  180.                 }
  181.                 else
  182.                 if(k2==0)
  183.                 {
  184.                         TR0=0;
  185.                         keycount=0;
  186.                         for(i=0;i<4;i++)
  187.                         time_buffer[i]=0;
  188.                         display_string(msg1,0);
  189.                         delay(100);
  190.                         while(k2==0);
  191.                 }
  192.                 show_second();
  193.         }               
  194. }


复制代码
回复

使用道具 举报

地板
ID:433060 发表于 2018-12-7 15:27 来自手机 | 只看该作者
一样的呀
回复

使用道具 举报

5#
ID:433060 发表于 2018-12-7 16:01 | 只看该作者

懂了 懂了 谢谢
回复

使用道具 举报

6#
ID:433060 发表于 2018-12-7 16:07 | 只看该作者
管理员  删了帖子吧
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表