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