|
讀鍵盤數(shù)據(jù)指令 D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | | d7 | d6 | d5 | d4 | d3 | d2 | d1 | d0 |
該指令從HD7279讀出當(dāng)前的按鍵代碼。與其它指令不同,此命令的前一個字節(jié)00010101B為微控制器傳送到HD7279的指令,而后一個字節(jié)d0- d7則為HD7279返回的按鍵代碼,其范圍是0-3FH(無鍵按下時為0xFF),各鍵鍵盤代碼的定義,請參閱圖2。 此指令的前半段,HD7279的DATA引腳處于高阻輸入狀態(tài),以接受來自微處理器的指令;在指令的后半段,DATA引腳從輸入狀態(tài)轉(zhuǎn)為輸出狀態(tài),輸出鍵盤代碼的值。故微處理器連接到DATA引腳的I/O口應(yīng)有一從輸出態(tài)到輸入態(tài)的轉(zhuǎn)換過程,詳情請參閱本文‘串行接口’一節(jié)的內(nèi)容。 當(dāng)HD7279檢測到有效的按鍵時,KEY引腳從高電平變?yōu)榈碗娖剑⒁恢北3值桨存I結(jié)束。在此期間,如果HD7279接收到‘讀鍵盤數(shù)據(jù)指令’,則輸出當(dāng)前按鍵的鍵盤代碼;如果在收到‘讀鍵盤指令’時沒有有效按鍵,HD7279將輸出FFH (11111111B)。 串行接口 HD7279采用串行方式與微處理器通訊, 串行數(shù)據(jù)從DATA引腳送入芯片,并由CLK端同步。當(dāng)片選信號變?yōu)榈碗娖胶,DATA引腳上的數(shù)據(jù)在CLK引腳的上升沿被寫入HD7279的緩沖寄存器。 HD7279的指令結(jié)構(gòu)有三種類型:1、不帶數(shù)據(jù)的純指令,指令的寬度為8個BIT,即微處理器需發(fā)送8個CLK脈沖。2、帶有數(shù)據(jù)的指令,寬度為16個BIT,即微處理器需發(fā)送16個CLK脈沖。3、讀取鍵盤數(shù)據(jù)指令,寬度為16個BIT,前8個為微處理器發(fā)送到HD7279的指令,后8個BIT為HD7279返回的鍵盤代碼。執(zhí)行此指令時,HD7279的DATA端在第9個CLK脈沖的上升沿變?yōu)檩敵鰻顟B(tài),并與第16個脈沖的下降沿恢復(fù)為輸入狀態(tài),等待接收下一個指令。 串行接口的時序如下圖: 1、純指令
 2、帶數(shù)據(jù)指令
8位指令(高位在前) 8位數(shù)據(jù)(高位在前) 3、讀鍵盤指令 讀鍵盤指令(8位,高位在前) HD7279輸出的鍵盤代碼(8位,高位在前) 2、EM78P156 接口程序 硬件連接如圖,EM78P156所用時鐘頻率4MHz, 選4個時鐘周期為一個指令周期, ;轉(zhuǎn)移指令用2個指令周期。程序使用ASM456編譯程序編譯通過。程序中延時時間 ;以HD7279A外接R=1.5K, C=15pF為準(zhǔn),如使用不同的CPU時鐘頻率或R/C參數(shù), ;請注意調(diào)整延時時間。 圖 5.14 EM78P156與HD7279A 的硬件連接
;********************************** ; 寄存器定義 ;********************************** STATUS == 0X03 P5 == 5 C == 0 BIT_COUNT == 0X10 DATA_OUT == 0X11 DATA_IN == 0X12 TEN == 0X13 TIMER == 0X14 TIMER1 == 0X15 ;********************************** ; I/O口定義 ;********************************** CS == 0 ;CS連接于EM78P156的P50 CLK == 1 ;CLK連接于EM78P156的P51 DAT == 2 ;DAT連接于EM78P156的P52 KEY == 3 ;KEY連接于EM78P156的P53
ORG 0x00 JMP START ORG 0X10 ;******************************************* ; 延時子程序 ;******************************************* LONG_DELAY: MOV A,@16 ;設(shè)定延時時間為約50uS MOV TIMER,A DELAY_LOOP: DJZ TIMER JMP DELAY_LOOP RET SHORT_DELAY: MOV A,@3 ;設(shè)定延時時間為約9uS MOV TIMER,A SHORT_LP: DJZ TIMER JMP SHORT_LP RET ;******************************************* ; 發(fā)送1個字節(jié)到HD7279,高位在前 ;******************************************* SEND: MOV DATA_OUT,A ;待發(fā)送數(shù)據(jù)存入DATA_OUT MOV A,@8 MOV BIT_COUNT,A ;設(shè)定位記數(shù)器=8 BC P5,CS ;設(shè)CS為低電平 CALL LONG_DELAY ;長延時 SEND_LOOP: BC STATUS,C RLC DATA_OUT ;輸出1位 BC P5,DAT JBC STATUS,C BS P5,DAT BS P5,CLK ;設(shè)CLK為高電平 CALL SHORT_DELAY ;短延時 BC P5,CLK ;設(shè)CLK為低電平 CALL SHORT_DELAY DJZ BIT_COUNT ;檢查是否8位均發(fā)送完畢 JMP SEND_LOOP ;未發(fā)送完,發(fā)送下一位 BC P5,DAT RET ;發(fā)送完畢,返回 ;******************************************* ; 從HD7279接收一個字節(jié),高位在前 ;******************************************* RECEIVE: MOV A,@8 MOV BIT_COUNT,A ;設(shè)定位記數(shù)器=8 MOV A,@0B11111100 ;設(shè)P5.2(DATA)口為輸入狀態(tài) IOW P5 CALL LONG_DELAY ;長延時 RECEIVE_LOOP: BS P5,CLK ;置CLK為高電平 CALL SHORT_DELAY ;短延時 BS STATUS,C JBS P5,DAT BC STATUS,C RLC DATA_IN ;讀取一位數(shù)據(jù) BC P5,CLK ;置CLK為低電平 CALL SHORT_DELAY DJZ BIT_COUNT ;是否已接收8位數(shù)據(jù) JMP RECEIVE_LOOP MOV A,@0B11111000 ;重新設(shè)P52(DATA)口為輸出態(tài) IOW P5 RET ;******************************************* ; 初始化 ;******************************************* START: MOV A,@0B11111000 ;I/O口初始化 IOW P5 MOV A,@0B11111001 MOV P5,A MOV A,@0X19 ;延時約25MS MOV TIMER,A START_DELAY: MOV A,@0XFF MOV TIMER1,A START_DELAY1: DJZ TIMER1 JMP START_DELAY1 DJZ TIMER JMP START_DELAY MOV A,@0B10100100 ;發(fā)復(fù)位(清除)指令 CALL SEND BS P5,CS ;恢復(fù)CS為高電平 ;******************************************* ; 主程序 ;******************************************* MAIN: JBC P5,KEY ;檢測是否有鍵按下 JMP MAIN MOV A,@0B00010101 ;有鍵按下,發(fā)送讀鍵盤指令 CALL SEND ;發(fā)送讀鍵盤指令 CALL RECEIVE ;從HD7279A讀鍵盤代碼 BS P5,CS ;設(shè)CS為高電平 ;******************************************* ; 16進(jìn)制——BCD碼轉(zhuǎn)換 ;******************************************* CLR TEN GET_DEC MOV A,@10 SUB A,DATA_IN JBS STATUS,C JMP OVER MOV DATA_IN,A INC TEN JMP GET_DEC ;******************************************* ;發(fā)送按鍵的BCD碼到HD7279A ;******************************************* ;發(fā)2次左移指令,使當(dāng)前顯示內(nèi)容左移,留出空 ;位供顯示新數(shù)據(jù) OVER MOV A,@0B10100001 ;左移指令 CALL SEND ;發(fā)送指令到HD7279A MOV A,@0B10100001 ;左移指令 CALL SEND ;發(fā)送指令到HD7279A MOV A,@0B10000001 ;下載數(shù)據(jù)且譯碼指令(第2位) CALL SEND ;發(fā)送指令到HD7279A MOV A,TEN CALL SEND ;發(fā)送十位數(shù)字到HD7279A MOV A,@0B10000000 ;下載數(shù)據(jù)且譯碼指令(第1位) CALL SEND ;發(fā)送指令到HD7279A MOV A,DATA_IN CALL SEND ;發(fā)送個位數(shù)字到HD7279A BS P5,CS WAIT JBS P5,KEY ;等待按鍵放開 JMP WAIT JMP MAIN ;EOP
|