#include
#include
#define COM8279 XBYTE[0x5FFF] //使用外部存储器的方式访问8279 命令口和数据口
#define DATA8279 XBYTE[0x5EFF]
unsigned char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极键码unsigned char key;
sbit pb2=P1^1;
void init();
void check();
void delay(unsigned char);
void keyevent(unsigned char key);
void display();
unsigned char curr,ischanging,currinput; //当前时段的命令,1:修改模式0:计时、当前修改的位置
int count,sec,min,hour; //中断计数、秒、分、时
unsigned char time[11][4]={{0xFF,0x00,0x00,0x00},{0xFE,0x07,0x1E,0x00},
{0xFF,0x07,0x1E,0x0A},{0xFE,0x08,0x1E,0x00},{0xFF,0x08,0x1E,0x0a},
{0xFE,0x08,0x1E,0x00},{0xFF,0x09,0x1e,0x0a},{0xFE,0x09,0x14,0x00},
{0xFF,0x09,0x14,0x0a},{0xFE,0x09,0x28,0x00}, {0xFF,0x09,0x28,0x0a}};
void main(void)
{
init();
curr=0;
hour=7;
min=59;
sec=50;
COM8279=0x00; //8279初始化
COM8279=0x34; //分频参数设置
COM8279=0xDC; //清除显示RAM和FIFO
while(1) //程序主循环
{
P1=time[curr][0]; //不停执行当前时间段的事件
display(); //不停更新显示
}
}
void init() //系统初始化
{
TMOD=0x01; //定时器模式1选择
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1; //定时器中断
TR0=1; //定时器开启
EX1=1; //外部中断1开启
IT1=1; //选择外部中断1 边沿触发
EA=1; //中断总开关
}
void timer0() interrupt 1 //时钟中断50ms
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20) //50msX20=1 s
{
count=0;
sec++;
if(sec==60)
{
min++;
sec=0;
if(min==60)
{
hour++;
min=0;
if(hour==24)
{
hour=0;
}
}
}
check(); //每秒检测一次当前时段事件
}
}
void check() //检查时间的触发条件
{
unsigned char i;
for(i=1;i<11;i++)
{
if(hour==time[i][1]&&min==time[i][2]&&sec==time[i][3]) //时分秒都相等的时候改变时段事件
{
curr=i; //修改当前时段标志用于主循环中输出命令
P1=time[i][0];
}
}
}
void display() //显示从右到左
{
COM8279=0x92; //写显示RAM,地址自加
DA TA8279=table[sec%10];
DA TA8279=table[sec/10];
DA TA8279=table[min%10]&0x7f; //控制点亮
DA TA8279=table[min/10];
DA TA8279=table[hour%10]&0x7f;
DA TA8279=table[hour/10];
}
void Int1ISR(void) interrupt 2
{
COM8279=0x40; //读FIFO RAM ,地址不自加key=DATA8279;
keyevent(key);
}
void input(unsigned char key)
{
switch(currinput) //判断当前输入的位置然后根据位置限制输入范围{
case 1:if(key>2)break;
hour=hour+10*key;
currinput++;
break;
case 2:if(hour==20&&key>3)break;
hour=hour+key;
currinput++;
break;
case 3:if(key>5)break;
min+=key*10;
currinput++;
break;
case 4:if(key>9)break;
min+=key;
currinput++;
break;
case 5:if(key>5)break;
sec+=key*10;
currinput++;
break;
case 6:if(key>9)break;
sec+=key;
currinput++;
break;
}
}
void keyevent(unsigned char key)
{
switch(key)
{
case 10:ischanging=1;
TR0=0; //停止计时
hour=0;
min=0;
sec=0;
currinput=1;
break;
case 11:ischanging=0;
TR0=1; //重开计时
break;
default:
if(key>9)break;
if(ischanging) input(key);
break;
}
display();
}