C51單片機上的外設鍵盤鍵是使用的矩陣方式擴展的,但是硬件仿真時必須把蜂民器的開關打開觸使行掃描的74HC53的E端接地為輸出型,否則測死了也沒反應,我還以為是我的程序有問題呢,后來才找到的。
其原理
74HC138譯碼器在輸出端Y1與WR(P3^6)都處于低電平通過或非門,轉化成行掃描的74HC53的片選端打開寫入數據,在輸出端的高4位通過移位方式輸出到外設鍵盤中。然后給WR一個高電平來給74HC53一個低電平使得輸入無效進行鎖存操作。然后通過RD(P3^7)與Y2共同輸出低電平通過或非門加上個非門把低電平送到列掃描的74HC53的片選端E上,在讀取數據前必須先將要獲取的高4位進行置1,然后讀取高4位數據,通過RD送出高電平進行鎖住輸出,防止74HC53同時輸入輸出導致芯片燒毀。然后根據獲得的unsigned char進行移位比對操作來獲得是哪一列,然后在通過運算得到第幾個按鍵被按下。
這是最簡單的矩陣方式擴展鍵盤的代碼流程,上述是我理解的流程,測試已沒問題。
#include<reg52.h> #include<absacc.h> void my_delay10nms(unsigned int n) { unsigned i,j; while(n --) { for(i = 128;i > 0;i --) for(j = 10;j > 0;j --); } } sbit LED_BIT = P1^6; void main(void) { unsigned char Key_h; unsigned char Key_Val; unsigned char Key_r; unsigned char Last_key; unsigned char Key_Temp; while(1) { Key_Val=0; for(Key_h=4;Key_h<8;Key_h++) { P2=0x88; P0=(1<<Key_h); P3&=~(1<<6); P3|=(1<<6); P2=0x90; P3&=~(1<<7); //讀 P0|=0xf0; Key_Temp=P0&0xf0; // P3|=(1<<7); // 防止芯片燒壞 if(Key_Temp) { for(Key_r=4;Key_r<8;Key_r++) { if(Key_Temp&(1<<Key_r)) { Key_Val=(Key_h-4)*4+(Key_r-4)+1; break; } } if(Key_Val)break; } } if(Last_key!=Key_Val) { Last_key=Key_Val; }else { if(Last_key) { P0=Last_key; LED_BIT = 1; LED_BIT = 0; } } my_delay10nms(1); } }