这篇文章是为了昨天一位博主准备的,因为我结题了,十分抱歉,今天重发以下
这是代码要求,附上原理图
以下是我写的代码,功能没有完全实现:
#include<reg52.h>
#define KeyPort P3
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
u8 minute,second; //定义分秒
u8 count = 0;
bit UpdateTimeFlag; //定义读时间标志
u8 code smg[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 显示段码值0~9
unsigned char TempData[8],Key_Num;
void delay(u8 i);
void display(); //数码管显示函数
void KeyScan(); //按键扫描
void Init_Timer0(void);//定时器初始化
void main (void)
{
Init_Timer0();
while (1) {
KeyScan();
if(count==1) {
switch(Key_Num) {
case 2:
minute++;
if(minute==60)minute=0;
Key_Num=0;
break;
case 3:
minute--;
if(minute==255)minute=59;
Key_Num=0;
break;
default:
break;
}
}
if(count==2) {
switch(Key_Num) {
case 2:
second++;
if(second==60)second=0;
Key_Num=0;
break;
case 3:
second--;
if(second==255)second=59;
Key_Num=0;
break;
default:
break;
}
}
TempData[0]=smg[minute/10];//分
TempData[1]=smg[minute%10];
TempData[2]=smg[second/10];//秒
TempData[3]=smg[second%10];
display();
}
}
void delay(u8 i) {
while(i--);
}
void display()
{
u8 i=0;
for(i=0; i<8; i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(7):
LSA=0;
LSB=0;
LSC=0;
break;//显示第0位
case(6):
LSA=1;
LSB=0;
LSC=0;
break;//显示第1位
case(5):
LSA=0;
LSB=1;
LSC=0;
break;//显示第2位
case(4):
LSA=1;
LSB=1;
LSC=0;
break;//显示第3位
case(3):
LSA=0;
LSB=0;
LSC=1;
break;//显示第4位
case(2):
LSA=1;
LSB=0;
LSC=1;
break;//显示第5位
case(1):
LSA=0;
LSB=1;
LSC=1;
break;//显示第6位
case(0):
LSA=1;
LSB=1;
LSC=1;
break;//显示第7位
}
P0=TempData[i]; //发送段码
delay(100); //间隔一段时间扫描
P0=0x00; //消隐
///delay(1000);
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
static unsigned int num,i;
u8 j;
TH0=(65536-2000)/256; //赋值 2ms
TL0=(65536-2000)%256;
i++;
if(i==10) //20ms更新一次
{
i=0;
UpdateTimeFlag=1; //更新时间志位置1
}
num++;
if(num==500) //1s
{
num=0;
if(count==0) {
if(minute!=0||second!=0) {
if(minute!=0&&second==0) {
second--;
if(second==255){
second=59;
minute--;
}
second--;
j++;
if(j==60) {
j=0;
if(minute > 0) {
minute--;
}
}
}
if(minute==0&&second!=0) {
second--;
}
if(minute!=0&&second!=0) {
second--;
if(second==255) {
minute--;
second=59;
}
second--;
j++;
if(j==60) {
if(minute > 0) {
minute--;
}
}
}
}
}
}
}
void KeyScan()
{
if(k1==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k1==0) //再次判断按键是否按下
{
Key_Num=1;
}
while(!k1); //检测按键是否松开
count++;
}
if(count==3)count=0; //复位操作数字
if(k2==0)
{
delay(1000);
if(k2==0)
{
Key_Num=2;
}
while(!k2);
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
Key_Num=3;
}
while(!k3);
}
if(k4==0)
{
delay(1000);
if(k4==0)
{
Key_Num=4;
}
while(!k4);
}
}