#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义独立按键控制脚
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 mode=0;
u8 DisplayData[8];
u16 num,num1;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : key_scan
* 函数功能 : 检测独立按键是否按下,按下则返回对应键值
* 输 入 : mode=0:单次扫描按键
mode=1:连续扫描按键
* 输 出 : KEY1_PRESS:K1按下
KEY2_PRESS:K2按下
KEY3_PRESS:K3按下
KEY4_PRESS:K4按下
KEY_UNPRESS:未有按键按下
*******************************************************************************/
u8 key_scan(u8 mode)
{
static u8 key=1;
if(mode)key=1;//连续扫描按键
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按键按下
{
delay_10us(1000);//消抖
key=0;
if(KEY1==0)
return 1;
else if(KEY2==0)
return 2;
else if(KEY3==0)
return 3;
else if(KEY4==0)
return 4;
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //无按键按下
{
key=1;
}
return 0;
}
void DigDisplay()
{
u8 i;
for(i=0;i<3;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=1;LSB=1;LSC=1; break;//显示第7位
case(1):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(2):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(3):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(4):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(5):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(6):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(7):
LSA=0;LSB=0;LSC=0; break;//显示第0位
}
P0=DisplayData[i];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void datapros()
{
DisplayData[1]=smgduan[num1/100 ];
DisplayData[2]=smgduan[num1/10%10];
DisplayData[3]=smgduan[num1%10 ];
DisplayData[4]=0x40;
DisplayData[5]=smgduan[num/100 ];
DisplayData[6]=smgduan[num/10%10];
DisplayData[7]=smgduan[num%10 ];
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 key=0;
while(1)
{
key=key_scan(0);
if(key==4)
{
mode++;
if(mode==2)
mode=0;
}
if(mode==0)
{
if(key==1)
{
num=num+1;
}
else if(key==2)
{
num=num+2;
}
else if(key==3)
{
num=num+3;
}
}
else
{
if(key==1)
{
num1=num1+1;
}
else if(key==2)
{
num1=num1+2;
}
else if(key==3)
{
num1=num1+3;
}
}
datapros();
DigDisplay();
}
}
篮球比赛计分器
最新推荐文章于 2024-02-09 02:15:48 发布