仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (20.36 KB, 下載次數: 90)
下載附件
2017-9-25 01:33 上傳
0.png (19.69 KB, 下載次數: 99)
下載附件
2017-9-25 01:33 上傳
0.png (34.42 KB, 下載次數: 88)
下載附件
2017-9-25 01:33 上傳
單片機源程序如下:
- /*
- #include <reg51.h>
- #include <intrins.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit DAT = P0^2;
- sbit CLK = P0^1;
- //////////////
- void Delay_1ms(uint x)
- {
- uint i;
- uchar j;
- for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);
- }
- //名稱: Keyscan()
- //功能: P1外接4×4按鍵, 用掃描法讀出鍵值
- //返回: 按鍵值0~15/如無鍵按下, 返回16
- //
- uchar Keyscan(void)
- {
- uchar i, j, temp;
- uchar Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
- for(j = 0; j < 4; j++)//循環四次
- {
- P1 = Buffer[j]; //在P1高四位分別輸出一個低電平
- temp = 0x01; //計劃先判斷P1.0位
- for(i = 0; i < 4; i++) //循環四次
- {
- if(!(P1 & temp)) //從P1低四位,截取1位
- return (i + j * 4); //返回取得的按鍵值
- temp <<= 1; //判斷的位,左移一位
- }
- }
- return 16; //判斷結束,沒有鍵按下,返回16
- } //呵呵,實質性的語句不過8行,就是這么簡練!
- // 功能: 經由 P0 驅動 164,再使得共陽數碼管顯示 0~F
- //參數: k (鍵盤數值)
- void Display(uchar k)
- {
- uchar code table[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共陽段碼
- uchar i, j;
- j = table[k]; //取出段碼
- for(i = 0; i < 8; i++)
- {
- DAT = j & 0x01; //低位在前
- CLK = 0;
- Delay_1ms(1);
- CLK = 1;
- j >>= 1;
- }
- }
- /////////////////////////////////////////
- void Main(void)
- {
- uchar Key_Value = 16, Key_Temp1, Key_Temp2;//兩次讀出的鍵值
- P0 = 0xff;
- while(1)
- {
- //---------以下讀入按鍵、消抖、等待按鍵釋放
-
- P1 = 0xff;
- Key_Temp1 = Keyscan(); //先讀入按鍵
- if(Key_Temp1 != 16)
- { //如果有鍵按下
- Delay_1ms(10); //延時一下
- Key_Temp2 = Keyscan(); //再讀一次按鍵
- if (Key_Temp1 == Key_Temp2)
- { //必須是兩次相等
- Key_Value = Key_Temp1; //才保存,這就是消除抖動
- Display(Key_Value); //顯示鍵值
- }
- }
- }
- }
- */
復制代碼
所有資料51hei提供下載:
兩種4X4按鍵掃描.rar
(113.67 KB, 下載次數: 9)
2017-9-24 14:19 上傳
點擊文件名下載附件
掃描法簡易代碼 下載積分: 黑幣 -5
|