|
V~`}X[U6LN~U2M$RK32FM`T.jpg (60.05 KB, 下載次數(shù): 60)
下載附件
2020-12-27 11:08 上傳
- //********************編譯預(yù)處理語句*******************************//
- #pragma SMALL
- #include <reg51.h>
- #include <absacc.h>
- #include <intrins.h>
- //************************端口定義*********************************//
- sbit P3_6=P3^6;
- //************************全局變量定義*****************************//
- unsigned char clockbuf[3]={0,0,0}; //存放時鐘時、分、秒的十進(jìn)制數(shù)
- unsigned char bellbuf[3]={0,0,0}; //存放鬧鐘時、分、秒的十進(jìn)制數(shù)
- unsigned char msec1; //10ms中斷次數(shù)
- unsigned char msec2; //1s循環(huán)次數(shù)
- unsigned char timdata,rtimdata; //時鐘和鬧鐘修改標(biāo)志位
- unsigned char count; //鬧鐘啟動后10s計時單元
- unsigned char *dis_p; //顯示緩沖區(qū)指針
- bit arm; //鬧鐘標(biāo)志,arm=0,鬧鐘沒有設(shè)定,arm=1鬧鐘已設(shè)定
- bit rtim; //鬧鐘是否啟動標(biāo)志,rtim=1,鬧鐘已啟動
- bit rhour; //鬧鐘小時修改標(biāo)志,rhour=1,正在修改鬧鐘小時
- bit rmin; //鬧鐘分修改標(biāo)志,rmin =1,正在修改鬧鐘分鐘
- bit hour; //時鐘小時修改標(biāo)志,hour=1正在修改時鐘小時
- bit min; //時鐘分修改標(biāo)志,min =1正在修改時鐘分鐘
- bit sec; //時鐘秒修改標(biāo)志,sec=1正在修改時鐘秒
- //***************************6位LED顯示函數(shù)*****************************//
- void display(unsigned char *p)
- {
- unsigned char buffer[]={0,0,0,0,0,0};
- unsigned char i,j,m,temp;
- unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9的顯示碼
- buffer[0]=p[0]/10; //將緩存區(qū)中數(shù)據(jù)的十位和各位分開
- buffer[1]=p[0]%10;
- buffer[2]=p[1]/10;
- buffer[3]=p[1]%10;
- buffer[4]=p[2]/10;
- buffer[5]=p[2]%10;
- { //沒有修改標(biāo)志,正常顯示
- temp=0x01;
- for(i=0;i<6;i++)
- {
- P0=0x00; //關(guān)顯示
- j=buffer[i];
- P0=led[j]; //P0送段碼
- P1=~temp; //P1對應(yīng)端口低電平選位
- temp<<=1;
- for(m=0;m<200;m++); //每一位顯示延時
- }
- }
- }
- //********************************鍵盤檢測函數(shù)****************************//
- //函數(shù)名:keytest
- //函數(shù)功能:測試鍵盤有無鍵按下,讀出行輸入按鍵狀態(tài)碼,用于測試是否有按鍵按下
- //形式參數(shù):無
- //返回值:鍵盤行輸入按鍵狀態(tài)碼,unsigned char類型
- unsigned char keytest()
- {
- unsigned char c;
- P2=0xf0; //檢測是否有鍵按下, 行值全給1
- c=P2; //讀取P2的值
- c=c&0xf0; //按鍵行輸入為P2.0~P2.3,屏蔽無關(guān)位
- return(c); //返回c的值
- }
- //*********************************查鍵值函數(shù)****************************//
- //函數(shù)名:search
- //函數(shù)功能:按鍵識別
- //形式參數(shù):無
- //返回值:行列式按鍵的鍵碼,unsigned char類型
- unsigned char search()
- {
- unsigned char a,b,c,d,e;
- c=0x7f; //首列掃描字送入變量c
- a=0; //首行號送a
- while(1)
- {
- P2=c; //給P2的賦值
- d=P2; //讀取P2的值
- d=d&0x0f; //屏蔽無關(guān)位h1-h4
- if(d==0x07){b=0;break;} //b為列號
- else if(d==0x0b){b=1;break;}
- else if(d==0x0d){b=2;break;}
- else if(d==0x0e){b=3;break;}
- a++; //掃描行號加1
- c>>=1; //修改列掃描字,掃描下一列
- if(a==4) {a=0;c=0x7f;} //控制移位到h1
- }
- e=a*4+b; //求鍵號
- do{display(dis_p);}
- while((d=keytest())!=0xf0);
- //等待釋放按鍵
- return(e);
- }
- //**************************鬧鐘判斷啟動函數(shù)****************************//
- //函數(shù)名:alarm
- //函數(shù)功能:啟動鬧鐘10s
- //形式參數(shù):無
- //返回值:無
- void alarm()
- {
- if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1]))
- { //判斷時鐘與鬧鐘是否相等
- P3_6=0; //啟動鬧鐘
- rtim=1; //設(shè)置鬧鐘計時標(biāo)志,鬧鐘將進(jìn)行10s計時標(biāo)志
- }
- if(count==10) //判斷鬧鐘保持10s時間到否
- {
- count=0; //清楚鬧鐘保持10s計時
- P3_6=1; //清除鬧鐘
- arm=0; //清鬧鐘標(biāo)志,否則鬧鐘設(shè)置將繼續(xù)保持有效
- rtim=0; //鬧鐘關(guān)閉
- }
- }
- //*****************************時鐘設(shè)置函數(shù)******************************//
- //函數(shù)名:ftion0
- //函數(shù)功能:時鐘修改,根據(jù)按鍵次數(shù),修改時、分、秒修改標(biāo)志全局變量
- //形式參數(shù):無
- //返回值:無
- void ftion0()
- {
- TR0=0; //關(guān)定時器
- rhour=0; //禁止鬧鐘小時參數(shù)修改,清鬧鐘修改標(biāo)志
- rmin=0; //禁止鬧鐘分參數(shù)修改,清鬧鐘修改標(biāo)志
- dis_p=clockbuf; //將時鐘緩存區(qū)首地址送顯示指針
- rtimdata=0; //清鬧鐘修改位置記錄
- timdata++; //將時鐘修改記錄值加1
- switch(timdata)
- {
- case 0x01:sec=1;break; //記錄值為1,則將時鐘秒修改標(biāo)志置1
- case 0x02:sec=0;min=1;break; //記錄值為2,則將時鐘分修改標(biāo)志置1
- case 0x03:min=0;hour=1;break; //記錄值為3,則將時鐘小時修改標(biāo)志置1
- case 0x04:timdata=0;hour=0;TR0=1;break; //按4次則清時鐘單元修改位置
- default:break; //記錄,定時器重新啟動
- }
- }
- //****************************鬧鐘設(shè)置函數(shù)******************************//
- //函數(shù)名:ftion1
- //函數(shù)功能:鬧鐘修改,根據(jù)按鍵次數(shù),修改時、分修改標(biāo)志全局變量
- //形式參數(shù):無
- //返回值:無
- void ftion1()
- {
- sec=0; //禁止時鐘秒修改
- min=0; //禁止時鐘分修改
- hour=0; //禁止時鐘小時修改
- dis_p=bellbuf; //設(shè)置鬧鐘顯示標(biāo)志
- timdata=0; //清時鐘修改位置標(biāo)志記錄
- rtimdata++; //將鬧鐘修改記錄值加1
- switch(rtimdata)
- {
- case 0x01:rmin=1;break; //記錄值為1,則將鬧鐘分修改標(biāo)志置1
- case 0x02:rmin=0;rhour=1;break; //記錄值為2,則將鬧鐘小時修改標(biāo)志置1
- case 0x03:rtimdata=0;rhour=0;arm=1;dis_p=clockbuf;break;
- //按3次則清鬧鐘單元修改位置記錄
- default:break; //恢復(fù)時鐘顯示標(biāo)志
- }
- }
- //****************************加1修改功能函數(shù)**************************//
- //函數(shù)名:cum
- //函數(shù)功能:根據(jù)標(biāo)志位對相應(yīng)的時、分、秒單元加1
- //形式參數(shù):無
- //返回值:無
- void cum()
- {
- if(sec==1) //若時鐘秒修改標(biāo)志位為1,則秒單元內(nèi)容加1
- {
- if(59==clockbuf[2]) clockbuf[2]=0;
- else clockbuf[2]++;
- }
- else if(min==1) //若時鐘分修改標(biāo)志為1,則分單元內(nèi)容加1
- {
- if(59==clockbuf[1]) clockbuf[1]=0;
- else clockbuf[1]++;
- }
- else if(hour==1) //若時鐘小時修改標(biāo)志為1,則小時單元內(nèi)容加1
- {
- if(23==clockbuf[0]) clockbuf[0]=0;
- else clockbuf[0]++;
- }
- else if(rmin==1) //若鬧鐘分修改標(biāo)志為1,則分單元內(nèi)容加1
- {
- if(bellbuf[1]==59) bellbuf[1]=0;
- else bellbuf[1]++;
- }
- else if(rhour==1) //若鬧鐘小時修改標(biāo)志為1,則小時單元內(nèi)容加1
- {
- if(bellbuf[0]==23) bellbuf[0]=0;
- else bellbuf[0]++;
- }
- }
- //***************************加1修改功能函數(shù)************************//
- //函數(shù)名:jian
- //函數(shù)功能:根據(jù)標(biāo)志位對相應(yīng)的時、分、秒單元減1
- //形式參數(shù):無
- //返回值:無
- void jian()
- {
- if(sec==1) //若時鐘秒修改標(biāo)志位為1,則秒單元內(nèi)容減1
- {
- if(0==clockbuf[2]) clockbuf[2]=59;
- else clockbuf[2]--;
- }
- else if(min==1) //若時鐘分修改標(biāo)志為1,則分單元內(nèi)容減1
- {
- if(0==clockbuf[1]) clockbuf[1]=59;
- else clockbuf[1]--;
- }
- else if(hour==1) //若時鐘小時修改標(biāo)志為1,則小時單元內(nèi)容減1
- {
- if(0==clockbuf[0]) clockbuf[0]=23;
- else clockbuf[0]--;
- }
- else if(rmin==1) //若鬧鐘分修改標(biāo)志為1,則分單元內(nèi)容減1
- {
- if(bellbuf[1]==0) bellbuf[1]=59;
- else bellbuf[1]--;
- }
- else if(rhour==1) //若鬧鐘小時修改標(biāo)志為1,則小時單元內(nèi)容減1
- {
- if(bellbuf[0]==0) bellbuf[0]=23;
- else bellbuf[0]--;
- }
- }
- //***************************定時器中斷函數(shù)******************************//
- //函數(shù)名:clock
- //函數(shù)功能:定時器T0定時中斷,interrupt 1
- //形式參數(shù):無
- //返回值:無
- void clock() interrupt 1
- {
- EA=0; //關(guān)中斷
- if(msec1!=0x28) msec1++; //6MHz晶振,到10ms否,不到則msec1加1
- else
- {
- msec1=0;
- if(msec2!=100) msec2++; //到1s否,不到則msec2加1
- else
- {
- if(rtim==1) count++; //鬧鐘啟動標(biāo)志計時10s
- msec2=0;
- if(clockbuf[2]!=59) clockbuf[2]++; //到1min否,不到則clockbuf[2]加1
- else
- {
- clockbuf[2]=0;
- if(clockbuf[1]!=59) clockbuf[1]++; //到1h否,不到則clockbuf[1]加1
- else
- {
- clockbuf[1]=0;
- if(clockbuf[0]!=23) clockbuf[0]++; //到24h否,不到則clockbuf[0]加1
- else clockbuf[0]=0;
- }
- }
- }
- }
- EA=1; //開中斷
- }
- void main()
- {
- unsigned char a;
- arm=0;
- //清零鬧鐘標(biāo)志位
- P3_6=1; //P3_6置初值1
- msec1=0; //設(shè)置10ms中斷次數(shù)初值
- msec2=0; //設(shè)置1s中斷次數(shù)初值
- timdata=0; //時鐘內(nèi)容修改位置記憶單元清零
- rtimdata=0; //鬧鐘內(nèi)容修改位置記憶單元清零
- count=0; //鬧鐘啟動后保持10s計時單元清零
- TMOD=0x02; //初始化定時器,定時器T0位工作方式2
- TL0=0x06; //定時250us初始化
- TH0=0x06;
- EA=1; //中斷允許控制
- ET0=1; //定時器0開中斷
- TR0=1; //啟動定時器0
- dis_p=clockbuf; //將時鐘值所在地址送人顯示指針
- while(1)
- {
- a=keytest(); //調(diào)用鍵盤檢測子程序
- if(a==0xf0) //判斷是否有鍵按下
- {
- display(dis_p); //無鍵輸入調(diào)用顯示程序
- if(arm==1) alarm(); //判斷鬧鐘設(shè)定否,若已設(shè)定則調(diào)用鬧鐘啟動子程序
- }
- else
- {
- display(dis_p); //調(diào)用顯示子程序作為延時去抖
- a=keytest();
- if(a!=0xf0) //沒有抖動,則表示有鍵按下
- {
- a=search(); //調(diào)用查鍵值子程序
- switch(a)
- {
- case 0x04:ftion0();break; //是時鐘參數(shù)修改功能鍵,調(diào)用時鐘設(shè)置子程序
- case 0x05:ftion1();break; //是鬧鐘參數(shù)修改功能鍵,調(diào)用鬧鐘設(shè)置子程序
- case 0x06:cum();break; //是加1功能鍵,則調(diào)用加1修改功能子程序
- case 0x07:jian();break; //是減1功能鍵,則調(diào)用減1修改功能子程序
- default:break;
- }
- }
- }
- }
- }
復(fù)制代碼
|
-
-
程序,代碼.rar
2020-12-27 11:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
207.54 KB, 下載次數(shù): 33, 下載積分: 黑幣 -5
|