dreamed_star 2023-11-18 10:32 采纳率: 33.3%
浏览 14
已结题

51单片机LCD秒表显示问题

51单片机LCD秒表显示问题
为什么这段程序,在LCD上显示时,秒表部分显示这样的“000-010-020一直到595”就像这样,后面总会多一个和十位一样的数?


```c
 
```c
#include<reg52.h>
sbit LCD_RS=P2^6; //命令/数据选择
sbit LCD_RW=P2^5; //读写口
sbit LCD_EN=P2^7;  //锁存控制
#define uchar unsigned char
unsigned char m=5,n=5;
 
//延时函数
void delay7ms()
{
    long int i,j;
    for(i=0;i<1;i++)
    for(j=0;j<14;j++);
}
 
//x^y
int pow(int x,uchar y)
{
    int mi=1; 
    for(;y>0;y--)
    {
        mi*=x;
    }
    return mi;
}
 
//延时
void delay()
{
    uchar i,j;
    for(i=1;i>0;i--)
    for(j=250;j>0;j--);
}
 
//向LCD写指令
void LCD_write_cmd(uchar command)
{
    LCD_RS=0; //选择指令寄存器---写的是指令
    LCD_RW=0; //写--状态
    P0=command;  //写入命令--将指令赋给8位数据总线
    LCD_EN=1; //使能信号1
    delay(); //等待写入,如果时间太短,会导致液晶无法显示
    LCD_EN=0; //使能信号从1->0 下降沿有效 LCD执行写入命令
    delay();
}
 
//向LCD写数据
void LCD_write_data(uchar Data)
{
    LCD_RS=1; //选择数据寄存器,写数据
    LCD_RW=0; //写操作
    P0=Data; //将数据赋给8位数据总线DB0-DB7,
             //这里的P0为LCD上8位数据总线所连接的单片机IO端口
    LCD_EN=1; //使能端拉高
    delay();
    LCD_EN=0; //使能端拉低,下降沿有效,数据写入DDRAM
    delay();
}
 
//初始化
void LCD_Init()
{
    LCD_write_cmd(0x38); //指令--显示模式设置
    LCD_write_cmd(0x0c); //指令--显示光标开及光标设置
    LCD_write_cmd(0x06); //指令--显示光标移动设置
    LCD_write_cmd(0x01); // 指令--清屏
}
 
//LCD显示字符串
void LCD_dstr(uchar line,uchar column,uchar *str)
{
    if(line==1)
    {
        LCD_write_cmd(0x80|(column-1));
    }
    else
    {
        LCD_write_cmd(0x80|(column-1)+0x40);
    }
    while(*str!='\0')
    {
        LCD_write_data(*str++);
    }
}
 
//LCD显示整形数字
void LCD_dnum(uchar line,uchar column,int num,uchar length)
{
    uchar i;
    if(line==1)
    {
        LCD_write_cmd(0x80|(column-1));
    }
    else
    {
        LCD_write_cmd(0x80|(column-1)+0x40);
    }
    for(i=length;i>0;i--)
    {
        LCD_write_data('0'+num/pow(10,i-1)%10);
    }
}
 
//LCD显示字符
void LCD_dchar(uchar line,uchar column,uchar Char)
{
    if(line==1)
    {
        LCD_write_cmd(0x80|(column-1));
    }
    else
    {
        LCD_write_cmd(0x80|(column-1)+0x40);
    }
        LCD_write_data(Char);
}
 
 
void main()
{
    unsigned int j;
    
    //step1:TMOD确定工作方式
    TMOD = 0x01; //定时器0工作方式1
    
    //step2:计算初值(与定的时间有关,每隔50ms溢出)
  TH0 = (65536 - 50000)/256;//高四位初值
  TL0 = (65536 - 50000)%256;//低四位初值
    
    //step3:打开需要的中断
  EA = 1;        //开总允许中断
  ET0 = 1;       //开启T0溢出中断
    
    //step4:打开定时器
  TR0 = 1;       //开启定时器
    
    while(1)
    {
        uchar *ge,*shi,*str2;
        
        for(j=0;j<50;j++) 
        {
            uchar xin[]=" 2022210491 sdd ";
            uchar Dig_code[]="0123456789";
            uchar Dig[2]="  ";
            Dig[0] = Dig_code[n];
            Dig[1] = Dig_code[m];
            shi=&Dig[1];
            ge=&Dig[0];
            str2=&xin[0];
        LCD_Init();
        LCD_dstr(1,1,shi);
            LCD_dstr(1,2,ge);
        LCD_dstr(2,1,str2);
            }
    
    }
}
 
void ET0_ISR(void) interrupt 1       //定时0中断
{ 
  static unsigned int cnt = 0;    
 
  //初值重赋    
  TH0 = (65536-50000)/256;
  TL0 = (65536-50000)%256;
    
  cnt++;//溢出一次,+1 
  if(cnt >= 20)                     //当为1秒时+1
  {
    cnt = 0;
      n++;
        if(n>=10) 
        {
            m++; n=0;
        }
        if(m>=6) m=0;
  }
}
 
 

```

  • 写回答

3条回答 默认 最新

  • qq_29144129 2023-11-19 16:30
    关注

    LCD_dstr(1,1,shi);和LCD_dstr(1,2,ge);配合上LCD_dstr函数中的while(*str!='\0')有问题。Dig[0]是个位,Dig[1]是十位,Dig[2]是空,主函数里写显示的时候写LCD_dstr(1,1,ge);即可,while会直接显示Dig[0]个位和Dig[1]十位

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月1日
  • 已采纳回答 11月23日
  • 创建了问题 11月18日

悬赏问题

  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现
  • ¥15 有人会SIRIUS 5.8.0这个软件吗