數碼管顯示時間,矩陣鍵盤設置時間(仿真加程序)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include<REG51.H>
- #define LED P0//P0為數碼管的段選
- #define WS P2//P2為數碼管的位選
- char tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};//0~9最后 “—”號
- unsigned char sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi;//定義秒,分,時,秒的個位,十位,分的個位,十位,時的個位,十位
- unsigned char t;
- //---------------------------------------------------------------------
- //---------------------------------------------------------------------
- void initT0()
- {
- TMOD=0x01;//定義定時器0工作與方式1
- TH0=(65536-5000)/256;//定時器賦初值
- TL0=(65536-5000)%256; //50ms
- EA=1;//開總中斷和T0中斷
- ET0=1;
- }
- void TOint()interrupt 1
- {
- TH0=(65536-50000)/256;//定時器賦初值
- TL0=(65536-50000)%256;
- t++;
- }
- //--------------------------------延時子函數------------------------------------
- void Delay_ms(unsigned int x) //延時Xms
- {
- unsigned int i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- //-------------------------------顯示子函數---------------------------------------
- void display()
- {
- // TR0=1;
- if(t==20)
- {
- t=0;
- sec++;//秒加1
- }
- if(sec==60)//如果秒為60,則清零,分加1
- {
- sec=0;
- min++;
- }
- if(min==60)//如果分為60,則清零,時加1
- {
- min=0;
- hour++;
- }
- if(hour==24)//如果時為24,則清零
- {
- hour=0;
- }
- sec_ge=sec%10;//秒的個位和十位
- sec_shi=sec/10;
- min_ge=min%10;//分的個位和十位
- min_shi=min/10;
- hour_ge=hour%10;//時的個位和十位
- hour_shi=hour/10;
- WS=0x80;//循環掃描
- LED=tab[sec_ge];
- Delay_ms(1);
- WS=0x40;
- LED=tab[sec_shi];
- Delay_ms(1);
- //-//0X20
- WS=0x20;
- LED=tab[10];
- Delay_ms(1);
- WS=0x10;
- LED=tab[min_ge];
- Delay_ms(1);
- WS=0x08;
- LED=tab[min_shi];
- Delay_ms(1);
- //-// 0X04
- WS=0x04;
- LED=tab[10];
- Delay_ms(1);
- WS=0x02;
- LED=tab[hour_ge];
- Delay_ms(1);
- WS=0x01;
- LED=tab[hour_shi];
- Delay_ms(1);
- }
- void keyscan()
- {
- unsigned char temp;
- P1=0xfe; //第一行置低
- temp=P1; //將P2口的值賦給temp
- temp=temp&0xf0; //將temp跟1111 0000 按位與
- if(temp!=0xf0)
- {
- Delay_ms(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xee:
- {
- sec++;
- if(sec==60)
- sec=0;
-
- break;
- }
- case 0xde:
- {
- min++;
- if(min==60)
- min=0;
-
- break;
- }
- case 0xbe:
- {
- hour++;
- if(hour==24)
- hour=0;
-
- break;
- }
- case 0x7e:
- break;
- }
- while(temp!=0xf0)
- { TR0=0;
- temp=P1;
- temp=temp&0xf0;
- }
- }
- TR0=1;
- }
- P1=0xfd; //第二行置低
- temp=P1; //將P2口的值賦給temp
- temp=temp&0xf0; //將temp跟1111 0000 按位與
- if(temp!=0xf0)
- {
- Delay_ms(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xed:
-
- break;
- case 0xdd:
-
- break;
- case 0xbd:
-
- break;
- case 0x7d:
-
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xfb; //第二行置低
- temp=P1; //將P2口的值賦給temp
- temp=temp&0xf0; //將temp跟1111 0000 按位與
- if(temp!=0xf0)
- {
- Delay_ms(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xeb:
- break;
- case 0xdb:
- break;
- case 0xbb:
-
- break;
- case 0x7b:
-
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xf7; //第二行置低
- temp=P1; //將P2口的值賦給temp
- temp=temp&0xf0; //將temp跟1111 0000 按位與
- if(temp!=0xf0)
- {
- Delay_ms(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xe7:
-
- break;
- case 0xd7:
-
- break;
- case 0xb7:
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
數碼管顯示時間4×4鍵盤矩陣按鍵.rar
(49.83 KB, 下載次數: 148)
2017-11-14 19:56 上傳
點擊文件名下載附件
|