📄 oklianjiankongzhi.asm
字号:
;***************************;
; 数控调频手动控制器 ;
;***************************;
;p1.7---CK P3.1
;p1.6---DA P3.0
;p1.5---CE P3.2
;p1.4---muting(静音)低电位是开声音“0”,高电位是关声音“1”
;p3.0---play
;p3.1---play
;p.2----k1
;p3.3---k2
;p3.4---k3
;p3.5---k4
;二倍频为数不能偏差超过0.015MHZB倍频后0.03MHZ
;26H-29H放显示小数位、个位、十位、百位BCD码数,24H-25H放频率控制数据(十六进制)
;
WEISHU EQU 30H ;位数指示
XIANSHI EQU 31H ;位指示
CONBITL EQU 21H ;频率控制字节低8位
CONBITH EQU 22H ;频率控制字节高8位
KEYWORD EQU 23H ;存放键扫描时P1口值
;
;
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-29H循环清0
MOV R1,#0BH ;
CLEARLOOP: MOV @R0,#00H ;
INC R0 ;
DJNZ R1,CLEARLOOP ;
MOV P1,#0FFH ;
MOV P3,#0FFH ;
CLR P1.6 ;BH1415禁止操作
CLR P1.7 ;
CLR P1.5 ;
CLR P1.4 ;低电位是开声音“0”,高电位是关声音“1”
CLEAR1: MOV PCON,#00H ;控制寄存器清0
MOV 29H,#01H ; 置初始值为110.0MHZ倍频后220MHZ
MOV 28H,#01H ;
MOV 27H,#00H ;
MOV 26H,#00H ;
LCALL DISPUPDAT ;写入BH1415芯片(修改发送频率)
MOV WEISHU,#01H
RET ;子程序返回
;
;主程序
START: LCALL CLEARMEN ;上电初始化
MAIN: LCALL KEYFUN00 ;调查键子程序
LCALL DINGSHI
LCALL DISPLAY ;LED显示一次
AJMP MAIN ;转MAIN循环
NOP ;PC出错处理
NOP ;
AJMP START ;重新初始化
;
KEYFUN00: JB P3.2,DSFSFAS
KEYFUN0011: LCALL DL05S
JNB P3.2,KEYFUN0011
LCALL DL05S
INC WEISHU ;个位数加1
MOV A,WEISHU ;
CLR C ;
CJNE A,#04H,JHLLURYEE ;判断是否小于10
JHLLURYEE: JC DSFSFAS ;小于10转FUN02OUT
MOV WEISHU,#01H ;大于或等于10清为0
DSFSFAS: RET ;
;
DINGSHI: JB P3.3,RGERRTHRTH
MOV A,WEISHU
CJNE A,#01H,NAGEAIQU1
KEYFUN01: CLR P1.3
SETB P1.2
SETB P1.1
CLR A
INC 28H ;百位数加1
MOV A,28H ;入A
CLR C ;清进位标志
CJNE A,#02H,FUN001 ;
FUN001: JC FUN00OUT1 ;百位小于2转FUNOO0UT
MOV 28H,#00H ;大于等于2清为0(百位只能是0或1)
FUN00OUT1: LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
AJMP NAGEAIQU
NAGEAIQU1: CJNE A,#02H,NAGEAIQU2
CLR A
CLR P1.2
SETB P1.3
SETB P1.1
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,NAGEAIQU
CLR A
CLR P1.1
SETB P1.2
SETB P1.3
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 ;写入控制芯片(修改发射频率)
NAGEAIQU: LCALL DL05S
LCALL DL05S
RGERRTHRTH: RET
;
; 将BCD码转为十六进制数,与5位控制码合成操作码,写入控制芯片
DISPUPDAT: CLR P1.6 ;BH1415禁止操作
CLR P1.7 ;
CLR P1.5
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 ;返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;用串行输出显示数据
DISPLAY:RET
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 发送控制字节子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
PUTBIT: MOV A,CONBITL ;低8位控制字入A
SETB P1.5 ;BH1415使能(允许写)
LCALL PUT ;发送8位
MOV A,CONBITH ; 高8位控制字入A
LCALL PUT ; 发送8位
CLR P1.5 ; BH1415写禁止
CLR P1.6 ;复位
CLR P1.7 ;复位
RET ;返回
;
;字节发送子程序
PUT: MOV R3,#8 ;发送8位控制
CLR C ;清C
PUT1: RRC A ;带进位位右移(先发低位)
MOV P1.6,C ;低位送至P3.0口
NOP ;延时4微秒
NOP ;
NOP ;
NOP ;
SETB P1.7 ;锁存数据(上升沿时锁存数据)
NOP ;延时4微秒
NOP ;
NOP ;
NOP ;
CLR P1.7 ;
DJNZ R3,PUT1 ;8位未发完转PUT1再发
RET ; 8位发完结束
;
;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
LCALL DL10MS
LCALL DL10MS
LCALL DL10MS
RET
;
END ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -