本帖最后由 ethanshen 于 2018-5-26 15:27 编辑
如何用光电开关计数并用LCD1602显示,求大神们指教
下面是我写的程序,希望大家帮我看一下,很急!!!!!!
不知道为什么,总是第一下显示,后面就不显示了,我用的是STC89C52
希望大神能帮我改改这个程序,我是一个初学者,我已经看了好几天了,还是找不出问题,谢谢了!!!!!!
补充:我是用这个来计算硬币的个数的
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^4;
sbit led1=P1^0;
uint num;
unsigned char code table1[]={"Coins total:"};
uchar code smgduan[]= {0x3f, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
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;
RW = 1;
do
{
EN = 1;
busy = P0;
EN = 0;
}while(busy & 0x80);
}
void Write_Cmd(uchar cmd) //写LCD1602命令一个字节
{
Read_Busy();
RS = 0;
RW = 0;
P0 = cmd;
EN = 1;
EN = 0;
}
void Write_Dat(uchar dat)//写一个字节数据
{
Read_Busy();
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
EN = 0;
}
void display_digit(uchar d)//显示数字
{
uchar bai,shi,ge;
bai=d/100;
shi=d%100/10;
ge=d%10;
Write_Dat(bai+'0');
Write_Dat(shi+'0');
Write_Dat(ge+'0');
while(1);
}
//X代表0-40地址;Y:0代表第一行,1代表第二行;str代表字符串
void display_char(uchar x, uchar y, uchar *str)//显示字符串
{
if(y) x |= 0x40;
x |= 0x80;
Write_Cmd(x);
while(*str!='\0')
{
Write_Dat(*str++);
}
}
void LCD1602Init() //初始化
{
Write_Cmd(0x38);//设置16*2显示
Write_Cmd(0x0f);//开显示 显示光标,光标闪烁
Write_Cmd(0x06);//地址指针移位命令
Write_Cmd(0x01); //清屏
}
//定时器0初始化
void timer0Init()
{
EA=1;
ET0=1;
TR0 = 1;
TMOD |= 0X01;
TH0 =0Xed;
TL0 =0Xff;
}
void main()
{
LCD1602Init();
display_char(0,0,&table1[0]);
while(1)
{
if(led1==0)
{
delay(20);
if(led1==0)//检测P1^0的低电平,若是,则num加一
{
num++;
while(!led1);
}
}
}
}
void timer0() interrupt 1
{
TH0=0Xed;
TL0=0Xff;
display_digit(num);
}
|