数控调频台汇编程序
扫描二维码
随时随地手机看文章
;26H-29H放显示小数位、个位、十位、百位BCD码数,24H-25H放频率控制数据(十六进制)
;
CONBITLEQU21H;频率控制字节低8位
CONBITHEQU22H;频率控制字节高8位
KEYWORDEQU23H;存放键扫描时P1口值
;
;
ORG0000H;程序开始地址
LJMPSTART;转START执行
ORG0003H;
RETI;不用中断程序
ORG000BH;
RETI;不用中断程序
ORG0013H;
RETI;不用中断程序
ORG001BH;
RETI;不用中断程序
ORG0023H;
RETI;不用中断程序
ORG002BH;
RETI;不用中断程序
;
;初始化程序
CLEARMEN:MOVR0,#20H;20H-29H循环清0
MOVR1,#0AH;
CLEARLOOP:MOV@R0,#00H;
INCR0;
DJNZR1,CLEARLOOP;
MOVP0,#0FFH;四端口置1
MOVP1,#0FFH;
MOVP2,#0FFH;
MOVP3,#0FFH;
CLRP3.0;BH1415禁止操作
CLRP3.1;
CLRP3.2;
LCALLKEYFUN15;置立体声发射方式,开立体声发射指示灯
CLEAR1:MOVPCON,#00H;控制寄存器清0
MOV29H,#00H;置初始值为88MHz(显示为088.0)
MOV28H,#08H;
MOV27H,#08H;
MOV26H,#00H;
LCALLDISPUPDAT;写入BH1415芯片(修改发送频率)
RET;子程序返回
;
;主程序
START:LCALLCLEARMEN;上电初始化
MAIN:LCALLKEYWORK;调查键子程序
LCALLDISPLAY;LED显示一次
AJMPMAIN;转MAIN循环
NOP;PC出错处理
NOP;
AJMPSTART;重新初始化
;
;4*4行列扫描查键子程序
KEYWORK:MOVP1,#0FFH;置P1口为输入状态
CLRP1.0;扫描第一行(第一行为0)
MOVA,P1;读入P1口值
ANLA,#0F0H;低四位为0
CJNEA,#0F0H,KEYCON;高四位不为全1(有键按下)转KEYCOON
SETBP1.0;扫描第二行(第二行为0)
CLRP1.1;
MOVA,P1;读入P1口值
ANLA,#0F0H;低四位为0
CJNEA,#0F0H,KEYCON;高四位不为全1(有键按下)转KEYCOON
SETBP1.1;扫描第三行(第三行为0)
CLRP1.2;
MOVA,P1;读入P1口值
ANLA,#0F0H;低四位为0
CJNEA,#0F0H,KEYCON;高四位不为全1(有键按下)转KEYCOON
SETBP1.2;扫描第四行(第四行为0)
CLRP1.3;
MOVA,P1;读入P1口值
ANLA,#0F0H;低四位为0
CJNEA,#0F0H,KEYCON;高四位不为全1(有键按下)转KEYCOON
SETBP1.3;结束行扫描
RET;子程序返回
KEYCON:LCALLDL10MS;消抖处理
MOVA,P1;再读入P1口值
ANLA,#0F0H;低四位为0
CJNEA,#0F0H,KEYCHE;高四位不为全1,确有键按下,转KEYCHE
KEYOUT:RET;干扰,子程序返回
KEYCHE:MOVA,P1;读P1口值
MOVKEYWORD,A;放入23H暂存
CJLOOP:LCALLDISPLAY;调显示子程序
MOVA,P1;读P1口值
ANLA,#0F0H;低四位为0
CJNEA,#0F0H,CJLOOP;高四位为全1(键还按着),转CJLOOP等待释放
MOVR7,#00H;键释放,置R7初值为#00H(查表次数)
MOVDPTR,#KEYTAB;取键值表首址
CHEKEYLOOP:MOVA,R7;查表次数入A
MOVCA,@A+DPTR;查表
XRLA,KEYWORD;查表值与P1口读入值比较
JZKEYOK;为0(相等)转KEYOK
INCR7;不等,查表次数加1
CJNER7,#10H,CHEKEYLOOP;查表次数不超过16次转CHEKEYLOOP再查
RET;16次到,退出
;
KEYOK:MOVA,R7;查表次数入A(即键号值)
MOVB,A;放入B
RLA;左移
ADDA,B;相加(键号乘3处理JMP3字节指令)
MOVDPTR,#KEYFUNTAB;取键功能散转表首址
JMP@A+DPTR;查表
KEYFUNTAB:LJMPKEYFUN00;键功能散转表。跳至0号键功能程序
LJMPKEYFUN01;跳至01号键功能程序
LJMPKEYFUN02;跳至02号键功能程序
LJMPKEYFUN03
LJMPKEYFUN04
LJMPKEYFUN05
LJMPKEYFUN06
LJMPKEYFUN07
LJMPKEYFUN08
LJMPKEYFUN09
LJMPKEYFUN10
LJMPKEYFUN11
LJMPKEYFUN12
LJMPKEYFUN13
LJMPKEYFUN14
LJMPKEYFUN15;跳至15号键功能程序
RET;散转出错返回
;
;键号对应P1口数值表(同时按下两键为无效操作)
KEYTAB:DB0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH
DB0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,0FFH,0FFH
;
;0号键功能程序
KEYFUN00:INC29H;百位数加1
MOVA,29H;入A
CLRC;清进位标志
CJNEA,#02H,FUN00;
FUN00:JCFUN00OUT;百位小于2转FUNOO0UT
MOV29H,#00H;大于等于2清为0(百位只能是0或1)
FUN00OUT:MOVA,29H;判断百位是0还是1
XRLA,#01H;
JNZF00OUT1;若百位为0转FOOOUT1
MOV28H,#00H;若百位为1,十位为0
AJMPF00OUT;
F00OUT1:MOV28H,#08H;若百位为0,十位数改为8
F00OUT:LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET;返回
;
;01号键功能程序
KEYFUN01:INC28H;十位数加1
MOVA,28H;入A
CLRC;清进位标志
CJNEA,#0AH,FUN01;判断是否小于10
FUN01:JCFUN01OUT;十位数小于10转FUN01OUT
MOV28H,#00H;十位数大于或等于10清为0
FUN01OUT:MOVA,29H;判断百位数是0不是1
XRLA,#01H;
JNZF01OUT;
MOV28H,#00H;百位数为1时,十位数为0
AJMPF001OUT;
F01OUT:MOVA,28H;百位为0时,十位数只能是8或9
XRLA,#08H;判断是不是8
JZF001OUT;十位数是8转F001OUT
MOVA,28H;
XRLA,#09H;判断是不是9
JZF001OUT;十位数是9转F001OUT
MOV28H,#08H;不是8也不是9,十位赋值为8
F001OUT:LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET;返回
;
;02号键功能程序
KEYFUN02:INC27H;个位数加1
MOVA,27H;
CLRC;
CJNEA,#0AH,FUN02;判断是否小于10
FUN02:JCFUN02OUT;小于10转FUN02OUT
MOV27H,#00H;大于或等于10清为0
FUN02OUT:LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET;
;
;03号键功能程序
KEYFUN03:INC26H;个位数加1
MOVA,26H;
CLRC;
CJNEA,#0AH,FUN03;判断是不小于10
FUN03:JCFUN03OUT;小于10转FUN03OUT
MOV26H,#00H;大于或等于10清为0
FUN03OUT:LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET;返回
;
;04号键功能程序(频率预置键)
KEYFUN04:MOV29H,#01H;预置109.0MHZ发射频率
MOV28H,#00H
MOV27H,#09H
MOV26H,#00H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;05号键功能程序(频率预置键)
KEYFUN05:MOV29H,#01H;预置108.0MHZ发射频率
MOV28H,#00H
MOV27H,#08H
MOV26H,#00H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;06号键功能程序(频率预置键)
KEYFUN06:MOV29H,#01H;预置105.0MHZ发射频率
MOV28H,#00H
MOV27H,#05H
MOV26H,#00H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;07号键功能程序(频率预置键)
KEYFUN07:MOV29H,#01H;预置100.0MHZ发射频率
MOV28H,#00H
MOV27H,#00H
MOV26H,#00H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;08号键功能程序(频率预置键)
KEYFUN08:MOV29H,#00H;预置98.0MHZ发射频率
MOV28H,#09H
MOV27H,#08H
MOV26H,#00H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;09号键功能程序(频率预置键)
KEYFUN09:MOV29H,#00H;预置96.0MHZ发射频率
MOV28H,#09H
MOV27H,#06H
MOV26H,#00H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;10号键功能程序(频率预置键)
KEYFUN10:MOV29H,#00H;预置94.0MHZ发射频率
MOV28H,#09H
MOV27H,#04H
MOV26H,#00H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;11号键功能程序(频率预置键)
KEYFUN11:MOV29H,#00H;预置92.0MHZ发射频率
MOV28H,#09H
MOV27H,#02H
MOV26H,#00H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;12号键功能程序(频率预置键)
KEYFUN12:MOV29H,#00H;预置90.0MHZ发射频率
MOV28H,#09H
MOV27H,#00H
MOV26H,#00H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;13号键功能程序(频率预置键)
KEYFUN13:MOV29H,#00H;预置88.0MHZ发射频率
MOV28H,#08H
MOV27H,#08H
MOV26H,#00H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;14号键功能程序(频率预置键);预置87.0MHZ发射频率
KEYFUN14:MOV29H,#00H
MOV28H,#08H
MOV27H,#07H
MOV26H,#08H
LCALLDISPUPDAT;写入控制芯片(修改发射频率)
RET
;
;15号键功能程序(立体声/单声道设置键)
KEYFUN15:CPL03H;立体/单声标志取反
JNB03H,MONO;为0转单声道MONO
CLRP3.3;为1开立体声指示灯
LCALLPUTBIT;发送控制字至BH1415
RET;返回
MONO:SETBP3.3;关立体声指示灯
LCALLPUTBIT;发控制字至BH1415
RET;返回
;
;将BCD码转为十六进制数,与5位控制码合成操作码,写入控制芯片
DISPUPDAT:LCALLBCDB;调BCD码转为十六进制数程序
LCALLCONCOMMAND;调与5位控制码合成操作码程序
LCALLPUTBIT;发控制字至BH1415
RET;返回
;
;将BCD码转为十六进制数程序
BCDB:MOVCONBITL,#00H;控制字清0
MOVCONBITH,#00H;控制字清0
MOVCONBITL,26H;小数位数放入控制字低8位
MOVA,27H;个位数乘10操作
MOVB,#10;
LCALLMULLOOP;调乘法子程序
MOVA,28H;十位数乘100操作
MOVB,#100;
LCALLMULLOOP;调乘法子程序
MOVA,29H;
JNZADD3E8;百位数为1转ADD3E8(加1000操作)
RET;百位数为0退出
ADD3E8:CLRC;清进位档标志
MOVA,#0E8H;低8位加法
ADDA,CONBITL;累加
MOVCONBITL,A;放回CONBITL
MOVA,#03H;高8位加法
ADDCA,CONBITH;控制字高8位处理
MOVCONBITH,A;放回CONBITH
RET;返回
;
;乘法及累加处理程序(将四位显示的十进制BCD码转为1个二进制数)
MULLOOP:MULAB;乘法
CLRC;清进位标志
ADDA,CONBITL;积低8位与CONBITL相加
MOVCONBITL,A;放回CONBITL
MOVA,CONBITH;
ADDCA,B;积高8位与CONBITH带进位累加
MOVCONBITH,A;放回CONBITH
RET;返回
;
;频率控制数据与5位控制码合成BH1415控制字
CONCOMMAND:ANLCONBITH,#07H;高四位为0
MOVA,20H;控制字放入A
ORLA,CONBITH;合成控制字
MOVCONBITH,A;放回CONBITH
RET;返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;显示程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;共阳LED显示,P0口输出段码,P2口输出扫描字
DISPLAY:MOVR1,#26H;显示首址
MOVR5,#0FEH;设扫描字
PLAY:MOVA,R5;放入A
MOVP2,A;P2口输出
MOVA,@R1;取显示数据
MOVDPTR,#TAB;取段码表首址
MOVCA,@A+DPTR;查段码
MOVP0,A;从P0输出
MOVA,R5;读入扫描字
JBACC.1,PLAY1;不是十位(LED),不显示小数点
CLRP0.7;是十位,显示小数点
PLAY1:LCALLDL1MS;点亮1毫秒
INCR1;指向下一显示数据
JNBACC.3,ENDOUT;是第四位LED,退出
RLA;不是,左移一位
MOVR5,A;放回R5
SETBP0.7;关小数点
AJMPPLAY;转PLAY循环
ENDOUT:MOVP2,#0FFH;显示结束,关显示输出口
MOVP0,#0FFH;
RET;返回
;
;0-9共阳段码表
TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;发送控制字节子程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
PUTBIT:MOVA,CONBITL;低8位控制字入A
SETBP3.2;BH1415使能(允许写)
LCALLPUT;发送8位
MOVA,CONBITH;高8位控制字入A
LCALLPUT;发送8位
CLRP3.2;BH1415写禁止
CLRP3.0;复位
CLRP3.1;复位
RET;返回
;
;字节发送子程序
PUT:MOVR3,#8;发送8位控制
CLRC;清C
PUT1:RRCA;带进位位右移(先发低位)
MOVP3.0,C;低位送至P3.0口
NOP;延时4微秒
NOP;
NOP;
NOP;
SETBP3.1;锁存数据(上升沿时锁存数据)
NOP;延时4微秒
NOP;
NOP;
NOP;
CLRP3.1;
DJNZR3,PUT1;8位未发完转PUT1再发
RET;8位发完结束
;
;513微秒延时子程序
DL513:MOVR3,#0FFH
DL513LOOP:DJNZR3,DL513LOOP
RET
;
;1毫秒延时子程序(LED点亮用)
DL1MS:MOVR4,#02H
DL1MSLOOP:LCALLDL513
DJNZR4,DL1MSLOOP
RET
;
;10毫秒延时子程序(消抖动用)
DL10MS:MOVR6,#0AH
DL10MSLOOP:LCALLDL1MS
DJNZR6,DL10MSLOOP
RET
;
;
END;程序结束