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