#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit Score_Select=P2^6;
sbit Time_Select=P2^7;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x80,0x40,0x00,0x76};//0-9数字,后面为". - 熄灯 H"
uchar msec;
unsigned char key_down=0;//键按下和松开状态指示,防止重复读取键值
/*****50msec定时器0中断*****/
void T0_int() interrupt 1
{
TH0=0x3c; //50ms定时
TL0=0xB0;
msec++;
}
/*****延时子程序*****/
void delay(uint t)
{
for(;t>0;t--);
}
/*--------------------------------------------------------*/
/*4*4矩阵键盘键值扫描程序 */
/*返回按键的数字值 */
/*--------------------------------------------------------*/
uchar key_scan(void)
{
uchar key,key_val;
P1=0xf0;//低位行线送低电平
key=P1;//读取高位列线电平
if(key!=0xf0)//是否有键按下
{
if(key_down==0)//之前没有按键按下
{
key_down=1;//置按键按下标志
delay(5000); //延时去抖动5ms
key=P1;//再读取高位列线电平
if(key!=0xf0)//确认有键按下
{
P1=0x0f;//高位列线拉低回送
key|=P1;//读取低位行线电平并与原高位列电平组合得到键扫描码
}
else
return 0xff;//按键干扰,返回无效按键键值
}
else
return 0xff;//按键按下未松开,返回无效按键键值
}
else
{
if(key_down==1) key_down=0;//键松开,清按键标志
return 0xff;//返回无效按键键值
}
switch(key)
{ //第一行按键
case 0xee:
key_val=1;
break;
case 0xde:
key_val=2;
break;
case 0xbe:
key_val=3;
break;
case 0x7e:
key_val=15;
break;
//第二行按键
case 0xed:
key_val=4;
break;
case 0xdd:
key_val=5;
break;
case 0xbd:
key_val=6;
break;
case 0x7d:
key_val=14;
break;
//第三行按键
case 0xeb:
key_val=7;
break;
case 0xdb:
key_val=8;
break;
case 0xbb:
key_val=9;
break;
case 0x7b:
key_val=13;
break;
//第四行按键
case 0xe7:
key_val=10;
break;
case 0xd7:
key_val=0;
break;
case 0xb7:
key_val=11;
break;
case 0x77:
key_val=12;
break;
default:
key_val=0xff;//无效按键键值
break;
}
return key_val;
}
main()
{
uchar sec,minute,hour;
char count_sec,count_minute,count_hour,count_pause;
uchar set_hour,set_minute,set_sec,set_count;
long set_count_time,temp;
int temp1;
uchar time_set,time_set_bit,time_disp,time[8];
uchar team,one_flash;
uchar score_set,inv;
int score_add,score[2];
uchar keyvalue;
uchar i;
team=0;
inv=0;
score_set=0;
score_add=0;
score[0]=score[1]=0;
time_set=time_set_bit=time_disp=0;
time[0]=time[1]=0;
msec=0;
sec=50;
minute=59;
hour=23;
count_sec=count_minute=count_hour=count_pause=0;
set_hour=set_minute=set_sec=set_count=set_count_time=0;
IT0=1;
EX0=1;
TMOD=0x11;
TH0=0x3C;
TL0=0xB0;
ET0=1;
TR0=1;
EA=1;
while(1)
{
keyvalue=key_scan();
switch(keyvalue)
{
case 15://Time Set
if(time_set==0){
time_set=1;//标志时钟设置
i=2;
time[i++]=hour/10;
time[i++]=hour%10;
time[i++]=minute/10;
time[i++]=minute%10;
time[i++]=sec/10;
time[i++]=sec%10;
}else if(time_set==1){
time_set=2;//标志计时设置
i=2;
time[i++]=set_hour/10;
time[i++]=set_hour%10;
time[i++]=set_minute/10;
time[i++]=set_minute%10;
time[i++]=set_sec/10;
time[i++]=set_sec%10;
}else if(time_set==2){
time_set=3;//标志倒计时设置
}else if(time_set>=3) time_set=0;//标志退出时间设置状态
time_set_bit=0;
break;
case 14://Score Set
score_set=1;
team^=1;
break;
case 13://OK Confirm
if(score_set)
{ score_set=0;
if(inv) score_add=~score_add+1;
score[team]+=score_add;
if(score[team]<0) score[team]=0;
score_add=0;
inv=0;
}
if(time_set==1)
{//时钟设置
time_set=0;//标志退出时间设置
time_disp=0;//标志时钟显示
hour=time[2]*10+time[3];
minute=time[4]*10+time[5];
sec=time[6]*10+time[7];
msec=0;
}
if(time_set==2)
{//计时设置
time_set=0;
time_disp=1;//标志计时显示
set_hour=time[2]*10+time[3];
set_minute=time[4]*10+time[5];
set_sec=time[6]*10+time[7];
set_count_time=set_hour*3600+set_minute*60+set_sec;
count_sec=count_minute=count_hour=0;
}
if(time_set==3)
{//倒计时设置
time_set=0;
time_disp=2;//标志倒计时显示
set_hour=time[2]*10+time[3];
set_minute=time[4]*10+time[5];
set_sec=time[6]*10+time[7];
set_count_time=(long)(set_hour)*3600+set_minute*60+set_sec;
count_sec=count_minute=count_hour=0;
}
break;
case 12://ESC Cancel
score_set=0;
score_add=0;
time_set=0;
break;
case 11://Point
count_pause^=1;
break;
case 10://+/- Add/Sub Point
inv^=1;
break;
case 0xFF:break;
default://Num key down
if(score_set)
{ score_add*=10;
score_add+=keyvalue;
}
if(time_set)
{ time[time_set_bit]=keyvalue;
time_set_bit++;
if(time_set_bit>=8) time_set_bit=0;
}
break;
}
if(msec>=20)
{
sec++;
if(count_pause==0) count_sec++;
msec-=20;
// interval_time++; //计算间隔+1秒
// if(key_hold==2) key_hold_sec++;//按键按下时间+1秒
}
//实时时钟计数
if(sec>=60)
{
minute++;
sec-=60;
}
if(minute>=60)
{
hour++;
minute-=60;
}
if(hour>=24)
{
hour=0;
}
//计时时钟
if(count_sec>=60)
{
count_minute++;
count_sec-=60;
}
if(count_minute>=60)
{
count_hour++;
count_minute-=60;
}
if(count_hour>=24)
{
count_hour=0;
}
if(msec%10==5) one_flash=0;
if(score_set && msec%10==0) one_flash=1;
if(score_set && one_flash && team==0 ) i=4;
else{
i=0;
P0=table[1];
P2=i;
Score_Select=1;
delay(250);
Score_Select=0;
i++;
P0=table[score[0]/100];
P2=i;
Score_Select=1;
delay(250);
Score_Select=0;
i++;
P0=table[(score[0]%100)/10];
P2=i;
Score_Select=1;
delay(250);
Score_Select=0;
i++;
P0=table[(score[0]%100)%10];
P2=i;
Score_Select=1;
delay(250);
Score_Select=0;
i++;
}
if(score_set && one_flash && team==1 ) i=8;
else{
P0=table[2];
P2=i;
Score_Select=1;
delay(250);
Score_Select=0;
i++;
P0=table[score[1]/100];
P2=i;
Score_Select=1;
delay(250);
Score_Select=0;
i++;
P0=table[(score[1]%100)/10];
P2=i;
Score_Select=1;
delay(250);
Score_Select=0;
i++;
P0=table[(score[1]%100)%10];
P2=i;
Score_Select=1;
delay(250);
Score_Select=0;
i++;
}
if(time_set==0)
{
if(time_disp==0 )
{//时钟显示数据计算
i=2;
time[i++]=hour/10;
time[i++]=hour%10;
time[i++]=minute/10;
time[i++]=minute%10;
time[i++]=sec/10;
time[i++]=sec%10;
}else if(time_disp!=0xff)
{//计时显示数据计算
temp=set_count_time-(count_hour*3600+count_minute*60+count_sec);
if(set_count_time && temp<0) time_disp=0xff;//计时显示终止
if(time_disp==1)
{//无计时上限或未到达计时上限
i=2;
time[i++]=(count_hour)/10;
time[i++]=(count_hour)%10;
time[i++]=(count_minute)/10;
time[i++]=(count_minute)%10;
time[i++]=(count_sec)/10;
time[i++]=(count_sec)%10;
}
if(time_disp==2)
{
i=2;
temp1=temp/3600;
time[i++]=(temp1)/10;
time[i++]=(temp1)%10;
temp=temp%3600;
temp1=temp/60;
time[i++]=(temp1)/10;
time[i++]=(temp1)%10;
temp1=temp%60;
time[i++]=(temp1)/10;
time[i++]=(temp1)%10;
}
}
}
for(i=0;i<8;i++)
{
P0=table[time[i]];
P2=i;
Tim
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
计分器.rar (15个子文件)
计分器
score.PWI 790B
score_uvopt.bak 55KB
score.OBJ 19KB
score.uvproj 13KB
score.c 8KB
score_uvproj.bak 0B
score 15KB
Last Loaded score.DBK 118KB
score.LST 23KB
score.M51 20KB
score.hex 8KB
score.uvopt 55KB
score.lnp 27B
score.DSN 118KB
score.plg 352B
共 15 条
- 1
资源评论
netflesh
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功