|
本帖最后由 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);
}
|
|