dreamed_star 2023-11-12 21:51 采纳率: 33.3%
浏览 11

51单片机LCD秒表显示问题

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


```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;
  }
}


```

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-13 08:50
    关注

    【相关推荐】




    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月12日

悬赏问题

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