|

楼主 |
发表于 2022-8-16 03:55:33
|
显示全部楼层
- ;------------------------------------------------------------------------------------
- ;子程序:编码器按键开关处理,间隔时间不超过0.6秒的2次短按,为有效按键动作
- ;出口参数:A=1(按了1次);A=2(按了2次);A=3(长按达到了10秒)
- ;------------------------------------------------------------------------------------
- KEY:
- MOV MJS,#10 ;放入等待时间(秒)
- MOV FENGMQ,#12 ;蜂鸣器响一声,12*10毫秒=120毫秒
- KEY1:
- MOV A,MJS ;装入等待时间
- JNZ KEY2 ;如果不为0就转移,时间未到
- MOV A,#3 ;时间到了
- RET
- KEY2:
- LCALL SKEY ;扫描按键
- JC KEY1 ;如果C=1(按键还没松开),就继续扫描
- LCALL KEYA ;扫描按键600毫秒
- JZ KEY3 ;如果600毫秒内有按键动作就转移
- MOV A,#1 ;600毫秒内没有按键动作,置A=1(按了1次)
- RET
- KEY3:
- MOV FENGMQ,#12 ;蜂鸣器响一声,12*10毫秒=120毫秒
- LCALL KEYEX ;等待第二次按键松开
- MOV A,#2 ;置A=2(按了2次)
- RET
- ;----------- 扫描按键600毫秒,有按键动作A=0,无按键动作A=1 -----------
- KEYA:
- MOV SHMJS,#60 ;等待600毫秒
- KEYB:
- MOV A,SHMJS ;装入(10)毫秒计数
- JZ KEYC ;为0(时间到)就转移
- LCALL SKEY ;扫描按键
- JNC KEYB ;没有按键动作(C=0)就转移
- CLR A ;有按键动作A=0
- RET
- KEYC:
- MOV A,#1 ;等待时间已到,A=1没有按键动作
- RET
- ;-------------- 按键开关扫描,未按C=0,已按下C=1 --------------
- SKEY:
- SETB EC11K ;按键端口置为高电平
- JNB EC11K,SKEY1 ;为0(低电平)就转移
- CLR C ;C置为0,没有按键动作
- RET
- SKEY1:
- LCALL DELAY20 ;延时20毫秒
- SETB EC11K ;延时结束后再次把按键端口置为高电平
- JNB EC11K,SKEY2 ;为0(低电平)就转移
- CLR C ;C置为0,没有按键动作
- RET ;按键未被有效按下,退出
- SKEY2:
- SETB C ;C置为1,按键已有效按下
- LCALL SETPWM ;有按键动作就重新放置“延时PWM驱动”时间
- RET
- ;------------------ 等待按键释放 ------------------
- KEYEX:
- LCALL SKEY ;扫描按键
- JC KEYEX ;如果C=1(按键还没释放)就继续扫描
- RET
- ;------------------ 延时20毫秒 ------------------
- DELAY20: ;@11.0592MHz
- PUSH 15H
- PUSH 16H
- PUSH 17H
- MOV 15H,#2
- MOV 16H,#32
- MOV 17H,#58
- NEXT20:
- DJNZ 17H,NEXT20
- DJNZ 16H,NEXT20
- DJNZ 15H,NEXT20
- POP 17H
- POP 16H
- POP 15H
- RET
- ;---------------------------------------------------------------------------------------------
- ;子程序:编码器旋转动作处理,根据旋转方向增(减)定时时间、档位
- ;10小时以下每次增(减)30分钟;10小时及以上每次增(减)1个小时;20小时以上每次增(减)2个小时
- ;---------------------------------------------------------------------------------------------
- BMQCL:
- LCALL Scan2 ;扫描编码器(无方向标志)
- MOV DSDW,DSDWJG ;置交替显示间隔时间
- JB BMQDZ,BMQCL ;“编码器动作”为1(动作未结束)就转移继续等待
- BMQCL0:
- JNB XSNRXZ,BMQCL5 ;“显示内容选择”为0(显示定时时间)就转移
- SETB YSBC ;“延时保存”置为1
- MOV MJS,#10 ;“延时保存”时长(秒)。延时结束后才保存,避免频繁的EEPROM操作
- MOV A,DANG ;装入当前档位值
- JB XZFX,BMQCL2 ;“旋转方向”为1(顺时针正转)就转移
- DEC A ;是反转,减1档
- JNZ BMQCL1 ;减1后不为0就转移
- RET
- BMQCL1:
- MOV DANG,A
- RET
- BMQCL2:
- CJNE A,#15,BMQCL3 ;是否已到最高15档
- BMQCL3:
- JC BMQCL4 ;小于就转移
- MOV DANG,#15 ;等于或大于,放入最高档位15
- RET
- BMQCL4:
- INC DANG ;还未到上限,增1档
- RET
- BMQCL5:
- CLR SSBZ ;“闪烁标志”置为0(数字及冒号状态为“显示”)
- MOV A,DSSJS ;装入定时时间(时)
- CJNE A,#20,BMQCL6 ;当前“时”是否等于或大于20
- BMQCL6:
- JC BMQCL7 ;小于就转移
- MOV R5,#2 ;等于或大于20,加减2个小时
- LJMP BMQCL9
- BMQCL7:
- CJNE A,#10,BMQCL8 ;当前“时”是否等于或大于10
- BMQCL8:
- JC BMQCL13 ;小于就转移
- MOV R5,#1 ;等于或大于10,加减1个小时
- BMQCL9:
- JNB XZFX,BMQCL11 ;“旋转方向”为0(逆时针反转)就转移
- ADD A,R5 ;是正转,加
- CJNE A,#100,BMQCL10 ;加完后是否等于或大于100
- BMQCL10:
- JC BMQCL12 ;如果小于就转移,把A放回到DSSJS
- MOV DSSJS,#99 ;已经大于99了,直接设置为99:59:59+HMJS(1秒),100小时
- MOV DSSJF,#59 ;已经大于99了,直接设置为99:59:59+HMJS(1秒),100小时
- MOV DSSJM,#59 ;已经大于99了,直接设置为99:59:59+HMJS(1秒),100小时
- RET
- BMQCL11:
- SUBB A,R5 ;是反转,减
- BMQCL12:
- MOV DSSJS,A ;把计算结果放入DSSJS
- RET
- BMQCL13:
- MOV A,DSSJF ;小于10小时,装入定时时间(分)
- JNB XZFX,BMQCL16 ;“旋转方向”为0(逆时针反转)就转移
- ADD A,#30 ;是正转,当前“分”加30
- CJNE A,#60,BMQCL14 ;加完后“分”是否等于或大于60
- BMQCL14:
- JC BMQCL15 ;小于60就转移,把A放入定时时间(分)
- SUBB A,#60 ;等于或大于60,就减60,然后小时加1
- INC DSSJS ;小时加1
- BMQCL15:
- MOV DSSJF,A ;把A放入定时时间(分)
- RET
- BMQCL16:
- CJNE A,#30,BMQCL17 ;是逆时针反转,当前“分”是否等于或大于30
- BMQCL17:
- JC BMQCL18 ;小于就转移
- SUBB A,#30 ;定时时间(分)减30
- MOV DSSJF,A ;把计算结果放入定时时间(分)
- RET
- BMQCL18:
- MOV A,#30 ;“分”小于30,把30放入寄存器A
- CLR C ;进位标志清0
- SUBB A,DSSJF ;减“定时时间(分)”
- MOV DSSJF,A ;减完后的结果暂时放入DSSJF
- MOV A,#60
- SUBB A,DSSJF ;60减上面的计算结果,得出定时时间(分),然后小时减1
- MOV DSSJF,A ;得出的数放入定时时间(分)
- MOV A,DSSJS ;装入定时时间(时)
- JZ DSSJQL ;如果“时”为0就转移(不够减了,把定时时间清零)
- DEC DSSJS ;“时”不为0,减1
- RET
- DSSJQL:
- MOV DSSJS,#0 ;定时时间清零
- MOV DSSJF,#0 ;定时时间清零
- MOV DSSJM,#0 ;定时时间清零
- RET
- ;----------------------------------------------------------------------------------------------
- ;子程序:扫描编码器是否有旋转动作并设置好方向标志
- ;出口参数:“编码器动作”=1已经转动,=0没有转动;“旋转方向”=1顺时针正转,=0逆时针反转
- ;----------------------------------------------------------------------------------------------
- Scan1:
- SETB EC11A ;拉高编码器A引脚电平
- SETB EC11B ;拉高编码器B引脚电平
- JNB EC11A,Scan11 ;如果为0(低电平)就转移,编码器有旋转动作,顺时针正转
- JNB EC11B,Scan12 ;如果为0(低电平)就转移,编码器有旋转动作,逆时针反转
- CLR BMQDZ ;没有旋转动作,把“编码器动作”置为0
- RET
- Scan11:
- SETB XZFX ;顺时针正转,把“旋转方向”置为1
- SETB BMQDZ ;有旋转动作,把“编码器动作”置为1
- LCALL SETPWM ;有动作就重新放置“延时PWM驱动”时间
- RET
- Scan12:
- CLR XZFX ;逆时针反转,把“旋转方向”置为0
- SETB BMQDZ ;有旋转动作,把“编码器动作”置为1
- LCALL SETPWM ;有动作就重新放置“延时PWM驱动”时间
- RET
- ;-------------------------------------------------------------
- ;子程序:扫描编码器是否有旋转动作,不设置方向标志
- ;出口参数:“编码器动作”BMQDZ=1已经转动,=0没有转动
- ;-------------------------------------------------------------
- Scan2:
- SETB EC11A ;拉高编码器A引脚电平
- SETB EC11B ;拉高编码器B引脚电平
- JNB EC11A,Scan21 ;如果为0(低电平)就转移,编码器有旋转动作
- JNB EC11B,Scan21 ;如果为0(低电平)就转移,编码器有旋转动作
- CLR BMQDZ ;没有旋转动作,把“编码器动作”置为0
- RET
- Scan21:
- SETB BMQDZ ;有旋转动作,把“编码器动作”置为1
- LCALL SETPWM ;有动作就重新放置“延时PWM驱动”时间
- RET
- ;--------------------------------------------------------------
- ;子程序:继电器控制,T0中断、EEPROM操作子程序调用
- ;--------------------------------------------------------------
- Control:
- JNB EEPBC,CTL00 ;EEPBC标志为0就转移。为1表示EEPROM操作子程序正在调用下面的继电器控制程序
- RET
- CTL00:
- MOV A,DSSJM ;装入定时时间(秒)到寄存器A
- JNZ CTL02 ;不是0就转移
- MOV A,DSSJF ;装入定时时间(分)到寄存器A
- JNZ CTL02 ;不是0就转移
- MOV A,DSSJS ;装入定时时间(时)到寄存器A
- JNZ CTL02 ;不是0就转移
- CTL01:
- MOV P3,#0FFH ;置P3端口为高电平,断电
- RET
- CTL02:
- JNB PWM,CTL03 ;PWM标志为0就转移。0=禁止PWM驱动,1=使用PWM方式驱动
- MOV A,YSPWM ;装入“延时PWM驱动”,为0时使用PWM驱动方式
- JNZ CTL03 ;不是0就转移
- JB PWMBZ,CTL01 ;“PWM电平状态标志”为1(高电平)就转移。PWM周期25微秒*2=50微秒,20KHz占空比50%
- CTL03:
- JB FLQH,CTL05 ;“风类切换”为1自然风(睡眠风)就转移
- MOV A,DANG ;装入档位值
- CTL04:
- PUSH DPL
- PUSH DPH
- MOV DPTR,#DAB1 ;档位控制码地址
- DEC A ;档位值减1后为正确地址
- MOVC A,@A+DPTR ;装入档位控制码
- MOV P3,A ;置P3口控制继电器
- POP DPH
- POP DPL
- RET
- CTL05:
- MOV A,SMFJG2 ;装入自然风(睡眠风)档位变化时的间隔时间(秒)
- JZ CTL06 ;是0就转移
- MOV A,DANGW ;装入自然风当前档位
- LJMP CTL04
- CTL06:
- MOV SMFJG2,SMFJG ;重新放入设置的档位变化间隔时间
- LCALL SETPWM ;设置“延时PWM驱动”时间
- MOV A,DANGW ;装入当前档位值
- JNB TSFX,CTL09 ;如果“调速方向”为0(渐慢降档)就转移
- CJNE A,DANG_G,CTL07 ;当前档位值是否等于或大于设置的最高上限
- CTL07:
- JC CTL08 ;小于就转移
- MOV A,DANG_G ;等于或大于,装入最高上限
- CLR TSFX ;“调速方向”改为0(渐慢降档)
- LJMP CTL09
- CTL08:
- INC A ;增1档
- MOV DANGW,A
- LJMP CTL04
- CTL09:
- CJNE A,DANG_D,CTL10 ;当前档位值不是设置的最低下限就转移
- SETB TSFX ;是,“调速方向”改为1(渐快增档)
- LJMP CTL04
- CTL10:
- JC CTL13 ;小于就转移
- CJNE A,DANG_G,CTL11 ;是否大于设置的最高上限
- CTL11:
- JC CTL12 ;小于就转移
- MOV A,DANG_G ;等于或大于,装入最高上限
- CTL12:
- DEC A ;减1档
- MOV DANGW,A
- LJMP CTL04
- CTL13:
- MOV A,DANG_D ;小于最低下限,装入最低下限
- MOV DANGW,A
- LJMP CTL04
- ;--------------------------------------------------------------
- ;子程序:T1中断调用,时间计数及倒计时处理。10毫秒执行一次
- ;--------------------------------------------------------------
- TIME:
- MOV A,YSPWM ;延时PWM驱动
- JZ TIME0
- DEC YSPWM ;每10毫秒减1,直到为0
- TIME0:
- MOV A,FENGMQ ;蜂鸣器鸣响时长
- JZ TIME1
- DEC FENGMQ ;每10毫秒减1,直到为0
- TIME1:
- MOV A,SHMJS ;装入(10)毫秒计数
- JZ TIME2 ;如果是0就转移
- DEC SHMJS ;每10毫秒减1,直到为0
- TIME2:
- MOV A,HWJS ;每10毫秒减1,为0时清除“接收到的红外遥控数据码”
- JZ TIME3 ;是0就转移
- DEC HWJS ;减1
- LJMP TIME4
- TIME3:
- MOV MA1,FWBZ1 ;用“复位及EEPROM判断标志”填充“接收到的红外遥控数据码”
- MOV MA2,FWBZ2 ;用“复位及EEPROM判断标志”填充“接收到的红外遥控数据码”
- TIME4:
- MOV A,HMJS ;装入(10)毫秒计数2
- JZ TIME6 ;如果是0就转移
- DEC HMJS ;不是0,减1
- CJNE A,#50,TIME5 ;如果不是50就转移退出
- SETB SSBZ ;“闪烁标志”置为1,数字及冒号闪烁时用,每0.5秒变化一次
- TIME5:
- RET
- TIME6:
- CLR SSBZ ;“闪烁标志”置为0,数字及冒号闪烁时用,每0.5秒变化一次
- MOV HMJS,#99 ;重新放入计数值(1秒)
- MOV A,SMFJG2 ;装入运行时使用的“睡眠风(自然风)档位变化时的间隔时间(秒)”
- JZ TIME7 ;如果是0就转移
- DEC SMFJG2 ;每秒减1,直到为0
- TIME7:
- MOV A,MJS ;秒计数
- JZ TIME8 ;如果是0就转移
- DEC MJS ;每秒减1,直到为0
- TIME8:
- MOV A,FWBZ0 ;装入复位提示(闪烁显示)秒计数
- JZ TIME9 ;如果是0就转移
- DEC FWBZ0 ;每秒减1,直到为0
- TIME9:
- MOV A,DSDW ;装入定时与档位交替显示的间隔时间(秒)
- JNZ TIME10 ;如果不是0就转移
- MOV DSDW,DSDWJG ;重新放入设置值
- CPL XSNRXZ ;“显示内容选择”取反,交替显示
- TIME10:
- DEC DSDW ;每秒减1,直到为0
- MOV A,DSSJM ;装入定时时间(秒)到寄存器A
- JZ TIME11 ;如果是0就转移
- DEC DSSJM ;减1秒
- RET
- TIME11:
- MOV A,DSSJF ;装入定时时间(分)到寄存器A
- JZ TIME12 ;如果是0就转移
- DEC DSSJF ;不是0,减1分
- MOV DSSJM,#59 ;把59放入定时时间(秒)
- RET
- TIME12:
- MOV A,DSSJS ;装入定时时间(时)到寄存器A
- JNZ TIME13 ;不是0就转移
- CLR XSNRXZ ;定时结束,“显示内容选择”置为0,不显示档位
- RET
- TIME13:
- DEC DSSJS ;不是0,小时减1
- MOV DSSJM,#59 ;把59放入定时时间(秒)
- MOV DSSJF,#59 ;把59放入定时时间(分)
- RET
- ;---------------------------------------------------------------------------
- ;子程序:T1中断调用,显示定时时间及档位、红外遥控解码等。10毫秒执行一次
- ;---------------------------------------------------------------------------
- DISPLAY:
- JB XSKG,DPYSZ1 ;如果“显示开关”为1(禁止T1显示功能)就转移,退出
- JNB XSQHY,DPYSZ0 ;如果“显示切换1”为0(显示定时或档位)就转移
- LJMP DSZ
- DPYSZ0:
- JB FLQH,DISPL0 ;如果“风类切换”为1睡眠风(自然风)就转移,显示定时时间
- JNB XSNRXZ,DISPL0 ;如果“显示内容选择”为0(显示定时时间)就转移
- MOV A,DANG ;显示档位,装入档位值
- CJNE A,XSHC1,DPYSZ3 ;当前档位值与缓存1不相同就转移,立即显示
- MOV A,HMJS ;相同,装入(10)毫秒计数2
- CJNE A,#99,DPYSZ2 ;不是99就转移,每0.5秒显示一次
- LJMP DPYSZ3 ;是,显示
- DPYSZ1: RET
- DPYSZ2:
- CJNE A,#49,DPYSZ1 ;不是49就转移退出,每0.5秒显示一次
- DPYSZ3:
- MOV XSHC1,DANG ;当前档位值放入缓存1
- MOV ZXM1,#0 ;放入消隐码到待发送TM1637区1
- MOV ZXM4,#0 ;放入消隐码到待发送TM1637区4
- MOV R0,#ZXM2 ;装入待发送TM1637区2地址
- MOV A,DANG ;装入档位值
- LCALL BCD ;转换并获取字形码放到待发送TM1637区2和3
- LCALL disp ;发送4个字节数据到TM1637显示
- RET
- ;--------------------------------
- DISPL0:
- CLR XSNRXZ ;“显示内容选择”置为0,显示定时时间
- MOV R1,#DSSJS ;把定时时间“时”的地址放入R1
- MOV A,@R1 ;装入“时”
- JZ DISPL1 ;如果“时”为0就转移
- LJMP DISPL3
- DISPL1:
- CLR SSBZ ;“时”为0,把“闪烁标志”置为0,始终显示冒号
- INC R1 ;地址加1,指向“分”
- MOV A,@R1 ;装入“分”
- DISPL3:
- CJNE A,XSHC1,DISPL6 ;寄存器A的数据与显示缓存1不相同就转移,立即显示
- INC R1 ;地址加1
- MOV A,@R1 ;装入下一个时间数值
- DEC R1 ;地址减1
- CJNE A,XSHC2,DISPL6 ;寄存器A的数据与显示缓存2不相同就转移,立即显示
- MOV A,HMJS ;都相同,装入(10)毫秒时间计数2
- CJNE A,#99,DISPL5 ;不是99就转移
- LJMP DISPL6 ;是,显示(每0.5秒显示一次)
- DISPL4: RET
- DISPL5:
- CJNE A,#49,DISPL4 ;不是49就转移退出,每0.5秒显示一次
- DISPL6:
- INC R1 ;地址加1
- MOV A,@R1 ;装入后面一位时间数值
- MOV XSHC2,A ;放入缓存2
- DEC R1 ;地址减1
- MOV A,@R1 ;装入前面一位时间数值
- MOV XSHC1,A ;放入缓存1
- MOV R0,#ZXM1 ;待发送TM1637区1地址
- LCALL BCD ;转换并获取字形码放到待发送TM1637区1、2
- INC R1 ;地址加1
- MOV R0,#ZXM3 ;待发送TM1637区3地址
- MOV A,@R1 ;装入后面一位时间数值
- LCALL BCD ;转换并获取字形码放到待发送TM1637区3、4
- JB SSBZ,DISPL8 ;如果“闪烁标志”为1就转移,不显示冒号
- DISPL7:
- ORL ZXM2,#10000000B ;把最高位置为1(最高位为1就显示冒号)
- DISPL8:
- LCALL disp ;发送4个字节数据到TM1637显示
- RET
- ;--------------------------------
- DSZ:
- JNB XSQHE,DHW ;如果“显示切换2”为0(显示红外遥控信号解码)就转移
- MOV A,ZRFJG ;装入当前要显示的项目号,1:档位下限;2=档位上限;3=档位变化的间隔时间(秒)
- DEC A ;减1
- JNZ DSZ1 ;不为0就转移
- MOV A,DANG_D ;是1,显示档位下限
- MOV ZXM1,#038H ;放入“L”到待发送TM1637区1
- LJMP DSZ3
- DSZ1:
- DEC A ;减1
- JNZ DSZ2 ;不为0就转移
- MOV A,DANG_G ;是2,显示档位上限
- MOV ZXM1,#076H ;放入“H”到待发送TM1637区1
- LJMP DSZ3
- DSZ2:
- MOV A,SMFJG ;是3,显示档位变化的间隔时间(秒)
- MOV ZXM1,#079H ;放入“E”到待发送TM1637区1
- DSZ3:
- MOV ZXM2,#040H ;放入“-”到待发送TM1637区2
- MOV R0,#ZXM3 ;待发送TM1637区3地址
- LCALL BCD ;转换并获取字形码放到待发送TM1637区2和3
- LCALL disp ;显示
- RET
- ;---------------------------------
- DHW:
- JB BMXSQH,DHW4 ;如果“编码显示切换”为1(显示数据码+反码)就转移
- MOV A,XMBH ;装入功能编号
- CJNE A,XSHC1,DHW3 ;与显示缓存1不相同就转移,立即显示
- MOV A,HMJS ;相同,装入(10)毫秒计数
- CJNE A,#99,DHW2 ;不是99就转移,每0.5秒显示一次
- LJMP DHW3 ;是,显示
- DHW1: RET
- DHW2:
- CJNE A,#49,DHW1 ;不是49就转移退出,每0.5秒显示一次
- DHW3:
- MOV XSHC1,XMBH ;功能编号放入缓存1
- MOV R0,#ZXM1 ;显示功能编号+系统码,待发送TM1637区1
- MOV A,XMBH ;装入功能编号
- LCALL BCD1 ;获取字形码放到待发送TM1637区
- MOV ZXM2,#040H ;放入“-”到待发送TM1637区2
- MOV A,ANJZ ;装入系统码
- MOV R0,#ZXM3 ;待发送TM1637区3
- LCALL HEX ;显示十六进制系统码
- LCALL disp ;显示十六进制系统码
- RET
- DHW4:
- MOV A,XMBH ;装入功能编号
- MOV B,#2 ;功能编号乘2
- MUL AB ;功能编号乘2
- DEC A ;计算结果减1
- ADD A,#ANJZ ;加遥控按键值首地址,得出数据码的实际地址
- MOV R1,A ;地址放入R1
- MOV A,@R1 ;装入数据码
- CJNE A,XSHC1,DHW7 ;与显示缓存1不相同就转移,立即显示
- INC R1 ;地址加1
- MOV A,@R1 ;装入装入数据码反码
- DEC R1 ;地址减1
- CJNE A,XSHC2,DHW7 ;与显示缓存2不相同就转移,立即显示
- MOV A,HMJS ;都相同,装入(10)毫秒时间计数
- CJNE A,#99,DHW6 ;不是99就转移
- LJMP DHW7 ;是,显示(每0.5秒显示一次)
- DHW5: RET
- DHW6:
- CJNE A,#49,DHW5 ;不是49就转移退出,每0.5秒显示一次
- DHW7:
- INC R1 ;地址加1
- MOV A,@R1 ;装入数据码反码
- MOV XSHC2,A ;放入缓存2
- DEC R1 ;地址减1
- MOV A,@R1 ;装入数据码码
- MOV XSHC1,A ;放入缓存1
- MOV R0,#ZXM1 ;待发送TM1637区1
- LCALL HEX ;查表获取字形码
- MOV A,@R1 ;装入数据码反码
- LCALL HEX ;查表获取字形码
- LCALL disp ;显示
- RET
- ;---------------------------------
- HEX:
- PUSH ACC
- SWAP A ;高低半字节交换
- ANL A,#0FH ;逻辑与运算
- LCALL BCD1 ;查表获取字形码放到待发送TM1637区
- INC R0 ;地址加1
- POP ACC
- ANL A,#0FH ;逻辑与运算
- LCALL BCD1 ;查表获取字形码放到待发送TM1637区
- INC R0 ;地址加1
- INC R1 ;地址加1
- RET
- ;---------------------------------
- BCD:
- MOV B,#10 ;转换为BCD码
- DIV AB ;转换为BCD码
- PUSH DPL
- PUSH DPH
- MOV DPTR,#SEGTAB ;查表获取字形码
- MOVC A,@A+DPTR ;查表获取字形码
- POP DPH
- POP DPL
- MOV @R0,A ;字形码放入待发送TM1637区
- INC R0 ;地址加1
- XCH A,B ;A、B寄存器内容交换
- BCD1:
- PUSH DPL
- PUSH DPH
- MOV DPTR,#SEGTAB ;查表获取字形码
- MOVC A,@A+DPTR ;查表获取字形码
- POP DPH
- POP DPL
- MOV @R0,A ;字形码放入待发送TM1637区
- RET
- ;************** 关闭T1中断的显示功能,显示“----”**************
- HENGX:
- SETB XSKG ;“显示开关”置为1,关闭T1中断的显示功能
- MOV ZXM1,#40H ;显示“----”
- MOV ZXM2,#40H
- MOV ZXM3,#40H ;显示“----”
- MOV ZXM4,#40H
- LJMP disp0
- ;---------- 发送4个字节数据到TM1637显示,地址自动加1 ----------
- disp:
- MOV A,FWBZ0 ;装入复位提示(闪烁显示)秒计数
- JZ disp0 ;如果是0(未发生复位)就转移
- JNB SSBZ,disp0 ;已经发生复位,“闪烁标志”为0(闪烁显示中的“显示”状态)就转移
- CLR A ;处于闪烁显示中的“不显示”状态,放入消隐码(0)
- MOV ZXM1,A ;放入消隐码
- MOV ZXM2,A ;放入消隐码
- MOV ZXM3,A ;放入消隐码
- MOV ZXM4,A ;放入消隐码
- disp0:
- LCALL Srt
- MOV A,#040H ;数据命令设置40H:地址自动加1,写数据到显示寄存器
- LCALL Writebyte ;发送一个字节
- LCALL Stop
- NOP
- LCALL Srt
- MOV A,#0C0H ;地址命令设置C0H:初始地址为00H
- LCALL Writebyte ;发送一个字节
- MOV R6,#4 ;发送4个字节数据
- MOV R1,#ZXM1 ;等待发送的字形码始址
- disp1:
- MOV A,@R1 ;装入要发送的字形码
- LCALL Writebyte ;发送一个字节
- INC R1 ;地址加1
- DJNZ R6,disp1 ;如果还未发送完就继续
- LCALL Stop
- LCALL Srt
- MOV A,SMGLD ;装入设置的数码管亮度(1~8)
- ADD A,#087H ;加上87H后即为对应的亮度控制命令88H~8FH
- LCALL Writebyte ;按设置的亮度开显示
- LCALL Stop
- RET
- ;----- 发送8bit(一个字节)数据到TM1637,A=要发送的数据,从低位开始 -----
- Writebyte:
- MOV R7,#8 ;发送8位数据
- WBY1:
- CLR CLK ;拉低CLK
- JNB ACC.0,WBY2 ;A寄存器的低位(0位)如果为0就转移
- SETB DIO ;为1,拉高DIO
- SJMP WBY3
- WBY2:
- CLR DIO ;为0,拉低DIO
- WBY3:
- MOV R4,#13 ;延时
- DJNZ R4,$ ;延时
- SETB CLK ;拉高CLK
- CLR C ;进位标志清0
- RRC A ;A寄存器内容带进位循环右移
- DJNZ R7,WBY1 ;如果还未发送完8bit数据就继续
- CLR CLK ;8位数据发送完了
- MOV R7,#20 ;设置等待应答信号延时计数
- WBY5:
- JNB DIO,WBY6 ;判断TM1637发过来的ACK应答信号,应答就转移(0,低电平)
- DJNZ R7,WBY5 ;
- WBY6:
- MOV R4,#13 ;延时
- DJNZ R4,$ ;延时
- SETB CLK ;拉高CLK
- MOV R4,#13 ;延时
- DJNZ R4,$ ;延时
- RET
- ;------------------ Start子程序 ------------------
- Srt:
- SETB DIO ;拉高DIO
- SETB CLK ;拉高CLK
- MOV R4,#13 ;延时
- DJNZ R4,$ ;延时
- SETB DIO ;拉高DIO
- MOV R4,#13 ;延时
- DJNZ R4,$ ;延时
- CLR DIO ;拉低DIO
- MOV R4,#13 ;延时
- DJNZ R4,$ ;延时
- CLR CLK ;拉低CLK
- RET
- ;------------------ Stop子程序 ------------------
- Stop:
- CLR CLK
- MOV R4,#30
- DJNZ R4,$
- CLR DIO
- MOV R4,#30
- DJNZ R4,$
- SETB CLK
- MOV R4,#40
- DJNZ R4,$
- SETB DIO
- MOV R4,#30
- DJNZ R4,$
- CLR CLK
- CLR DIO
- RET
- ;********************** 以下为EEPROM操作子程序 **********************
- ;STC8G1K08有4K的EEPROM,共8个扇区,
- ;第1扇区:0000H~01FFH;第2扇区:0200H~03FFH……
- ;----------------------------------------------------
- ;
- ;------- 读EEPROM保存的各项设置,如果没有就保存当前的设置值 ---------
- REEP:
- LCALL RE00 ;读EEPROM
- JNC WEEP ;无数据(C=0)就转移,保存当前的设置值
- RET
- WEEP:
- LCALL BCJDQ ;全功率驱动继电器保持至EEPROM操作结束,防止PWM驱动方式时可能断开无法吸合
- MOV IAP_ADDRH,#00H ;第一个扇区地址的高8位
- MOV IAP_ADDRL,#00H ;第一个扇区地址的低8位
- LCALL Sector_Erase ;擦除整个扇区
- MOV R1,#FWBZ1 ;首地址
- MOV R2,#30 ;共写入20个字节
- WEEP1:
- MOV A,@R1 ;装入R1指向的RAM地址的内容到A
- LCALL Byte_Program ;写入EEPROM
- INC IAP_ADDRL ;EEPROM地址加1
- INC R1 ;RAM地址增1
- DJNZ R2,WEEP1 ;未保存完就转移继续
- MOV IAP_ADDRL,#0 ;保存完了,扇区地址低位指向0(当前扇区首址)
- LCALL Byte_Read ;读出来检查看是否写入成功
- CJNE A,FWBZ1,WEEP3 ;如果与EEPROM数据判断标志1不相同就转移
- INC IAP_ADDRL ;EEPROM地址加1
- LCALL Byte_Read ;读第二个字节
- CJNE A,FWBZ2,WEEP3 ;如果与EEPROM数据判断标志2不相同就转移
- RET ;成功了,退出
- WEEP3:
- SETB XSKG ;“显示开关”置为1,关闭T1中断的显示功能
- MOV MJS,#5 ;显示5秒E1
- MOV ZXM1,#0 ;消隐码
- MOV ZXM2,#079H ;E
- MOV ZXM3,#006H ;1
- MOV ZXM4,#0 ;消隐码
- LCALL DISP ;显示
- WEEP4:
- MOV A,MJS
- JNZ WEEP4 ;等待MJS为0秒
- RET
- ;;---------- 读EEPROM保存的各项设置 ----------
- RE00:
- LCALL BCJDQ ;全功率驱动继电器保持至EEPROM操作结束,防止PWM驱动方式时可能断开无法吸合
- MOV IAP_ADDRH,#00H ;第一个扇区地址的高8位
- MOV IAP_ADDRL,#00H ;第一个扇区地址的低8位
- LCALL Byte_Read ;读第一个字节,返回:A=读出的数据
- CJNE A,FWBZ1,RE02 ;如果不是原来保存的数据就转移
- INC IAP_ADDRL ;EEPROM字节地址增1
- LCALL Byte_Read ;读第二个字节
- CJNE A,FWBZ2,RE02 ;如果不是原来保存的数据就转移
- MOV R1,#FWBZ2 ;从FWBZ2+1处开始放置读出的设置值
- MOV R2,#28 ;再读出28个字节
- RE01:
- INC R1 ;RAM地址增1
- INC IAP_ADDRL ;EEPROM字节地址增1
- LCALL Byte_Read ;读一个字节,返回:A=读出的数据
- MOV @R1,A ;放到R1指向的RAM地址
- DJNZ R2,RE01 ;未读完就继续
- SETB C ;把C置为1,读取成功
- RET
- RE02:
- CLR C ;把C置为0,没有数据
- RET
- ;-------------------------------
- ;EEPROM操作需要数毫秒以上,期间MCU会暂停,PWM停止。
- ;全功率驱动使继电器保持吸合状态至EEPROM操作结束,防止PWM驱动方式时可能断开无法吸合
- BCJDQ:
- LCALL SETPWM ;设置“延时PWM驱动”时间
- SETB EEPBC ;“EEPROM操作子程序调用”标志置为1,使T0中断暂停执行继电器控制程序
- LCALL CTL00 ;控制继电器
- CLR EEPBC ;标志置为0
- RET
- ;-------------------------------
- ;读一个字节,A=读出的数据
- Byte_Read:
- MOV IAP_CONTR,#80H ;打开IAP功能
- MOV IAP_TPS,#12 ;设置等待参数
- MOV IAP_CMD,#01 ;设置IAP读命令
- MOV IAP_TRIG,#05AH ;触发命令
- MOV IAP_TRIG,#0A5H ;触发命令
- NOP
- MOV A,IAP_DATA ;读出的数据在IAP_DATA,送入累加器A
- RET
- ;-------------------------------
- ;字节编程,A=需写入的数据
- Byte_Program:
- MOV IAP_CONTR,#80H ;打开IAP功能
- MOV IAP_TPS,#12 ;设置等待参数
- MOV IAP_CMD,#02 ;设置IAP写命令
- MOV IAP_DATA,A ;要写入的数据先送进IAP_DATA寄存器
- MOV IAP_TRIG,#05AH ;触发命令
- MOV IAP_TRIG,#0A5H ;触发命令
- RET
- ;-------------------------------
- ;擦除扇区
- Sector_Erase:
- MOV IAP_CONTR,#80H ;打开IAP功能
- MOV IAP_TPS,#12 ;设置等待参数
- MOV IAP_CMD,#03 ;设置IAP擦除命令
- MOV IAP_TRIG,#05AH ;触发命令
- MOV IAP_TRIG,#0A5H ;触发命令
- RET
- ;************************* 以上为EEPROM操作子程序 ***************************
- ;
- ;1~15档控制码:
- DAB1: DB 0FEH,0FDH,0FBH,0FAH,0F9H,0F8H,0F4H,0F2H,0F1H,0F0H,0E4H,0E2H,0E1H,0E0H,0DFH
- ;
- ;------------------ 字形表 ------------------
- SEGTAB:
- DB 00111111B ;0(3FH)
- DB 00000110B ;1(06H)
- DB 01011011B ;2(5BH)
- DB 01001111B ;3(4FH)
- DB 01100110B ;4(66H)
- DB 01101101B ;5(6DH)
- DB 01111101B ;6(7DH)
- DB 00000111B ;7(07H)
- DB 01111111B ;8(7FH)
- DB 01101111B ;9(6FH)
- DB 01110111B ;A(77H)
- DB 01111100B ;B(7CH)
- DB 00111001B ;C(39H)
- DB 01011110B ;D(5EH)
- DB 01111001B ;E(79H)
- DB 01110001B ;F(71H)
- ;---------------------------------------------
- END
复制代码 |
打赏
-
查看全部打赏
|