当前位置:首页 > 单片机 > 单片机
[导读] ;26H-29H放显示小数位、个位、十位、百位BCD码数,24H-25H放频率控制数据(十六进制);CONBITLEQU21H;频率控制字节低8位CONBITHEQU22H;频率控制字节高8位KEYWORDEQU23H;存放键扫描时P1口值;;ORG0000H;程

;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;程序结束

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭