4x4矩陣鍵數值的讀取和顯示;
按鍵被按下后只有被松開才會有效果;
多個按鍵被按下只有按鍵都被松開最先被按下的按鍵起效果;
采用共陽極數碼管顯示;
附件包含完整仿真設計和C程序。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
無標題.png (58.53 KB, 下載次數: 81)
下載附件
仿真效果
2021-5-30 10:07 上傳
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- /**************物理連線
- P1對應數碼管;
- P2前四位對應矩陣行
- P2后四位對應矩陣列
- *****************/
- #define saomiao P2
- #define DB P1
- void display(uchar dat); //顯示鍵盤值函數
- uchar key_scan( ); //鍵盤掃描函數
- uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e }; //0~15數碼管代碼,共陽極
- uchar key; //鍵盤值
- /********************************************************************
- 延時函數
- *********************************************************************/
- void delay10ms(void) //延時程序
- {
- unsigned char i,j;
- for(i=20;i>0;i--)
- for(j=248;j>0;j--);
- }
- //*****************鍵盤掃描函數*****************
- uchar key_scan()
- {
- uchar temp;
- saomiao=0xfe; //掃描第1行鍵
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- delay10ms(); //延時10ms
- temp=saomiao;
- temp=temp&0xf0; //確認按鍵被按下
- if(temp!=0xf0)
- {
- temp=saomiao;
- switch(temp)
- {
- case 0xee: //第1行第1列被按下
- key=0;
- break;
- case 0xde: // 第1行第2列被按下
- key=1;
- break;
- case 0xbe: // 第1行第3列被按下
- key=2;
- break;
- case 0x7e: // 第1行第4列被按下
- key=3;
- break;
- default:
- break;
- }
- K1:
- temp=saomiao;
- temp=temp&0xf0;
- while(temp!=0xf0) //等待按鍵被松開才可以有效果
- goto K1;
- }
- saomiao=0xfd; //掃描第2行鍵
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- delay10ms();
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=saomiao;
- switch(temp)
- {
- case 0xed:
- key=4;
- break;
- case 0xdd:
- key=5;
- break;
- case 0xbd:
- key=6;
- break;
- case 0x7d:
- key=7;
- break;
- default:
- break;
- }
- K2: temp=saomiao;
- temp=temp&0xf0;
- while(temp!=0xf0) //等待按鍵被松開
- goto K2;
- }
- saomiao=0xfb; //掃描第3行鍵
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- delay10ms();
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=saomiao;
- switch(temp)
- {
- case 0xeb:
- key=8;
- break;
- case 0xdb:
- key=9;
- break;
- case 0xbb:
- key=10;
- break;
- case 0x7b:
- key=11;
- break;
- default :
- break;
- }
- K3:
- temp=saomiao;
- temp=temp&0xf0;
- while(temp!=0xf0) //等待按鍵被松開
- goto K3;
- }
- saomiao=0xf7; //掃描第4行鍵
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- delay10ms();
- temp=saomiao;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=saomiao;
- switch(temp)
- {
- case 0xe7:
- key=12;
- break;
- case 0xd7:
- key=13;
- break;
- case 0xb7:
- key=14;
- break;
- case 0x77:
- key=15;
- break;
- default:
- break;
- }
- K4: temp=saomiao;
- temp=temp&0xf0;
- while(temp!=0xf0) //等待按鍵被松開
- goto K4;
- }
- return key;
- }
- void display(uchar dat)
- {
- DB=table[dat];
- }
- main()
- {
- key=0;
- while(1)
- {
- key=key_scan(); //讀取按鍵值
- display(key); //顯示按鍵值
- }
- }
-
復制代碼
所有資料51hei提供下載:
4x4矩陣鍵.zip
(54.63 KB, 下載次數: 13)
2021-5-30 10:07 上傳
點擊文件名下載附件
仿真設計和C程序 下載積分: 黑幣 -5
|