|
150黑幣
QG)A}%RGHDAJA1]KHD6L]NB.png (149.55 KB, 下載次數(shù): 60)
下載附件
2021-11-15 23:41 上傳
單片機(jī)代碼奉上:
- #include "reg52.h"
- #include "intrins.h"
- typedef unsigned int u16;
- typedef unsigned char u8;
- #define GPIO_KEY P1
- u8 smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- u8 t0,KeyVal,Display[8],flag,flag1,flag2,flag3;
- u16 hour,minute,second;
- //38譯碼器
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- //數(shù)碼管顯示函數(shù)
- void Showsmg();
- //延時(shí)函數(shù)
- void Delay(u16 i);
- //初始化函數(shù)
- void Init();
- //按鍵檢測(cè)
- void KeyDown();
- //按鍵處理
- void Keypross();
- //數(shù)據(jù)處理
- void Datapross();
- //按鍵數(shù)字處理
- void Numpross(u8 dat);
- //Up功能處理
- void Uppross();
- //Down功能處理
- void Downpross();
- //Func功能處理
- void Funcpross();
- //Enter功能處理
- void Enterpross();
- //Back功能處理
- void Backpross();
- void main(){
- Init();
- while(1){
- KeyDown();
- Keypross();
- Datapross();
- Showsmg();
- }
- }
- //數(shù)碼管顯示函數(shù)
- void Showsmg(){
- u8 i;
- for(i=0;i<8;i++)
- {
- switch(7-i) //位選
- {
- case 0: LSA=0;LSB=0;LSC=0;break;
- case 1: LSA=1;LSB=0;LSC=0;break;
- case 2: LSA=0;LSB=1;LSC=0;break;
- case 3: LSA=1;LSB=1;LSC=0;break;
- case 4: LSA=0;LSB=0;LSC=1;break;
- case 5: LSA=1;LSB=0;LSC=1;break;
- case 6: LSA=0;LSB=1;LSC=1;break;
- case 7: LSA=1;LSB=1;LSC=1;break;
- }
- P0=Display[i];
- Delay(1);
- P0=0x00;
- }
- }
- //延時(shí)函數(shù)
- void Delay(u16 i) //11.0592 1ms
- {
- while(i--){
- unsigned char i, j;
- _nop_();
- i = 2;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- //初始化函數(shù)
- void Init(){
- //參數(shù)初始化
- hour=0;
- minute=0;
- second=0;
- t0=0;
- flag=0;
- flag1=0;
- flag2=0;
- //定時(shí)器0初始化
- TMOD=0x01;
- TH0=(65536-9174)/256; //10ms
- TL0=(65536-9174)%256;
- EA=1;
- ET0=1;
- TR0=0;
- }
- //按鍵檢測(cè)
- void KeyDown(){
- char a=0;
- GPIO_KEY=0x0f;
- if(GPIO_KEY!=0x0f){
- Delay(10);
- if(GPIO_KEY!=0x0f){
- GPIO_KEY=0x0f;
- switch(GPIO_KEY){
- case 0x07 : KeyVal=0;flag3=1;break;
- case 0x0b : KeyVal=1;flag3=1;break;
- case 0x0d : KeyVal=2;flag3=1;break;
- case 0x0e : KeyVal=3;flag3=1;break;
- }
- GPIO_KEY=0xf0;
- switch(GPIO_KEY){
- case 0x70 : KeyVal=KeyVal;break;
- case 0xb0 : KeyVal=KeyVal+4;break;
- case 0xd0 : KeyVal=KeyVal+8;break;
- case 0xe0 : KeyVal=KeyVal+12;break;
- }
- }
- while((a<150) && (GPIO_KEY!=0xf0)){
- Delay(1);
- a++;
- }
- }
- }
- //按鍵處理
- void Keypross(){
- if(flag3==1){
- flag3=0;
- switch(KeyVal){
- case 0:Numpross(7);break;
- case 1:Numpross(8);break;
- case 2:Numpross(9);break;
- case 3:Uppross();break;
- case 4:Numpross(4);break;
- case 5:Numpross(5);break;
- case 6:Numpross(6);break;
- case 7:Downpross();break;
- case 8:Numpross(1);break;
- case 9:Numpross(2);break;
- case 10:Numpross(3);break;
- case 11:Funcpross();break;
- case 12:Numpross(0);break;
- case 13:break;
- case 14:Backpross();break;
- case 15:Enterpross();break;
-
- }
- }
- }
- //數(shù)據(jù)處理
- void Datapross(){
- if(flag2==1){
- flag2=0;
- second--;
- if(second>59){
- if(minute>59){
- if(hour>23){
- second=0;
- minute=0;
- hour=0;
- TR0=0;
- }
- else{
- hour--;
- minute=59;
- }
- }
- else{
- minute--;
- second=59;
- }
- }
- }
- Display[0]=smgduan[hour/10];
- Display[1]=smgduan[hour%10];
- Display[2]=0x40;
- Display[3]=smgduan[minute/10];
- Display[4]=smgduan[minute%10];
- Display[5]=0x40;
- Display[6]=smgduan[second/10];
- Display[7]=smgduan[second%10];
- }
- //按鍵數(shù)字處理
- void Numpross(u8 dat){
- u8 tp;
- if(flag==1){
- switch(flag1){
- case 0:tp=hour%10;hour=tp+dat*10;break;
- case 1:tp=hour/10;hour=tp*10+dat;break;
- case 2:tp=minute%10;minute=tp+dat*10;break;
- case 3:tp=minute/10;minute=tp*10+dat;break;
- case 4:tp=second%10;second=tp+dat*10;break;
- case 5:tp=second/10;second=tp*10+dat;break;
- }
- }
- }
- //Up功能處理
- void Uppross(){
- if(flag==1){
- flag1++;
- if(flag1>5){
- flag1=0;
- }
- }
- }
- //Down功能處理
- void Downpross(){
- if(flag==1){
- flag1--;
- if(flag1<0)
- flag1=5;
- }
- }
- //Func功能處理
- void Funcpross(){
- TR0=0; //停止計(jì)時(shí)
- flag=1; //允許設(shè)置時(shí)間
- }
- //Enter功能處理
- void Enterpross(){
- flag=0; //清零,不允許設(shè)置時(shí)間
- flag1=0;
- if(hour>23)
- hour=23;
- if(minute>59)
- minute=59;
- if(second>59)
- second=59;
- TR0=1; //開(kāi)始計(jì)時(shí)
- }
- //Back功能處理
- void Backpross(){
- //暫無(wú)功能
- }
- void Timer0() interrupt 1{
- TH0=(65536-9174)/256; //重置
- TL0=(65536-9174)%256;
- t0++;
- if(t0==100){
- t0=0;
- flag2=1;
- }
- }
復(fù)制代碼 |
|