数码之家

 找回密码
 立即注册
搜索
查看: 31645|回复: 160

[C51] STC15F104W制作定时器,适用于各种需延时通断、循环通断控制场合(源码)

    [复制链接]
发表于 2021-1-19 09:52:43 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用STC15F104W制作定时IC,适用于各种需延时通断、循环通断的控制场合
作者:杨小强,2021年1月
MCU:STC15F104W,内部R/C时钟,频率选择:11.0592MHz
显示:(TM1637)4位数码管显示模块
调整定时时间、设置:EC11带按键5脚旋转编码器。也可以用两只按键代替编码器
定时范围:10毫秒~100小时

描述:
默认导通定时时间10小时,上电就导通,可通过旋转编码器实时调整当前定时时间,最大可调到99小时59分59+1秒=100小时,最小为0;导通定时时间到0就断开,停止运行,不循环,睡眠模式为“始终显示”,旋转编码器调整当前导通定时时间,又开始运行。

定时时间1小时以上显示“时:分”,冒号闪烁;小于1小时自动切换为显示“分:秒”,冒号不闪烁;小于1分钟自动切换为显示“秒:毫秒”,冒号不闪烁。

用于固定定时时间的场合时,设置好各项参数,可取消数码管显示模块、编码器、按键,同时把编码器、按键I/O端口P3.1、P3.2、P3.3接到2脚VCC,避免万一端口受到干扰而产生误动作。
设置共有2种方式:
方式1(适合手头上没有TM1637数码管显示模块的情况):把源程序中“设置各项默认值”处改为需要的值,编译为HEX文件,烧写时把“本次将EEPROM区域全部填充为FF”选项勾上。
方式2:之1.长按KEY3秒,显示“--:--”时释放,进入“设置”状态进行设置。
            之2.转动编码器一点点停留在半格,也就是两格之间,让A或B、或者AB都为ON并保持3秒,显示“--:--”时转完一格,进入“设置”状态进行设置。当“主界面状态下长按快速加减使能的常数”设为081H(允许)时此方式无效。


按键、编码器动作:
1.处于睡眠状态时,按键、编码器动作只唤醒睡眠,恢复数码管显示,不影响正常运行和数据。
2.处于始终导通状态时,有按键、编码器动作将退出始终导通状态,切换到“导通时间”结束的断开状态,如果设置的是循环定时,就从“断开时间”继续运行。
3.同时处于睡眠状态和终导通状态时,先唤醒睡眠,退出睡眠状态2秒后,再次有按键、编码器动作才退出始终导通状态。
4.短按KEY1次,暂停计时,如果当前是导通状态将断开,再按恢复导通并继续计时。
5.处于“导通”或“断开”工作状态时,短按2次KEY,当前时间清零,运行下一项(如果设有)。
6.短按KEY3次:重新启动,相当于重新上电。
7.间隔时间不超过0.5秒的2次或3次短按,为有效按键动作。
8.长按KEY3秒,显示“--:--”时释放,进入“设置”,如果保持按下达到10秒,将恢复默认设置。
9.长按KEY10秒,恢复默认设置,显示88:88,然后按默认值从“导通”开始执行。
10.处于“上电延时导通”、“导通”、“断开”工作状态时,旋转编码器可进行实时调整,最大99小时59分59+1秒=100小时,最小为0。
11.处于“上电延时导通”工作状态,延时导通模式为2(延时时间到后从“断开”继续运行)时,上电4.2分钟后,按下KEY达到设置的时长,时间清零,之后不响应按键动作,继续执行“断开”、“导通”,执行到“导通”状态运行结束时,恢复按键全部功能。
12.转动编码器一点点停留在半格,也就是两格之间,让A或B、或者AB都为ON并保持3秒,这时显示 “--:--”(如果仍然保持不动达到10秒,将恢复默认设置),然后转完一格,进入“设置”。当“定义主界面状态下长按快速加减使能的常数”设为081H(允许)时此方式无效。

设置:
进入“设置”后,根据数码管左边显示的内容进行相应设置,旋转编码器加或减,设置好一项,闪烁5秒无操作或者短按KEY释放0.5秒后,跳到下一项。任何时候都可以短按2次KEY保存并退出,或在最后一项无操作自动保存退出。
按住KEY不放,旋转编码器可向上/下转移到任意一项设置,释放按键后旋转编码器加或减。
1、显示“1A”设置导通时间(时),0~99小时,默认10小时
2、显示“1b”设置导通时间(分),0~59分钟
3、显示“1C”设置导通时间(秒),0~59秒
4、显示“1d”设置导通时间(×10毫秒),0~99
5、显示“o-”设置循环定时,0=无限循环;1=不循环;2~99=循环导通次数。默认为1,不循环
6、显示“C-”设置睡眠模式,0=始终显示;1~59=无操作进入睡眠(分钟)。默认为0,始终显示
7、显示“bC”设置实时调整时(步长),3小时以下定时调整时,编码器每转动一格的增(减)值:
              1~30分钟,默认1分钟;3小时以上增(减)值30分钟;10小时以上增(减)值1个小时;
              20小时以上增(减)值2个小时。
8、显示“Ld”设置数码管亮度,1~8级。默认为3级
9、显示“2A”设置断开时间(时),0~99小时
10、显示“2b”设置断开时间(分),0~59分钟
11、显示“2C”设置断开时间(秒),0~59秒
12、显示“2d”设置断开时间(×10毫秒),0~99
13、显示“3A”设置上电延时导通(时),0~99小时,默认值为0
14、显示“3b”设置上电延时导通(分),0~59分钟,默认值为0
15、显示“3C”设置上电延时导通(秒),0~59秒,默认值为0
16、显示“d-”设置延时导通模式,0~2。默认为2(延时时间到后从“断开”继续运行)
17、显示“E-”设置“持续时间”秒计数0~99,按下KEY持续0~99秒结束“上电延时导通”状态

保存失败将显示5秒E1。

导通时间:1~99(×10)毫秒~100小时,如果“上电延时导通”时间设为0(关闭),则上电就执行本项。如果设置为循环定时,本项时间结束就执行“断开时间”。
循环定时:0=无限循环;1=不循环;2~99=导通次数;导通次数是指从上电到循环结束为止,总共导通的次数。如果“断开时间”设置的时间为0,循环无效,导通定时时间到后就断开,停止。
睡眠模式:0=始终显示;1~59=无操作1~59分钟关闭显示继续运行;按键、编码器有动作就唤醒睡眠
断开时间:1~99(×10)毫秒~100小时,时间结束就运行“导通时间”。默认值为2小时。
上电延时导通:1秒~100小时。设置的时间全部为0=关闭;设置的时间不为0就启用;
              本项上电只执行一次,不参与循环定时。默认为0  启用上电延时导通,延时导通模式为2时,上电4.2分钟内不响应按键动作,编码器可以正常使用,4.2分钟之后,当持续按下按键的时间达到设置的时长(0~99秒)就清零,结束“上电延时导通”状态,继续不响应按键动作,执行到“导通”状态运行结束时,按键功能恢复正常。
延时导通模式:0=延时时间到后始终导通。旋转编码器或按下KEY就退出始终导通状态,切换到“导通时间”的结束状态,如果设置的是循环定时,就从“断开时间”继续运行。
              1=延时时间到后从“导通”继续运行,如果“导通时间”设置的时间为0就结束
              2=延时时间到后从“断开”继续运行,如果“断开时间”设置的时间为0就转到“导通”继续运行。

下面用电动车充电定时器等电路举例其应用:
电动车充电器定时自动关机.jpg
电动车充电器定时自动关机(检测绿灯).jpg

电动车充电器定时自动断电(SCR).jpg

电动车充电器定时自动断电(SCR)(检测绿灯).jpg
电动车充电器定时自动断电(继电器).jpg
电动车充电器定时自动断电(继电器)(检测绿灯).jpg
冰箱冰柜定时器.jpg
可控硅控制.jpg
继电器控制.jpg
10毫秒.jpg
上面是“导通时间”和“断开时间”设为最小值1(10毫秒),“循环定时”设为“无限循环”的情况,P3.0的输出为50Hz方波。


下面是源程序:
  1. ;----------------------------- 端口定义 ------------------------------------
  2.             MOC      EQU  P3.0   ;5脚,导通状态输出低电平;断开状态输出高电平
  3.             KEY      EQU  P3.1   ;6脚,按键KEY
  4.             EC11A    EQU  P3.2   ;7脚,接编码器的A引脚
  5.             EC11B    EQU  P3.3   ;8脚,接编码器的B引脚
  6.             DIO      EQU  P3.4   ;1脚,接显示模块TM1637的DIO
  7.             CLK      EQU  P3.5   ;3脚,接显示模块TM1637的CLK

  8.     ;---------------------------- 位地址及RAM的使用 ----------------------------
  9.     ;(20H)第0位:1=编码器有旋转动作;0=没有旋转动作
  10.     ;(20H)第1位:1=编码器顺时针正转;0=编码器逆时针反转
  11.     ;(20H)第2位:1=暂停;0=正常运行
  12.     ;(20H)第3位:1=禁止;0=允许。进行各项设置时使用,允许/禁止检查剩余时间
  13.     ;(20H)第4位:1=闪烁显示;0=不闪烁。进行各项设置时用
  14.     ;(20H)第5位:1=不显示,0=显示,数字及冒号闪烁时用,每0.5秒变化一次
  15.     ;(20H)第6位:1=关闭时间显示,3秒88:88或5秒E1显示占用;0=正常显示
  16.     ;(20H)第7位:1=已进入“上电延时导通”的始终导通状态;0=正常
  17.     ;(21H)第8位:1=禁止响应按键动作;0=正常
  18.     ;(21H)第9位:1=允许恢复响应按键动作;0=正常

  19.     FWBZ1    EQU   022H     ;复位判断标志1,也作EEPROM数据判断标志
  20.     FWBZ2    EQU   023H     ;复位判断标志2,也作EEPROM数据判断标志
  21.     DTS      EQU   024H     ;导通时间(时),0~99
  22.     DTF      EQU   025H     ;导通时间(分),0~59
  23.     DTM      EQU   026H     ;导通时间(秒),0~59
  24.     DTHM     EQU   027H     ;导通时间,100(0~99)×10毫秒
  25.     XHDS     EQU   028H     ;循环定时,0=无限循环;1=不循环;2~99=循环次数
  26.     SMMS     EQU   029H     ;睡眠模式,0=始终显示;1~59=无操作进入睡眠(分钟)
  27.     BMQZJ    EQU   02AH     ;编码器每转动一小格的增/减值,1~30分钟
  28.     SMGLD    EQU   02BH     ;数码管亮度,1~8级
  29.     DKS      EQU   02CH     ;断开时间(时),0~99
  30.     DKF      EQU   02DH     ;断开时间(分),0~59
  31.     DKM      EQU   02EH     ;断开时间(秒),0~59
  32.     DKHM     EQU   02FH     ;断开时间,100(0~99)×10毫秒
  33.     SDYSS    EQU   030H     ;上电延时导通(时),0~99
  34.     SDYSF    EQU   031H     ;上电延时导通(分),0~59
  35.     SDYSM    EQU   032H     ;上电延时导通(秒),0~59
  36.     YSMS     EQU   033H     ;延时导通模式,0~2
  37.     YSJS     EQU   034H     ;在上电延时导通状态时,按下KEY持续0~99秒结束该状态
  38.     YSXY     EQU   035H     ;延时响应,在上电延时导通状态时,此处为0才响应按键动作
  39.     DSSJS    EQU   036H     ;定时时间,时
  40.     DSSJF    EQU   037H     ;定时时间,分
  41.     DSSJM    EQU   038H     ;定时时间,秒
  42.     DSSJHM   EQU   039H     ;定时时间,毫秒,100(0~99)×10毫秒=1秒
  43.     SMJSF    EQU   03AH     ;睡眠计时(分)
  44.     SMJSM    EQU   03BH     ;睡眠计时(秒)
  45.     SMJS     EQU   03CH     ;睡眠处理计时用
  46.     XHJS     EQU   03DH     ;循环定时用,导通次数计数
  47.     SHMJS    EQU   03EH     ;(10)毫秒计数,每10毫秒减1,直到为0
  48.     HMJS     EQU   03FH     ;(10)毫秒计数2,为0后自动重新放入99
  49.     MJS      EQU   040H     ;秒计数,每秒减1,直到为0
  50.     DQZT     EQU   041H     ;当前状态,0=导通、1=断开,2=上电延时导通
  51.     XSHC1    EQU   042H     ;缓存1,与上次不同就立即显示,否则0.5秒显示一次
  52.     XSHC2    EQU   043H     ;缓存2,与上次不同就立即显示,否则0.5秒显示一次
  53.     XXSZ     EQU   044H     ;下限数值,进行各项设置时用
  54.     SXSZ     EQU   045H     ;上限数值,进行各项设置时用
  55.     ZXM1     EQU   046H     ;显示用,待发送到TM1637的字形码1
  56.     ZXM2     EQU   047H     ;显示用,待发送到TM1637的字形码2
  57.     ZXM3     EQU   048H     ;显示用,待发送到TM1637的字形码3
  58.     ZXM4     EQU   049H     ;显示用,待发送到TM1637的字形码4
  59.     DSZJ     EQU   04AH     ;加减定时时间使用
  60.     DISPL    EQU   04BH     ;要显示的项目
  61.     ;
  62.     ;定义主界面状态下长按快速加减使能的常数:
  63.     KSJJ        EQU        080H     ;禁止主界面状态下长按快速加减
  64.     ;KSJJ        EQU        081H    ;允许主界面状态下长按快速加减
  65.     ;当使用按键代替编码器,需要“长按快速加减”功能时,把080H改为081H。
  66.     ;
  67.     ;--------------- 看门狗、EEPROM特殊功能寄存器地址 ---------------
  68.     AUXR          EQU   08EH   ;辅助寄存器
  69.     WDT_CONTR     EQU   0C1H   ;看门狗地址
  70.     IAP_DATA      EQU   0C2H   ;数据寄存器,读出、写入的数据放在此处
  71.     IAP_ADDRH     EQU   0C3H   ;地址寄存器高八位
  72.     IAP_ADDRL     EQU   0C4H   ;地址寄存器低八位
  73.     IAP_CMD       EQU   0C5H   ;命令寄存器,0=关闭,1=读,2=写,3=擦除
  74.     IAP_TRIG      EQU   0C6H   ;命令触发寄存器,每次操作先放入5A再放入A5,命令立即被触发起动
  75.     IAP_CONTR     EQU   0C7H   ;控制寄存器,Flash操作允许/禁止及等待时间
  76.     ENABLE_IAP    EQU   083H   ;定义Flash操作等待时间及允许IAP/ISP/EEPROM操作的常数,时钟<12MHz时为83H

  77.     ;======================= 程序代码开址 =======================
  78.             ORG    0000H
  79.             LJMP   START

  80.             ORG    000BH         ;T0中断入口
  81.             LJMP   T0INT         ;T0中断入口

  82.             ORG    0030H         ;程序代码始址安排在30H

  83.     ;--------------- 定时器0中断(10毫秒产生一次中断) ---------------
  84.     T0INT:
  85.             PUSH  ACC
  86.             PUSH  PSW
  87.             SETB  RS1          ;RS1、RS0组合为11,选择第3组工作寄存器,R0~R7地址为18H~1FH
  88.             SETB  RS0          ;退出中断时恢复默认的工作寄存器(第0组:R0~R7地址为00H~07H)
  89.             LCALL TIME         ;处理各项时间、状态切换
  90.             LCALL DISPLAY      ;显示
  91.             JB    02H,T0INT0   ;如果位地址02H为1(暂停)就转移,断开
  92.             JB    07H,T0INT1   ;如果位地址07H为1(始终导通)就转移,导通
  93.             MOV   A,DQZT       ;装入“当前状态”
  94.             JNZ   T0INT0       ;不是0(导通时间)就转移,断开
  95.             MOV   A,DSSJHM     ;是“导通时间”,装入定时时间(毫秒)到寄存器A
  96.             JNZ   T0INT1       ;不是0就转移,导通
  97.             MOV   A,DSSJM      ;装入定时时间(秒)到寄存器A
  98.             JNZ   T0INT1       ;不是0就转移,导通
  99.             MOV   A,DSSJF      ;装入定时时间(分)到寄存器A
  100.             JNZ   T0INT1       ;不是0就转移,导通
  101.             MOV   A,DSSJS      ;装入定时时间(时)到寄存器A
  102.             JNZ   T0INT1       ;不是0就转移,导通
  103.     T0INT0:
  104.             SETB  MOC          ;定时时间为0,置MOC为高电平,断开
  105.             LJMP  T0INT2
  106.     T0INT1:
  107.             CLR   MOC          ;置MOC为低电平,可控硅(或继电器)导通,通电
  108.     T0INT2:
  109.             POP   PSW
  110.             POP   ACC
  111.             RETI

  112.     ;--------------- 设置各项默认值(#号后面都为十进制数) ----------------
  113.     SZMRZ:
  114.             MOV        DTS,#10    ;导通时长(时),0~99。默认10小时
  115.             MOV        DTF,#0     ;导通时长(分),0~59
  116.             MOV        DTM,#0     ;导通时长(秒),0~59
  117.             MOV        DTHM,#0    ;导通时长,0~99(×10毫秒)
  118.             MOV        XHDS,#1    ;循环定时,0=无限循环;1=不循环;2~99=导通次数
  119.             MOV        SMMS,#0    ;睡眠模式,0=始终显示;1~59=无操作进入睡眠(分钟)
  120.             MOV        BMQZJ,#1   ;实时调整时,编码器每转动一格的+、-值(分钟)
  121.             MOV        SMGLD,#3   ;数码管亮度,8级亮度最高
  122.             MOV        DKS,#2     ;断开时长(时),0~99
  123.             MOV        DKF,#0     ;断开时长(分),0~59
  124.             MOV        DKM,#0     ;断开时长(秒),0~59
  125.             MOV        DKHM,#0    ;断开时长,0~99(×10毫秒)
  126.             MOV        SDYSS,#0   ;上电延时导通时长(时),0~99
  127.             MOV        SDYSF,#0   ;上电延时导通时长(分),0~59
  128.             MOV        SDYSM,#0   ;上电延时导通时长(秒),0~59
  129.             MOV        YSMS,#0    ;延时导通模式,0~2;
  130.             MOV        YSJS,#99   ;结束“上电延时导通”的“按下持续时间”秒计数,0~99
  131.             RET

  132.     ;--------------- 定时器T0设置(10毫秒产生一次中断) ----------------
  133.     SETINT:                                ;10毫秒@11.0592MHz
  134.             ANL  AUXR,#7FH   ;定时器时钟12T模式
  135.             ANL  TMOD,#0F0H  ;设置定时器模式
  136.             MOV  TL0,#000H   ;设置定时初值
  137.             MOV  TH0,#0DCH   ;设置定时初值
  138.             CLR  TF0         ;清除TF0标志
  139.             SETB TR0         ;定时器0开始计时
  140.             SETB ET0         ;允许定时器0中断
  141.             SETB EA          ;允许全局中断
  142.             RET

  143.     ;---- 启动看门狗及喂狗,11.0592MHz预分频数=2(71.1毫秒),00111000B(38H) ----
  144.     WG:        
  145.             MOV   WDT_CONTR,#00111000B
  146.             RET

  147.     ;*********************************** 主程序开始 ***********************************
  148.     START:
  149.             MOV    SP,#050H        ;设置堆栈指针
  150.             MOV    A,FWBZ1         ;检查复位判断标志,不相同就是初次上电,从初始化开始运行
  151.             CJNE   A,#0C8H,START0  ;检查复位判断标志,不相同就是初次上电,从初始化开始运行
  152.             MOV    A,FWBZ2         ;检查复位判断标志,不相同就是初次上电,从初始化开始运行
  153.             CJNE   A,#0D9H,START0  ;检查复位判断标志,不相同就是初次上电,从初始化开始运行
  154.             LCALL  SETINT          ;相同,定时器设置(10毫秒产生一次中断)
  155.             LJMP   START2          ;相同,跳过初始化继续运行
  156.     START0:
  157.             CLR    A               ;初始化,RAM从20H开始清零30H个字节
  158.             MOV    R0,#30H         ;初始化,RAM从20H开始清零30H个字节
  159.             MOV    R1,#20H         ;初始化,RAM从20H开始清零30H个字节
  160.     START1:
  161.             MOV    @R1,A           ;初始化,RAM从20H开始清零30H个字节
  162.             INC    R1              ;初始化,RAM从20H开始清零30H个字节
  163.             DJNZ   R0,START1       ;初始化,RAM从20H开始清零30H个字节
  164.             MOV    FWBZ1,#0C8H     ;初始化,放入复位判断标志1到RAM
  165.             MOV    FWBZ2,#0D9H     ;初始化,放入复位判断标志2到RAM
  166.             MOV    YSXY,#0FFH      ;初始化,放入结束“上电延时导通”的延时响应时间,4.2分钟
  167.             LCALL  SETINT          ;初始化,定时器设置(10毫秒产生一次中断)
  168.             LCALL  REEP            ;初始化,读EEPROM保存的各项设置,没有就设为默认值并保存
  169.     START2:
  170.             CLR    06H             ;位地址06H置为0,正常显示
  171.             MOV    DISPL,#0        ;设置要显示的目标,0=显示定时时间
  172.             LCALL  SKEY            ;扫描KEY
  173.             JC     START3          ;有按键动作(C=1)就转移
  174.             LCALL  Scan1           ;扫描编码器(有方向标志)
  175.             JNB    00H,START2      ;如果位地址00H为0(编码器没有转动)就转移
  176.             LCALL  BMQCL           ;调用编码器动作处理子程序
  177.             LJMP   START2
  178.     START3:
  179.             LCALL  AJDZCL          ;调用按键动作处理子程序
  180.             LJMP   START2
  181.     ;*********************************** 主程序结束 ***********************************
  182.     ;
  183.     ;----------------------------------------------------------------------------------------
  184.     ;子程序:编码器动作处理,实时调整定时时间
  185.     ;如果是用按键代替编码器,支持长按快速加减(需要把“长按快速加减使能常数”由080H改为081H)。
  186.     ;----------------------------------------------------------------------------------------
  187.     BMQCL:
  188.             MOV    A,#KSJJ        ;装入“长按快速加减使能常数”
  189.             CJNE   A,#081H,BMQCL5 ;如果不是“支持长按快速加减”就转移
  190.             MOV    SHMJS,#50      ;设置有效长按所需时长,50×10毫秒=500毫秒
  191.     BMQCL1:
  192.             MOV    A,SHMJS        ;装入(10)毫秒计数
  193.             JZ     BMQCL2         ;如果时长达到(为0)就转移
  194.             LCALL  Scan2          ;扫描编码器(无方向标志)
  195.             JB     00H,BMQCL1     ;动作未结束就转移
  196.             LCALL  DSSJZJ         ;动作结束,根据方向加/减定时时间
  197.             RET
  198.     BMQCL2:
  199.             LCALL  DSSJZJ       ;根据方向加/减定时时间
  200.             MOV    SHMJS,#13    ;加/减间隔时间,(×10)毫秒
  201.     BMQCL3:
  202.             MOV    A,SHMJS      ;装入(10)毫秒计数
  203.             JNZ    BMQCL4       ;时间未到(不为0)就转移
  204.             LJMP   BMQCL2       ;已达到设定的时长,转移,根据方向加/减定时时间
  205.     BMQCL4:
  206.             LCALL  DELAY10      ;延时10毫秒
  207.             LCALL  Scan2        ;扫描编码器(无方向标志)
  208.             JB     00H,BMQCL3   ;动作未结束就转移
  209.             LCALL  DELAY10      ;延时10毫秒
  210.             LCALL  Scan2        ;第2次扫描编码器(无方向标志)
  211.             JB     00H,BMQCL3   ;动作未结束就转移
  212.             LCALL  DELAY10      ;延时10毫秒
  213.             LCALL  Scan2        ;第3次扫描编码器(无方向标志)
  214.             JB     00H,BMQCL3   ;动作未结束就转移
  215.             RET                 ;动作结束,退出
  216.     BMQCL5:
  217.             MOV    MJS,#10      ;设置等待时间(秒)
  218.     BMQCL6:
  219.             LCALL  Scan2        ;扫描编码器(无方向标志)
  220.             JB     00H,BMQCL7   ;如果还没转到卡点位置就转移
  221.             LCALL  DSSJZJ       ;已经旋转到卡点位置,根据旋转方向增/减定时时间
  222.             RET
  223.     BMQCL7:
  224.             MOV    A,MJS        ;装入秒计数到寄存器A
  225.             CJNE   A,#7,BMQCL6  ;检查剩余时间,如果不是7(10秒-3秒=7)就转移,继续扫描
  226.             SETB   06H          ;达到3秒了,把位地址06H设置为1,数码管显示“--:--”
  227.             MOV    ZXM1,#0C0H   ;-
  228.             MOV    ZXM2,#0C0H   ;-
  229.             MOV    ZXM3,#0C0H   ;-
  230.             MOV    ZXM4,#0C0H   ;-
  231.             LCALL  DISP         ;显示“--:--”
  232.     BMQCL8:
  233.             LCALL  Scan2        ;扫描编码器(无方向标志)
  234.             MOV    A,MJS        ;装入秒计数到寄存器A
  235.             JZ     BMQCL9       ;如果秒计数为0(达到10秒)就转移
  236.             JB     00H,BMQCL8   ;如果还没转到卡点位置就转移,继续扫描
  237.             MOV    SMJSF,#0FFH  ;已经旋转到卡点位置,先放入一个数值,等退出后才恢复睡眠计时
  238.             LCALL  TZGXSZ       ;调用“调整各项设置”子程序
  239.             MOV    SMJSF,SMMS   ;睡眠模式
  240.             MOV    SMJSM,#0
  241.             RET
  242.     BMQCL9:
  243.             MOV    ZXM1,#0FFH   ;达到了10秒,显示3秒88:88
  244.             MOV    ZXM2,#0FFH   ;8
  245.             MOV    ZXM3,#0FFH   ;8
  246.             MOV    ZXM4,#0FFH   ;8
  247.             LCALL  DISP         ;显示
  248.             MOV    MJS,#3       ;显示3秒
  249.     BMQCL10:
  250.             MOV    A,MJS        ;装入秒计数到寄存器A
  251.             LCALL  WG           ;喂狗
  252.             JNZ    BMQCL10      ;等待MJS变为0秒
  253.             LCALL  SZMRZ        ;延时时间到,恢复各项默认设置
  254.             LCALL  WSET         ;保存设置
  255.     BMQCL11:
  256.             LCALL  Scan2        ;扫描编码器(无方向标志)
  257.             JB     00H,BMQCL11  ;如果还没转到卡点位置就继续扫描
  258.             LCALL  REEPR        ;把“导通时间”放入“定时时间”,从“导通”开始运行。
  259.             CLR    02H          ;位地址02H置为0(正常运行)
  260.             MOV    MJS,#2       ;延时2秒才退出
  261.     BMQCL12:
  262.             MOV    A,MJS        ;装入秒计数到寄存器A
  263.             LCALL  WG           ;喂狗
  264.             JNZ    BMQCL12
  265.             RET

  266.     ;-------------------------------------------------------------------------------------
  267.     ;子程序:根据编码器旋转方向加减定时时间
  268.     ;3小时及以下,按设置的值加减:1~30分钟
  269.     ;3小时以上每次增(减)30分钟;10小时以上每次增(减)1个小时;20小时以上每次增(减)2个小时
  270.     ;-------------------------------------------------------------------------------------
  271.     DSSJZJ:
  272.             MOV   DSSJM,#0       ;放入0到定时时间(秒)
  273.             MOV   DSSJHM,#99
  274.             CLR   05H
  275.             MOV   A,DSSJS        ;装入定时时间(时)
  276.             CJNE  A,#20,DSZJ1    ;当前“时”是否等于或大于20
  277.     DSZJ1:
  278.             JC    DSZJ2          ;小于就转移
  279.             MOV   DSZJ,#2        ;等于或大于20,加减2个小时
  280.             LJMP  DSZJ4
  281.     DSZJ2:
  282.             CJNE  A,#10,DSZJ3    ;当前“时”是否等于或大于10
  283.     DSZJ3:
  284.             JC    DSZJ8          ;小于就转移
  285.             MOV   DSZJ,#1        ;等于或大于10,加减1个小时
  286.     DSZJ4:
  287.             JNB   01H,DSZJ6      ;如果位地址01H为0(逆时针反转)就转移
  288.             ADD   A,DSZJ         ;是正转,加
  289.             CJNE  A,#100,DSZJ5   ;加完后是否等于或大于100
  290.     DSZJ5:
  291.             JC    DSZJ7          ;如果小于就转移,把A放回到DSSJS
  292.             MOV   DSSJS,#99      ;已经大于99了,直接设置为99:59:59+DSSJHM(1秒),100小时
  293.             MOV   DSSJF,#59      ;已经大于99了,直接设置为99:59:59+DSSJHM(1秒),100小时
  294.             MOV   DSSJM,#59      ;已经大于99了,直接设置为99:59:59+DSSJHM(1秒),100小时
  295.             RET
  296.     DSZJ6:
  297.             SUBB  A,DSZJ         ;是反转,减
  298.     DSZJ7:
  299.             MOV   DSSJS,A        ;把计算结果放入DSSJS
  300.             RET
  301.     DSZJ8:
  302.             MOV   DSZJ,BMQZJ     ;把设置的“增(减)值”放入DSZJ
  303.             CJNE  A,#3,DSZJ11    ;当前“时”不是3就转移
  304.             JB    01H,DSZJ12     ;是3,如果位地址01H为1(正转)就转移,把DSZJ处的“增(减)值”改为30(分钟)
  305.             MOV   A,DSSJF        ;是反转,装入定时时间(分)
  306.             JZ    DSZJ13         ;如果当前“分”为0(3:00)就转移,按设置的增(减)值减
  307.             CJNE  A,#30,DSZJ9    ;“分”不为0,是否等于或大于30
  308.     DSZJ9:
  309.             JC    DSZJ10         ;小于就转移,把0放入定时时间(分),使时间变为3:00
  310.             SUBB  A,#30          ;等于或大于,减30分
  311.             MOV   DSSJF,A        ;把计算结果放入定时时间(分)
  312.             RET
  313.     DSZJ10:
  314.             MOV   DSSJF,#0       ;小于30,把0放入定时时间(分),使时间变为3:00
  315.             RET
  316.     DSZJ11:
  317.             JC    DSZJ13         ;小于3就转移
  318.     DSZJ12:
  319.             MOV   DSZJ,#30       ;大于3:00,把DSZJ处的“增(减)值”改为30(分钟)
  320.     DSZJ13:
  321.             MOV   A,DSSJF        ;装入定时时间(分)
  322.             JNB   01H,DSZJ17     ;如果位地址01H为0(逆时针反转)就转移
  323.             ADD   A,DSZJ         ;是正转,当前“分”直接加DSZJ处的“增(减)值”
  324.             CJNE  A,#60,DSZJ14   ;加完后“分”是否等于或大于60
  325.     DSZJ14:
  326.             JC    DSZJ15         ;小于60就转移,把A放入定时时间(分)
  327.             SUBB  A,#60          ;等于或大于60,就减60,然后小时加1
  328.             MOV   DSSJF,A        ;把A放入定时时间(分)
  329.             MOV   A,DSSJS        ;装入“时”
  330.             INC   A              ;小时加1
  331.             MOV   DSSJS,A
  332.             CJNE  A,#3,DSZJ16    ;加完后“时”不是3就转移,退出
  333.             CLR   A              ;加完后大于3:00了,把0放入定时时间(分),使时间变为3:00
  334.     DSZJ15:
  335.             MOV   DSSJF,A
  336.     DSZJ16: RET
  337.     DSZJ17:
  338.             CJNE  A,DSZJ,DSZJ18 ;是逆时针反转,当前“分”是否等于或大于DSZJ处的“增(减)值”
  339.     DSZJ18:
  340.             JC    DSZJ19        ;小于就转移
  341.             SUBB  A,DSZJ        ;等于或大于,定时时间(分)减“增(减)值”
  342.             MOV   DSSJF,A       ;把计算结果放入定时时间(分)
  343.             RET
  344.     DSZJ19:
  345.             MOV   A,DSZJ        ;“分”小于“增(减)值”,装入DSZJ处的“增(减)值”
  346.             CLR   C             ;进位标志清0
  347.             SUBB  A,DSSJF       ;“增(减)值”减“定时时间(分)”
  348.             MOV   DSSJF,A       ;减完后的结果暂时放入DSSJF
  349.             MOV   A,#60
  350.             SUBB  A,DSSJF       ;60减上面的计算结果,得出定时时间(分),然后小时减1
  351.             MOV   DSSJF,A       ;得出的数放入定时时间(分)
  352.             MOV   A,DSSJS       ;装入定时时间(时)
  353.             JZ    DSSJQL        ;如果“时”为0就转移
  354.             DEC   DSSJS         ;“时”不为0,减1
  355.             RET
  356.     DSSJQL:
  357.             MOV   DSSJF,#0      ;把“分”置为0
  358.             MOV   DSSJHM,#0
  359.             RET

  360.     ;-------------------------------------------------------------------------------------
  361.     ;子程序:按键动作处理
  362.     ;短按1次暂停计时;短按2次当前项时间(当次)清零;短按3次重新启动,相当于重新上电。
  363.     ;长按3秒显示“--:--”时释放,进入“设置”;长按10秒,恢复默认设置,显示88:88。
  364.     ;
  365.     ;启用“上电延时导通”,“延时导通模式”为2时,上电4.2分钟内按键失效,4.2分钟之后
  366.     ;按键只有时间清零功能,持续按下按键的时间达到设置的时长(0~99秒)就清零,清零后
  367.     ;继续执行下一项,执行到“导通”状态运行结束时,按键功能恢复正常。
  368.     ;-------------------------------------------------------------------------------------
  369.     AJDZCL:
  370.             JB     08H,JSYSDT2  ;位地址08H为1就转移,不响应按键动作。
  371.             MOV    A,DQZT       ;装入“当前状态”,0=导通、1=断开,2=上电延时导通
  372.             CJNE   A,#2,KEY0    ;不是“上电延时导通”状态就转移
  373.             MOV    A,YSMS       ;装入“延时导通模式”
  374.             CJNE   A,#2,KEY0    ;不是2(延时时间到后从“断开”继续运行)就转移
  375.             MOV    A,YSXY       ;装入“延时响应”
  376.             JNZ    JSYSDT2      ;延时响应时间未到就转移退出
  377.             MOV    MJS,YSJS     ;把设置的“按下持续时间”秒计数放入MJS
  378.     JSYSDT1:
  379.             MOV    A,MJS
  380.             JNZ    JSYSDT3      ;等待秒计数为0
  381.             MOV    DSSJS,A      ;持续按下的时间到,定时时间(时)清零
  382.             MOV    DSSJF,A      ;持续按下的时间到,定时时间(分)清零
  383.             MOV    DSSJM,A      ;持续按下的时间到,定时时间(秒)清零
  384.             MOV    DSSJHM,A     ;持续按下的时间到,定时时间(毫秒)清零
  385.             LCALL  KEYEX        ;等待按键释放
  386.             SETB   08H          ;位地址08H置为1,不响应按键动作。
  387.     JSYSDT2:
  388.             RET
  389.     JSYSDT3:
  390.             LCALL  SKEY0
  391.             JC     JSYSDT1      ;如果C=1(按键还没释放),就继续扫描等待
  392.             RET
  393.     KEY0:
  394.             MOV    MJS,#10      ;放入等待时间,10秒
  395.     KEY1:
  396.             MOV    A,MJS        ;装入等待时间
  397.             CJNE   A,#7,KEY5    ;按下未达到3秒(10-3=7)就转移
  398.             SETB   06H          ;到3秒了,把位地址06H设置为1,数码管显示“--:--”
  399.             MOV    ZXM1,#0C0H   ;-
  400.             MOV    ZXM2,#0C0H   ;-
  401.             MOV    ZXM3,#0C0H   ;-
  402.             MOV    ZXM4,#0C0H   ;-
  403.             LCALL  DISP         ;显示“--:--”
  404.     KEY2:
  405.             MOV    A,MJS        ;装入等待时间
  406.             JZ     KEY3         ;如果为0(长按达到了10秒)就转移
  407.             LCALL  SKEY         ;扫描按键
  408.             JC     KEY2         ;如果C=1(按键还没释放),就继续扫描
  409.             MOV    SMJSF,#0FFH  ;先放入一个数值,等退出后才恢复睡眠计时
  410.             LCALL  TZGXSZ       ;调用“调整各项设置”子程序
  411.             MOV    SMJSF,SMMS   ;睡眠模式
  412.             MOV    SMJSM,#0     ;
  413.             RET
  414.     KEY3:
  415.             MOV    ZXM1,#0FFH  ;达到了10秒,显示3秒88:88
  416.             MOV    ZXM2,#0FFH  ;8
  417.             MOV    ZXM3,#0FFH  ;8
  418.             MOV    ZXM4,#0FFH  ;8
  419.             LCALL  DISP        ;显示
  420.             MOV    MJS,#3      ;显示3秒
  421.     KEY4:
  422.             MOV    A,MJS       ;显示3秒
  423.             LCALL  WG          ;喂狗
  424.             JNZ    KEY4        ;等待MJS为0秒
  425.             LCALL  SZMRZ       ;延时时间到,恢复各项默认设置
  426.             LCALL  WSET        ;保存设置
  427.             LCALL  KEYEX       ;等待按键释放
  428.             LCALL  REEPR       ;把“导通时间”放入“定时时间”,从“导通”开始运行。
  429.             CLR    02H         ;位地址02H置为0(正常运行)
  430.             RET
  431.     KEY5:
  432.             LCALL  SKEY       ;扫描按键
  433.             JC     KEY1       ;如果C=1(按键还没释放),就继续扫描
  434.             MOV    A,DSSJHM   ;装入定时时间(毫秒)到寄存器A
  435.             JNZ    KEY6       ;不是0就转移
  436.             MOV    A,DSSJM    ;装入定时时间(秒)到寄存器A
  437.             JNZ    KEY6       ;不是0就转移
  438.             MOV    A,DSSJF    ;装入定时时间(分)到寄存器A
  439.             JNZ    KEY6       ;不是0就转移
  440.             MOV    A,DSSJS    ;装入定时时间(时)到寄存器A
  441.             JNZ    KEY6       ;不是0就转移
  442.             CLR    02H        ;定时时间为0,位地址02H置为0(正常)
  443.             LJMP   KEY7
  444.     KEY6:
  445.             CPL    02H        ;位地址02H取反,暂停/正常切换
  446.     KEY7:
  447.             LCALL  KEYA       ;第1次按键释放了,再次扫描按键500毫秒
  448.             JZ     KEY8       ;如果500毫秒内有按键动作就转移
  449.             RET
  450.     KEY8:
  451.             LCALL  KEYEX      ;有按键动作,等待第2次按键释放
  452.             LCALL  KEYA       ;按键释放了,扫描按键500毫秒
  453.             JZ     KEY9       ;如果500毫秒内有按键动作就转移
  454.             MOV    DSSJS,#0   ;没有按键动作,按了2次,把当前时间清零
  455.             MOV    DSSJF,#0   ;把当前时间清零
  456.             MOV    DSSJM,#0   ;把当前时间清零
  457.             MOV    DSSJHM,#0  ;把当前时间清零
  458.             CLR    02H        ;位地址02H置为0(正常)
  459.             RET
  460.     KEY9:
  461.             LCALL  KEYEX      ;等待第3次按键释放
  462.             CLR    EA         ;关闭全局中断
  463.             INC    FWBZ1      ;加1,改变复位判断标志1
  464.             LJMP   START      ;跳转到START,重新初始化

  465.     ;------------------------------------------------------------------
  466.     ;子程序:调整各项设置值
  467.     ;短按2次KEY保存并退出,或在最后一项无操作自动保存退出。
  468.     ;闪烁5秒无操作或者短按KEY释放0.5秒后,跳到下一项设置。
  469.     ;按住KEY不放,旋转编码器可向上/下跳到任意一项设置
  470.     ;如果是用按键代替编码器,支持长按快速加/减
  471.     ;------------------------------------------------------------------
  472.     TZGXSZ:
  473.             CLR    06H            ;位地址06H置为0,正常显示
  474.             MOV    DISPL,#1       ;第一项,导通时间(时),0~99小时
  475.     SZTZ:
  476.             MOV    MJS,#7         ;放入无操作等待时间(秒)到MJS
  477.             CLR    03H            ;位地址03H置为0,允许检查剩余时间
  478.     SZTZ1:
  479.             LCALL  SKEY0          ;扫描按键
  480.             JNC    SZTZ7          ;没有按键动作(C=0)就转移
  481.             CLR    04H            ;已经按下,把位地址04H置为0,不闪烁显示
  482.     SZTZ2:        
  483.             LCALL  Scan10         ;扫描编码器(有方向标志)
  484.             JB     00H,SZTZ4      ;如果编码器有旋转动作(位地址00H为1)就转移
  485.             LCALL  SKEY0          ;扫描按键
  486.             JC     SZTZ2          ;按键未释放(C=1)就转移
  487.             LCALL  KEYA           ;释放了,再次扫描按键500毫秒
  488.             JNZ    SZTZ3          ;没有第2次按键动作就转移
  489.             LCALL  WSET           ;已经第2次按下,保存设置
  490.             LCALL  KEYEX          ;等待按键释放
  491.             RET
  492.     SZTZ3:
  493.             SETB   01H            ;把位地址01H置为1,顺时针正转(切换到下一项)
  494.             LCALL  QHXM           ;根据位地址01H的方向,切换到上/下一项
  495.             LJMP   SZTZ
  496.     SZTZ4:
  497.             LCALL  QHXM           ;根据位地址01H的方向,切换到上/下一项
  498.     SZTZ5:
  499.             LCALL  Scan20         ;扫描编码器(无方向标志)
  500.             JB     00H,SZTZ5      ;编码器动作未结束就继续扫描,等待
  501.     SZTZ6:
  502.             LCALL  SKEY0          ;扫描按键
  503.             JNC    SZTZ           ;按键释放(C=0)就转移
  504.             LCALL  Scan10         ;扫描编码器(有方向标志)
  505.             JB     00H,SZTZ4      ;编码器有动作(位地址00H为1)就转移,切换到上/下一项
  506.             LJMP   SZTZ6
  507.     SZTZ7:
  508.             LCALL  Scan10         ;扫描编码器(有方向标志)
  509.             JB     00H,SZTZ9      ;如果编码器有旋转动作(位地址00H为1)就转移
  510.             MOV    A,MJS          ;没有转动,装入秒计数到寄存器A
  511.             JZ     SZTZ8          ;如果秒计数为0(等待时间到)就转移
  512.             JB     03H,SZTZ1      ;不为0,如果位地址03H为1就转移,不检查剩余时间
  513.             CJNE   A,#5,SZTZ1     ;检查剩余时间,不到就转移,继续扫描编码器
  514.             SETB   04H            ;把位地址04H置为1,设置为闪烁显示
  515.             SETB   03H            ;位地址03H置为1,禁止检查剩余时间
  516.             LJMP   SZTZ1
  517.     SZTZ8:
  518.             CLR    04H            ;等待时间到,把位地址04H置为0,不闪烁显示
  519.             MOV    A,DISPL        ;装入当前目标项
  520.             CJNE   A,#17,SZTZ3    ;不是最后一项就转移,跳到下一项
  521.             LCALL  WSET           ;保存设置
  522.             RET
  523.     SZTZ9:
  524.             CLR    04H            ;编码器已经转动,把位地址04H置为0,不闪烁显示
  525.             MOV    SHMJS,#50      ;设置有效长按所需时长,50×10毫秒=500毫秒
  526.     SZTZ10:
  527.             MOV    A,SHMJS        ;装入(10)毫秒计数
  528.             JZ     SZTZ11         ;如果时长达到(为0)就转移
  529.             LCALL  Scan20         ;扫描编码器(无方向标志)
  530.             JB     00H,SZTZ10     ;动作未结束就转移,继续扫描
  531.             LCALL  MBSZ           ;动作结束了,调整DISPL指向的对象,加/减1
  532.             LJMP   SZTZ
  533.     SZTZ11:
  534.             LCALL  MBSZ           ;加/减1。已经为有效长按,下面进入长按快速加/减
  535.             MOV    SHMJS,#13      ;间隔加/减时间,(×10)毫秒
  536.     SZTZ12:
  537.             MOV    A,SHMJS        ;装入(10)毫秒计数
  538.             JNZ    SZTZ13         ;时间未到(不为0)就转移
  539.             LJMP   SZTZ11         ;已达到设定的间隔时长,转移,加/减1
  540.     SZTZ13:
  541.             LCALL  DELAY10        ;延时10毫秒
  542.             LCALL  Scan20         ;扫描编码器(无方向标志)
  543.             JB     00H,SZTZ12     ;动作未结束就转移
  544.             LCALL  DELAY10        ;延时10毫秒
  545.             LCALL  Scan20         ;第2次扫描编码器(无方向标志)
  546.             JB     00H,SZTZ12     ;动作未结束就转移
  547.             LCALL  DELAY10        ;延时10毫秒
  548.             LCALL  Scan20         ;第3次扫描编码器(无方向标志)
  549.             JB     00H,SZTZ12     ;动作未结束就转移
  550.             LJMP   SZTZ           ;动作结束
  551.     MBSZ:
  552.             MOV    A,DISPL        ;装入要调整的目标项
  553.             LCALL  SXXFW          ;设置上下限限值
  554.             DEC    A              ;减1
  555.             ADD    A,#DTS         ;加上各项设置的起始地址
  556.             MOV    R0,A           ;把得出的目标项地址放入R0
  557.             JB     01H,MBSZ2      ;如果位地址01H为1(顺时针正转)就转移
  558.             INC    XXSZ           ;是反转,下限值先加1
  559.             MOV    A,@R0          ;装入R0指向的目标数值
  560.             CJNE   A,XXSZ,MBSZ0   ;与加1后的下限值比较
  561.     MBSZ0:
  562.             JC     MBSZ1          ;如果小于“下限值+1”(不够减)就转移
  563.             DEC    @R0            ;等于或大于下限值,目标数值减1
  564.             DEC    XXSZ           ;减1,恢复下限值
  565.             RET
  566.     MBSZ1:
  567.             DEC    XXSZ           ;减1,恢复下限值
  568.             MOV    @R0,XXSZ       ;不够减了,直接放入下限值
  569.             RET
  570.     MBSZ2:
  571.             MOV    A,@R0          ;是正转,装入R0指向的RAM地址的目标数值
  572.             INC    A              ;加1
  573.             CJNE   A,SXSZ,MBSZ3   ;加完后与上限数值比较
  574.     MBSZ3:
  575.             JC     MBSZ4          ;如果小于就转移
  576.             MOV    @R0,SXSZ       ;等于或大于上限值,直接放入上限值
  577.             RET
  578.     MBSZ4:
  579.             MOV    @R0,A          ;小于上限值,把计算结果放回去
  580.             RET

  581.     ;-------------------------------------------------------------------------
  582.     ;子程序:切换项目。根据位地址01H的方向标志,把当前设置项切换到上/下一项
  583.     ;-------------------------------------------------------------------------
  584.     QHXM:
  585.             MOV   A,DISPL     ;装入当前项目号
  586.             JB    01H,QHXM2   ;如果位地址01H为1(正转)就转移,切换到下一项
  587.             CJNE  A,#1,QHXM1  ;是反转,如果不是1就转移
  588.             MOV   DISPL,#17   ;切换到上一项17
  589.             RET
  590.     QHXM1:
  591.             DEC   DISPL       ;减1,切换到上一项
  592.             RET
  593.     QHXM2:
  594.             CJNE  A,#17,QHXM3 ;是正转,如果不是17就转移
  595.             MOV   DISPL,#1    ;切换到下一项1
  596.             RET
  597.     QHXM3:
  598.             INC   DISPL       ;加1,切换到下一项
  599.             RET

  600.     ;-------------------------------------------------------------------------
  601.     ;子程序:根据当前项目号设置加/减调整的上下限值。入口参数:A=项目号。
  602.     ;-------------------------------------------------------------------------
  603.     SXXFW:
  604.             CJNE  A,#1,SXXFW1    ;1=显示“1A”设置导通时间(时),0~99小时
  605.             MOV   XXSZ,#0        ;下限为0
  606.             MOV   SXSZ,#99       ;上限为99
  607.             RET
  608.     SXXFW1:
  609.             CJNE  A,#2,SXXFW2    ;2=显示“1b”设置导通时间(分),0~59分钟
  610.             MOV   XXSZ,#0        ;下限为0
  611.             MOV   SXSZ,#59       ;上限为59
  612.             RET
  613.     SXXFW2:
  614.             CJNE  A,#3,SXXFW3    ;3=显示“1C”设置导通时间(秒),0~59秒
  615.             MOV   XXSZ,#0        ;下限为0
  616.             MOV   SXSZ,#59       ;上限为59
  617.             RET
  618.     SXXFW3:
  619.             CJNE  A,#4,SXXFW4    ;4=显示“1d”设置导通时间(×10毫秒),0~99
  620.             MOV   XXSZ,#0        ;下限为0
  621.             MOV   SXSZ,#99       ;上限为99
  622.             RET
  623.     SXXFW4:
  624.             CJNE  A,#5,SXXFW5    ;5=显示“o-”设置循环定时,0~99
  625.             MOV   XXSZ,#0        ;下限为0
  626.             MOV   SXSZ,#99       ;上限为99
  627.             RET
  628.     SXXFW5:
  629.             CJNE  A,#6,SXXFW6    ;6=显示“C-”设置睡眠模式,0~59
  630.             MOV   XXSZ,#0        ;下限为0
  631.             MOV   SXSZ,#59       ;上限为59
  632.             RET
  633.     SXXFW6:
  634.             CJNE  A,#7,SXXFW7    ;7=显示“bC”设置实时调整时的增/减值(步长):1~30分钟
  635.             MOV   XXSZ,#1        ;下限为1
  636.             MOV   SXSZ,#30       ;上限为30
  637.             RET
  638.     SXXFW7:
  639.             CJNE  A,#8,SXXFW8    ;8=显示“Ld”设置数码管亮度,1~8级。
  640.             MOV   XXSZ,#1        ;下限为1
  641.             MOV   SXSZ,#8        ;上限为8
  642.             RET
  643.     SXXFW8:
  644.             CJNE  A,#9,SXXFW9    ;9=显示“2A”设置断开时间(时),0~99小时
  645.             MOV   XXSZ,#0        ;下限为0
  646.             MOV   SXSZ,#99       ;上限为99
  647.             RET
  648.     SXXFW9:
  649.             CJNE  A,#10,SXXFW10  ;10=显示“2b”设置断开时间(分),0~59分钟
  650.             MOV   XXSZ,#0        ;下限为0
  651.             MOV   SXSZ,#59       ;上限为59
  652.             RET
  653.     SXXFW10:
  654.             CJNE  A,#11,SXXFW11  ;11=显示“2C”设置断开时间(秒),0~59秒
  655.             MOV   XXSZ,#0        ;下限为0
  656.             MOV   SXSZ,#59       ;上限为59
  657.             RET
  658.     SXXFW11:
  659.             CJNE  A,#12,SXXFW12  ;12=显示“2d”设置断开时间(×10毫秒),0~99
  660.             MOV   XXSZ,#0        ;下限为0
  661.             MOV   SXSZ,#99       ;上限为99
  662.             RET
  663.     SXXFW12:
  664.             CJNE  A,#13,SXXFW13  ;13=显示“3A”设置上电延时导通(时),0~99小时
  665.             MOV   XXSZ,#0        ;下限为0
  666.             MOV   SXSZ,#99       ;上限为99
  667.             RET
  668.     SXXFW13:
  669.             CJNE  A,#14,SXXFW14  ;14=显示“3b”设置上电延时导通(分),0~59分钟
  670.             MOV   XXSZ,#0        ;下限为0
  671.             MOV   SXSZ,#59       ;上限为59
  672.             RET
  673.     SXXFW14:
  674.             CJNE  A,#15,SXXFW15  ;15=显示“3C”设置上电延时导通(秒),0~59秒
  675.             MOV   XXSZ,#0        ;下限为0
  676.             MOV   SXSZ,#59       ;上限为59
  677.             RET
  678.     SXXFW15:
  679.             CJNE  A,#16,SXXFW16  ;16=显示“d-”设置延时导通模式,0~2。默认为0
  680.             MOV   XXSZ,#0        ;下限为0
  681.             MOV   SXSZ,#2        ;上限为2
  682.             RET
  683.     SXXFW16:                     ;17=显示“E-”设置“持续按下时间”秒计数0~99
  684.             MOV   XXSZ,#0        ;下限为0
  685.             MOV   SXSZ,#99       ;上限为99
  686.             RET

  687.     ;----------------------------------------------------------------------------------------
  688.     ;子程序:扫描编码器是否有旋转动作并设置好方向标志
  689.     ;出口参数:位地址第00位=1已经转动,=0没有转动;位地址第01位=1顺时针正转,=0逆时针反转
  690.     ;----------------------------------------------------------------------------------------
  691.     Scan1:
  692.             LCALL  Scan10        ;扫描编码器
  693.             JNB    00H,Scan1E    ;如果没有旋转动作就转移退出
  694.             LCALL  SMCL          ;有旋转动作,调用睡眠处理子程序
  695.             JZ     Scan1E        ;如果是0(从睡眠状态唤醒)就转移,下次才退出“始终导通”状态
  696.             LCALL  TCSZDT        ;退出上电延时导通的“始终导通”状态
  697.     Scan1E: RET
  698.     Scan10:
  699.             LCALL  WG            ;喂狗
  700.             SETB   EC11A         ;拉高编码器A引脚电平
  701.             SETB   EC11B         ;拉高编码器B引脚电平
  702.             JNB    EC11A,Scan11  ;如果为0(低电平)就转移,编码器有旋转动作,顺时针正转
  703.             JNB    EC11B,Scan12  ;如果为0(低电平)就转移,编码器有旋转动作,逆时针反转
  704.             CLR    00H           ;没有旋转动作,把位地址00H置为0
  705.             RET
  706.     Scan11:
  707.             SETB   01H           ;顺时针正转,把位地址01H置为1
  708.             SETB   00H           ;有旋转动作,把位地址00H置为1
  709.             RET  
  710.     Scan12:
  711.             CLR    01H           ;逆时针反转,把位地址01H置为0
  712.             SETB   00H           ;有旋转动作,把位地址00H置为1
  713.     Scan13: RET

  714.     ;-----------------------------------------------------------
  715.     ;子程序:扫描编码器是否有旋转动作,不设置方向标志
  716.     ;出口参数:位地址第0位=1已经转动,=0没有转动
  717.     ;-----------------------------------------------------------
  718.     Scan2:
  719.             LCALL  Scan20        ;扫描编码器
  720.             JNB    00H,Scan2E    ;如果没有旋转动作就转移退出
  721.             LCALL  SMCL          ;有旋转动作,调用睡眠处理子程序
  722.             JZ     Scan2E        ;如果是0(从睡眠状态唤醒)就转移,下次才退出“始终导通”状态
  723.             LCALL  TCSZDT        ;退出上电延时导通的“始终导通”状态
  724.     Scan2E: RET
  725.     Scan20:
  726.             LCALL  WG            ;喂狗
  727.             SETB   EC11A         ;拉高编码器A引脚电平
  728.             SETB   EC11B         ;拉高编码器B引脚电平
  729.             JNB    EC11A,Scan21  ;如果为0(低电平)就转移,编码器有旋转动作
  730.             JNB    EC11B,Scan21  ;如果为0(低电平)就转移,编码器有旋转动作
  731.             CLR    00H           ;没有旋转动作,把位地址00H置为0
  732.             RET
  733.     Scan21:
  734.             SETB   00H           ;有旋转动作,把位地址00H置为1
  735.     Scan22: RET

  736.     ;-----------------------------------------------------------
  737.     ;子程序:扫描按键,未按C=0,已按下C=1
  738.     ;-----------------------------------------------------------
  739.     SKEY:
  740.             LCALL  SKEY0      ;扫描按键
  741.             JNC    SKEYE      ;如果没有按键动作(C为0)就转移退出
  742.             LCALL  SMCL       ;有按键动作,调用睡眠处理子程序
  743.             JZ     SKEYE      ;如果是0(从睡眠状态唤醒)就转移,下次才退出“始终导通”状态
  744.             LCALL  TCSZDT     ;退出上电延时导通的“始终导通”状态
  745.     SKEYE:  RET
  746.     SKEY0:
  747.             LCALL  WG         ;喂狗
  748.             SETB   KEY        ;按键端口置为高电平
  749.             JNB    KEY,SKEY1  ;为0(低电平)就转移,表示按键已经被按下
  750.             CLR    C          ;C置为0,没有按键动作
  751.             RET
  752.     SKEY1:
  753.             LCALL  DELAY10    ;延时10毫秒
  754.             LCALL  DELAY10    ;延时10毫秒
  755.             SETB   KEY        ;延时结束后再次把按键端口置为高电平
  756.             JNB    KEY,SKEY2  ;为0(低电平,按键被有效按下)就转移
  757.             CLR    C          ;C置为0,没有按键动作
  758.             RET               ;按键未被有效按下,退出
  759.     SKEY2:
  760.             SETB   C          ;C置为1,按键已有效按下
  761.             RET

  762.     ;------------------ 扫描按键500毫秒,有按键动作A=0,无按键动作A=1 ------------------
  763.     KEYA:
  764.             MOV    SHMJS,#50  ;等待500毫秒
  765.     KEYB:
  766.             MOV    A,SHMJS    ;装入(10)毫秒计数
  767.             JZ     KEYC       ;为0(时间到)就转移
  768.             LCALL  SKEY0      ;扫描按键
  769.             JNC    KEYB       ;没有按键动作(C=0)就转移
  770.             CLR    A          ;有按键动作A=0
  771.             RET
  772.     KEYC:
  773.             MOV    A,#1       ;等待时间已到,A=1没有按键动作
  774.             RET

  775.     ;------------------ 等待按键释放 ------------------
  776.     KEYEX:        
  777.             LCALL  SKEY0      ;扫描按键
  778.             JC     KEYEX      ;如果C=1(按键还没释放)就继续扫描
  779.             RET

  780.     ;------------------ 延时10毫秒 ------------------
  781.     DELAY10:   ;@11.0592MHz
  782.             NOP
  783.             NOP
  784.             NOP
  785.             PUSH   16H
  786.             PUSH   17H
  787.             MOV    16H,#87
  788.             MOV    17H,#10
  789.     NEXT:
  790.             DJNZ   17H,NEXT
  791.             DJNZ   16H,NEXT
  792.             POP    17H
  793.             POP    16H
  794.             RET

  795.     ;-----------------------------------------------------------------------------------
  796.     ;子程序:睡眠模式处理,如果当前处于睡眠状态就重新放入睡眠倒计时,恢复显示,等待
  797.     ;编码器或按键动作结束并延时2秒才退出;如果不是睡眠状态,重新放入睡眠计时,返回
  798.     ;出口参数:A=0从睡眠状态唤醒
  799.     ;-----------------------------------------------------------------------------------
  800. 源程序后半部分在下面2楼
复制代码
源程序后半部分在下面2楼

压缩文件的内容:
压缩文件的内容.png
用STC15F104W制作定时IC.rar (4.65 MB, 下载次数: 375)

打赏

参与人数 17家元 +355 收起 理由
hxjxyz + 20 膜拜汇编大佬
hefanghua + 15 厉害!向楼主学习
zzy_85569381 + 20 謝謝分享
hzmsn + 20 優秀文章
geek云中漫步 + 10 謝謝分享
kkdkj + 20 謝謝分享
ch104517745 + 20
gdszyrx + 20 謝謝分享
海洋dz + 50 謝謝分享
aec + 20 謝謝分享

查看全部打赏

本帖被以下淘专辑推荐:

 楼主| 发表于 2021-1-19 09:56:31 | 显示全部楼层
本帖最后由 杨小强 于 2021-1-19 13:33 编辑

源程序后半部分:
  1.     ;-----------------------------------------------------------------------------------
  2.     ;子程序:睡眠模式处理,如果当前处于睡眠状态就重新放入睡眠倒计时,恢复显示,等待
  3.     ;编码器或按键动作结束并延时2秒才退出;如果不是睡眠状态,重新放入睡眠计时,返回
  4.     ;出口参数:A=0从睡眠状态唤醒
  5.     ;-----------------------------------------------------------------------------------
  6.     SMCL:
  7.             MOV    A,SMMS       ;装入睡眠模式设置值
  8.             JNZ    SMCL1        ;不为0就转移
  9.             INC    A            ;为0,加1,使返回时A不为0
  10.             RET                 ;当前睡眠模式为“始终显示”,返回
  11.     SMCL1:
  12.             MOV    A,SMJSF      ;装入睡眠计时(分)
  13.             JNZ    SMCL2        ;不为0就转移
  14.             MOV    A,SMJSM      ;装入睡眠计时(秒)
  15.             JZ     SMCL3        ;是0就转移
  16.     SMCL2:
  17.             MOV    SMJSF,SMMS   ;不为0,还没进入睡眠状态,重新放入倒计时
  18.             MOV    SMJSM,#0     ;不为0,还没进入睡眠状态,重新放入倒计时
  19.             RET
  20.     SMCL3:
  21.             MOV    SMJSF,SMMS   ;已进入睡眠状态,重新放入倒计时,唤醒睡眠,恢复显示
  22.             MOV    SMJSM,#0     ;已进入睡眠状态,重新放入倒计时,唤醒睡眠,恢复显示
  23.             INC    XSHC1        ;改变XSHC1数据,触发“立即显示”
  24.     SMCL4:
  25.             MOV    SMJS,#2      ;放入秒计时
  26.     SMCL5:
  27.             LCALL  WG           ;喂狗
  28.             SETB   KEY          ;按键端口置为高电平
  29.             SETB   EC11A        ;编码器A引脚置为高电平
  30.             SETB   EC11B        ;编码器B引脚置为高电平
  31.             JNB    KEY,SMCL4    ;为0(低电平)未释放就转移
  32.             JNB    EC11A,SMCL4  ;为0(低电平)未释放就转移
  33.             JNB    EC11B,SMCL4  ;为0(低电平)未释放就转移
  34.             MOV    A,SMJS       ;装入计时
  35.             JNZ    SMCL5        ;不为0就转移继续扫描按键和编码器
  36.             CLR    C            ;C置为0,没有按键动作
  37.             CLR    00H          ;把位地址00H置为0,没有旋转动作
  38.             RET

  39.     ;-------------------------------------------------------------------------------------
  40.     ;子程序:退出始终导通状态处理。当进入“延时时间到后始终导通”状态时,按键、编码器有
  41.     ;动作就退出始终导通状态,切换到“导通时间”的结束(断开)状态,如设置为循环定时,就转
  42.     ;换到“断开时间”继续运行。
  43.     ;-------------------------------------------------------------------------------------
  44.     TCSZDT:
  45.             JB     07H,TC1   ;如果为1(已进入“上电延时导通”的始终导通状态)就转移
  46.             RET
  47.     TC1:
  48.             MOV    A,XHDS    ;装入“循环定时”设置
  49.             CJNE   A,#1,TC2  ;不是1(不循环)就转移
  50.             MOV    DQZT,#0   ;把当前状态切换到“导通”
  51.             CLR    07H       ;位地址07H置为0(正常)
  52.             LCALL  SMCL4     ;等待编码器或按键动作结束后延时2秒才退出
  53.             RET
  54.     TC2:
  55.             MOV    DQZT,#1      ;把当前状态设为1,从“断开时间”继续运行
  56.             MOV    DSSJS,DKS    ;装入“断开时间”
  57.             MOV    DSSJF,DKF    ;装入“断开时间”
  58.             MOV    DSSJM,DKM    ;装入“断开时间”
  59.             MOV    DSSJHM,DKHM  ;装入“断开时间”
  60.             CLR    07H          ;位地址07H置为0(正常)
  61.             LCALL  SMCL4        ;等待编码器或按键动作结束后延时2秒才退出
  62.             RET

  63.     ;------------------------------------------------------------------------
  64.     ;子程序:T0中断调用,时间计数及倒计时处理、状态切换
  65.     ;------------------------------------------------------------------------
  66.     TIME:
  67.             LCALL  TIME6          ;部分时间计数及倒计时处理
  68.             JB     02H,TIME1      ;如果位地址02H为1(暂停)就转移退出,停止计时
  69.             MOV    A,DSSJHM       ;装入定时时间(10)毫秒计数
  70.             JZ     TIME2          ;如果是0就转移
  71.             DEC    A              ;DSSJHM不是0,减1
  72.             MOV    DSSJHM,A       ;DSSJHM不是0,减1
  73.             JNZ    TIME1          ;减1后不为0就转移退出
  74.             MOV    A,DSSJM        ;装入定时时间(秒)到寄存器A
  75.             JNZ    TIME1          ;如果(秒)不是0就转移退出
  76.             MOV    A,DSSJF        ;装入定时时间(分)到寄存器A
  77.             JNZ    TIME1          ;如果(分)不是0就转移退出
  78.             MOV    A,DSSJS        ;装入定时时间(时)到寄存器A
  79.             JNZ    TIME1          ;如果(时)不是0就转移退出
  80.             LCALL  ZTQH           ;时、分、秒都是0了,状态切换
  81.     TIME1:  RET
  82.     TIME2:
  83.             MOV    A,DSSJM        ;装入定时时间(秒)到寄存器A
  84.             JZ     TIME3          ;如果是0就转移
  85.             DEC    DSSJM          ;不是0,减1秒
  86.             MOV    DSSJHM,#99     ;重新放入(10)毫秒计数值
  87.             MOV    HMJS,#99       ;重新放入(10)毫秒计数值,使DSSJHM与HMJS同步
  88.             RET
  89.     TIME3:
  90.             MOV    A,DSSJF        ;装入定时时间(分)到寄存器A
  91.             JZ     TIME4          ;如果是0就转移
  92.             DEC    DSSJF          ;不是0,减1分
  93.             MOV    DSSJM,#59      ;把59放入定时时间(秒)
  94.             MOV    DSSJHM,#99     ;重新放入(10)毫秒计数值
  95.             MOV    HMJS,#99       ;重新放入(10)毫秒计数值
  96.             RET
  97.     TIME4:
  98.             MOV    A,DSSJS        ;装入定时时间(时)到寄存器A
  99.             JNZ    TIME5          ;不是0就转移
  100.             LCALL  ZTQH           ;状态切换
  101.             RET
  102.     TIME5:        
  103.             DEC    DSSJS          ;不是0,小时减1
  104.             MOV    DSSJM,#59      ;把59放入定时时间(秒)
  105.             MOV    DSSJF,#59      ;把59放入定时时间(分)
  106.             MOV    DSSJHM,#99     ;重新放入(10)毫秒计数值
  107.             MOV    HMJS,#99       ;重新放入(10)毫秒计数值
  108.             RET
  109.     TIME6:
  110.             MOV    A,SHMJS        ;装入(10)毫秒计数
  111.             JZ     TIME7          ;如果是0就转移
  112.             DEC    SHMJS          ;每10毫秒减1,直到为0
  113.     TIME7:
  114.             MOV    A,HMJS         ;装入(10)毫秒计数2
  115.             JZ     TIME9          ;如果是0就转移
  116.             DEC    HMJS           ;不是0,减1
  117.             CJNE   A,#50,TIME8    ;如果不是50就转移退出
  118.             SETB   05H            ;位地址第05位置为1,数字及冒号闪烁时用,每0.5秒变化一次
  119.     TIME8:  RET
  120.     TIME9:
  121.             CLR    05H            ;位地址第05位置为0,数字及冒号闪烁时用,每0.5秒变化一次
  122.             MOV    HMJS,#99       ;重新放入计数值(1秒)
  123.             MOV    A,MJS          ;装入秒计数
  124.             JZ     TIME10         ;如果是0就转移
  125.             DEC    MJS            ;每秒减1,直到为0
  126.     TIME10:
  127.             MOV    A,YSXY         ;装入“延时响应”秒计数
  128.             JZ     TIME11         ;如果是0就转移
  129.             DEC    YSXY           ;每秒减1,直到为0
  130.     TIME11:
  131.             JNB     09H,TIME12    ;位地址09H不为1(允许恢复响应按键动作)就转移
  132.             JNB     08H,TIME12    ;位地址08H不为1(禁止响应按键动作)就转移
  133.             SETB    KEY           ;按键端口置为高电平
  134.             JNB     KEY,TIME12    ;为0(低电平,按键为按下状态)就转移
  135.             CLR     08H           ;位地址08H置为0(恢复响应按键动作)
  136.             CLR     09H           ;位地址09H置为0(正常)
  137.     TIME12:
  138.             MOV     A,SMJS        ;装入睡眠模式处理计时
  139.             JZ      TIME13        ;如果是0就转移
  140.             DEC     SMJS          ;不是0,减1秒
  141.     TIME13:        
  142.             MOV     A,SMJSM       ;装入睡眠倒计时(秒)
  143.             JZ      TIME14        ;如果是0就转移
  144.             DEC     SMJSM         ;(秒)减1
  145.             RET
  146.     TIME14:
  147.             MOV     A,SMJSF       ;装入睡眠倒计时(分)
  148.             JNZ     TIME15        ;如果不是0就转移
  149.             RET
  150.     TIME15:        
  151.             DEC     SMJSF         ;(分)减1
  152.             MOV     SMJSM,#59     ;放入59(秒)
  153.             RET
  154.     ZTQH:
  155.             MOV     A,DQZT        ;装入“当前状态”,0=导通、1=断开,2=上电延时导通
  156.             CJNE    A,#2,ZTQH2    ;不是“上电延时导通”状态就转移
  157.             MOV     A,YSMS        ;装入延时导通模式
  158.             JNZ     ZTQH0         ;如果不是0(延时时间到后始终导通)就转移
  159.             SETB    07H           ;位地址07H置为1,始终导通
  160.             RET
  161.     ZTQH0:
  162.             CJNE    A,#1,ZTQH6    ;不是1(从“导通时间”继续运行)就转移,从“断开时间”继续运行
  163.     ZTQH1:
  164.             MOV     DQZT,#0       ;切换到“导通时间”状态
  165.             MOV     DSSJS,DTS     ;把“导通时间”放入“定时时间”
  166.             MOV     DSSJF,DTF     ;把“导通时间”放入“定时时间”
  167.             MOV     DSSJM,DTM     ;把“导通时间”放入“定时时间”
  168.             MOV     DSSJHM,DTHM   ;把“导通时间”放入“定时时间”
  169.             RET
  170.     ZTQH2:
  171.             CLR     07H          ;位地址07H置为0(正常)
  172.             JNZ     ZTQH1        ;是1(断开时间)状态就转移,切换到“导通时间”状态
  173.             MOV     A,XHDS       ;是“导通时间”状态,装入循环模式
  174.             SETB    09H          ;位地址09H置为1(允许恢复响应按键动作)
  175.             CJNE    A,#1,ZTQH3   ;不是1(不循环)就转移,0=无限循环;1=不循环;2~99=导通次数
  176.             RET                  ;是不循环,退出
  177.     ZTQH3:
  178.             JZ      ZTQH5        ;是0(无限循环)就转移
  179.             MOV     A,XHJS       ;装入导通次数计数
  180.             DEC     A            ;检查导通次数是否已到,不到就转移
  181.             JNZ     ZTQH4        ;检查导通次数是否已到,不到就转移
  182.             RET
  183.     ZTQH4:
  184.             DEC     XHJS         ;导通次数减1
  185.     ZTQH5:
  186.             MOV     A,DKS        ;
  187.             JNZ     ZTQH7        ;检查“断开时间”不为0才切换到“断开时间”
  188.             MOV     A,DKF        ;
  189.             JNZ     ZTQH7        ;检查“断开时间”不为0才切换到“断开时间”
  190.             MOV     A,DKM        ;
  191.             JNZ     ZTQH7        ;检查“断开时间”不为0才切换到“断开时间”
  192.             MOV     A,DKHM       ;
  193.             JNZ     ZTQH7        ;检查“断开时间”不为0才切换到“断开时间”
  194.             RET
  195.     ZTQH6:
  196.             SETB    08H          ;位地址08H置为1,不响应按键动作。
  197.     ZTQH7:
  198.             MOV     DQZT,#1      ;切换到“断开时间”状态
  199.             MOV     DSSJS,DKS    ;把“断开时间”放入“定时时间”
  200.             MOV     DSSJF,DKF    ;把“断开时间”放入“定时时间”
  201.             MOV     DSSJM,DKM    ;把“断开时间”放入“定时时间”
  202.             MOV     DSSJHM,DKHM  ;把“断开时间”放入“定时时间”
  203.             RET

  204.     ;-----------------------------------------------------------------------
  205.     ;子程序:T0中断调用,显示定时时间及各项设置的内容
  206.     ;-----------------------------------------------------------------------
  207.     DISPLAY:
  208.             JB    06H,DPYSZ1     ;如果位地址06H为1就转移退出,主程序显示88:88或E1
  209.             MOV   A,DISPL        ;装入要显示的目标(项目号)
  210.             JZ    DISPL0         ;如果是0(显示定时时间)就转移
  211.             MOV   B,#2
  212.             MUL   AB             ;项目号乘2
  213.             DEC   A
  214.             DEC   A              ;把计算结果减2
  215.             PUSH  ACC            ;寄存器A的内容压入堆栈
  216.             MOV   DPTR,#SEGTAB2  ;字形码首址
  217.             MOVC  A,@A+DPTR      ;查表获取字形码
  218.             MOV   ZXM1,A         ;项目字形码放到待发送TM1637区1
  219.             POP   ACC            ;弹出上面压入堆栈的内容到寄存器A
  220.             INC   A              ;地址加1
  221.             MOVC  A,@A+DPTR      ;查表获取字形码
  222.             MOV   ZXM2,A         ;项目字形码放到待发送TM1637区2
  223.             MOV   A,DISPL        ;装入项目号
  224.             DEC   A              ;减1
  225.             ADD   A,#DTS         ;加各项设置值始址,得出设置项目的实际地址
  226.             MOV   R1,A           ;地址放入R1
  227.             MOV   A,@R1          ;装入设置值
  228.             MOV   B,A            ;放进寄存器B
  229.             CJNE  A,XSHC1,DPYSZ3 ;当前设置值与显示缓存1不相同就转移,立即显示
  230.             MOV   A,HMJS         ;相同,装入(10)毫秒计数2
  231.             CJNE  A,#99,DPYSZ2   ;不是99就转移,每0.5秒显示一次
  232.             LJMP  DPYSZ3         ;是,显示
  233.     DPYSZ1: RET
  234.     DPYSZ2:
  235.             CJNE   A,#49,DPYSZ1 ;不是49就转移退出,每0.5秒显示一次
  236.     DPYSZ3:
  237.             MOV    XSHC1,B      ;当前设置值放入显示缓存1
  238.             MOV    A,B          ;当前设置值放入A寄存器
  239.             MOV    R0,#ZXM3     ;待发送TM1637区3地址
  240.             LCALL  BCD          ;转换并获取字形码放到待发送TM1637区3和4
  241.             JNB    04H,DPYSZ4   ;如果位地址04H为0(不闪烁)就转移
  242.             JNB    05H,DPYSZ4   ;为1,闪烁显示,如果位地址05H为0(显示)就转移
  243.             MOV    ZXM3,#0      ;处于闪烁显示中的“不显示”状态,放入消隐码
  244.             MOV    ZXM4,#0      ;处于闪烁显示中的“不显示”状态,放入消隐码
  245.     DPYSZ4:
  246.             LCALL  disp         ;发送4个字节数据到TM1637显示
  247.             RET
  248.     DISPL0:
  249.             MOV    R1,#DSSJS    ;把定时时间“时”的地址放入R1
  250.             MOV    A,@R1        ;装入“时”
  251.             JZ     DISPL1       ;如果“时”为0就转移
  252.             LJMP   DISPL3
  253.     DISPL1:
  254.             CLR    05H          ;“时”为0,把位地址05H置为0,始终显示冒号
  255.             INC    R1           ;地址加1,指向“分”
  256.             MOV    A,@R1        ;装入“分”
  257.             JZ     DISPL2       ;如果“分”为0就转移
  258.             LJMP   DISPL3
  259.     DISPL2:
  260.             INC    R1           ;地址加1,指向“秒”
  261.             MOV    A,@R1        ;装入“秒”
  262.     DISPL3:
  263.             CJNE   A,XSHC1,DISPL6  ;寄存器A的数据与显示缓存1不相同就转移,立即显示
  264.             INC    R1              ;地址加1
  265.             MOV    A,@R1           ;装入
  266.             DEC    R1              ;地址减1
  267.             CJNE   A,XSHC2,DISPL6  ;寄存器A的数据与显示缓存2不相同就转移,立即显示
  268.             MOV    A,HMJS          ;都相同,装入(10)毫秒时间计数2
  269.             CJNE   A,#99,DISPL5    ;不是99就转移
  270.             LJMP   DISPL6          ;是,显示(每0.5秒显示一次)
  271.     DISPL4: RET
  272.     DISPL5:
  273.             CJNE   A,#49,DISPL4    ;不是49就转移退出,每0.5秒显示一次
  274.     DISPL6:
  275.             INC    R1          ;地址加1
  276.             MOV    A,@R1       ;装入后面一位时间
  277.             MOV    XSHC2,A     ;放入缓存2
  278.             DEC    R1          ;地址减1
  279.             MOV    A,@R1       ;装入前面一位时间
  280.             MOV    XSHC1,A     ;放入缓存1
  281.             MOV    R0,#ZXM1    ;待发送TM1637区1地址
  282.             LCALL  BCD         ;转换并获取字形码放到待发送TM1637区1、2
  283.             INC    R1          ;地址加1
  284.             MOV    R0,#ZXM3    ;待发送TM1637区3地址
  285.             MOV    A,@R1       ;装入后面一位时间
  286.             LCALL  BCD         ;转换并获取字形码放到待发送TM1637区3、4
  287.             JB     02H,DISPL7  ;如果02H为1(暂停)就转移,始终显示冒号
  288.             JB     05H,DISPL8  ;如果05H为1就转移,不显示冒号
  289.     DISPL7:
  290.             ORL    ZXM2,#10000000B   ;把最高位置为1(最高位为1就显示冒号)
  291.     DISPL8:
  292.             LCALL  disp        ;发送4个字节数据到TM1637显示
  293.             RET
  294.     BCD:
  295.             MOV    B,#10       ;转换为BCD码
  296.             DIV    AB          ;转换为BCD码
  297.             MOV    DPTR,#SEGTAB   ;查表获取字形码
  298.             MOVC   A,@A+DPTR   ;查表获取字形码
  299.             MOV    @R0,A       ;字形码放入待发送TM1637区
  300.             XCH    A,B         ;A、B寄存器内容交换
  301.             MOVC   A,@A+DPTR   ;查表获取字形码
  302.             INC    R0          ;地址加1
  303.             MOV    @R0,A       ;字形码放入待发送TM1637区
  304.             RET

  305.     ;------------------ 发送4个字节数据到TM1637显示,地址自动加1 ------------------
  306.     disp:
  307.             MOV    A,SMMS     ;装入设置的睡眠模式
  308.             JZ     disp0      ;如果为0(始终显示)就转移
  309.             MOV    A,SMJSF    ;装入睡眠计时(分)
  310.             JNZ    disp0      ;不为0(未进入睡眠状态)就转移
  311.             MOV    A,SMJSM    ;装入睡眠计时(秒)
  312.             JNZ    disp0      ;不为0(未进入睡眠状态)就转移
  313.             CLR    A          ;已进入睡眠状态,放入消隐码(0)
  314.             MOV    ZXM1,A     ;放入消隐码
  315.             MOV    ZXM2,A     ;放入消隐码
  316.             MOV    ZXM3,A     ;放入消隐码
  317.             MOV    ZXM4,A     ;放入消隐码
  318.     disp0:
  319.             LCALL  Srt
  320.             MOV    A,#040H    ;数据命令设置40H:地址自动加1,写数据到显示寄存器
  321.             LCALL  Writebyte  ;发送一个字节
  322.             LCALL  Stop
  323.             NOP
  324.             LCALL  Srt
  325.             MOV    A,#0C0H    ;地址命令设置C0H:初始地址为00H
  326.             LCALL  Writebyte  ;发送一个字节
  327.             MOV    R6,#4      ;发送4个字节数据
  328.             MOV    R1,#ZXM1   ;等待发送的字形码始址
  329.     disp1:
  330.             MOV    A,@R1      ;装入要发送的字形码
  331.             LCALL  Writebyte  ;发送一个字节
  332.             INC    R1         ;地址加1
  333.             DJNZ   R6,disp1   ;如果还未发送完就继续
  334.             LCALL  Stop
  335.             LCALL  Srt
  336.             MOV    A,SMGLD    ;装入设置的数码管亮度(1~8)
  337.             ADD    A,#087H    ;加上87H后即为对应的亮度控制命令88H~8FH
  338.             LCALL  Writebyte  ;按设置的亮度开显示
  339.             LCALL  Stop
  340.             RET

  341.     ;------------------ 发送8bit(一个字节)数据到TM1637,A=要发送的数据,从低位开始 ------------------
  342.     Writebyte:
  343.             MOV   R7,#8       ;发送8位数据
  344.     WBY1:
  345.             CLR   CLK         ;拉低CLK
  346.             JNB   ACC.0,WBY2  ;A寄存器的低位(0位)如果为0就转移
  347.             SETB  DIO         ;为1,拉高DIO
  348.             SJMP  WBY3
  349.     WBY2:
  350.             CLR   DIO       ;为0,拉低DIO
  351.     WBY3:
  352.             MOV   R4,#13    ;延时
  353.     WBY4:
  354.             DJNZ  R4,WBY4   ;延时
  355.             SETB  CLK       ;拉高CLK
  356.             CLR   C         ;进位标志清0
  357.             RRC   A         ;A寄存器内容带进位循环右移
  358.             DJNZ  R7,WBY1   ;如果还未发送完8bit数据就继续
  359.             CLR   CLK       ;8位数据发送完了
  360.             MOV   R7,#20    ;设置等待应答信号延时计数
  361.     WBY5:
  362.             JNB   DIO,WBY6  ;判断TM1637发过来的ACK应答信号,应答就转移(0,低电平)
  363.             DJNZ  R7,WBY5   ;
  364.     WBY6:
  365.             MOV   R4,#13    ;延时
  366.     WBY7:
  367.             DJNZ  R4,WBY7   ;延时
  368.             SETB  CLK
  369.             MOV   R4,#13    ;延时
  370.     WBY8:
  371.             DJNZ  R4,WBY8   ;延时
  372.             RET         

  373.     ;------------------ Start子程序 ------------------
  374.     Srt:
  375.             SETB   DIO       ;拉高DIO
  376.             SETB   CLK       ;拉高CLK
  377.             MOV    R4,#13    ;延时
  378.     SrtY1:
  379.             DJNZ   R4,SrtY1  ;延时
  380.             SETB   DIO       ;拉高DIO
  381.             MOV    R4,#13    ;延时
  382.     SrtY2:
  383.             DJNZ   R4,SrtY2  ;延时
  384.             CLR    DIO       ;拉低DIO
  385.             MOV    R4,#13    ;延时
  386.     SrtY3:
  387.             DJNZ   R4,SrtY3  ;延时
  388.             CLR   CLK        ;拉低CLK
  389.             RET         

  390.     ;------------------ Stop子程序 ------------------
  391.     Stop:
  392.             CLR   CLK
  393.             MOV   R4,#30
  394.     StopY1:
  395.             DJNZ  R4,StopY1
  396.             CLR   DIO
  397.             MOV   R4,#30
  398.     StopY2:
  399.             DJNZ  R4,StopY2
  400.             SETB  CLK
  401.             MOV   R4,#40
  402.     StopY3:
  403.             DJNZ  R4,StopY3
  404.             SETB  DIO
  405.             MOV   R4,#30
  406.     StopY4:
  407.             DJNZ  R4,StopY4
  408.             CLR   CLK
  409.             CLR   DIO
  410.             RET         

  411.     ;********************** 以下为EEPROM操作子程序 **********************
  412.     ;STC15F104W有1K字节的EEPROM,共2个扇区,第1扇区:0000H~01FFH;第2扇区:0200H~03FFH
  413.     ;-------------------------------------------
  414.     ;读一字节,A=读出的数据
  415.     Byte_Read:
  416.             MOV  IAP_CONTR,#ENABLE_IAP  ;打开IAP功能,设置Flash操作等待时间(83H)
  417.             MOV  IAP_CMD,#01            ;设置为IAP/ISP/EEPROM字节读模式命令(1)
  418.             MOV  IAP_TRIG,#05AH         ;先送5AH
  419.             MOV  IAP_TRIG,#0A5H         ;再送A5H,ISP/IAP命令立即被触发起动
  420.             NOP
  421.             MOV  A,IAP_DATA             ;读出的数据在IAP_DATA单元中,送入累加器A
  422.             RET
  423.     ;-------------------------------------------
  424.     ;字节编程,A=需写入的数据
  425.     Byte_Program:
  426.             MOV  IAP_CONTR,#ENABLE_IAP  ;打开IAP功能,设置Flash操作等待时间(83H)
  427.             MOV  IAP_CMD,#02            ;设置为IAP/ISP/EEPROM字节编程模式命令(2)
  428.             MOV  IAP_DATA,A             ;要编程的数据先送进IAP_DATA寄存器
  429.             MOV  IAP_TRIG,#05AH         ;先送5AH
  430.             MOV  IAP_TRIG,#0A5H         ;再送A5H,ISP/IAP命令立即被触发起动
  431.             RET
  432.     ;-------------------------------------------
  433.     ;擦除扇区
  434.     Sector_Erase:
  435.             MOV  IAP_CONTR,#ENABLE_IAP  ;打开IAP功能,设置Flash操作等待时间(83H)
  436.             MOV  IAP_CMD,#03            ;设置为IAP/ISP/EEPROM扇区擦除模式命令(3)
  437.             MOV  IAP_TRIG,#05AH         ;先送5AH
  438.             MOV  IAP_TRIG,#0A5H         ;再送A5H,ISP/IAP命令立即被触发起动
  439.             NOP
  440.             RET

  441.     ;---------- 读EEPROM保存的各项设置,如果没有就设置为默认值并保存 ------------
  442.     REEP:
  443.             LCALL  RE00          ;读EEPROM保存的各项设置
  444.             MOV    XHJS,XHDS     ;循环定时
  445.             MOV    SMJSF,SMMS    ;睡眠模式
  446.             MOV    A,SDYSS       ;装入上电延时导通(时)
  447.             JNZ    REYS          ;不是0就转移
  448.             MOV    A,SDYSF       ;装入上电延时导通(分)
  449.             JNZ    REYS          ;不是0就转移
  450.             MOV    A,SDYSM       ;装入上电延时导通(秒)
  451.             JZ     REEPR         ;都为0就转移
  452.     REYS:
  453.             MOV    DSSJS,SDYSS   ;把“上电延时导通”时间放入“定时时间”
  454.             MOV    DSSJF,SDYSF   ;把“上电延时导通”时间放入“定时时间”
  455.             MOV    DSSJM,SDYSM   ;把“上电延时导通”时间放入“定时时间”
  456.             MOV    DSSJHM,#0  
  457.             MOV    DQZT,#2       ;设置当前状态,0=导通、1=断开,2=上电延时导通
  458.             RET
  459.     REEPR:
  460.             MOV    DSSJS,DTS     ;把“导通时间”放入“定时时间”
  461.             MOV    DSSJF,DTF     ;把“导通时间”放入“定时时间”
  462.             MOV    DSSJM,DTM     ;把“导通时间”放入“定时时间”
  463.             MOV    DSSJHM,DTHM   ;把“导通时间”放入“定时时间”
  464.             MOV    DQZT,#0       ;设置当前状态,0=导通、1=断开,2=上电延时导通
  465.             RET
  466.     RE00:
  467.             MOV    IAP_ADDRH,#00H  ;从第一个扇区开始搜索,地址的高8位
  468.     RE01:
  469.             MOV    IAP_ADDRL,#00H  ;从第一个扇区开始搜索,地址的低8位
  470.             LCALL  Byte_Read     ;读第一个字节,返回:A=读出的数据
  471.             CJNE   A,FWBZ1,RE03  ;是否保存在当前扇区,不是就转移到RE03
  472.             INC    IAP_ADDRL     ;EEPROM字节地址增1
  473.             LCALL  Byte_Read     ;读第二个字节
  474.             CJNE   A,FWBZ2,RE03  ;第二个字节是否相符
  475.             MOV    R1,#FWBZ2     ;相符,从FWBZ2+1处开始放置读出的设置值
  476.             MOV    R2,#17        ;再读出17个字节
  477.     RE02:
  478.             INC    R1            ;RAM地址增1
  479.             INC    IAP_ADDRL     ;EEPROM字节地址增1
  480.             LCALL  Byte_Read     ;读一个字节,返回:A=读出的数据
  481.             MOV    @R1,A         ;放到R1指向的RAM地址
  482.             DJNZ   R2,RE02       ;未读完就继续
  483.             RET                  ;读完了,退出
  484.     RE03:
  485.             MOV    A,IAP_ADDRH  ;装入扇区地址的高8位
  486.             ADD    A,#2         ;扇区增1
  487.             MOV    IAP_ADDRH,A  ;放入IAP_ADDRH
  488.             CJNE   A,#04H,RE01  ;如果未搜索完最后一个扇区+2(02H+2=04H)就转移,继续搜索
  489.             LCALL  SZMRZ        ;已经搜索全部扇区,未找到保存的内容,设置为默认值
  490.             MOV    R0,#2        ;总扇区数量,共2个扇区
  491.             LJMP   WSET3        ;跳转到WSET3保存设置

  492.     ;------------------ 保存设置,不固定保存到某个扇区,各扇区轮流使用 ------------------
  493.     WSET:
  494.             MOV    R0,#2           ;扇区总数量,共2个扇区
  495.             MOV    IAP_ADDRH,#00H  ;从第一个扇区开始搜索上次保存的设置
  496.     WSET1:
  497.             MOV    IAP_ADDRL,#00H  ;地址低位指向第一个字节
  498.             LCALL  Byte_Read       ;读第一个字节,返回:A=读出的数据
  499.             CJNE   A,FWBZ1,WSET7   ;如果与EEPROM数据判断标志1不相同就转移
  500.             INC    IAP_ADDRL       ;第一个字节相同,EEPROM字节地址增1
  501.             LCALL  Byte_Read       ;读第二个字节
  502.             CJNE   A,FWBZ2,WSET7   ;如果与EEPROM数据判断标志2不相同就转移
  503.             MOV    IAP_ADDRL,#0    ;是在当前扇区,地址指向扇区第一个字节
  504.             LCALL  Sector_Erase    ;擦除当前扇区,另换一个扇区保存
  505.     WSET2:
  506.             MOV    A,IAP_ADDRH     ;装入扇区地址高位到寄存器A
  507.             CJNE   A,#00H,WSET3    ;当前扇区地址高位如果不是00H(第一个扇区)就转移
  508.             MOV    IAP_ADDRH,#04H  ;是00H,把IAP_ADDRH设置为最后一个扇区+2(02H+2=04H)
  509.     WSET3:
  510.             DEC    IAP_ADDRH      ;减1
  511.             DEC    IAP_ADDRH      ;再减1,指向上一个扇区首址
  512.             MOV    IAP_ADDRL,#0   ;低8位指向扇区第一个字节
  513.             LCALL  Sector_Erase   ;擦除整个扇区
  514.             MOV    R1,#FWBZ1      ;要保存的内容始址
  515.             MOV    R2,#19         ;共19个字节
  516.     WSET4:
  517.             MOV    A,@R1          ;装入R1指向的RAM地址的内容到A
  518.             LCALL  Byte_Program   ;字节编程(写入EEPROM)
  519.             INC    IAP_ADDRL      ;EEPROM地址加1
  520.             INC    R1             ;RAM地址增1
  521.             DJNZ   R2,WSET4       ;未保存完就继续
  522.             MOV    IAP_ADDRL,#0   ;保存完了,扇区地址低位指向0(当前扇区首址)
  523.             LCALL  Byte_Read      ;读出来检查看是否写入成功
  524.             CJNE   A,FWBZ1,WSET5  ;如果与EEPROM数据判断标志1不相同就转移
  525.             INC    IAP_ADDRL      ;EEPROM地址加1
  526.             LCALL  Byte_Read      ;读第二个字节
  527.             CJNE   A,FWBZ2,WSET5  ;如果与EEPROM数据判断标志2不相同就转移
  528.             RET                   ;成功了,退出
  529.     WSET5:
  530.             DJNZ   R0,WSET2      ;如果未试完全部扇区就转移到WSET2继续往前一个扇区写
  531.             SETB   06H           ;已经试完全部扇区,都失败了,位地址06H置为1
  532.             MOV    MJS,#5        ;显示5秒E1
  533.             MOV    ZXM1,#0       ;消隐码
  534.             MOV    ZXM2,#079H    ;E
  535.             MOV    ZXM3,#006H    ;1
  536.             MOV    ZXM4,#0       ;消隐码
  537.             LCALL  DISP          ;显示
  538.     WSET6:
  539.             MOV    A,MJS
  540.             LCALL  WG            ;喂狗
  541.             JNZ    WSET6         ;等待MJS为0秒
  542.             CLR    06H           ;显示结束,位地址06H置为0
  543.             RET
  544.     WSET7:
  545.             MOV    A,IAP_ADDRH   ;装入扇区地址高位
  546.             ADD    A,#2          ;加2,指向下一个扇区首址
  547.             MOV    IAP_ADDRH,A   ;放回IAP_ADDRH
  548.             CJNE   A,#04H,WSET1  ;如果未到最后一个扇区地址高位+2(02H+2=04H)就转移到WSET1继续搜索
  549.             LJMP   WSET3         ;已经搜索完所有扇区,未找到上次保存的数据,跳转到WSET3保存当前设置

  550.     ;**************************** 以上为EEPROM操作子程序 ****************************

  551.     ;------------------ 字形表 ------------------
  552.     SEGTAB:
  553.             DB  00111111B  ;0(3FH)
  554.             DB  00000110B  ;1(06H)
  555.             DB  01011011B  ;2(5BH)
  556.             DB  01001111B  ;3(4FH)
  557.             DB  01100110B  ;4(66H)
  558.             DB  01101101B  ;5(6DH)
  559.             DB  01111101B  ;6(7DH)
  560.             DB  00000111B  ;7(07H)
  561.             DB  01111111B  ;8(7FH)
  562.             DB  01101111B  ;9(6FH)
  563.     SEGTAB2:
  564.             DB  00000110B,01110111B  ;1A(06H,77H)
  565.             DB  00000110B,01111100B  ;1b(06H,7CH)
  566.             DB  00000110B,00111001B  ;1C(06H,39H)
  567.             DB  00000110B,01011110B  ;1d(06H,5EH)
  568.             DB  01011100B,01000000B  ;o-(5CH,40H)
  569.             DB  00111001B,01000000B  ;C-(39H,40H)
  570.             DB  01111100B,00111001B  ;bC(7CH,39H)
  571.             DB  00111000B,01011110B  ;Ld(38H,5EH)
  572.             DB  01011011B,01110111B  ;2A(5BH,77H)
  573.             DB  01011011B,01111100B  ;2b(5BH,7CH)
  574.             DB  01011011B,00111001B  ;2C(5BH,39H)
  575.             DB  01011011B,01011110B  ;2d(5BH,5EH)
  576.             DB  01001111B,01110111B  ;3A(4FH,77H)
  577.             DB  01001111B,01111100B  ;3b(4FH,7CH)
  578.             DB  01001111B,00111001B  ;3C(4FH,39H)
  579.             DB  01011110B,01000000B  ;d-(5EH,40H)
  580.             DB  01111001B,01000000B  ;E-(79H,40H)

  581.     ;------------------------------------------------------------------------------------------

  582.             END
复制代码



打赏

参与人数 3家元 +51 收起 理由
2n3055 + 20 優秀文章
wyq032 + 30 優秀文章,厉害厉害,膜拜一下!.
guangqu + 1 源码在附件包里吗

查看全部打赏

回复 支持 2 反对 0

使用道具 举报

发表于 2021-1-19 10:24:04 | 显示全部楼层
这个强大学习了!
回复 支持 反对

使用道具 举报

发表于 2021-1-19 10:24:43 | 显示全部楼层
电路不错:praise:,源代码给个网盘链接吧。
回复 支持 反对

使用道具 举报

发表于 2021-1-19 10:39:39 来自手机浏览器 | 显示全部楼层
汇编写的程序吗
回复 支持 反对

使用道具 举报

发表于 2021-1-19 10:52:45 | 显示全部楼层
楼主毛笔字写得很好看啊,羡慕你们字写得漂亮的,自己偶尔也练,但还是没法看。
回复 支持 反对

使用道具 举报

发表于 2021-1-19 11:34:02 | 显示全部楼层
膜拜会汇编的!能来个网盘链接就好了
回复 支持 反对

使用道具 举报

发表于 2021-1-19 12:44:33 | 显示全部楼层
这个好,论坛经常有小白需要MCU去做一些简单的时序控制,这下子全都给满足了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-19 13:20:08 | 显示全部楼层
kindzhon 发表于 2021-1-19 10:24
电路不错,源代码给个网盘链接吧。

源代码上面已经发出来了,之前不知道什么原因发不了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-19 13:21:22 | 显示全部楼层
维超 发表于 2021-1-19 11:34
膜拜会汇编的!能来个网盘链接就好了

源代码上面已经发出来了,之前操作总是不成功发不了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-19 13:23:05 | 显示全部楼层
zidian 发表于 2021-1-19 10:52
楼主毛笔字写得很好看啊,羡慕你们字写得漂亮的,自己偶尔也练,但还是没法看。 ...

谢谢,我偶尔写写,但总写得不好
回复 支持 反对

使用道具 举报

发表于 2021-1-19 13:41:54 | 显示全部楼层

编译出错

杨小强 发表于 2021-1-19 13:21
源代码上面已经发出来了,之前操作总是不成功发不了

A3.A9错误

A3.A9错误

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-19 13:55:53 | 显示全部楼层
本帖最后由 杨小强 于 2021-1-19 13:58 编辑

刚刚复制下来试,我这边没问题哦 QQ图片20210119135618.png
回复 支持 反对

使用道具 举报

发表于 2021-1-19 14:11:07 | 显示全部楼层
杨小强 发表于 2021-1-19 13:55
刚刚复制下来试,我这边没问题哦

谢谢!现在可以了.是字体编码的问题 OK.png
回复 支持 反对

使用道具 举报

发表于 2021-1-19 14:23:09 来自手机浏览器 | 显示全部楼层
居然汇编…厉害了…:praise:
回复 支持 反对

使用道具 举报

发表于 2021-1-19 15:15:35 来自手机浏览器 | 显示全部楼层
厉害了,汇编语言,当初老师教的也是汇编,一个学期下来,咋也不懂,只知道些mov,累加器这类的玩意,白学的孩子路过
回复 支持 反对

使用道具 举报

发表于 2021-1-19 15:22:24 | 显示全部楼层
不错呀,厉害 ,全汇编太高级了
回复 支持 反对

使用道具 举报

发表于 2021-1-19 15:58:54 | 显示全部楼层
谢谢分享,正好还有几个这个小单片机:lol:
回复 支持 反对

使用道具 举报

发表于 2021-1-19 16:25:34 | 显示全部楼层
居然用汇编。能用C绝不用汇编:tongue:
回复 支持 反对

使用道具 举报

发表于 2021-1-19 16:53:51 | 显示全部楼层
有一个做控制器的想法,但小白一个,可以有偿定制一么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-29 13:35 , Processed in 0.234000 second(s), 16 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表