?? gaichefa.asm
字號:
; *************************************
; * *
; * 遙控編碼控制器 *
; * *
; * 采用89c51 *
; *************************************
;
; P1.0口按紐為前進,P1.1口按紐為后退,P1.2口按紐為左轉彎,P1.3口按紐為右轉彎,
; P1.4口按紐為自動駕駛,P3.5為編碼輸出
;
;*************************************
;* *
;* 主程序和中斷程序入口 *
;* *
;*************************************
KEYWORD EQU 23H
ORG 0000H ;程序執行開始地址
LJMP START ;跳至START執行
ORG 0003H ;外中斷0中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 000BH ;定時器T0中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 0013H ;外中斷1中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 001BH ;定時器T1中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 0023H ;串行口中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 002BH ;定時器T2中斷入口地址
RETI ;中斷返回(不開中斷)
;
;*************************************
;* *
;* 初始化程序中的各變量 *
;* *
;*************************************
CLEARMEMIO: CLR A ;清A
DEC A ;A為#0FFH
MOV P1,A ; P1口置1
MOV P3,A ; P3口置1
MOV IE,#00H ;關所有中斷
RET ;子程序返回
;
;
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: CALL LED
LCALL CLEARMEMIO ;調用初始化
; 主體程序
MAIN: LCALL KEYWORK ;調用查鍵子程序
LJMP MAIN ;轉MAIN循環
NOP ;PC值出錯處理
NOP
NOP
LJMP START ;轉START重新啟動
;
;**************************
;* *
;* 鍵盤工作子程序 *
;**************************
; 4*4行列掃描查鍵子程序
KEYWORK: MOV P1,#0FFH ; 置P1口為輸入狀態
CLR P1.0 ;掃描第一行(第一行為0)
MOV A,P1 ;讀入P1口值
ANL A,#0F0H ;低四位為0
CJNE A,#0F0H,KEYCON ;高四位不為全1(有鍵按下)轉KEYCOON
SETB P1.0 ; 掃描第二行(第二行為0)
CLR P1.1 ;
MOV A,P1 ; 讀入P1口值
ANL A,#0F0H ; 低四位為0
CJNE A,#0F0H,KEYCON ; 高四位不為全1(有鍵按下)轉KEYCOON
SETB P1.1 ; 掃描第三行(第三行為0)
CLR P1.2 ;
MOV A,P1 ; 讀入P1口值
ANL A,#0F0H ; 低四位為0
CJNE A,#0F0H,KEYCON ; 高四位不為全1(有鍵按下)轉KEYCOON
SETB P1.2 ; 掃描第四行(第四行為0)
CLR P1.3 ;
MOV A,P1 ; 讀入P1口值
ANL A,#0F0H ; 低四位為0
CJNE A,#0F0H,KEYCON ; 高四位不為全1(有鍵按下)轉KEYCOON
SETB P1.3 ;結束行掃描
RET ;子程序返回
KEYCON: LCALL DL10MS ;消抖處理
MOV A,P1 ;再讀入P1口值
ANL A,#0F0H ; 低四位為0
CJNE A,#0F0H,KEYCHE ; 高四位不為全1,確有鍵按下,轉KEYCHE
KEYOUT: RET ;干擾,子程序返回
KEYCHE: MOV A,P1 ;讀P1口值
MOV KEYWORD,A ;放入23H暫存
CJLOOP: ;調顯示子程序
MOV A,P1 ;讀P1口值
ANL A,#0F0H ;低四位為0
CJNE A,#0F0H,CJLOOP ;高四位為全1(鍵還按著),轉CJLOOP等待釋放
MOV R7,#00H ;鍵釋放,置R7初值為#00H(查表次數)
MOV DPTR,#KEYTAB ;取鍵值表首址
CHEKEYLOOP: MOV A,R7 ;查表次數入A
MOVC A,@A+DPTR ;查表
XRL A,KEYWORD ;查表值與P1口讀入值比較
JZ KEYOK ;為0(相等)轉KEYOK
INC R7 ;不等,查表次數加1
CJNE R7,#10H,CHEKEYLOOP ;查表次數不超過16次轉CHEKEYLOOP再查
RET ;16次到,退出
;
KEYOK: MOV A,R7 ;查表次數入A(即鍵號值)
MOV B,A ;放入B
RL A ;左移
ADD A,B ;相加(鍵號乘3處理JMP 3字節指令)
MOV DPTR,#KEYFUNTAB ;取鍵功能散轉表首址
JMP @A+DPTR ;查表
KEYFUNTAB: LJMP KEYFUN00 ; 鍵功能散轉表。跳至0號鍵功能程序
LJMP KEYFUN01 ; 跳至01號鍵功能程序
LJMP KEYFUN02 ; 跳至02號鍵功能程序
LJMP KEYFUN03
LJMP KEYFUN04
LJMP KEYFUN05
LJMP KEYFUN06
LJMP KEYFUN07
LJMP KEYFUN08
LJMP KEYFUN09
LJMP KEYFUN10
LJMP KEYFUN11
LJMP KEYFUN12
LJMP KEYFUN13
LJMP KEYFUN14
LJMP KEYFUN15 ; 跳至15號鍵功能程序
RET ;散轉出錯返回
;
;鍵號對應P1口數值表(同時按下兩鍵為無效操作)
KEYTAB: DB 0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH
DB 0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,0FFH,0FFH
;
;
KEYFUN00: CLR P2.0
call DL10MS;CALL DELAY
SETB P2.0
MOV A,#02H ;發2個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN01: CLR P2.1
call DL10MS;CALL DELAY
SETB P2.1
MOV A,#03H ;發3個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN02: CLR P2.2
call DL10MS;CALL DELAY
SETB P2.2
MOV A,#04H ;發4個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN03: CLR P2.3
call DL10MS;CALL DELAY
SETB P2.3
MOV A,#05H ;發5個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN04: CLR P2.4
call DL10MS;CALL DELAY
SETB P2.4
MOV A,#06H ;發6個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN05: CLR P2.5
call DL10MS;CALL DELAY
SETB P2.5
MOV A,#07H ;發7個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN06: CLR P2.6
call DL10MS;CALL DELAY
SETB P2.6
MOV A,#08H ;發8個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN07: MOV A,#09H ;發9個脈沖
LJMP REMOTE ;轉發送程序
RET
;
;
KEYFUN08: MOV A,#0AH ;發10個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN09: MOV A,#0BH ;發11個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN10: MOV A,#0CH ;發12個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN11: MOV A,#0DH ;發13個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN12: MOV A,#0EH ;發14個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN13: MOV A,#0FH ;發15個脈沖
LJMP REMOTE ;轉發送程序
RET
;
KEYFUN14: MOV A,#10H
LJMP REMOTE
RET
KEYFUN15: MOV A,#11H
LJMP REMOTE
RET
;
;
;*************************************
;* *
;* 編 碼 發 射 程 序 *
;* *
;*************************************
;
REMOTE: MOV R1,A ;?????A
LJMP OUT3 ;???????
OUT: MOV R0,#55H ;1MS?????
OUT1: CLR P3.5 ;??????
NOP ;????(????21??)
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R0,OUT1 ;??????,?OUT1??
MOV R0,#55H ;1MS?????
OUT2: SETB P3.5 ;??????
NOP ;????(????21??)
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R0,OUT2 ;??????,?OUT2??
DJNZ R1,OUT ;???????OUT???
LCALL DL10MS ;??????10??
RET ;??
OUT3: MOV R0,#0FFH ;3MS?????
LJMP OUT1 ;?OUT1?????
LED: ;程序指示燈
MOV R4,#0Ah
L0: CPL P2.7
mov r5, #0ffh
L1: CALL DELAY
djnz r5,L1
DJNZ R4,L0
SETB P2.7
RET
;*************************************
;* *
;* 延時 255 X 2 = 512 us *
;* *
;*************************************
DELAY: MOV R2,#0FFH
DELAY1: DJNZ R2,DELAY1
RET
;
;*************************************
;* *
;* 延時10ms程序 *
;* (消按鍵抖動用) *
;*************************************
DL10MS: MOV R3,#14H
DL10MS1: LCALL DELAY
DJNZ R3,DL10MS1
RET
DL500MS: MOV R4,#32H
DL500MS1: LCALL DL10MS
DJNZ R4,DL500MS1
RET
;
;
END ;程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -