矩陣式鍵盤鍵值分別是0-9,最下面一排鍵位功能鍵,左右兩個鍵分別為“清0鍵”“C”,和”“回車鍵”“8 ”,其它鍵無效。未按鍵不顯示,每按鍵一次,鍵值在最低位顯示,原鍵值向高位移一位。按8個鍵后,再按鍵無效。按清0鍵全顯示“0”。按“8 ”后全部熄滅,再按鍵重新開始。
設計思路:
1、 動態顯示。 (1)設置8個數據的一維顯示數組disp[],設置位選碼數組sled_bit[],對應每個數碼管;設置2個一維數組,data uchar ar[8]={1,9,4,9,1,0,0,1};data uchar br[8]={2,0,1,4,1,2,1,0};按K1、K2鍵進入外部中斷0,在外部中斷程序中根據按鍵將ar[]、br[]數據送人disp[]。 (2) T0每500us中斷1次,在T0中斷中點亮一個數碼管。在T0中斷函數中,① P1.3=1,U1、U2輸出高阻;② P1.4=1,P0口輸出段碼,P1.4=0,U1鎖存輸入的段碼;③ P1.5=1,P0口輸出位選碼,P1.5=0,U2鎖存輸入的位選碼;④ P1.3=0,U1、U2同時輸出段碼和位選碼,進行顯示。 2、 矩陣式鍵盤按鍵識別 (1) 行、列輸出后要延時,才讀出相應特征值; (2) 進行鍵值分析前要具備如下條件: ① 要有鍵按下,設a是得到的鍵值,if(a!=0xff)才繼續進行; ②要等鍵彈起,若輸出P2=0x0f,則P2!=0x0f 要等待,while(P2!=0x0f); ③ 每次進行完鍵值分析后,要延時。 3、 功能鍵位 設置功能鍵位時單獨處理,對位選數組disp[]做相應的修改并修改顯示標志位。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (16.39 KB, 下載次數: 53)
下載附件
2019-12-27 01:19 上傳
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- sbit out=P1^3;
- sbit page=P1^4;
- sbit bite=P1^5;
- data uchar a,num,i,j=0,y,b;
- //char data *px;
- uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- data uchar disp[]={16,16,16,16,16,16,16,16};
- uchar table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
- //uchar table2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
- //uchar data b1[]={2,0,1,4,1,2,1,0};
- //uchar data b2[]={1,9,4,9,1,0,0,1};
- void delay(unsigned int i)
- {
- unsigned char j;
- for(;i>0;i--)
- for(j=0;j<125;j++)
- ;
- }
- void main()
- {
- TMOD=0x01; //定時器T0的方式1
- //TMOD=0x50; 定時器T1的方式1
- TH0=65036/256;
- TL0=65036%256;
- ET0=1;
- EA=1;
- // TR0=1;
- EX0=1; //開關外部中斷
- IT0=1; //外部中斷0觸發方式為跳變沿觸發
- PX0=1; //設置外部中斷0優先于1;
- // out=1;
- // P0=0xff;
- while(1){
- TR0=1;
- P2=0xf0;
- a=P2;
- // a=~a;
- P2=0x0f;
- b=P2;
- a=a|b;
- if(a!=0xff)
- {
- while(P2!=0x0f);
- switch(a)
- {
- case 0xee: num=0;break;
- case 0xde: num=1;break;
- case 0xbe: num=2;break;
- case 0x7e: num=3;break;
- case 0xed: num=4;break;
- case 0xdd: num=5;break;
- case 0xbd: num=6;break;
- case 0x7d: num=7;break;
- case 0xeb: num=8;break;
- case 0xdb: num=9;break;
- case 0xe7: num=12;break;
- case 0x77: num=15;break;
- }
- if(num<10&&disp[0]==16){
- for(i=0;i<7;i++)
- disp[i]=disp[i+1];
- disp[7]=num;
- }
- else if(num==12)
- {
- for(i=7;i>0;i--)
- disp[i]=disp[i-1];
- disp[0]=16;
- }else if(num==15)
- {
- for(i=0;i<8;i++)
- disp[i]=16;
- }else if(disp[0]!=16){
- for(i=0;i<7;i++)
- disp[i]=16;
- disp[7]=num;
-
- }
- }
- delay(50);
- }
- }
- void EXO_int() interrupt 0
- {
-
- }
- void T0_int() interrupt 1
- {
- uchar k;
- TH0=65036/256;
- TL0=65036%256;
- out=1;
- k=disp[j];
- P0=table2[k];//顯示的值
- page=1;
- page=0;
- P0=table1[j]; //顯示的位
- bite=1;
- bite=0;
- out=0;
- j++;
- if(j>7) j=0;
- }
復制代碼
所有資料51hei提供下載:
動態顯示與矩陣鍵盤.zip
(22.8 KB, 下載次數: 37)
2019-12-27 00:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|