?? atm89c2051rts.asm
字號:
;***************************;
; 數控調頻手動控制器 ;
;***************************;
;發射控制芯片BH1415F
;P2和P0掃描顯示LED
WEISHU EQU 30H ;位數指示
XIANSHI EQU 31H ;位指示
CONBITL EQU 21H ;頻率控制字節低8位
CONBITH EQU 22H ;頻率控制字節高8位
KEYWORD EQU 23H ;存放鍵掃描時P1口值
Muting EQU P1.4 ;發射靜音
DATAF EQU P1.6 ;發射數據
CLOCKF EQU P1.7 ;發射時鐘
CSCEF EQU P1.5 ;發射片選
;
;
ORG 0000H ;程序開始地址
LJMP START ;轉START執行
ORG 0003H ;
RETI ;不用中斷程序
ORG 000BH ;
RETI ; 不用中斷程序
ORG 0013H ;
RETI ; 不用中斷程序
ORG 001BH ;
RETI ; 不用中斷程序
ORG 0023H ;
RETI ; 不用中斷程序
ORG 002BH ;
RETI ; 不用中斷程序
;
;初始化程序
CLEARMEN: MOV R0,#20H ;20H-34H循環清0
MOV R1,#12H ;
CLEARLOOP: MOV @R0,#00H ;
INC R0 ;
DJNZ R1,CLEARLOOP ;
MOV P1,#0FFH ;
MOV P0,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
CLR Muting ;發射開音BH1415禁止操作
CLR DATAF ;發射數據
CLR CLOCKF ;發射時鐘
CLR CSCEF ;發射片選
CLEAR1: MOV PCON,#00H ;控制寄存器清0
MOV 29H,#01H ; 置初始值為110.0MHZ倍頻后220MHZ
MOV 28H,#00H ;
MOV 27H,#06H ;
MOV 26H,#05H ;
LCALL DISPUPDAT ;寫入BH1415芯片(修改發送頻率)
MOV WEISHU,#05H
RET
;主程序
START: LCALL CLEARMEN ;上電初始化
MAIN: LCALL KEYFUN00 ;調查鍵子程序
LCALL DINGSHI
LCALL DISPLAY ;LED顯示一次
AJMP MAIN ;轉MAIN循環
NOP ;PC出錯處理
NOP ;
AJMP START ;重新初始化
;位數指示
JIESHUZHIIN: MOV A,WEISHU
CJNE A,#01H,NAGEAIQU111
MOV 31H,#14H
MOV 32H,#0AH
MOV 33H,28H
MOV 34H,#14H
AJMP JIESHUZHOUT555
NAGEAIQU111: CJNE A,#02H,NAGEAIQU222
MOV 31H,#14H
MOV 32H,27H
MOV 33H,#14H
MOV 34H,#14H
AJMP JIESHUZHOUT555
NAGEAIQU222: CJNE A,#03H,NAGEAIQU333
MOV 31H,26H
MOV 32H,#0AH
MOV 33H,#14H
MOV 34H,#14H
AJMP JIESHUZHOUT555
NAGEAIQU333: CJNE A,#04H,JIESHUZHOUT444
MOV 31H,#14H
MOV 32H,#0AH
MOV 33H,#14H
MOV 34H,29H
AJMP JIESHUZHOUT555
JIESHUZHOUT444: CJNE A,#05H,JIESHUZHOUT555
MOV 31H,26H
MOV 32H,27H
MOV 33H,28H
MOV 34H,29H
JIESHUZHOUT555:RET
;
KEYFUN00: JB P3.2,DSFSFAS
KEYFUN0011: LCALL DISPLAY
JNB P3.2,KEYFUN0011
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
JNB P3.2,KEYFUN0011
INC WEISHU ;個位數加1
MOV A,WEISHU ;
CLR C ;
CJNE A,#06H,JHLLURYEE ;判斷是否小于10
JHLLURYEE: JC DSFSFAS ;小于10轉FUN02OUT
MOV WEISHU,#01H ;大于或等于10清為0
DSFSFAS: RET ;
;
;
DINGSHI: JB P3.3,RGERRTHRTH
DINGSHI1: LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
JNB P3.3,DINGSHI1
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
JNB P3.3,DINGSHI1
MOV A,WEISHU
CJNE A,#01H,NAGEAIQU1
KEYFUN01: CLR A
INC 28H ;百位數加1
MOV A,28H ;入A
CLR C ;清進位標志
CJNE A,#04H,FUN001 ; ;百位小于2轉FUNOO0UT
MOV 28H,#08H
AJMP FUN0013 ;大于等于2清為0(百位只能是0或1)
FUN001: CJNE A,#09H,FUN0012
MOV 28H,#09H
AJMP FUN0013
FUN0012: CJNE A,#0AH,FUN0013
MOV 28H,#00H
FUN0013: LCALL DISPUPDAT ;寫入控制芯片(修改發射頻率)
AJMP NAGEAIQU
NAGEAIQU1: CJNE A,#02H,NAGEAIQU2
CLR A
INC 27H ;個位數加1
MOV A,27H ;
CLR C ;
CJNE A,#0AH,FUN02 ;判斷是否小于10
FUN02: JC FUN02OUT ;小于10轉FUN02OUT
MOV 27H,#00H ;大于或等于10清為0
FUN02OUT: LCALL DISPUPDAT ;寫入控制芯片(修改發射頻率)
AJMP NAGEAIQU
NAGEAIQU2: CJNE A,#03H,NAGEAIQU3
CLR A
INC 26H ;個位數加1
MOV A,26H ;
CLR C ;
CJNE A,#0AH,FUN03 ;判斷是不小于10
FUN03: JC FUN03OUT ;小于10轉FUN03OUT
MOV 26H,#00H ;大于或等于10清為0
FUN03OUT: LCALL DISPUPDAT ;寫入控制芯片(修改發射頻率)
AJMP NAGEAIQU
NAGEAIQU3: CJNE A,#04H,NAGEAIQU
CLR A
INC 29H ;個位數加1
MOV A,29H ;
CLR C ;
CJNE A,#02H,FUN04 ;判斷是不小于10
FUN04: JC FUN04OUT ;小于10轉FUN03OUT
MOV 29H,#00H ;大于或等于10清為0
FUN04OUT: LCALL DISPUPDAT ;寫入控制芯片(修改發射頻率)
NAGEAIQU: LCALL DISPLAY
RGERRTHRTH: RET
; 將BCD碼轉為十六進制數,與5位控制碼合成操作碼,寫入控制芯片
DISPUPDAT: LCALL BCDB ; 調BCD碼轉為十六進制數程序
LCALL CONCOMMAND ; 調與5位控制碼合成操作碼程序
LCALL PUTBIT ; 發控制字至BH1415
RET ;返回
;
; 將BCD碼轉為十六進制數程序
BCDB: MOV A,#00H
MOV CONBITL,#00H ; 控制字清0
MOV CONBITH,#00H ; 控制字清0
MOV CONBITL,26H ;小數位數放入控制字低8位
MOV A,27H ;個位數乘10操作
MOV B,#10 ;
LCALL MULLOOP ;調乘法子程序
MOV A,28H ;十位數乘100操作
MOV B,#100 ;
LCALL MULLOOP ; 調乘法子程序
MOV A,29H ;
JNZ ADD3E8 ;百位數為1轉ADD3E8(加1000操作)
RET ; 百位數為0退出
ADD3E8: CLR C ;清進位檔標志
MOV A,#0E8H ;低8位加法
ADD A,CONBITL ;累加
MOV CONBITL,A ;放回CONBITL
MOV A,#03H ; 高8位加法
ADDC A,CONBITH ;控制字高8位處理
MOV CONBITH,A ;放回CONBITH
RET ;返回
;
;乘法及累加處理程序(將四位顯示的十進制BCD碼轉為1個二進制數)
MULLOOP: MUL AB ;乘法
CLR C ;清進位標志
ADD A,CONBITL ;積低8位與CONBITL相加
MOV CONBITL,A ;放回CONBITL
MOV A,CONBITH ;
ADDC A,B ;積高8位與CONBITH帶進位累加
MOV CONBITH,A ;放回CONBITH
RET ;返回
;
;頻率控制數據與5位控制碼合成BH1415控制字
CONCOMMAND: ANL CONBITH,#07H ;高四位為0
MOV A,#40H ;控制字放入A
ORL A,CONBITH ;合成控制字
MOV CONBITH,A ;放回CONBITH
RET ;返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 發送控制字節子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
PUTBIT: MOV A,CONBITL ;低8位控制字入A
SETB CSCEF ;片選 ;BH1415使能(允許寫)
LCALL PUT
MOV A,CONBITH ; 高8位控制字入A
LCALL PUT ; 發送8位
CLR CSCEF ;片選 ; BH1415寫禁止
CLR DATAF ;復位
CLR CLOCKF ;復位
RET ;返回
;
;字節發送子程序
PUT: MOV R3,#8 ;發送8位控制
CLR C ;清C
PUT1: RRC A ;帶進位位右移(先發低位)
NOP ;延時4微秒
NOP ;
NOP ;
NOP ;
SETB CLOCKF ;鎖存數據(上升沿時鎖存數據)
NOP ;延時4微秒
NOP ;
NOP ;
NOP ;
CLR CLOCKF ;
DJNZ R3,PUT1 ;8位未發完轉PUT1再發
RET ; 8位發完結束
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 顯示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 顯示數據在70H-75H單元內,用六位LED共陽數碼管顯示,P1口輸出段碼數據,P3口作
; 掃描控制,每個LED數碼管亮1MS時間再逐位循環。
DISPLAY: LCALL JIESHUZHIIN
MOV A,#0AH
ADD A,32H
MOV 32H,A
MOV R1,#31H ;指向顯示數據首址
MOV R5,#0FEH ;掃描控制字初值
PLAY: MOV A,R5 ;掃描字放入A
MOV P2,A ;從P3口輸出
MOV A,@R1 ;取顯示數據到A
MOV DPTR,#TAB ;取段碼表地址
MOVC A,@A+DPTR ;查顯示數據對應段碼
MOV P0,A ;段碼放入P1口
LCALL DL1MS ;顯示1MS
INC R1 ;指向下一地址
MOV A,R5 ;掃描控制字放入A
ENDOUTA: JNB ACC.5,ENDOUT ;ACC.5=0時一次顯示結束
RL A ;A中數據循環左移
MOV R5,A ;放回R5內
AJMP PLAY ;跳回PLAY循環
ENDOUT: SETB P2.5 ;一次顯示結束,P3口復位
MOV P2,#0FFH ;P3.7口為0時轉時間調整程序
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H,0BFH
;共陽段碼表 "0""1""2" "3""4""5""6""7" "8""9""不亮"
;
;513微秒延時子程序
DL513: MOV R3,#0FFH
DL513LOOP: DJNZ R3,DL513LOOP
RET
;
;1毫秒延時子程序(LED點亮用)
DL1MS: MOV R4,#02H
DL1MSLOOP: LCALL DL513
DJNZ R4,DL1MSLOOP
RET
;
;10毫秒延時子程序(消抖動用)
DL10MS: MOV R6,#0AH
DL10MSLOOP: LCALL DL1MS
DJNZ R6,DL10MSLOOP
RET
;
DL05S: LCALL DL10MS
LCALL DL10MS
RET
;
END ;程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -