//-----宏声明-----#define D8279 XBYTE[0xF238] //8279 数据口地址
#define C8279 XBYTE[0xF239] //8279 状态/命令口地址 #define uchar unsigned char #define uint unsigned int #define TimeDisp 1 #define DateDisp 0 //-----变量定义-----
uchar idata time[] = {0,0,0,12}; //10毫秒,秒,分,十 uchar idata day[3] = {18,6,8};
uchar idata diss[8]={0x20,0x20,0,0,0,0,0,0};//显示缓冲区
uchar code ledseg[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5E,0x79,0x71, 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,
0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1,0x00,0x40};//LED显示常数表
bit bdata sbz,wbz,kbz; //定义秒标志、键值合法标志、读键标志 bit bdata flag = TimeDisp;
//-----取键值函数-----
uchar getkey() {
uchar key;
if((C8279&0x07)==0x00)
{kbz=0;} //无键按下,置标志 else {
kbz=1;
C8279=0x40; //读FIFO RAM命令 key=D8279;
key=(key&0x3f); //取键盘数据低6位 return(key); } }
//-----显示函数----- void disled(d) uchar idata *d; {
uchar i;
C8279=0x90; for(i=0;i<8;i++) {
C8279=i+0x80; D8279=ledseg[*d]; d++; } }
//-----显示缓冲区内容显示----- void disp(void) {
disled(diss); }
//----8279初始化子程序----- void init8279() {
C8279=0; //置8279工作方式 C8279=0x2f; //置键盘扫描速率 C8279=0xc1; //清除 LED 显示 //while(com&0x80);//等待清除结束 }
//-----毫秒显示----- void disms()
{
diss[0]=time[0]%10; diss[1]=time[0]/10; disp(); }
//-----显示处理----- void display() {
if(flag == 1) {
diss[0]=time[1]%10; diss[1]=time[1]/10; diss[2]=33;
diss[3]=time[2]%10; diss[4]=time[2]/10; diss[5]=33;
diss[6]=time[3]%10; diss[7]=time[3]/10; } else {
diss[0]=day[0]%10; diss[1]=day[0]/10; diss[2]=33;
diss[3]=day[1]%10; diss[4]=day[1]/10; diss[5]=33;
diss[6]=day[2]%10; diss[7]=day[2]/10; }
disp(); }
//-----初始化----- void first(void) {
init8279(); //初始化8279 sbz=1; //标志 TMOD=0x10;
TH1=0xdc; //10毫秒的时间常数 TL1=0x00; disms(); ET1=1;
EA=1; //允许中断
}
//-----INT_T1中断服务子程序----- void Int_T1(void) interrupt 3 {
TR1=0;
TH1=0xdc; //10毫秒定时常数 TL1=0x00; TR1=1;
time[0]=time[0]+1; //10毫秒数加 1 if(time[0]==100) //判断10毫秒=100 {
time[0]=0;
sbz=1; //置秒标志 }
//disms();
if(time[0]==0) {
time[1]=time[1]+1; //秒加1 if(time[1]==60) //判断秒=60 {
time[1]=0;
time[2]=time[2]+1;//分加1 if(time[2]==60) //判断分=60 {
time[2]=0;
time[3]=time[3]+1;//时加1 if(time[3]==24)//判断时=23 {
time[3]=0; day[0] += 1; if(day[0] == 30) {
day[0] = 0; day[1] += 1; if(day[1] == 12) {
day[1] = 0; day[2]++; } } } }
} } }
//-----读数子程序----- void getword() {
uchar i;
for(i=8;i>0;i--) {
do {
getkey(); //读键盘
}while(kbz==0);//无键输入,则再读
if((getkey()>9)||(getkey()<0))//判断输入是否大于9,小于0 {
wbz=0; //置非法输入标志 return; } else {
wbz=1; //置合法输入标志 if((i == 6)||(i == 3)) { i--;
diss[i-1]=getkey();
disp(); //显示输入的字符 } else {
diss[i-1]=getkey();
disp(); //显示输入的字符 } } } }
//-----时间清零子程序----- void cleart() {
TR1=0; //关计数器
time[0]=0; //10毫秒清零 time[1]=0; //秒清零 time[2]=0; //分钟清零 time[3]=0; //小时清零 disms(); //显示毫秒
sbz=1; //置秒标志 }
//-----设置初值子程序----- void sett() {
getword(); //读数
if(wbz==1) //判断输入合法性 {
if(flag == 1) {
time[3]=(diss[7]*10+diss[6]);
if(time[3]<24)//判断输入小时值 < 24 {
time[2]=(diss[4]*10+diss[3]);
if(time[2]<60)//判断输入分钟数 < 60 {
time[1]=(diss[1]*10+diss[0]);
if(time[1]<60)//判断输入秒值 < 60 { ; } else
{cleart();} //时间清零 } else
{cleart();} //时间清零 } else
{cleart();} //时间清零 } else {
day[2]=(diss[7]*10+diss[6]);
if(day[2]<32)//判断输入小时值 < 24 {
day[1]=(diss[4]*10+diss[3]);
if(day[1]<13)//判断输入分钟数 < 60 {
day[0]=(diss[1]*10+diss[0]);
if(day[0]<100)//判断输入秒值 < 60 { ; }
else
{cleart();} //时间清零 } else
{cleart();} //时间清零 } else
{cleart();} //时间清零 } } else
{cleart();} //时间清零 display();//显示时间 }
//-----主程序----- void main() {
uint counter = 0; first(); //初始化 while(1) //循环 {
counter++;
if(counter == 10000 ) {
//flag = !flag; counter = 0; }
getkey(); //读键盘
if(kbz==1) //判断是否有键输入 {
switch(getkey()) {
case 0x0c: cleart();//输入键是'C',转CLEART break;
case 0x0a: TR1=1; //输入键是'A',电子钟计时 break;
case 0x0d: TR1=0; //输入键是'D',电子钟停止计时 break;
case 0x0b: TR1=0; //输入键是'B',转SETT sett(); break;
case 0x0e: _nop_();//输入键是'E', case 0x0f: flag = !flag;break;
while(1)//等待回到监控 {} } }
else if(sbz==1) {
display();//显示时间 sbz=0;//清标志 } } }