找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 845|回复: 3
收起左侧

那位大佬帮忙看看,这1602读数为啥不行啊

[复制链接]
ID:837156 发表于 2021-1-24 17:15 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include<intrins.h>       
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^7;
uchar t, i;
void delay(uint z)
{
        uint x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}

//判断液晶忙不忙,忙则等待 、
void read_busy()
{
        uchar busy;
        P0=0xff;        //给与高电位
        RS=0;                //1 数据 0命令
        RW=1;           //1 读 0写
        do
        {
                 EN=1;        //使能
                busy=P0;
                EN=0;
        }while(busy &0x80);
}
//1602命令
void write_cmd(uint cmd)
{
        read_busy();
        RS=0;
        RW=0;
        P0=cmd;
        EN=1;
        EN=0;
}
//1602 数据
void write_dat(uint dat)
{
        read_busy();
        RS=1;
        RW=0;
        P0=dat;
        EN=1;
        EN=0;
}
void timer_init()
{

        TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
        TH0=0XFC;        //给定时器赋初值,定时1ms
        TL0=0X68;       
        ET0=1;//打开定时器0中断允许
        EA=1;//打开总中断
        TR0=1;//打开定时器                       
}

void main()
{

        timer_init();
        write_cmd(0x38);//设置16*2显示
        write_cmd(0x0f); //开显示
        write_cmd(0x06); //指针地址右加一  0x04左
//        write_cmd(0x01); //清屏
        write_cmd(0x80|0x06 ); //显示地址
        write_cmd(0x01); //清屏         
        while(1);
        {
           if(t<1000)
           {
                        write_cmd(0x80 | 0x06);
                        write_dat(t/10+'0');
                                        //显示十位数字
                        write_cmd(0x80 | 0x07);
                                //显示个位数字
                        write_dat(t%10+'0');
                }
        }               
                  
}
void Timer0() interrupt 1
{

        TH0=0XFC;        //给定时器赋初值,定时1ms
        TL0=0X68;
        i++;
        if(i==1000)
        {
                i=0;
                t++;
        }
       
       
}

回复

使用道具 举报

ID:213173 发表于 2021-1-24 21:05 | 显示全部楼层
楼主注意变量的数据类型选择要恰当,while(1);多了分号。给你略改了一点,显示1位小数。 无标题.jpg

  1. #include<reg52.h>
  2. #include<intrins.h>        
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit RS=P2^6;
  6. sbit RW=P2^5;
  7. sbit EN=P2^7;
  8. uint i;
  9. uchar t;
  10. /*
  11. void delay(uint z)
  12. {
  13.         uint x,y;
  14.         for(x = z; x > 0; x--)
  15.                 for(y = 114; y > 0 ; y--);
  16. }*/
  17. //判断液晶忙不忙,忙则等待 、
  18. void read_busy()
  19. {
  20.         uchar busy;
  21.         P0=0xff;        //给与高电位
  22.         RS=0;                //1 数据 0命令
  23.         RW=1;           //1 读 0写
  24.         do
  25.         {
  26.                 EN=1;        //使能
  27.                 busy=P0;
  28.                 EN=0;
  29.         }while(busy &0x80);
  30. }
  31. //1602命令
  32. void write_cmd(uint cmd)
  33. {
  34.         read_busy();
  35.         RS=0;
  36.         RW=0;
  37.         P0=cmd;
  38.         EN=1;
  39.         EN=0;
  40. }
  41. //1602 数据
  42. void write_dat(uint dat)
  43. {
  44.         read_busy();
  45.         RS=1;
  46.         RW=0;
  47.         P0=dat;
  48.         EN=1;
  49.         EN=0;
  50. }
  51. void timer_init()
  52. {
  53.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
  54.         TH0=0XFC;        //给定时器赋初值,定时1ms
  55.         TL0=0X68;        
  56.         ET0=1;//打开定时器0中断允许
  57.         EA=1;//打开总中断
  58.         TR0=1;//打开定时器                        
  59. }

  60. void main()
  61. {
  62.         timer_init();
  63.         write_cmd(0x38);//设置16*2显示
  64.         write_cmd(0x01); //清屏
  65.         write_cmd(0x0c); //开显示不显示光标
  66.         write_cmd(0x06); //指针地址右加一  0x04左
  67. //        write_cmd(0x01); //清屏
  68. //        write_cmd(0x80|0x06 ); //显示地址

  69.         while(1)//;
  70.         {
  71.                 if(t>999)
  72.                         t=0;
  73.                 write_cmd(0x80+6);
  74.                 write_dat(t/100%10+'0');//显示十位数字
  75.                 write_dat(t/10%10+'0');//显示个位数字
  76.                 write_dat('.');                //显示小数点
  77.                 write_dat(t%10+'0');//显示小数
  78.         }
  79. }
  80. void Timer0() interrupt 1
  81. {
  82.         TH0=0XFC;        //给定时器赋初值,定时1ms
  83.         TL0=0X68;
  84.         i++;
  85.         if(i==100)
  86.         {
  87.                 i=0;
  88.                 t++;
  89.         }
  90. }
复制代码




回复

使用道具 举报

ID:390416 发表于 2021-1-24 21:18 | 显示全部楼层
单片机+LCD1602显示℃  http://www.51hei.com/bbs/dpj-200685-1.html
回复

使用道具 举报

ID:847443 发表于 2021-1-25 16:40 | 显示全部楼层
变量的数据类型选择要实型,还要注意语法。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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