功能:
掃描讀取4*4矩陣鍵盤的輸入,并顯示在數碼管上,掃描含消抖處理。包含C源碼及Proteus仿真文件,包含原理圖;
注:僅實現了0-15的顯示,6根數碼管顯示的數相同。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei截圖20210909154201.png (169.28 KB, 下載次數: 53)
下載附件
2021-9-9 15:49 上傳
單片機源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit wela = P2^7; //位選端口
- sbit dula = P2^6; //段選端口
- sbit beep = P2^3; //蜂鳴器端口
- uchar temp, num;
- void keyscan();
- void delay(uchar num);
- void display(uchar num);
- void initialization();
- uchar code Table[] = //數碼管段碼數組
- {
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D, //共陰極段碼 0 1 2 3 4 5
- 0x7D,0x07,0x7F,0x6F,0x77,0x7C, //共陰極段碼 6 7 8 9 A b
- 0x39,0x5E,0x79,0x71,0x73,0x3E, //共陰極段碼 C d E F P U
- 0x31,0x6E,0x76,0x38,0x00 //共陰極段碼 T y H L 滅燈
- };
- void main()
- {
- initialization();
- while (1)
- {
- beep = 0;
- keyscan();
- }
- }
- /************延時函數*************/
- void delay(uchar num) //延時 num ms
- {
- uint x, y;
- for(x = num; x > 0; x--)
- {
- for(y = 110; y > 0; y--);
- }
- }
- /**** 鍵盤掃描函數 ****
- **** 函數功能 ****
- **** 掃描4*4矩陣鍵盤的輸入 ****/
- void keyscan()
- {
-
- P3 = 0xfe; //檢測第一行矩陣鍵盤(0-3)
- temp = P3;
- temp = temp & 0xf0; //判斷是否有按鍵按下
- while(temp != 0xf0)
- {
- delay(5);
- P3 = 0xfe;
- temp = temp & 0xf0;
- while(temp != 0xf0) //延時消抖 確認有按鍵按下
- {
- temp = P3;
- switch (temp)
- {
- case 0xee: num = 0; //檢測到第一個鍵按下
- break;
- case 0xde: num = 1; //檢測到第二個鍵按下
- break;
- case 0xbe: num = 2; //檢測到第三個鍵按下
- break;
- case 0x7e: num = 3; //檢測到第四個鍵按下
- break;
- }
- while(temp != 0xf0) //松手檢測
- {
- temp = P3;
- temp = temp & 0xf0;
- }
- display(num);
- }
- }
- P3 = 0xfd; //檢測第二行矩陣鍵盤(4-7)
- temp = P3;
- temp = temp & 0xf0; //判斷是否有按鍵按下
- while(temp != 0xf0)
- {
- delay(5);
- P3 = 0xfd;
- temp = temp & 0xf0;
- while(temp != 0xf0) //延時消抖 確認有按鍵按下
- {
- temp = P3;
- switch (temp)
- {
- case 0xed: num = 4; //檢測到第一個鍵按下
- break;
- case 0xdd: num = 5; //檢測到第二個鍵按下
- break;
- case 0xbd: num = 6; //檢測到第三個鍵按下
- break;
- case 0x7d: num = 7; //檢測到第四個鍵按下
- break;
- }
- while(temp != 0xf0) //松手檢測
- {
- temp = P3;
- temp = temp & 0xf0;
- }
- display(num);
- }
- }
- P3 = 0xfb; //檢測第三行矩陣鍵盤(8-11)
- temp = P3;
- temp = temp & 0xf0; //判斷是否有按鍵按下
- while(temp != 0xf0)
- {
- delay(5);
- P3 = 0xfb;
- temp = temp & 0xf0;
- while(temp != 0xf0) //延時消抖 確認有按鍵按下
- {
- temp = P3;
- switch (temp)
- {
- case 0xeb: num = 8; //檢測到第一個鍵按下
- break;
- case 0xdb: num = 9; //檢測到第二個鍵按下
- break;
- case 0xbb: num = 10; //檢測到第三個鍵按下
- break;
- case 0x7b: num = 11; //檢測到第四個鍵按下
- break;
- }
- while(temp != 0xf0) //松手檢測
- {
- temp = P3;
- temp = temp & 0xf0;
- }
- display(num);
- }
- }
-
- P3 = 0xf7; //檢測第四行矩陣鍵盤(12-15)
- temp = P3;
- temp = temp & 0xf0; //判斷是否有按鍵按下
- while(temp != 0xf0)
- {
- delay(5);
- P3 = 0xf7;
- temp = temp & 0xf0;
- while(temp != 0xf0) //延時消抖 確認有按鍵按下
- {
- temp = P3;
- switch (temp)
- {
- case 0xe7: num = 12; //檢測到第一個鍵按下
- break;
- case 0xd7: num = 13; //檢測到第二個鍵按下
- break;
- case 0xb7: num = 14; //檢測到第三個鍵按下
- break;
- case 0x77: num = 15; //檢測到第四個鍵按下
- break;
- }
- while(temp != 0xf0) //松手檢測
- {
- temp = P3;
- temp = temp & 0xf0;
- }
- display(num);
- }
- }
- }
- void display(uchar num) //數碼管顯示函數
- {
- beep = 1;
- dula = 1;
- P0 = Table[num];
- dula = 0;
- }
- void initialization() //數碼管初始化
- {
- dula = 1; //開段碼鎖存
- P0 = 0x00; //設數碼管初值
- dula = 0;
- wela = 1;
- P0 = 0xc0; //選通6根數碼管
- wela = 0;
- }
復制代碼
所有資料51hei附件下載:
Key_scan.rar
(29.94 KB, 下載次數: 43)
2021-9-9 15:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|