;FUCTION:當按下鍵盤數值時,七段顯示器顯示數值在個位數,而 ; 下次再按鍵時,上次資料左移至十位數,最新資料顯 ; 示在個位數,而每當有資料輸入時,舊資料會左移直至 ;  千位數。而資料範圍為0~9 ; DISP_BCD EQU 30H ;設定顯示初始位址 SPPOINT EQU 50H ;設定堆疊指標初值 ORG 00H ;重置位址 JMP INITIAL ORG 30H INITIAL: MOV R7,#0FFH ;待電源穩定 DJNZ R7,$ ; MOV SP,#SPPOINT ;設定堆疊指標位址 MOV R0,#DISP_BCD ;(M30)=00H MOV @R0,#00H ; MOV R0,#DISP_BCD+1 ;(M31)=00H MOV @R0,#00H ; ;======================================================= ; NAME:DISPLAY ; FUNCTION:顯示數值 ;======================================================= DISPLAY:MOV R0,#DISP_BCD ;個位數顯示 MOV A,@R0 ; ORL A,#11100000B ; ANL A,#11101111B ; MOV P1,A ; CALL DELAY ; ORL P1,#11111111B ; MOV A,@R0 ;十位數顯示 SWAP A ; ORL A,#11010000B ; ANL A,#11011111B ; MOV P1,A ; CALL DELAY ; ORL P1,#11111111B ; MOV R0,#DISP_BCD+1 ;百位數顯示 MOV A,@R0 ; ORL A,#10110000B ; ANL A,#10111111B ; MOV P1,A ; CALL DELAY ; ORL P1,#11111111B ; MOV A,@R0 ;千位數顯示 SWAP A ; ORL A,#01110000B ; ANL A,#01111111B ; MOV P1,A ; CALL DELAY ; ORL P1,#11111111B ; ;======================================================= ; NAME:SCAMKEY ; FUNCTION:掃描鍵盤 ;======================================================= SCANKEY:MOV P2,#0FH MOV A,P2 MOV R1,A ;將掃描碼讀入R1 MOV P2,#F0H MOV A,P2 MOV R2,A ;將資料碼讀入R2 XRL A,#F0H JZ DISPLAY ;判斷資料碼已讀入 MOV A,R1 XRL A,#0FH JZ DISPLAY ;判斷掃描碼已讀入 ;======================================================= MOV R3,#FFH ;使用R3計算列 MOV R4,#FFH ;使用R4計算行 MOV A,R1 ;把掃描碼轉態 ANL A,#0FH ;使掃描碼變為行號 XRL A,#0FH ;(行號包括 0 1 2 3) TEST: INC R3 ; CLR C ; RRC A ; JNC TEST ; ;======================================================= MOV A,R2 ;把資料碼轉態 SWAP A ;使資料碼變為列號 ANL A,#0FH ;(列號包括 0 1 2 3) XRL A,#0FH ; SERC: INC R4 ; CLR C ; RRC A ; JNC SERC ; ;======================================================= CLR C ;清除進位旗標為零 MOV A,#4 ; MOV B,R4 ; MUL AB ; ADD A,R3 ;(列號x4+行號=按鍵值) MOV DPTR,#TABLE MOVC A,@A+DPTR ;取碼 MOV R5,A ;儲存按鍵值至R5 ;======================================================= ; NAME:移位 ; FUNCTION:作移位動作 ;======================================================= MOV R3,#00H MOV R4,#00H MOV R0,#DISP_BCD ;將(M30)的高, MOV A,@R0 ;低位元交換 SWAP A ; MOV R3,A ; MOV @R0,A ; CALL DELAY_100M MOV R0,#DISP_BCD+1 ;將(M31)的高, MOV A,@R0 ;低位元交換 SWAP A ; MOV R4,A ; MOV @R0,A ; CALL DELAY_100M MOV A,R3 ;將(M30),(M31)的 XCHD A,@R0 ;低4位元交換 MOV R0,#DISP_BCD ; MOV A,R4 ; XCHD A,@R0 ; R_KEY: MOV A,@R0 ANL A,#F0H ORL A,R5 MOV @R0,A JMP DISPLAY ;======================================================= ; NAME:DELAY ; FUNCTION:延遲時間 ;======================================================= DELAY_100M: ;延時100MSEC副程式 MOV R6,#200 DELAY_2:MOV R7,#250 DJNZ R7,$ DJNZ R6,DELAY_2 RET ;======================================================= DELAY: MOV R6,#30 ;延時副程式 T2: MOV R7,#98 DJNZ R7,$ DJNZ R6,T2 RET ;======================================================= ; NAME:TABLE ; FUNCTION:按鍵值取碼 ;======================================================= TABLE: DB 00 ;取碼指標初始值 DB 01 DB 02 DB 03 DB 04 DB 05 DB 06 DB 07 DB 08 DB 09 ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ END ;程式結束