?? ch451a54.asm
字號:
; CH451
; 4-Wire Interface Program for MCS-51
;
; Website: http://winchiphead.com
; Email: tech@winchiphead.com
; Author: W.ch 2003.03
;
;****************************************************************************
;需要主程序定義的參數
;CH451_DCLK BIT P1.7 ;串行數據時鐘,上升沿激活
;CH451_DIN BIT P1.6 ;串行數據輸出,接CH451的數據輸入
;CH451_LOAD BIT P1.5 ;串行命令加載,上升沿激活
;CH451_DOUT BIT P3.2 ;INT0,鍵盤中斷和鍵值數據輸入,接CH451的數據輸出
;CH451_KEY DATA 7FH ;存放鍵盤中斷中讀取的鍵值
;****************************************************************************
;
;對外接口子程序
;
; 1. CH451_INIT 初始化子程序
;
; 2. CH451_WRITE 輸出命令子程序
; 入口: B-ACC 待寫的12位數據, 低8位在ACC中, 高4位在B的低4位中
; 使用: ACC, B, R7
;
; 3. CH451_READ 輸入鍵值子程序
; 出口: ACC 鍵值數據
; 使用: ACC, R7
;
; 4. CH451_INTER 鍵盤中斷子程序
; 使用: 堆棧4字節
;
; 如果使用CH451的鍵盤中斷, 強烈建議在子程序CH451_WRITE和CH451_READ中
; 添加屏蔽鍵盤中斷的代碼, 以防止在子程序運行過程中被鍵盤中斷
;
;****************************************************************************
;主程序的例子
; ORG 0000H ;復位后單片機入口
; LJMP START
; ORG 0003H ;鍵盤中斷
; LJMP CH451_INTER
;
;START: ...
; CALL CH451_INIT ;初始化
; ...
; SETB EA ;允許中斷
; ...
; MOV B,#04H ;設置系統參數命令
; MOV A,#03H ;禁止看門狗,使能鍵盤功能,使能顯示驅動
; CALL CH451_WRITE ;發出命令
; ...
; MOV B,#09H ;加載字數據到DIG1對應的數據寄存器
; MOV A,#5BH ;字數據,如果是數碼管,則第二個數碼管顯示"2"
; CALL CH451_WRITE ;發出命令
; ...
;WAIT_KEY: MOV A,#0FFH ;無效按鍵代碼
; XCH A,CH451_KEY ;取鍵盤中斷獲取的鍵值,同時置為無效值
; MOV R6,A ;鍵值
; XRL A,#0FFH ;有鍵按下?
; JZ WAIT_KEY ;還沒有檢測到有效按鍵,繼續等待
; CJNE R6,??,... ;判別按鍵
; ...
;
;; CALL CH451_READ ;重新讀取最近一次有效按鍵的鍵值
; ...
;
;
;****************************************************************************
;
;
; 初始化子程序
CH451_INIT: CLR CH451_DIN ;先低后高,輸出上升沿通知CH451選擇4線串行接口
SETB CH451_DCLK ;置為默認的高電平
SETB CH451_DIN
SETB CH451_LOAD
SETB CH451_DOUT ;置為輸入
; 下述三條指令用于鍵盤中斷
; CLR IT0 ;置外部信號為低電平觸發
; SETB PX0 ;置高優先級或者低優先級
; CLR IE0 ;清中斷標志
; SETB EX0 ;允許鍵盤中斷
RET
;
;
; 輸出命令子程序
; ENTRY: B-ACC 待寫的12位數據, 低8位在ACC中, 高4位在B的低4位中
; USE: ACC, B, R7
CH451_WRITE: ;CLR EX0 ;禁止鍵盤中斷
CLR CH451_LOAD ;命令開始,此命令可以放在后面
MOV R7,#08H ;將ACC中8位送出
CH451_WRITE_8: RRC A ;低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿通知CH451輸入位數據
DJNZ R7,CH451_WRITE_8 ;位數據未完繼續
MOV A,B
MOV R7,#04H ;將B中4位送出
CH451_WRITE_4: RRC A ;低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿通知CH451輸入位數據
DJNZ R7,CH451_WRITE_4 ;位數據未完繼續
SETB CH451_LOAD ;產生加載上升沿通知CH451處理命令數據
; SETB EX0 ;允許鍵盤中斷
RET
;
;
; 輸入鍵值子程序
; EXIT: ACC 鍵值數據
; USE: ACC, R7
CH451_READ: ;CLR EX0 ;禁止鍵盤中斷
CLR CH451_LOAD ;命令開始
MOV A,#07H ;讀取鍵值命令的高4位0111B
MOV R7,#04H ;忽略12位命令的低8位
CH451_READ_4: RRC A ;低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿鎖通知CH451輸入位數據
DJNZ R7,CH451_READ_4 ;位數據未完繼續
SETB CH451_LOAD ;產生加載上升沿通知CH451處理命令數據
CLR A ;先清除鍵值單元以便移位
MOV R7,#07H ;讀入7位鍵值
CH451_READ_7: MOV C,CH451_DOUT ;讀入一位數據
CLR CH451_DCLK ;產生時鐘下升沿通知CH451輸出下一位
RLC A ;數據移入ACC,高位在前,低位在后
SETB CH451_DCLK
DJNZ R7,CH451_READ_7 ;位數據未完繼續
; CLR IE0 ;清中斷標志,讀操作過程中有低電平脈沖
; SETB EX0 ;允許鍵盤中斷
RET
;
;
; 鍵盤中斷子程序
; USE: 堆棧4字節
CH451_INTER: PUSH PSW ;現場保護
PUSH ACC
CLR CH451_LOAD ;命令開始
MOV A,#0F7H ;讀鍵值命令,忽略12位命令的低8位,高4位用作結束標志
CH451_INTER_4: SETB C ;在高位添0以檢測位數據結束
RRC A ;低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿鎖通知CH451輸入位數據
CJNE A,#0FFH,CH451_INTER_4 ;位數據未完繼續,共4位,完成后為0FFH
SETB CH451_LOAD ;產生加載上升沿通知CH451處理命令數據
MOV A,#0FCH ;該數據用以檢測位數據結束
CH451_INTER_7: MOV C,CH451_DOUT ;讀入一位數據
CLR CH451_DCLK ;產生時鐘下升沿通知CH451輸出下一位
RLC A ;數據移入ACC,高位在前,低位在后
SETB CH451_DCLK
JC CH451_INTER_7 ;位數據未完繼續,共7位,完成后才移出0
MOV CH451_KEY,A ;保存鍵值
POP ACC
POP PSW
CLR IE0 ;清中斷標志,該指令需根據實際情況作修改
RETI ;中斷返回
;
;****************************************************************************
;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -