數(shù)控調(diào)頻臺(tái)匯編程序
;26H-29H放顯示小數(shù)位、個(gè)位、十位、百位BCD碼數(shù),24H-25H放頻率控制數(shù)據(jù)(十六進(jìn)制)
;
CONBITLEQU21H;頻率控制字節(jié)低8位
CONBITHEQU22H;頻率控制字節(jié)高8位
KEYWORDEQU23H;存放鍵掃描時(shí)P1口值
;
;
ORG0000H;程序開始地址
LJMPSTART;轉(zhuǎn)START執(zhí)行
ORG0003H;
RETI;不用中斷程序
ORG000BH;
RETI;不用中斷程序
ORG0013H;
RETI;不用中斷程序
ORG001BH;
RETI;不用中斷程序
ORG0023H;
RETI;不用中斷程序
ORG002BH;
RETI;不用中斷程序
;
;初始化程序
CLEARMEN:MOVR0,#20H;20H-29H循環(huán)清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;置立體聲發(fā)射方式,開立體聲發(fā)射指示燈
CLEAR1:MOVPCON,#00H;控制寄存器清0
MOV29H,#00H;置初始值為88MHz(顯示為088.0)
MOV28H,#08H;
MOV27H,#08H;
MOV26H,#00H;
LCALLDISPUPDAT;寫入BH1415芯片(修改發(fā)送頻率)
RET;子程序返回
;
;主程序
START:LCALLCLEARMEN;上電初始化
MAIN:LCALLKEYWORK;調(diào)查鍵子程序
LCALLDISPLAY;LED顯示一次
AJMPMAIN;轉(zhuǎn)MAIN循環(huán)
NOP;PC出錯(cuò)處理
NOP;
AJMPSTART;重新初始化
;
;4*4行列掃描查鍵子程序
KEYWORK:MOVP1,#0FFH;置P1口為輸入狀態(tài)
CLRP1.0;掃描第一行(第一行為0)
MOVA,P1;讀入P1口值
ANLA,#0F0H;低四位為0
CJNEA,#0F0H,KEYCON;高四位不為全1(有鍵按下)轉(zhuǎn)KEYCOON
SETBP1.0;掃描第二行(第二行為0)
CLRP1.1;
MOVA,P1;讀入P1口值
ANLA,#0F0H;低四位為0
CJNEA,#0F0H,KEYCON;高四位不為全1(有鍵按下)轉(zhuǎn)KEYCOON
SETBP1.1;掃描第三行(第三行為0)
CLRP1.2;
MOVA,P1;讀入P1口值
ANLA,#0F0H;低四位為0
CJNEA,#0F0H,KEYCON;高四位不為全1(有鍵按下)轉(zhuǎn)KEYCOON
SETBP1.2;掃描第四行(第四行為0)
CLRP1.3;
MOVA,P1;讀入P1口值
ANLA,#0F0H;低四位為0
CJNEA,#0F0H,KEYCON;高四位不為全1(有鍵按下)轉(zhuǎn)KEYCOON
SETBP1.3;結(jié)束行掃描
RET;子程序返回
KEYCON:LCALLDL10MS;消抖處理
MOVA,P1;再讀入P1口值
ANLA,#0F0H;低四位為0
CJNEA,#0F0H,KEYCHE;高四位不為全1,確有鍵按下,轉(zhuǎn)KEYCHE
KEYOUT:RET;干擾,子程序返回
KEYCHE:MOVA,P1;讀P1口值
MOVKEYWORD,A;放入23H暫存
CJLOOP:LCALLDISPLAY;調(diào)顯示子程序
MOVA,P1;讀P1口值
ANLA,#0F0H;低四位為0
CJNEA,#0F0H,CJLOOP;高四位為全1(鍵還按著),轉(zhuǎn)CJLOOP等待釋放
MOVR7,#00H;鍵釋放,置R7初值為#00H(查表次數(shù))
MOVDPTR,#KEYTAB;取鍵值表首址
CHEKEYLOOP:MOVA,R7;查表次數(shù)入A
MOVCA,@A+DPTR;查表
XRLA,KEYWORD;查表值與P1口讀入值比較
JZKEYOK;為0(相等)轉(zhuǎn)KEYOK
INCR7;不等,查表次數(shù)加1
CJNER7,#10H,CHEKEYLOOP;查表次數(shù)不超過16次轉(zhuǎn)CHEKEYLOOP再查
RET;16次到,退出
;
KEYOK:MOVA,R7;查表次數(shù)入A(即鍵號(hào)值)
MOVB,A;放入B
RLA;左移
ADDA,B;相加(鍵號(hào)乘3處理JMP3字節(jié)指令)
MOVDPTR,#KEYFUNTAB;取鍵功能散轉(zhuǎn)表首址
JMP@A+DPTR;查表
KEYFUNTAB:LJMPKEYFUN00;鍵功能散轉(zhuǎn)表。跳至0號(hào)鍵功能程序
LJMPKEYFUN01;跳至01號(hào)鍵功能程序
LJMPKEYFUN02;跳至02號(hào)鍵功能程序
LJMPKEYFUN03
LJMPKEYFUN04
LJMPKEYFUN05
LJMPKEYFUN06
LJMPKEYFUN07
LJMPKEYFUN08
LJMPKEYFUN09
LJMPKEYFUN10
LJMPKEYFUN11
LJMPKEYFUN12
LJMPKEYFUN13
LJMPKEYFUN14
LJMPKEYFUN15;跳至15號(hào)鍵功能程序
RET;散轉(zhuǎn)出錯(cuò)返回
;
;鍵號(hào)對(duì)應(yīng)P1口數(shù)值表(同時(shí)按下兩鍵為無效操作)
KEYTAB:DB0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH
DB0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,0FFH,0FFH
;
;0號(hào)鍵功能程序
KEYFUN00:INC29H;百位數(shù)加1
MOVA,29H;入A
CLRC;清進(jìn)位標(biāo)志
CJNEA,#02H,FUN00;
FUN00:JCFUN00OUT;百位小于2轉(zhuǎn)FUNOO0UT
MOV29H,#00H;大于等于2清為0(百位只能是0或1)
FUN00OUT:MOVA,29H;判斷百位是0還是1
XRLA,#01H;
JNZF00OUT1;若百位為0轉(zhuǎn)FOOOUT1
MOV28H,#00H;若百位為1,十位為0
AJMPF00OUT;
F00OUT1:MOV28H,#08H;若百位為0,十位數(shù)改為8
F00OUT:LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET;返回
;
;01號(hào)鍵功能程序
KEYFUN01:INC28H;十位數(shù)加1
MOVA,28H;入A
CLRC;清進(jìn)位標(biāo)志
CJNEA,#0AH,FUN01;判斷是否小于10
FUN01:JCFUN01OUT;十位數(shù)小于10轉(zhuǎn)FUN01OUT
MOV28H,#00H;十位數(shù)大于或等于10清為0
FUN01OUT:MOVA,29H;判斷百位數(shù)是0不是1
XRLA,#01H;
JNZF01OUT;
MOV28H,#00H;百位數(shù)為1時(shí),十位數(shù)為0
AJMPF001OUT;
F01OUT:MOVA,28H;百位為0時(shí),十位數(shù)只能是8或9
XRLA,#08H;判斷是不是8
JZF001OUT;十位數(shù)是8轉(zhuǎn)F001OUT
MOVA,28H;
XRLA,#09H;判斷是不是9
JZF001OUT;十位數(shù)是9轉(zhuǎn)F001OUT
MOV28H,#08H;不是8也不是9,十位賦值為8
F001OUT:LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET;返回
;
;02號(hào)鍵功能程序
KEYFUN02:INC27H;個(gè)位數(shù)加1
MOVA,27H;
CLRC;
CJNEA,#0AH,FUN02;判斷是否小于10
FUN02:JCFUN02OUT;小于10轉(zhuǎn)FUN02OUT
MOV27H,#00H;大于或等于10清為0
FUN02OUT:LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET;
;
;03號(hào)鍵功能程序
KEYFUN03:INC26H;個(gè)位數(shù)加1
MOVA,26H;
CLRC;
CJNEA,#0AH,FUN03;判斷是不小于10
FUN03:JCFUN03OUT;小于10轉(zhuǎn)FUN03OUT
MOV26H,#00H;大于或等于10清為0
FUN03OUT:LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET;返回
;
;04號(hào)鍵功能程序(頻率預(yù)置鍵)
KEYFUN04:MOV29H,#01H;預(yù)置109.0MHZ發(fā)射頻率
MOV28H,#00H
MOV27H,#09H
MOV26H,#00H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;05號(hào)鍵功能程序(頻率預(yù)置鍵)
KEYFUN05:MOV29H,#01H;預(yù)置108.0MHZ發(fā)射頻率
MOV28H,#00H
MOV27H,#08H
MOV26H,#00H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;06號(hào)鍵功能程序(頻率預(yù)置鍵)
KEYFUN06:MOV29H,#01H;預(yù)置105.0MHZ發(fā)射頻率
MOV28H,#00H
MOV27H,#05H
MOV26H,#00H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;07號(hào)鍵功能程序(頻率預(yù)置鍵)
KEYFUN07:MOV29H,#01H;預(yù)置100.0MHZ發(fā)射頻率
MOV28H,#00H
MOV27H,#00H
MOV26H,#00H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;08號(hào)鍵功能程序(頻率預(yù)置鍵)
KEYFUN08:MOV29H,#00H;預(yù)置98.0MHZ發(fā)射頻率
MOV28H,#09H
MOV27H,#08H
MOV26H,#00H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;09號(hào)鍵功能程序(頻率預(yù)置鍵)
KEYFUN09:MOV29H,#00H;預(yù)置96.0MHZ發(fā)射頻率
MOV28H,#09H
MOV27H,#06H
MOV26H,#00H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;10號(hào)鍵功能程序(頻率預(yù)置鍵)
KEYFUN10:MOV29H,#00H;預(yù)置94.0MHZ發(fā)射頻率
MOV28H,#09H
MOV27H,#04H
MOV26H,#00H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;11號(hào)鍵功能程序(頻率預(yù)置鍵)
KEYFUN11:MOV29H,#00H;預(yù)置92.0MHZ發(fā)射頻率
MOV28H,#09H
MOV27H,#02H
MOV26H,#00H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;12號(hào)鍵功能程序(頻率預(yù)置鍵)
KEYFUN12:MOV29H,#00H;預(yù)置90.0MHZ發(fā)射頻率
MOV28H,#09H
MOV27H,#00H
MOV26H,#00H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;13號(hào)鍵功能程序(頻率預(yù)置鍵)
KEYFUN13:MOV29H,#00H;預(yù)置88.0MHZ發(fā)射頻率
MOV28H,#08H
MOV27H,#08H
MOV26H,#00H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;14號(hào)鍵功能程序(頻率預(yù)置鍵);預(yù)置87.0MHZ發(fā)射頻率
KEYFUN14:MOV29H,#00H
MOV28H,#08H
MOV27H,#07H
MOV26H,#08H
LCALLDISPUPDAT;寫入控制芯片(修改發(fā)射頻率)
RET
;
;15號(hào)鍵功能程序(立體聲/單聲道設(shè)置鍵)
KEYFUN15:CPL03H;立體/單聲標(biāo)志取反
JNB03H,MONO;為0轉(zhuǎn)單聲道MONO
CLRP3.3;為1開立體聲指示燈
LCALLPUTBIT;發(fā)送控制字至BH1415
RET;返回
MONO:SETBP3.3;關(guān)立體聲指示燈
LCALLPUTBIT;發(fā)控制字至BH1415
RET;返回
;
;將BCD碼轉(zhuǎn)為十六進(jìn)制數(shù),與5位控制碼合成操作碼,寫入控制芯片
DISPUPDAT:LCALLBCDB;調(diào)BCD碼轉(zhuǎn)為十六進(jìn)制數(shù)程序
LCALLCONCOMMAND;調(diào)與5位控制碼合成操作碼程序
LCALLPUTBIT;發(fā)控制字至BH1415
RET;返回
;
;將BCD碼轉(zhuǎn)為十六進(jìn)制數(shù)程序
BCDB:MOVCONBITL,#00H;控制字清0
MOVCONBITH,#00H;控制字清0
MOVCONBITL,26H;小數(shù)位數(shù)放入控制字低8位
MOVA,27H;個(gè)位數(shù)乘10操作
MOVB,#10;
LCALLMULLOOP;調(diào)乘法子程序
MOVA,28H;十位數(shù)乘100操作
MOVB,#100;
LCALLMULLOOP;調(diào)乘法子程序
MOVA,29H;
JNZADD3E8;百位數(shù)為1轉(zhuǎn)ADD3E8(加1000操作)
RET;百位數(shù)為0退出
ADD3E8:CLRC;清進(jìn)位檔標(biāo)志
MOVA,#0E8H;低8位加法
ADDA,CONBITL;累加
MOVCONBITL,A;放回CONBITL
MOVA,#03H;高8位加法
ADDCA,CONBITH;控制字高8位處理
MOVCONBITH,A;放回CONBITH
RET;返回
;
;乘法及累加處理程序(將四位顯示的十進(jìn)制BCD碼轉(zhuǎn)為1個(gè)二進(jìn)制數(shù))
MULLOOP:MULAB;乘法
CLRC;清進(jìn)位標(biāo)志
ADDA,CONBITL;積低8位與CONBITL相加
MOVCONBITL,A;放回CONBITL
MOVA,CONBITH;
ADDCA,B;積高8位與CONBITH帶進(jìn)位累加
MOVCONBITH,A;放回CONBITH
RET;返回
;
;頻率控制數(shù)據(jù)與5位控制碼合成BH1415控制字
CONCOMMAND:ANLCONBITH,#07H;高四位為0
MOVA,20H;控制字放入A
ORLA,CONBITH;合成控制字
MOVCONBITH,A;放回CONBITH
RET;返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;顯示程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;共陽LED顯示,P0口輸出段碼,P2口輸出掃描字
DISPLAY:MOVR1,#26H;顯示首址
MOVR5,#0FEH;設(shè)掃描字
PLAY:MOVA,R5;放入A
MOVP2,A;P2口輸出
MOVA,@R1;取顯示數(shù)據(jù)
MOVDPTR,#TAB;取段碼表首址
MOVCA,@A+DPTR;查段碼
MOVP0,A;從P0輸出
MOVA,R5;讀入掃描字
JBACC.1,PLAY1;不是十位(LED),不顯示小數(shù)點(diǎn)
CLRP0.7;是十位,顯示小數(shù)點(diǎn)
PLAY1:LCALLDL1MS;點(diǎn)亮1毫秒
INCR1;指向下一顯示數(shù)據(jù)
JNBACC.3,ENDOUT;是第四位LED,退出
RLA;不是,左移一位
MOVR5,A;放回R5
SETBP0.7;關(guān)小數(shù)點(diǎn)
AJMPPLAY;轉(zhuǎn)PLAY循環(huán)
ENDOUT:MOVP2,#0FFH;顯示結(jié)束,關(guān)顯示輸出口
MOVP0,#0FFH;
RET;返回
;
;0-9共陽段碼表
TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;發(fā)送控制字節(jié)子程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
PUTBIT:MOVA,CONBITL;低8位控制字入A
SETBP3.2;BH1415使能(允許寫)
LCALLPUT;發(fā)送8位
MOVA,CONBITH;高8位控制字入A
LCALLPUT;發(fā)送8位
CLRP3.2;BH1415寫禁止
CLRP3.0;復(fù)位
CLRP3.1;復(fù)位
RET;返回
;
;字節(jié)發(fā)送子程序
PUT:MOVR3,#8;發(fā)送8位控制
CLRC;清C
PUT1:RRCA;帶進(jìn)位位右移(先發(fā)低位)
MOVP3.0,C;低位送至P3.0口
NOP;延時(shí)4微秒
NOP;
NOP;
NOP;
SETBP3.1;鎖存數(shù)據(jù)(上升沿時(shí)鎖存數(shù)據(jù))
NOP;延時(shí)4微秒
NOP;
NOP;
NOP;
CLRP3.1;
DJNZR3,PUT1;8位未發(fā)完轉(zhuǎn)PUT1再發(fā)
RET;8位發(fā)完結(jié)束
;
;513微秒延時(shí)子程序
DL513:MOVR3,#0FFH
DL513LOOP:DJNZR3,DL513LOOP
RET
;
;1毫秒延時(shí)子程序(LED點(diǎn)亮用)
DL1MS:MOVR4,#02H
DL1MSLOOP:LCALLDL513
DJNZR4,DL1MSLOOP
RET
;
;10毫秒延時(shí)子程序(消抖動(dòng)用)
DL10MS:MOVR6,#0AH
DL10MSLOOP:LCALLDL1MS
DJNZR6,DL10MSLOOP
RET
;
;
END;程序結(jié)束