像这个好像是数码管显示的,怎么改成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;
}
|