99网
您的当前位置:首页电子时钟日历

电子时钟日历

来源:99网
 8279键盘显示实验(电子秒表)

一.实验要求

利用实验机上提供的8279键盘电路,数码显示电路,设计一个电子钟(日历),用小键盘控制电子钟(日历)的启停及初始值的预值。 电子钟做成如下两种格式(按F键两种格式可以切换): XX -XX-XX 由左向右分别为: 时、分、秒 XX -XX-XX 由左向右分别为: 年、月、日 1.C键:清除,显示00-00-00.

2.A键:启动,电子钟(日历)计时

3.D键:停止,电子钟(日历)停止计时

4.B键:设置初值:由左向右依次输入预置的时、分、秒(年、月、日)值,同时应具有判断输入错误的能力,若输入有错,则显示: 00-00-00

按B键即可重新输入预置值: 5.F键:实现电子钟和日历的切换 5.E键:程序退出。 二试验程序

//---8279键盘显示实验(电子秒表)--- //-----头文件引用------ #include #include #include //-----宏声明-----

#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;//清标志 } } }

因篇幅问题不能全部显示,请点此查看更多更全内容