📄 wodefm-1.asm
字号:
;***************************;
; 数控调频台控制器 ;
;***************************;
KMARK BIT 2AH.0 ;有键被按着
KFIRST BIT 2AH.1 ;第一次
KFUNC BIT 2AH.2;代表两种功能
KENTER BIT 2AH.3 ;代表执行S4键的操作
KS12 BIT 2AH.4 ;S1 S2两个键被按下
KFUNC1 BIT 2AH.5
KCOUNT EQU 2BH ;统计次数
COUNT EQU 2CH
TMRVAR EQU 60110;65536-5000*12/11.0592 定时器初值5毫秒
;***************************************************************************************
;26H-29H放显示小数位、个位、十位、百位BCD码数,24H-25H放频率控制数据(十六进制)
;
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 ; 不用中断程序
ORG 30H
;*******************************************************************************************
;初始化程序
CLEARMEN: MOV R0,#20H ;20H-2CH循环清0
MOV R1,#0CH ;
CLEARLOOP: MOV @R0,#00H ;
INC R0 ;
DJNZ R1,CLEARLOOP ;
MOV P0,#0FFH ;四端口置1
MOV P1,#0FFH ;
MOV P2,#0FFH ;
MOV P3,#0FFH ;
CLR P1.5 ;BH1415禁止操作
CLR P1.6 ;
CLR P1.7 ;
;OFF: SETB P1.1
CLEAR1: MOV PCON,#00H ;控制寄存器清0
MOV 29H,#00H ; 置初始值为88MHZ(显示为088.0)
MOV 28H,#08H ;
MOV 27H,#08H ;
MOV 26H,#00H ;
LCALL DISPUPDAT ;写入BH1415芯片(修改发送频率)
RET ;子程序返回
;
;***************************************************************************************************
;****************************************************************************************************
;主程序
START: MOV SP,#5FH
LCALL CLEARMEN ;上电初始化
MAIN:
ORL P3,#00111100B
MOV A,P3
ORL A,#11000011B
CPL A
JZ NO_KEY1 ;无键按下,返回
LCALL KEY
JB KFUNC,KEYFUN13 ;如果是第一功能写88.0MHZ
JNB KFUNC,KEYFUN05 ;如果是第二功能写108.0MHZ
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
LCALL DISPLAY ;LED显示一次
AJMP MAIN ;转MAIN循环
NOP ;PC出错处理
NOP ;
AJMP START ;重新初始化
;*****************************************************************************************************
NO_KEY1 : LCALL NO_KEY
;***********************************************************************
;
;05号键功能程序(频率预置键)
KEYFUN05: MOV 29H,#01H ; 预置108.0MHZ发射频率
MOV 28H,#00H
MOV 27H,#08H
MOV 26H,#00H
RET
;
;
;13号键功能程序(频率预置键)
KEYFUN13: MOV 29H,#00H ; 预置88.0MHZ发射频率
MOV 28H,#08H
MOV 27H,#08H
MOV 26H,#00H
RET
;
;
;15号键功能程序(立体声/单声道设置键)
;ON: CLR P1.1
;RET ;返回
;以下是键盘程序,实现显示及键盘处理
KEY:
JNB KMARK,KEY_1 ;键按下标志有效吗(无效转)?
DEC KCOUNT ;键值计数器减1
MOV A,KCOUNT
JNZ INT_EXIT1 ;如果是0,退出中断
JNB P3.2,KEY_S1 ;S1键按下
JNB P3.3,KEY_S2 ;S2键按下
JNB P3.4,KEY_S303 ;S3键按下
JNB P3.5,KEY_S404 ;S4键搂下
JMP NO_KEY ;无键按下
KEY_1:
MOV KCOUNT,#1
SETB KMARK
JMP INT_EXIT
KEY_S1:
SETB KS12
MOV A, 26H
CJNE A, #09H, CC2 ; 是否向个位进位
MOV 26H, #00H ; 小数位清零
MOV A, 27H
CJNE A, #09H, CC4 ; 是否向十位进位
MOV 27H, #00H; 个位清零
MOV A, 28H
CJNE A, #09H , CC5 ;是否向百位进位
MOV 28H, #00H; 十位清零
KEYFUN00:
INC 29H ;
MOV A,29H ;
CLR C ;
CJNE A,#02H,FUN00 ;
FUN00:
JC FUN00OUT ;
MOV 29H,#00H ;
FUN00OUT:
MOV A,29H ;
XRL A,#01H ;
JNZ F00OUT1 ;
MOV 28H,#00H ;
RET ;
F00OUT1:
MOV 28H,#08H ;
JMP KEY_2
;*************************************************************************************************
CC2: INC 26H ;小数位加1
JMP KEY_2
;
CC4: INC 27H ;个位加1
JMP KEY_2
;
CC5: INC 28H ;十位加1
JMP KEY_2
CC6: DEC 26H ;小数位减1
JMP KEY_2
CC7: DEC 27H ;个数位减1
JMP KEY_2
CC8: DEC 28H ;十数位减1
JMP KEY_2
;***************************************************************************************************
INT_EXIT1: LCALL INT_EXIT
KEY_S303: LCALL KEY_S3
KEY_S404: LCALL KEY_S4
;*****************************************************************************************************
KEY_S2:
SETB KS12
MOV A, 26H
CJNE A, #00H, CC6 ; 是否向个位借位
MOV 26H, #00H ; 小数位清零
MOV A, 27H
CJNE A, #00H, CC7 ; 是否向十位进位
MOV 27H, #00H; 个位清零
MOV A, 28H
CJNE A, #00H , CC8 ;是否向百位进位
MOV 28H, #00H; 十位清零
KEYFUN01:
DEC 29H ;
MOV A,29H ;
CLR C ;
CJNE A,#00H,FUN01 ;
FUN01:
JC FUN00OUT1 ;
MOV 29H,#00H ;
FUN00OUT1:
MOV A,29H ;
XRL A,#01H ;
JNZ F00OUT11 ;
MOV 28H,#00H ;
RET ;
F00OUT11:
MOV 28H,#08H ;
JMP KEY_2
KEY_S3:
LCALL KEYFUN05
KEY_2:
JNB KFIRST,KEY_3 ;如果无效,转
MOV KCOUNT,#20
JMP INT_EXIT
KEY_3:
MOV KCOUNT,#200
SETB KFIRST
JMP INT_EXIT
NO_KEY:
CLR KMARK
CLR KFIRST
CLR KFUNC1
MOV KCOUNT,#0
INT_EXIT:
RET
;***************************************************************************************************
;************************************************************************************
; 将BCD码转为十六进制数,与5位控制码合成操作码,写入控制芯片
DISPUPDAT: LCALL BCDB ;
LCALL CONCOMMAND ;
LCALL PUTBIT ; 发控制字至BH1415
RET ;返回
; 将BCD码转为十六进制数程序
BCDB: 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 ;
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 ;
MOV A,20H ;
ORL A,CONBITH ;
MOV CONBITH,A ;
RET ;返回
;******************************************************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;共阳LED显示,P0口输出段码,P2口输出扫描字
DISPLAY: MOV R1,#26H ;显示首址
MOV R5,#0FEH ;设扫描字
PLAY: MOV A,R5 ;放入A
MOV P2,A ;P2口输出
MOV A,@R1 ;取显示数据
MOV DPTR,#TAB ;取段码表首址
MOVC A,@A+DPTR ;查段码
MOV P0,A ;从P0输出
MOV A,R5 ;读入扫描字
JB ACC.1,PLAY1 ; 不是十位(LED),不显示小数点
CLR P0.7 ;是十位,显示小数点
PLAY1: LCALL DL1MS ;点亮1毫秒
INC R1 ;指向下一显示数据
JNB ACC.3,ENDOUT ;是第四位LED,退出
RL A ;不是,左移一位
MOV R5,A ;放回R5
SETB P0.7 ;关小数点
AJMP PLAY ;转PLAY循环
ENDOUT: MOV P2,#0FFH ;显示结束,关显示输出口
MOV P0,#0FFH ;
RET ;返回
;*****************************************************************************************
;0-9共阳段码表
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH
;*****************************************************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 发送控制字节子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
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.7,C ;低位送至P3.0口
NOP ;延时4微秒
NOP ;
NOP ;
NOP ;
SETB P1.6 ;锁存数据(上升沿时锁存数据)
NOP ;延时4微秒
NOP ;
NOP ;
NOP ;
CLR P1.6 ;
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
;
;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -