?? fmasmhu.asm
字號:
;26H-29H放顯示小數(shù)位、個位、十位、百位BCD碼數(shù),24H-25H放頻率控制數(shù)據(jù)(十六進(jìn)制)
;
CONBITL EQU 21H ;頻率控制字節(jié)低8位
CONBITH EQU 22H ;頻率控制字節(jié)高8位
KEYWORD EQU 23H ;存放鍵掃描時P1口值
;
;
ORG 0000H ;程序開始地址
LJMP START ;轉(zhuǎn)START執(zhí)行
ORG 0003H ;
RETI ;不用中斷程序
ORG 000BH ;
RETI ; 不用中斷程序
ORG 0013H ;
RETI ; 不用中斷程序
ORG 001BH ;
RETI ; 不用中斷程序
ORG 0023H ;
RETI ; 不用中斷程序
ORG 002BH ;
RETI ; 不用中斷程序
;
;初始化程序
CLEARMEN: MOV R0,#20H ;20H-29H循環(huán)清0
MOV R1,#0AH ;
CLEARLOOP: MOV @R0,#00H ;
INC R0 ;
DJNZ R1,CLEARLOOP ;
MOV P0,#0FFH ;四端口置1
MOV P1,#0FFH ;
MOV P2,#0FFH ;
MOV P3,#0FFH ;
CLR P3.0 ;BH1415禁止操作
CLR P3.1 ;
CLR P3.2 ;
LCALL KEYFUN15 ;置立體聲發(fā)射方式,開立體聲發(fā)射指示燈
CLEAR1: MOV PCON,#00H ;控制寄存器清0
MOV 29H,#00H ; 置初始值為88MHZ(顯示為088.0)
MOV 28H,#08H ;
MOV 27H,#08H ;
MOV 26H,#00H ;
LCALL DISPUPDAT ;寫入BH1415芯片(修改發(fā)送頻率)
RET ;子程序返回
;
;主程序
START: LCALL CLEARMEN ;上電初始化
MAIN: LCALL KEYWORK ;調(diào)查鍵子程序
LCALL DISPLAY ;LED顯示一次
AJMP MAIN ;轉(zhuǎn)MAIN循環(huán)
NOP ;PC出錯處理
NOP ;
AJMP START ;重新初始化
;
; 4*4行列掃描查鍵子程序
KEYWORK: MOV P1,#0FFH ; 置P1口為輸入狀態(tài)
CLR P1.0 ;掃描第一行(第一行為0)
MOV A,P1 ;讀入P1口值
ANL A,#0F0H ;低四位為0
CJNE A,#0F0H,KEYCON ;高四位不為全1(有鍵按下)轉(zhuǎn)KEYCOON
SETB P1.0 ; 掃描第二行(第二行為0)
CLR P1.1 ;
MOV A,P1 ; 讀入P1口值
ANL A,#0F0H ; 低四位為0
CJNE A,#0F0H,KEYCON ; 高四位不為全1(有鍵按下)轉(zhuǎn)KEYCOON
SETB P1.1 ; 掃描第三行(第三行為0)
CLR P1.2 ;
MOV A,P1 ; 讀入P1口值
ANL A,#0F0H ; 低四位為0
CJNE A,#0F0H,KEYCON ; 高四位不為全1(有鍵按下)轉(zhuǎn)KEYCOON
SETB P1.2 ; 掃描第四行(第四行為0)
CLR P1.3 ;
MOV A,P1 ; 讀入P1口值
ANL A,#0F0H ; 低四位為0
CJNE A,#0F0H,KEYCON ; 高四位不為全1(有鍵按下)轉(zhuǎn)KEYCOON
SETB P1.3 ;結(jié)束行掃描
RET ;子程序返回
KEYCON: LCALL DL10MS ;消抖處理
MOV A,P1 ;再讀入P1口值
ANL A,#0F0H ; 低四位為0
CJNE A,#0F0H,KEYCHE ; 高四位不為全1,確有鍵按下,轉(zhuǎn)KEYCHE
KEYOUT: RET ;干擾,子程序返回
KEYCHE: MOV A,P1 ;讀P1口值
MOV KEYWORD,A ;放入23H暫存
CJLOOP: LCALL DISPLAY ;調(diào)顯示子程序
MOV A,P1 ;讀P1口值
ANL A,#0F0H ;低四位為0
CJNE A,#0F0H,CJLOOP ;高四位為全1(鍵還按著),轉(zhuǎn)CJLOOP等待釋放
MOV R7,#00H ;鍵釋放,置R7初值為#00H(查表次數(shù))
MOV DPTR,#KEYTAB ;取鍵值表首址
CHEKEYLOOP: MOV A,R7 ;查表次數(shù)入A
MOVC A,@A+DPTR ;查表
XRL A,KEYWORD ;查表值與P1口讀入值比較
JZ KEYOK ;為0(相等)轉(zhuǎn)KEYOK
INC R7 ;不等,查表次數(shù)加1
CJNE R7,#10H,CHEKEYLOOP ;查表次數(shù)不超過16次轉(zhuǎn)CHEKEYLOOP再查
RET ;16次到,退出
;
KEYOK: MOV A,R7 ;查表次數(shù)入A(即鍵號值)
MOV B,A ;放入B
RL A ;左移
ADD A,B ;相加(鍵號乘3處理JMP 3字節(jié)指令)
MOV DPTR,#KEYFUNTAB ;取鍵功能散轉(zhuǎn)表首址
JMP @A+DPTR ;查表
KEYFUNTAB: LJMP KEYFUN00 ; 鍵功能散轉(zhuǎn)表。跳至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 ;散轉(zhuǎn)出錯返回
;
;鍵號對應(yīng)P1口數(shù)值表(同時按下兩鍵為無效操作)
KEYTAB: DB 0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH
DB 0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,0FFH,0FFH
;
;0號鍵功能程序
KEYFUN00: INC 29H ;百位數(shù)加1
MOV A,29H ;入A
CLR C ;清進(jìn)位標(biāo)志
CJNE A,#02H,FUN00 ;
FUN00: JC FUN00OUT ;百位小于2轉(zhuǎn)FUNOO0UT
MOV 29H,#00H ;大于等于2清為0(百位只能是0或1)
FUN00OUT: MOV A,29H ; 判斷百位是0還是1
XRL A,#01H ;
JNZ F00OUT1 ;若百位為0轉(zhuǎn)FOOOUT1
MOV 28H,#00H ;若百位為1,十位為0
AJMP F00OUT ;
F00OUT1: MOV 28H,#08H ;若百位為0,十位數(shù)改為8
F00OUT: LCALL DISPUPDAT ;寫入控制芯片(修改發(fā)射頻率)
RET ;返回
;
;01號鍵功能程序
KEYFUN01: INC 28H ;十位數(shù)加1
MOV A,28H ;入A
CLR C ;清進(jìn)位標(biāo)志
CJNE A,#0AH,FUN01 ;判斷是否小于10
FUN01: JC FUN01OUT ;十位數(shù)小于10轉(zhuǎn)FUN01OUT
MOV 28H,#00H ;十位數(shù)大于或等于10清為0
FUN01OUT: MOV A,29H ;判斷百位數(shù)是0不是1
XRL A,#01H ;
JNZ F01OUT ;
MOV 28H,#00H ;百位數(shù)為1時,十位數(shù)為0
AJMP F001OUT ;
F01OUT: MOV A,28H ;百 位為0時,十位數(shù)只能是8或9
XRL A,#08H ;判斷是不是8
JZ F001OUT ;十位數(shù)是8轉(zhuǎn)F001OUT
MOV A,28H ;
XRL A,#09H ;判斷是不是9
JZ F001OUT ;十位數(shù)是9轉(zhuǎn)F001OUT
MOV 28H,#08H ;不是8也不是9,十位賦值為8
F001OUT: LCALL DISPUPDAT ;寫入控制芯片(修改發(fā)射頻率)
RET ;返回
;
;02號鍵功能程序
KEYFUN02: INC 27H ;個位數(shù)加1
MOV A,27H ;
CLR C ;
CJNE A,#0AH,FUN02 ;判斷是否小于10
FUN02: JC FUN02OUT ;小于10轉(zhuǎn)FUN02OUT
MOV 27H,#00H ;大于或等于10清為0
FUN02OUT: LCALL DISPUPDAT ;寫入控制芯片(修改發(fā)射頻率)
RET ;
;
;03號鍵功能程序
KEYFUN03: INC 26H ;個位數(shù)加1
MOV A,26H ;
CLR C ;
CJNE A,#0AH,FUN03 ;判斷是不小于10
FUN03: JC FUN03OUT ;小于10轉(zhuǎn)FUN03OUT
MOV 26H,#00H ;大于或等于10清為0
FUN03OUT: LCALL DISPUPDAT ;寫入控制芯片(修改發(fā)射頻率)
RET ;返回
;
;04號鍵功能程序(頻率預(yù)置鍵)
KEYFUN04: MOV 29H,#01H ; 預(yù)置109.0MHZ發(fā)射頻率
MOV 28H,#00H
MOV 27H,#09H
MOV 26H,#00H
LCALL DISPUPDAT ;寫入控制芯片(修改發(fā)射頻率)
RET
;
;05號鍵功能程序(頻率預(yù)置鍵)
KEYFUN05: MOV 29H,#01H ; 預(yù)置108.0MHZ發(fā)射頻率
MOV 28H,#00H
MOV 27H,#08H
MOV 26H,#00H
LCALL DISPUPDAT ;寫入控制芯片(修改發(fā)射頻率)
RET
;
;06號鍵功能程序(頻率預(yù)置鍵)
KEYFUN06: MOV 29H,#01H ; 預(yù)置105.0MHZ發(fā)射頻率
MOV 28H,#00H
MOV 27H,#05H
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -