|
讀鍵盤數據指令 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讀出當前的按鍵代碼。與其它指令不同,此命令的前一個字節00010101B為微控制器傳送到HD7279的指令,而后一個字節d0- d7則為HD7279返回的按鍵代碼,其范圍是0-3FH(無鍵按下時為0xFF),各鍵鍵盤代碼的定義,請參閱圖2。 此指令的前半段,HD7279的DATA引腳處于高阻輸入狀態,以接受來自微處理器的指令;在指令的后半段,DATA引腳從輸入狀態轉為輸出狀態,輸出鍵盤代碼的值。故微處理器連接到DATA引腳的I/O口應有一從輸出態到輸入態的轉換過程,詳情請參閱本文‘串行接口’一節的內容。 當HD7279檢測到有效的按鍵時,KEY引腳從高電平變為低電平,并一直保持到按鍵結束。在此期間,如果HD7279接收到‘讀鍵盤數據指令’,則輸出當前按鍵的鍵盤代碼;如果在收到‘讀鍵盤指令’時沒有有效按鍵,HD7279將輸出FFH (11111111B)。 串行接口 HD7279采用串行方式與微處理器通訊, 串行數據從DATA引腳送入芯片,并由CLK端同步。當片選信號變為低電平后,DATA引腳上的數據在CLK引腳的上升沿被寫入HD7279的緩沖寄存器。 HD7279的指令結構有三種類型:1、不帶數據的純指令,指令的寬度為8個BIT,即微處理器需發送8個CLK脈沖。2、帶有數據的指令,寬度為16個BIT,即微處理器需發送16個CLK脈沖。3、讀取鍵盤數據指令,寬度為16個BIT,前8個為微處理器發送到HD7279的指令,后8個BIT為HD7279返回的鍵盤代碼。執行此指令時,HD7279的DATA端在第9個CLK脈沖的上升沿變為輸出狀態,并與第16個脈沖的下降沿恢復為輸入狀態,等待接收下一個指令。 串行接口的時序如下圖: 1、純指令
 2、帶數據指令
8位指令(高位在前) 8位數據(高位在前) 3、讀鍵盤指令 讀鍵盤指令(8位,高位在前) HD7279輸出的鍵盤代碼(8位,高位在前) 2、EM78P156 接口程序 硬件連接如圖,EM78P156所用時鐘頻率4MHz, 選4個時鐘周期為一個指令周期, ;轉移指令用2個指令周期。程序使用ASM456編譯程序編譯通過。程序中延時時間 ;以HD7279A外接R=1.5K, C=15pF為準,如使用不同的CPU時鐘頻率或R/C參數, ;請注意調整延時時間。 圖 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 ;設定延時時間為約50uS MOV TIMER,A DELAY_LOOP: DJZ TIMER JMP DELAY_LOOP RET SHORT_DELAY: MOV A,@3 ;設定延時時間為約9uS MOV TIMER,A SHORT_LP: DJZ TIMER JMP SHORT_LP RET ;******************************************* ; 發送1個字節到HD7279,高位在前 ;******************************************* SEND: MOV DATA_OUT,A ;待發送數據存入DATA_OUT MOV A,@8 MOV BIT_COUNT,A ;設定位記數器=8 BC P5,CS ;設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 ;設CLK為高電平 CALL SHORT_DELAY ;短延時 BC P5,CLK ;設CLK為低電平 CALL SHORT_DELAY DJZ BIT_COUNT ;檢查是否8位均發送完畢 JMP SEND_LOOP ;未發送完,發送下一位 BC P5,DAT RET ;發送完畢,返回 ;******************************************* ; 從HD7279接收一個字節,高位在前 ;******************************************* RECEIVE: MOV A,@8 MOV BIT_COUNT,A ;設定位記數器=8 MOV A,@0B11111100 ;設P5.2(DATA)口為輸入狀態 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 ;讀取一位數據 BC P5,CLK ;置CLK為低電平 CALL SHORT_DELAY DJZ BIT_COUNT ;是否已接收8位數據 JMP RECEIVE_LOOP MOV A,@0B11111000 ;重新設P52(DATA)口為輸出態 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 ;發復位(清除)指令 CALL SEND BS P5,CS ;恢復CS為高電平 ;******************************************* ; 主程序 ;******************************************* MAIN: JBC P5,KEY ;檢測是否有鍵按下 JMP MAIN MOV A,@0B00010101 ;有鍵按下,發送讀鍵盤指令 CALL SEND ;發送讀鍵盤指令 CALL RECEIVE ;從HD7279A讀鍵盤代碼 BS P5,CS ;設CS為高電平 ;******************************************* ; 16進制——BCD碼轉換 ;******************************************* 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 ;******************************************* ;發送按鍵的BCD碼到HD7279A ;******************************************* ;發2次左移指令,使當前顯示內容左移,留出空 ;位供顯示新數據 OVER MOV A,@0B10100001 ;左移指令 CALL SEND ;發送指令到HD7279A MOV A,@0B10100001 ;左移指令 CALL SEND ;發送指令到HD7279A MOV A,@0B10000001 ;下載數據且譯碼指令(第2位) CALL SEND ;發送指令到HD7279A MOV A,TEN CALL SEND ;發送十位數字到HD7279A MOV A,@0B10000000 ;下載數據且譯碼指令(第1位) CALL SEND ;發送指令到HD7279A MOV A,DATA_IN CALL SEND ;發送個位數字到HD7279A BS P5,CS WAIT JBS P5,KEY ;等待按鍵放開 JMP WAIT JMP MAIN ;EOP
|