像這個好像是數碼管顯示的,怎么改成LCD1602顯示啊,有人幫改一下代碼嗎?
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit Key_up=P3^4; //分鐘調節按鍵+
sbit Key_down=P3^5; //分鐘調節按鍵-
sbit Key_enter=P3^6;//開始、暫停按鍵
sbit Key_esc=P3^7; //清除按鍵
sbit beep=P2^3; //蜂鳴器
sbit wela=P2^7; //位鎖存器
sbit dula=P2^6; //段鎖存器
uint cnt,min,sec; //中斷計數、分、秒
bit flag; //開始位
uchar dsp[6]; //數碼管內容
uchar dsp_du[17]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c ,
0x39 , 0x5e , 0x79 , 0x71 , 0x00};//段編碼
uchar dsp_we[6]={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf};//位編號
//延時
void delay(uint z)
{
uint t1,y;
for(t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
//鍵盤控制
void key()
{
if(!Key_up) //向上
{
delay(200);
if(!Key_up) min++;
min=min%100;
}
if(!Key_down) //向下
{
delay(200);
if(!Key_down) min--;
min=min%100;
}
if(!Key_enter) //開始位
{
delay(50);
if(!Key_enter) flag=~flag;
while(!Key_enter);
}
if(!Key_esc) //停止位
{
flag=0;
min=0;
sec=0;
}
}
void run()
{
if(cnt>199) //秒計數
{
cnt=0;
if(sec==0) //分鐘計數
{
sec=60;
if(min==0) //分鐘復位
{
min=100;
flag=0; //停止運行
beep=0;//響聲提示
delay(2000);
beep=1;
}
min--;
}
sec--;
}
}
//定時器初始化
void init()
{
TMOD=0x11;
TR0=1; //啟動定時器0
ET0=1; //打開定時器0中斷
TR1=1; //啟動定時器1
ET1=1; //打開定時器1中斷
TH1=0xfd; //寫入定時器1初始值
TL1=0x77;
TH0=0xee;
TL0=0;
EA=1; //打開總中斷
min=20; //預置時間
}
//主函數
void main()
{
init();
while(1)
{
if(flag)
{run();}
key();
//數字拆分成個位和十位
dsp[0]=min/10;
dsp[1]=min%10;
dsp[2]=sec/10;
dsp[3]=sec%10;
}
}
//定時器0,用于計時
timer0() interrupt 1 // 定時器0中斷是1號
{
TH0=0xee; //5ms
TL0=0;
cnt++;
}
//定時器1,用于LED動態掃描
timer1() interrupt 3 // 定時器1中斷是3號
{
uchar wei; //數碼管顯示位計數
TH1=0xf0; //定時器初始值
TL1=0x00;
wela=1;
P0=dsp_we[wei];
wela=0;
dula=1;
P0=dsp_du[dsp[wei]];
if(wei==1) P0=P0|0x80; //第二位加點
dula=0;
wei++;
wei=wei%4;
}
|