数码之家

 找回密码
 立即注册
搜索
查看: 7737|回复: 34

[C51] 老式电饭煲用来煲广式老火汤的定时器汇编版(STC8G1K17+LCD1602)

  [复制链接]
发表于 2021-9-11 23:50:41 | 显示全部楼层 |阅读模式

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

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

x
这个是友情定制版的定时控制器:lol:,  经过大半年的使用,反馈回的效果很好。:victory:

去年底,一个同学他吐槽那些电瓦煲 煮的老火汤口感差(这个我认同,我家也有电瓦煲 ,煲出的汤确实口味不好),原因是电瓦煲 功率小,而且瓦煲内胆传热慢,从凉水到煮沸这段时间要很长,汤料泡在这不冷不热的水里时间长了就口感差。

他说还是觉得老式电饭煲煮的汤好喝,(他有一个800W的老式电饭煲)但老式电饭煲没有定时器,如果只是简单加个定时器,那煮沸后再过三四十分钟就烧干那水。他问我有没有办法做个定时器,先把水煮沸,再转到慢火 煲两小时。我说 “这不是问题 ”,PBC打版,焊接,写程序,调试,大概经20天 ,已经完成了,给我测试能用,跟着送给他。

当时我还不会用C语言,只能用汇编语言写, 程序和电路如下:
按键K_P30(SW1) K_P31(SW2) 是左和右选择选择需要设置的数(选择的位在屏幕上闪烁)
K_P32(SW3)  是数值加1,    >=10就回到0,
K_P33(SW4)  是取消/停止操作,按下后就停止和取消定时操作
K_P34(SW5)  是 开始运行
K_P35(SW6)  直接跳到 歇通电/断电 作慢火煲汤
K_P36,K_P37  是设计PCB板时作备用的,在这里没用上
电路里 P30/P31两端口用于程序下载, 于是用P11/P12与P32~P37 拼成一个8位口给LCD1602输出数据

电路图:
电饭煲控制器.JPG


  1. ; STC8G1K17+LCD1602定时器


  2. ;下面是寄存器的分配使用

  3.      TSRAM0 EQU 2CH         ;定时器计数用的寄存器0
  4.      TSRAM1 EQU 2DH         ;定时器计数用的寄存器1
  5.      TSRAM2 EQU 2EH         ;定时器计数用的寄存器1
  6.      TSRAM3 EQU 2FH          ;定时器计数用的寄存器1
  7.      TSRAM4 EQU 30H          ;定时器计数用的寄存器1

  8.      TSRAM5 EQU 31H
  9.      TSRAM6 EQU 32H
  10.      TSRAM7 EQU 33H
  11.      TSRAM8 EQU 34H
  12.      TSRAM9 EQU 35H

  13.     YSRAM1 EQU 36H       ;延时用寄存器1
  14.     YSRAM2 EQU 37H      ;延时用寄存器2
  15.     YSRAM3 EQU 38H     ; 延时用寄存器3

  16.           RAMADDR EQU 39H       ; RAMADDR,256字节的地址入口
  17.           RAMDATA  EQU 3AH      ;RAMDATA  读写数据缓冲
  18.           BUZRAM EQU 3BH    ;报警时间存放--秒


  19.     SS1 EQU 41H  ;时钟1秒计数

  20.     SS10 EQU 42H   ;时钟10秒计数
  21.     MM1 EQU 43H   ;时钟分个位
  22.     MM10 EQU 44H  ;时钟分十位
  23.     HH1 EQU 45H   ;时钟小时个位
  24.     HH10 EQU 46H  ;时钟小时十位


  25.     T1_1 EQU 47H     ;定时1组
  26.     T1_2 EQU 48H
  27.     T1_3 EQU 49H

  28.     T2_1 EQU  4AH    ;定时2组
  29.     T2_2 EQU  4BH
  30.     T2_3 EQU  4CH

  31.     S1_1 EQU 4DH    ;间歇时间1
  32.     S1_2 EQU 4EH
  33.     S1_1A EQU 4FH   ;S1时间重新加载保存处
  34.     S1_2A EQU 50H

  35.     S2_1 EQU 51H    ;间歇时间2
  36.     S2_2 EQU 52H
  37.     S2_1A EQU 53H ; S2时间重新加载保存处
  38.     S2_2A EQU 54H ;

  39.     SWJC EQU 55H   ; 设置键按下次数
  40.     SWBUF1 EQU 56H    ;按键状态移入,每2ms移入一次
  41.     SWBUF2 EQU 57H    ;按键状态移入,每2ms移入一次
  42.     SWBUF3 EQU 58H     ;按键状态移入,每2ms移入一次
  43.     SWBUF4 EQU 59H     ;按键状态移入,每2ms移入一次
  44.     SWBUF5 EQU 60H     ;按键状态移入,每2ms移入一次
  45.     SWBUF6 EQU 61H     ;按键状态移入,每2ms移入一次
  46.     SWBUF7 EQU 62H     ;按键状态移入,每2ms移入一次
  47.     SWBUF8 EQU 63H     ;按键状态移入,每2ms移入一次

  48.     SWSTA1 BIT 10H   ;按键当前状态位
  49.     SWSTA2 BIT 11H    ;按键当前状态位
  50.     SWSTA3 BIT 12H    ;按键当前状态位
  51.     SWSTA4 BIT 13H     ;按键当前状态位
  52.     SWSTA5 BIT 14H     ;按键当前状态位
  53.     SWSTA6 BIT 15H     ;按键当前状态位
  54.     SWSTA7 BIT 16H     ;按键当前状态位
  55.     SWSTA8 BIT 17H     ;按键当前状态位

  56.     SWUP1 BIT 20H   ;保存前一次按键状态位
  57.     SWUP2 BIT 21H    ;保存前一次按键状态位
  58.     SWUP3 BIT 22H    ;保存前一次按键状态位
  59.     SWUP4 BIT 23H    ;保存前一次按键状态位
  60.     SWUP5 BIT 24H    ;保存前一次按键状态位
  61.     SWUP6 BIT 25H    ;保存前一次按键状态位
  62.     SWUP7 BIT 26H    ;保存前一次按键状态位
  63.     SWUP8 BIT 27H    ;保存前一次按键状态位



  64.      LCD_D0  BIT  P1.2
  65.      LCD_D1  BIT  P1.3
  66.      LCD_D2  BIT  P3.2
  67.      LCD_D3  BIT  P3.3
  68.      LCD_D4  BIT  P3.4
  69.      LCD_D5  BIT  P3.5
  70.      LCD_D6  BIT  P3.6
  71.      LCD_D7  BIT  P3.7
  72.      LCD_RS  BIT  P1.0   ;LCD1602 的 RS端  ,1-数据,0-指令
  73.      LCD_EN  BIT  P1.1   ;LCD1602 的 E端   ,先从低变高,再变低,以确认输入数据或命令


  74.             F2 BIT 00H      ;秒标志
  75.             F3 BIT 01H      ;分标志
  76.             F4 BIT 02H
  77.             F5 BIT 03H
  78.             F6 BIT 04H
  79.             F7 BIT 05H
  80.             F8 BIT 06H
  81.             F9 BIT 07H
  82.             F10 BIT 08H
  83.             F11 BIT 09H
  84.             F12 BIT 0AH

  85.             PSW1 BIT P3.1     ;按键输入口
  86.             PSW2 BIT P3.2
  87.             PSW3 BIT P3.3
  88.             PSW4 BIT P3.5
  89.             PSW5 BIT P3.6
  90.             PSW6 BIT P3.7
  91.             PSW7 BIT P3.0
  92.             PSW8 BIT P3.4

  93.             SWEN BIT P1.4   ;按键选通口

  94.            OUT1 BIT P5.4 ;第1路输出
  95.            BUZ BIT P5.5   ;报警输出,为0时有响声


  96.      RAM1602 EQU 43H         ;LCD1602写入缓冲



  97.     LCD1_1 EQU 80H   ;LCD1602的第一行第1个



  98.     LCD2_1 EQU 90H   ;LCD1602的第二行第1个




  99.            ORG 0000H
  100.           LJMP AA1
  101.      ;--------------------------

  102.            ORG 00BH;T0中断入口
  103.            LJMP T0INT


  104.           ORG 0100H
  105. ;数值初始化


  106.        AA1:MOV R0,#02H      ;间接寻址,从02H开始到0FFH共256字节   全清空置零
  107.            MOV R1,#255
  108.        CL1:MOV @R0,#00H
  109.            INC R0
  110.            DJNZ R1,CL1
  111.            MOV R0,#00
  112.            MOV R1,#00

  113.            MOV P0M0,#00H    ;标准I/O口模式
  114.            MOV P0M1,#000H
  115.            MOV P1M0,#00H    ;标准I/O口模式
  116.            MOV P1M1,#000H
  117.            MOV P2M0,#00H    ;标准I/O口模式
  118.            MOV P2M1,#000H
  119.            MOV P3M0,#00H    ;标准I/O口模式
  120.            MOV P3M1,#000H
  121.            MOV P4M0,#00H    ;标准I/O口模式
  122.            MOV P4M1,#000H
  123.            MOV P5M0,#00H    ;标准I/O口模式
  124.            MOV P5M1,#000H


  125.        MOV SP,#0E0H;设定堆栈底在RAM的0E0H

  126.         ;---------定时器T0初始化--------10毫秒@11.0592MHz
  127.         ANL AUXR,#7FH                ;定时器T0时钟12T模式
  128.         ANL TMOD,#0F0H                ;设置定时器模式
  129.         MOV TL0,#001H                ;设置定时初值 #001H
  130.         MOV TH0,#0DCH                ;设置定时初值 #0DCH
  131.         CLR TF0                        ;清除TF0标志
  132.         SETB TR0                ;定时器0开始计时
  133.         SETB ET0             ;允许T0中断

  134.     ;-------------------------

  135.         SETB EA            ;中断总开关


  136.       SETB SWSTA1   ;按键当前状态置1
  137.       SETB SWSTA2   ;按键当前状态置1
  138.       SETB SWSTA3   ;按键当前状态置1
  139.       SETB SWSTA4   ;按键当前状态置1
  140.       SETB SWSTA5   ;按键当前状态置1
  141.       SETB SWSTA6   ;按键当前状态置1
  142.       SETB SWSTA7   ;按键当前状态置1
  143.       SETB SWSTA8   ;按键当前状态置1

  144.       SETB SWUP1   ;按键前一次状态置1
  145.       SETB SWUP2   ;按键前一次状态置1
  146.       SETB SWUP3   ;按键前一次状态置1
  147.       SETB SWUP4   ;按键前一次状态置1
  148.       SETB SWUP5   ;按键前一次状态置1
  149.       SETB SWUP6   ;按键前一次状态置1
  150.       SETB SWUP7   ;按键前一次状态置1
  151.       SETB SWUP8   ;按键前一次状态置1



  152.   ;---------------------------------------



  153.          ;LCD1602初始化
  154.       MOV RAM1602,#000      ;清P2
  155.       LCALL DELAY15MS     ;延时15毫秒


  156.       MOV RAM1602,#38H             ;16行*2,5*8
  157.       LCALL ZL

  158.       LCALL DELAY5MS       ;延时5毫秒


  159.       MOV RAM1602,#38H             ;16行*2,5*8

  160.       LCALL ZL
  161.       LCALL DELAY5MS       ;延时5毫秒




  162.       MOV RAM1602,#08H         ;关显示
  163.       LCALL ZL
  164.       LCALL DELAY1MS       ;延时1毫秒


  165.       MOV RAM1602,#01H       ;清屏
  166.       LCALL ZL
  167.       LCALL DELAY5MS       ;延时5毫秒


  168.       MOV RAM1602,#06H       ;地址计数器AC自动加1,光标右移 *******
  169.       LCALL ZL     ;
  170.       LCALL DELAY1MS       ;延时1毫秒


  171.       MOV RAM1602,#0CH             ;开显示
  172.        LCALL ZL
  173.       LCALL DELAY1MS       ;延时1毫秒



  174.     ;-----------------------------------

  175.             MOV R0,#80H   ;给80H到09FH都置空格(20H)
  176.             MOV R1,#32    ;32个字符存储字节
  177.        CL2: MOV @R0,#20H
  178.             INC R0
  179.             DJNZ R1,CL2







  180. ;运行主程序



  181.       AA2: NOP


  182.            LCALL SWCL10        ;按键处理程序2

  183.            LCALL LCD_SC1     ;调用显示
  184.            LCALL SXCL1
  185.            LCALL T1JC1    ;调用T1计数
  186.            LCALL S1JC1   ;间歇计时
  187.            LCALL OUT1_1    ;输出
  188.            LCALL BUZ1   ;响铃
  189.            LJMP AA2





  190. ;------------------------------------------
  191.   ;T0定时器中断处理程序

  192.      T0INT:PUSH PSW;保护标志位中断现场保护--T0中断处理程序开始
  193.            PUSH A
  194.            INC TSRAM0;计数,11.0592MHZ,每10ms加一次
  195.            NOP
  196.            INC TSRAM1;时钟计数  11.0592MHZ,每10ms加一次
  197.            NOP
  198.            INC TSRAM2;*******备用****11.0592MHZ,每10ms加一次

  199.            LCALL SWIN1    ;按键扫描输入程序2
  200.            NOP

  201.           MOV A,TSRAM1

  202.           CJNE A,#010,AA3;  RAM的TSRAM1加到100MS就清空
  203.           MOV TSRAM1,#00H
  204.           INC TSRAM3;   每100Ms就加1

  205.           NOP


  206.       AA3:MOV A,TSRAM0
  207.           CJNE A,#010,AA4;TSRAM0加到100MS就清空(10)

  208.           MOV TSRAM0,#000
  209.           INC TSRAM4;每100Ms就加1


  210.      AA4:MOV A,TSRAM2
  211.          CJNE A,#100,AA5  ;TSRAM2加到1秒(100)就清空
  212.          MOV TSRAM2,#00
  213.          INC SS1   ;秒计时器加1

  214.           SETB F2     ;秒标志

  215.           INC TSRAM5
  216.           MOV A,TSRAM5
  217.           CJNE A,#60,AA5
  218.           MOV TSRAM5,#00H
  219.           SETB F3     ;分标志


  220.           NOP


  221.     AA5:POP A
  222.          POP PSW;恢复标志位中断现场保护
  223.          RETI


  224. ;--------------------------------------------------------




  225. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  226. DELAY60US:                        ;@11.0592MHz/STC15W**延时60微秒
  227.         NOP
  228.         NOP
  229.         NOP
  230.         NOP
  231.         NOP
  232.         MOV YSRAM1,#130
  233. NEXT2:
  234.         DJNZ YSRAM1,NEXT2
  235.         NOP

  236.         RET




  237. DELAY15MS:                        ;@11.0592MHz  15毫秒延时
  238.         NOP
  239.         NOP
  240.         NOP
  241.         NOP

  242.         MOV YSRAM1,#130
  243.         MOV YSRAM2,#18
  244. NEXT6:
  245.         DJNZ YSRAM2,NEXT6

  246.         DJNZ YSRAM1,NEXT6


  247.         RET


  248. DELAY5MS:                        ;@11.0592MHz  5毫秒延时
  249.         NOP
  250.         NOP

  251.         MOV YSRAM1,#44
  252.         MOV YSRAM2,#2
  253. NEXT7:
  254.         DJNZ YSRAM2,NEXT7
  255.         DJNZ YSRAM1,NEXT7

  256.         RET



  257. DELAY1MS:                        ;@11.0592MHz   1毫秒延时

  258.         MOV YSRAM1,#9
  259.         MOV YSRAM2,#150
  260. NEXT8:
  261.         DJNZ YSRAM2,NEXT8
  262.         DJNZ YSRAM1,NEXT8

  263.         RET


  264. DELAY50US:                        ;@11.0592MHz  50微秒延时
  265.         NOP
  266.         NOP

  267.         MOV YSRAM1,#107
  268. NEXT9:
  269.         DJNZ YSRAM1,NEXT9

  270.         RET



  271. DELAY20MS:                        ;@11.0592MHz  20毫秒延时
  272.         MOV YSRAM1,#173
  273.         MOV YSRAM2,#27
  274. NEXT11:
  275.         DJNZ YSRAM2,NEXT11
  276.         DJNZ YSRAM1,NEXT11

  277.         RET


  278.          ;显示这字符编码**************


  279.      SQB: DB   30H ; 0
  280.           DB   31H ; 1
  281.           DB   32H ; 2
  282.           DB   33H ; 3
  283.           DB   34H ; 4
  284.           DB   35H ; 5
  285.           DB   36H ; 6
  286.           DB   37H ; 7
  287.           DB   38H ; 8
  288.           DB   39H ; 9
  289.           DB   41H  ;A
  290.           DB   42H  ;B
  291.           DB   43H  ;C
  292.           DB   44H  ;D
  293.           DB   45H  ;E
  294.           DB   46H  ;F

  295.           DB   3AH  ; :
  296.           DB   2BH  ; +
  297.           DB   2DH  ; -
  298.           DB   2AH  ; *
  299.           DB   0FEH  ; ÷
  300.           DB   3DH  ; =
  301.           DB   0DFH  ; °
  302.           DB   7EH  ; →
  303.           DB   7FH  ; ←
  304.           DB   23H  ; #
  305.           DB   25H   ; %
  306.           DB   24H  ; $
  307.           DB   28H  ; (
  308.           DB   29H  ; )
  309.           DB   2FH  ; /
  310.           DB   3FH  ; ?



  311.           DB   20H  ;空格
  312.           DB   21H  ; !
  313.           DB   22H  ; "
  314.           DB   23H  ; #
  315.           DB   24H  ; $
  316.           DB   25H  ; %
  317.           DB   26H  ;  &
  318.           DB   27H  ;  '
  319.           DB   28H  ;  (
  320.           DB   29H   ; )
  321.           DB   2AH  ;  *
  322.           DB   2BH  ;  +
  323.           DB   2CH  ;  ,
  324.           DB   2DH  ;  -
  325.           DB   2EH  ;  .
  326.           DB   2FH  ;  /

  327.           DB   30H   ;  0
  328.           DB   31H   ;  1
  329.           DB   32H   ;  2
  330.           DB   33H  ;   3
  331.           DB   34H  ;   4
  332.           DB   35H   ;  5
  333.           DB   36H   ;  6
  334.           DB   37H   ;  7
  335.           DB   38H  ;   8
  336.           DB   39H  ;   9
  337.           DB   3AH   ;  :
  338.           DB   3BH  ;   ;
  339.           DB   3CH  ;   <
  340.           DB   3DH  ;   =
  341.           DB   3EH  ;   >
  342.           DB   3FH  ;   ?


  343.            DB 40H ; @
  344.            DB  41H  ;A
  345.            DB  42H ; B
  346.            DB  43H  ;C
  347.            DB  44H ; D
  348.            DB  45H ; E
  349.            DB  46H ; F
  350.            DB  47H ; G
  351.            DB  48H ; H
  352.            DB  49H ; I
  353.            DB  4AH ; J
  354.            DB  4BH ; K
  355.            DB  4CH ; L
  356.            DB  4DH ; M
  357.            DB  4EH ; N
  358.            DB  4FH ; O

  359.            DB 50H ; P
  360.            DB 51H ; Q
  361.            DB 52H  ;R
  362.            DB 53H ; S
  363.            DB 54H  ;T
  364.            DB 55H  ;U
  365.            DB 56H  ;V
  366.            DB 57H ; W
  367.            DB 58H ; X
  368.            DB 59H  ;Y
  369.            DB 5AH ; Z
  370.            DB 5BH ; [
  371.            DB 5CH  ;\
  372.            DB 5DH  ;]
  373.            DB 5EH ; ︿
  374.            DB 5FH  ;_


  375.            DB  60H ; `
  376.            DB  61H ; a
  377.            DB  62H ; b
  378.            DB  63H  ;c
  379.            DB  64H  ;d
  380.            DB  65H  ;e
  381.            DB  66H  ;f
  382.            DB  67H ; g
  383.            DB  68H  ;h
  384.            DB  69H ; i
  385.            DB  6AH ; j
  386.            DB  6BH ; k
  387.            DB  6CH ; l
  388.            DB  6DH ; m
  389.            DB  6EH ; n
  390.            DB  6FH ; o


  391.            DB  70H ; p
  392.            DB  71H ; q
  393.            DB  72H ; r
  394.            DB  73H  ;s
  395.            DB  74H ; t
  396.            DB  75H  ;u
  397.            DB  76H  ;v
  398.            DB  77H ; w
  399.            DB  78H ; x
  400.            DB  79H  ;y
  401.            DB  7AH  ;z
  402.            DB  7BH ; {
  403.            DB  7CH ; |
  404.            DB  7DH ; }
  405.            DB  7EH  ;→
  406.            DB  7FH  ;←

  407.            DB   00H  ;  自编字符
  408.            DB   01H  ;  自编字符
  409.            DB   02H  ;  自编字符
  410.            DB   03H  ;  自编字符
  411.            DB   04H  ;  自编字符
  412.            DB   05H  ;  自编字符
  413.            DB   06H  ;  自编字符
  414.            DB   07H  ;  自编字符




  415.     ;------------------------------------


  416.        ;**********LCD1602显示程序,16字*2行    **************************
  417.        ;第一行显示内容在RAM的80H到8FH,
  418.        ;第二行显示内容在RAM的90H到9FH

  419.        LCD_SC1: PUSH 00H ;保存R0的内容

  420.                 MOV RAM1602,#080H   ;第一行显示   &&&&&&&&
  421.                 LCALL ZL    ;调用指令输出     &&&&&&&&&

  422.                 MOV R0,#LCD1_1   ;内部显示RAM的首址 #80H
  423.                 MOV R2,#16   ;每行16字符的计数

  424.        LCD_SC2: MOV RAM1602,@R0    ;显示的内容送到缓冲
  425.                 LCALL LCD_SS1     ;调用字符代码转换

  426.                 LCALL SZ   ;调用显示数据输出

  427.                 DJNZ R2,LCD_SC3   ;计算是否输出16个字符

  428.                 MOV RAM1602,#0C0H   ;第二行显示
  429.                 LCALL ZL    ;调用指令输出
  430.                 MOV R2,#16  ;每行16字符的计数
  431.                 INC R0
  432.        LCD_SC4: MOV RAM1602,@R0  ;显示的内容送到缓冲
  433.                 LCALL LCD_SS1     ;调用字符代码转换

  434.                 LCALL SZ   ;调用显示数据输出

  435.                 DJNZ R2,LCD_SC5  ;计算是否输出16个字符

  436.                 POP 00H   ;恢复R0的数据

  437.                 RET


  438.        LCD_SC3:INC R0
  439.                LJMP LCD_SC2

  440.        LCD_SC5:INC R0
  441.                LJMP LCD_SC4




  442.      ;显示字符转换*****************

  443.     LCD_SS1: PUSH A      ;保护A的数据
  444.              PUSH 82H    ;DPTR低位
  445.              PUSH 83H    ;DPTR高位
  446.              MOV A,RAM1602
  447.              MOV DPTR,#SQB    ;字符集首址
  448.              MOVC A,@A+DPTR   ;获取字符编码
  449.              MOV RAM1602,A
  450.              POP 83H   ;DPTR高位
  451.              POP 82H   ;DPTR低位
  452.              POP A
  453.              RET     ;恢复A的数



  454. ;-----------------------------


  455. ;----------------------------------------
  456.         ;字符数据写入*******
  457.         ;
  458.          SZ:SETB LCD_RS   ;RS,数据

  459.             SETB LCD_EN   ;E
  460.             MOV F1,C   ;保护C
  461.             PUSH A
  462.             MOV A,RAM1602
  463.             MOV C,ACC.7
  464.             MOV LCD_D7,C

  465.             MOV C,ACC.6
  466.             MOV LCD_D6,C

  467.             MOV C,ACC.5
  468.             MOV LCD_D5,C

  469.             MOV C,ACC.4
  470.             MOV LCD_D4,C

  471.             MOV C,ACC.3
  472.             MOV LCD_D3,C

  473.             MOV C,ACC.2
  474.             MOV LCD_D2,C

  475.             MOV C,ACC.1
  476.             MOV LCD_D1,C

  477.             MOV C,ACC.0
  478.             MOV LCD_D0,C

  479.             MOV C,F1   ;恢复C
  480.             POP A

  481.             NOP
  482.             NOP
  483.             CLR LCD_EN    ;E,下降沿
  484.             LCALL DELAY50US       ;延时50微秒
  485.             RET
  486. ;---------------------------
  487.       ;指令写入/地址设置
  488.          ZL:CLR LCD_RS   ;RS,数据

  489.             SETB LCD_EN   ;E
  490.             MOV F1,C   ;保护C
  491.             PUSH A
  492.             MOV A,RAM1602
  493.             MOV C,ACC.7
  494.             MOV LCD_D7,C

  495.             MOV C,ACC.6
  496.             MOV LCD_D6,C

  497.             MOV C,ACC.5
  498.             MOV LCD_D5,C

  499.             MOV C,ACC.4
  500.             MOV LCD_D4,C

  501.             MOV C,ACC.3
  502.             MOV LCD_D3,C

  503.             MOV C,ACC.2
  504.             MOV LCD_D2,C

  505.             MOV C,ACC.1
  506.             MOV LCD_D1,C

  507.             MOV C,ACC.0
  508.             MOV LCD_D0,C
  509.             MOV 0FH,C

  510.             MOV C,F1   ;恢复C
  511.             POP A
  512.             NOP
  513.             NOP
  514.             CLR LCD_EN    ;E,下降沿
  515.             LCALL DELAY50US       ;延时50微秒
  516.             RET



  517.   ;_____________________________________


  518. ;时钟计时程序SJ1

  519.      SJ1:MOV A,SS1
  520.          CJNE A,#60,SJ2  ;返回  8888888888888888888888888
  521.          MOV SS1,#00
  522.          INC MM1
  523.          MOV A,MM1
  524.          CJNE A,#10,SJ2 ;返回
  525.          MOV MM1,#00
  526.          INC MM10
  527.          MOV A,MM10
  528.          CJNE A,#06,SJ2;返回
  529.          MOV MM10,#00

  530.          INC HH1        ;小时个位加1
  531.           MOV A,HH10    ;计算小时是否到24小时
  532.           MOV B,#10
  533.           MUL AB
  534.           ADD A,HH1
  535.           CJNE A,#24,SJ3
  536.           MOV HH1,#00
  537.           MOV HH10,#00

  538.       SJ3:MOV A,HH1
  539.          CJNE A,#10,SJ2
  540.          MOV HH1,#00
  541.          INC HH10


  542.       SJ2:MOV R0,#80H
  543.           MOV @R0,HH10   ;送时十位到显示

  544.           INC R0
  545.           MOV @R0,HH1  ; 送时个位到显示

  546.           INC R0
  547.           MOV @R0,#3AH   ;送时钟点:到显示

  548.           INC R0
  549.           MOV @R0,MM10   ;送分十位到显示

  550.           INC R0
  551.           MOV @R0,MM1   ;送分个位到显示

  552.           RET




  553. ;_____________________________________


  554.                           ;按键扫描输入程序2    @@@@@@@@@@@@@@@@@@@@@@@@@@@

  555.           SWIN1:
  556.                 MOV P3,#0FFH     ;把按键输入的P2口置1
  557.                CLR SWEN   ;按键选通线拉低
  558.                NOP
  559.         SWIN10:MOV A,SWBUF1
  560.                MOV C,PSW1
  561.                RLC A      ;把按键PSW移入
  562.                MOV SWBUF1,A
  563.                CJNE A,#00H,SWIN11
  564.                CLR SWSTA1
  565.                LJMP SWIN20    ;扫描下一个
  566.         SWIN11:CJNE A,#0FFH,SWIN12
  567.                SETB SWSTA1
  568.         SWIN12:LJMP SWIN20    ;扫描下一个

  569.         SWIN20:MOV A,SWBUF2
  570.                MOV C,PSW2
  571.                RLC A      ;把按键PSW移入
  572.                MOV SWBUF2,A
  573.                CJNE A,#00H,SWIN21
  574.                CLR SWSTA2
  575.                LJMP SWIN30    ;扫描下一个
  576.         SWIN21:CJNE A,#0FFH,SWIN22
  577.                SETB SWSTA2
  578.         SWIN22:LJMP SWIN30    ;扫描下一个


  579.         SWIN30:MOV A,SWBUF3
  580.                MOV C,PSW3
  581.                RLC A      ;把按键PSW移入
  582.                MOV SWBUF3,A
  583.                CJNE A,#00H,SWIN31
  584.                CLR SWSTA3
  585.                LJMP SWIN40    ;扫描下一个
  586.         SWIN31:CJNE A,#0FFH,SWIN32
  587.                SETB SWSTA3
  588.         SWIN32:LJMP SWIN40    ;扫描下一个


  589.         SWIN40:MOV A,SWBUF4
  590.                MOV C,PSW4
  591.                RLC A      ;把按键PSW移入
  592.                MOV SWBUF4,A
  593.                CJNE A,#00H,SWIN41
  594.                CLR SWSTA4
  595.                LJMP SWIN50    ;扫描下一个
  596.         SWIN41:CJNE A,#0FFH,SWIN42
  597.                SETB SWSTA4
  598.         SWIN42:LJMP SWIN50    ;扫描下一个


  599.         SWIN50:MOV A,SWBUF5
  600.                MOV C,PSW5
  601.                RLC A      ;把按键PSW移入
  602.                MOV SWBUF5,A
  603.                CJNE A,#00H,SWIN51
  604.                CLR SWSTA5
  605.                LJMP SWIN60    ;扫描下一个
  606.         SWIN51:CJNE A,#0FFH,SWIN52
  607.                SETB SWSTA5
  608.         SWIN52:LJMP SWIN60    ;扫描下一个


  609.         SWIN60:MOV A,SWBUF6
  610.                MOV C,PSW6
  611.                RLC A      ;把按键PSW移入
  612.                MOV SWBUF6,A
  613.                CJNE A,#00H,SWIN61
  614.                CLR SWSTA6
  615.                LJMP SWIN70    ;扫描下一个
  616.         SWIN61:CJNE A,#0FFH,SWIN62
  617.                SETB SWSTA6
  618.         SWIN62:LJMP SWIN70    ;扫描下一个


  619.         SWIN70:MOV A,SWBUF7
  620.                MOV C,PSW7
  621.                RLC A      ;把按键PSW移入
  622.                MOV SWBUF7,A
  623.                CJNE A,#00H,SWIN71
  624.                CLR SWSTA7
  625.                LJMP SWIN80    ;扫描下一个
  626.         SWIN71:CJNE A,#0FFH,SWIN72
  627.                SETB SWSTA7
  628.         SWIN72:LJMP SWIN80    ;扫描下一个


  629.        SWIN80:MOV A,SWBUF8
  630.                MOV C,PSW8
  631.                RLC A      ;把按键PSW移入
  632.                MOV SWBUF8,A
  633.                CJNE A,#00H,SWIN81
  634.                CLR SWSTA8
  635.                LJMP SWIN90    ;扫描下一个
  636.         SWIN81:CJNE A,#0FFH,SWIN82
  637.                SETB SWSTA8
  638.         SWIN82:LJMP SWIN90    ;扫描下一个




  639.        SWIN90: SETB SWEN   ;按键选通线拉高

  640.                 RET


  641.                            ;按键处理程序2 @@@@@@@@@@@@@@@@@@@@@@@@@


  642.           SWCL10:MOV A,#00         ;把SWSTAT和SWUP分别放到A和R2        按键1
  643.                 MOV R2,#00
  644.                 MOV C,SWSTA1
  645.                 MOV ACC.0,C
  646.                 MOV R2,A
  647.                 MOV A,#00
  648.                 MOV C,SWUP1
  649.                 MOV ACC.0,C
  650.                 XRL A,R2       ;两者异或比较
  651.                 MOV C,ACC.0
  652.                 JC SWCL11
  653.                 LJMP SWCL20   ;下一个
  654.          SWCL11:MOV C,SWSTA1
  655.                MOV SWUP1,C   ;保存当前状态到SWUP,作下次比较
  656.                JB SWSTA1,SWCL20     ;如果当前状态是0,那就作按键需要的处理
  657.                    ; $这个是按键需要处理结果&&&&&&&&&&&
  658.                LCALL KEYINC1   ;----------按键值加1,显示设置的位置右移-----


  659.         SWCL20:MOV A,#00         ;把SWSTAT和SWUP分别放到A和R2         按键2
  660.                 MOV R2,#00
  661.                 MOV C,SWSTA2
  662.                 MOV ACC.0,C
  663.                 MOV R2,A
  664.                 MOV A,#00
  665.                 MOV C,SWUP2
  666.                 MOV ACC.0,C
  667.                 XRL A,R2       ;两者异或比较
  668.                 MOV C,ACC.0
  669.                 JC SWCL21
  670.                 LJMP SWCL30   ;下一个
  671.          SWCL21:MOV C,SWSTA2
  672.                MOV SWUP2,C   ;保存当前状态到SWUP,作下次比较
  673.                JB SWSTA2,SWCL30     ;如果当前状态是0,那就作按键需要的处理
  674.                   ; $这个是按键需要处理结果&&&&&&&&&&&
  675.                LCALL KEYDEC1   ;---------按键值减1,显示设置的位置左移----------

  676.         SWCL30:MOV A,#00         ;把SWSTAT和SWUP分别放到A和R2        按键3
  677.                 MOV R2,#00
  678.                 MOV C,SWSTA3       ;*
  679.                 MOV ACC.0,C
  680.                 MOV R2,A
  681.                 MOV A,#00
  682.                 MOV C,SWUP3       ;*
  683.                 MOV ACC.0,C
  684.                 XRL A,R2       ;两者异或比较
  685.                 MOV C,ACC.0
  686.                 JC SWCL31        ;*
  687.                 LJMP SWCL40   ;下一个    ;*
  688.          SWCL31:MOV C,SWSTA3                                     ;*
  689.                MOV SWUP3,C   ;保存当前状态到SWUP,作下次比较     ;*
  690.                JB SWSTA3,SWCL40     ;如果当前状态是0,那就作按键需要的处理   ;*
  691.                    ; $这个是按键需要处理结果&&&&&&&&&&&
  692.                LCALL JCINC1     ;按键加数

  693.          SWCL40:MOV A,#00         ;把SWSTAT和SWUP分别放到A和R2       按键4
  694.                 MOV R2,#00
  695.                 MOV C,SWSTA4       ;*
  696.                 MOV ACC.0,C
  697.                 MOV R2,A
  698.                 MOV A,#00
  699.                 MOV C,SWUP4       ;*
  700.                 MOV ACC.0,C
  701.                 XRL A,R2       ;两者异或比较
  702.                 MOV C,ACC.0
  703.                 JC SWCL41        ;*
  704.                 LJMP SWCL50   ;下一个    ;*
  705.          SWCL41:MOV C,SWSTA4                                     ;*
  706.                MOV SWUP4,C   ;保存当前状态到SWUP,作下次比较     ;*
  707.                JB SWSTA4,SWCL50     ;如果当前状态是0,那就作按键需要的处理   ;*
  708.                                ; $这个是按键需要处理结果&&&&&&&&&&&
  709.                 LCALL CLR_STOP1 ;调用 取消/停止 操作


  710.         SWCL50:MOV A,#00         ;把SWSTAT和SWUP分别放到A和R2         按键5
  711.                 MOV R2,#00
  712.                 MOV C,SWSTA5       ;*
  713.                 MOV ACC.0,C
  714.                 MOV R2,A
  715.                 MOV A,#00
  716.                 MOV C,SWUP5       ;*
  717.                 MOV ACC.0,C
  718.                 XRL A,R2       ;两者异或比较
  719.                 MOV C,ACC.0
  720.                 JC SWCL51        ;*
  721.                 LJMP SWCL60   ;下一个    ;*
  722.          SWCL51:MOV C,SWSTA5                                     ;*
  723.                MOV SWUP5,C   ;保存当前状态到SWUP,作下次比较     ;*
  724.                JB SWSTA5,SWCL60     ;如果当前状态是0,那就作按键需要的处理   ;*

  725.               LCALL STAR_RUN1  ;调用开始运行操作


  726.        SWCL60:MOV A,#00         ;把SWSTAT和SWUP分别放到A和R2       按键6
  727.                 MOV R2,#00
  728.                 MOV C,SWSTA6       ;*
  729.                 MOV ACC.0,C
  730.                 MOV R2,A
  731.                 MOV A,#00
  732.                 MOV C,SWUP6       ;*
  733.                 MOV ACC.0,C
  734.                 XRL A,R2       ;两者异或比较
  735.                 MOV C,ACC.0
  736.                 JC SWCL61        ;*
  737.                 LJMP SWCL70   ;下一个    ;*
  738.          SWCL61:MOV C,SWSTA6                                     ;*
  739.                MOV SWUP6,C   ;保存当前状态到SWUP,作下次比较     ;*
  740.                JB SWSTA6,SWCL70     ;如果当前状态是0,那就作按键需要的处理   ;*
  741.                 LCALL STAR_MIN1   ; 调用小火操作,——这个是按键需要处理结果&&&&&&&&&&&

  742.         SWCL70:MOV A,#00         ;把SWSTAT和SWUP分别放到A和R2       按键7
  743.                 MOV R2,#00
  744.                 MOV C,SWSTA7       ;*
  745.                 MOV ACC.0,C
  746.                 MOV R2,A
  747.                 MOV A,#00
  748.                 MOV C,SWUP7       ;*
  749.                 MOV ACC.0,C
  750.                 XRL A,R2       ;两者异或比较
  751.                 MOV C,ACC.0
  752.                 JC SWCL71        ;*
  753.                 LJMP SWCL80   ;下一个    ;*
  754.          SWCL71:MOV C,SWSTA7                                     ;*
  755.                MOV SWUP7,C   ;保存当前状态到SWUP,作下次比较     ;*
  756.                JB SWSTA7,SWCL80     ;如果当前状态是0,那就作按键需要的处理   ;*
  757.                  ;$这个是按键需要处理结果&&&&&&&&&&&

  758.         SWCL80:MOV A,#00         ;把SWSTAT和SWUP分别放到A和R2          按键8
  759.                 MOV R2,#00
  760.                 MOV C,SWSTA8       ;*
  761.                 MOV ACC.0,C
  762.                 MOV R2,A
  763.                 MOV A,#00
  764.                 MOV C,SWUP8       ;*
  765.                 MOV ACC.0,C
  766.                 XRL A,R2       ;两者异或比较
  767.                 MOV C,ACC.0
  768.                 JC SWCL81        ;*
  769.                 LJMP SWCL90   ;下一个    ;*
  770.          SWCL81:MOV C,SWSTA8                                     ;*
  771.                MOV SWUP8,C   ;保存当前状态到SWUP,作下次比较     ;*
  772.                JB SWSTA8,SWCL90     ;如果当前状态是0,那就作按键需要的处理   ;*
  773.                   ; $这个是按键需要处理结果&&&&&&&&&&&


  774.        SWCL90:RET         ;全部处理完


  775.    ;-------------


  776.              KEYINC1:INC SWJC
  777.                     MOV A,SWJC
  778.                     CJNE A,#11,KEYINC2
  779.                     MOV SWJC,#00
  780.              KEYINC2:RET

  781.              KEYDEC1:MOV A,SWJC
  782.                      JZ KEYDEC2
  783.                      DEC SWJC
  784.                      LJMP KEYDEC3
  785.              KEYDEC2:MOV SWJC,#10
  786.              KEYDEC3:RET





  787.             T1JC10:INC T1_1
  788.                   MOV A,T1_1
  789.                   CJNE A,#10,T1JC11
  790.                   MOV T1_1,#00
  791.             T1JC11:RET


  792.             T1JC20:INC T1_2
  793.                   MOV A,T1_2
  794.                   CJNE A,#10,T1JC21
  795.                   MOV T1_2,#00
  796.             T1JC21:RET


  797.             T1JC30:INC T1_3
  798.                   MOV A,T1_3
  799.                   CJNE A,#2,T1JC31
  800.                   MOV T1_3,#00
  801.             T1JC31:RET
  802.              ;---------------------------
  803.              T2JC10:INC T2_1
  804.                   MOV A,T2_1
  805.                   CJNE A,#10,T2JC11
  806.                   MOV T2_1,#00
  807.             T2JC11:RET


  808.             T2JC20:INC T2_2
  809.                   MOV A,T2_2
  810.                   CJNE A,#10,T2JC21
  811.                   MOV T2_2,#00
  812.             T2JC21:RET


  813.             T2JC30:INC T2_3
  814.                   MOV A,T2_3
  815.                   CJNE A,#2,T2JC31
  816.                   MOV T2_3,#00
  817.             T2JC31:RET
  818.               ;----------------------------------
  819.             S1JC10:INC S1_1
  820.                    MOV A,S1_1
  821.                    CJNE A,#10,S1JC11
  822.                    MOV S1_1,#00
  823.            S1JC11:RET

  824.           S1JC20:INC S1_2
  825.                    MOV A,S1_2
  826.                    CJNE A,#10,S1JC21
  827.                    MOV S1_2,#00
  828.            S1JC21:RET

  829.              ;----------------------------------
  830.             S2JC10:INC S2_1
  831.                    MOV A,S2_1
  832.                    CJNE A,#10,S2JC11
  833.                    MOV S2_1,#00
  834.            S2JC11:RET

  835.           S2JC20:INC S2_2
  836.                    MOV A,S2_2
  837.                    CJNE A,#10,S2JC21
  838.                    MOV S2_2,#00
  839.            S2JC21:RET





  840.             JCINC1:MOV A,SWJC
  841.                    CJNE A,#1,JCINC2
  842.                    LJMP T1JC30
  843.             JCINC2:MOV A,SWJC
  844.                    CJNE A,#2,JCINC3
  845.                    LJMP T1JC20
  846.             JCINC3:MOV A,SWJC
  847.                    CJNE A,#3,JCINC4
  848.                    LJMP T1JC10

  849.                   ;-------
  850.            JCINC4:MOV A,SWJC
  851.                    CJNE A,#4,JCINC5
  852.                    LJMP T2JC30
  853.             JCINC5:MOV A,SWJC
  854.                    CJNE A,#5,JCINC6
  855.                    LJMP T2JC20
  856.              JCINC6:MOV A,SWJC
  857.                    CJNE A,#6,JCINC7
  858.                    LJMP T2JC10
  859.                    ;-------------
  860.              JCINC7:MOV A,SWJC
  861.                    CJNE A,#7,JCINC8
  862.                    LJMP S1JC20
  863.             JCINC8:MOV A,SWJC
  864.                    CJNE A,#8,JCINC9
  865.                    LJMP S1JC10
  866.             JCINC9:MOV A,SWJC
  867.                    CJNE A,#9,JCINC10
  868.                    LJMP S2JC20
  869.             JCINC10:MOV A,SWJC
  870.                    CJNE A,#10,JCINC11
  871.                    LJMP S2JC10
  872.             JCINC11:RET





  873.      ;------------显示处理程序,包括设置位闪烁


  874.             SXCL1:MOV R0,#80H
  875.                   INC R0
  876.                   MOV @R0,#54H   ;显示T
  877.                   INC R0
  878.                   MOV @R0,#31H   ;显示1
  879.                   INC R0
  880.                   MOV @R0,#7EH   ;显示>
  881.                   INC R0
  882.                   MOV @R0,T1_3   ;显示T1_3    ;地址位置84H
  883.                   INC R0
  884.                   MOV @R0,T1_2   ;显示T1_2    ;地址位置85H
  885.                   INC R0
  886.                   MOV @R0,T1_1   ;显示T1_1    ;地址位置86H
  887.                   INC R0     ;跳过空格
  888.                   INC R0
  889.                   MOV @R0,#26H   ;显示&
  890.                   INC R0     ;跳过空格
  891.                   INC R0
  892.                   MOV @R0,#54H   ;显示T
  893.                   INC R0
  894.                   MOV @R0,#32H   ;显示2
  895.                   INC R0
  896.                   MOV @R0,#7EH   ;显示>
  897.                   INC R0
  898.                   MOV @R0,T2_3   ;显示T2_3     ;地址位置8DH
  899.                   INC R0
  900.                   MOV @R0,T2_2   ;显示T2_2      ;地址位置8EH
  901.                   INC R0
  902.                   MOV @R0,T2_1   ;显示T2_1       ;地址位置8FH
  903.                   ;----第二行
  904.                   INC R0
  905.                   ;MOV @R0,SWJC       ;这条用于显示设置键次数(设置位置)
  906.                   INC R0
  907.                   INC R0
  908.                   INC R0
  909.                   MOV @R0,#73H   ;显示S
  910.                   INC R0
  911.                   MOV @R0,#31H   ;显示1       ;地址位置94H
  912.                   INC R0
  913.                   MOV @R0,#7EH   ;显示>
  914.                   INC R0
  915.                   MOV @R0,S1_2   ;显示S1_2    ;地址位置96H
  916.                   INC R0
  917.                   MOV @R0,S1_1   ;显示S1_1     ;地址位置97H
  918.                   INC R0      ;跳过空格
  919.                   INC R0
  920.                   MOV @R0,#26H   ;显示&
  921.                   INC R0     ;跳过空格
  922.                   INC R0
  923.                   MOV @R0,#73H   ;显示S
  924.                   INC R0
  925.                   MOV @R0,#32H   ;显示2
  926.                   INC R0
  927.                   MOV @R0,#7EH   ;显示>
  928.                   INC R0
  929.                   MOV @R0,S2_2   ;显示S2_2       ;地址位置9EH
  930.                   INC R0
  931.                   MOV @R0,S2_1   ;显示S2_1      ;地址位置9FH
  932.                   LCALL LCD_SL         ;闪烁显示----设置用-----
  933.                   RET


  934.                    ;闪烁显示----设置用-----
  935.             ;TSRAM2为秒计时器
  936.             ;大于0.7秒就给指定位填上空格



  937.              LCD_SL:PUSH A
  938.                     PUSH PSW

  939.                     MOV A,SWJC
  940.                    JZ LCD_SLX     ;A为0就退出,也就是没有按键按下
  941.                    MOV A,TSRAM2
  942.                    SUBB A,#70
  943.                    JNC LCD_SL_1
  944.            LCD_SLX:POP PSW
  945.                    POP A
  946.                     RET
  947.           LCD_SL_1:MOV A,SWJC    ;按键计数值对应闪烁位置
  948.                    CJNE A,#1,LCD_SL_2
  949.                    MOV R0,#84H    ;LCD缓冲区对应位的地址
  950.            LCD_SLX2:MOV @R0,#20H     ;给该位放上空格
  951.                    POP PSW
  952.                    POP A

  953.                     RET
  954.            LCD_SL_2:MOV A,SWJC    ;按键计数值对应闪烁位置
  955.                    CJNE A,#2,LCD_SL_3
  956.                    MOV R0,#85H    ;LCD缓冲区对应位的地址
  957.                    LJMP LCD_SLX2

  958.            LCD_SL_3:MOV A,SWJC    ;按键计数值对应闪烁位置
  959.                    CJNE A,#3,LCD_SL_4
  960.                    MOV R0,#86H    ;LCD缓冲区对应位的地址
  961.                    LJMP LCD_SLX2

  962.           LCD_SL_4:MOV A,SWJC    ;按键计数值对应闪烁位置
  963.                    CJNE A,#4,LCD_SL_5
  964.                    MOV R0,#8DH    ;LCD缓冲区对应位的地址
  965.                    LJMP LCD_SLX2
  966.           LCD_SL_5:MOV A,SWJC    ;按键计数值对应闪烁位置
  967.                    CJNE A,#5,LCD_SL_6
  968.                    MOV R0,#8EH    ;LCD缓冲区对应位的地址
  969.                    LJMP LCD_SLX2
  970.           LCD_SL_6:MOV A,SWJC    ;按键计数值对应闪烁位置
  971.                    CJNE A,#6,LCD_SL_7
  972.                    MOV R0,#8FH    ;LCD缓冲区对应位的地址
  973.                    LJMP LCD_SLX2
  974.           LCD_SL_7:MOV A,SWJC    ;按键计数值对应闪烁位置
  975.                    CJNE A,#7,LCD_SL_8
  976.                    MOV R0,#96H    ;LCD缓冲区对应位的地址
  977.                    LJMP LCD_SLX2
  978.           LCD_SL_8:MOV A,SWJC    ;按键计数值对应闪烁位置
  979.                    CJNE A,#8,LCD_SL_9
  980.                    MOV R0,#97H    ;LCD缓冲区对应位的地址
  981.                    LJMP LCD_SLX2
  982.           LCD_SL_9:MOV A,SWJC    ;按键计数值对应闪烁位置
  983.                    CJNE A,#9,LCD_SL_10
  984.                    MOV R0,#9EH    ;LCD缓冲区对应位的地址
  985.                    LJMP LCD_SLX2
  986.           LCD_SL_10:MOV A,SWJC    ;按键计数值对应闪烁位置
  987.                    CJNE A,#10,LCD_SLX
  988.                    MOV R0,#9FH    ;LCD缓冲区对应位的地址
  989.                    LJMP LCD_SLX2



  990.          ;-------倒计时 T1
  991.           ; T1_1 个位, T1_2 十位 , T1_3百位


  992.            T1JC1:JNB F3,T1JC4
  993.                  CLR F3
  994.                  MOV A,SWJC
  995.                  JNZ T1JC4

  996.            T1JC2:JB F4,T1JC7
  997.                  MOV A,T1_1     ;先检查是否全部为0
  998.                  ORL A,T1_2
  999.                  ORL A,T1_3
  1000.                  ORL A,T2_1     ;先检查是否全部为0
  1001.                  ORL A,T2_2
  1002.                  ORL A,T2_3
  1003.                  JZ T1JC4       ;如果都为0,那就是没有计数任务

  1004.                  SETB F4       ;置标志位作输出用

  1005.           T1JC7:MOV A,T1_1     ;再检查T1是否为0
  1006.                  ORL A,T1_2
  1007.                  ORL A,T1_3
  1008.                  JZ T2JC1             ;此时T1为0就转到T2倒计数

  1009.           T1JC3:MOV A,T1_3      ;此时T1不为0就转到T1倒计数
  1010.                  MOV B,#100
  1011.                  MUL AB
  1012.                  MOV R2,A
  1013.                  MOV A,T1_2
  1014.                  MOV B,#10
  1015.                  MUL AB
  1016.                  ADD A,R2
  1017.                  ADD A,T1_1
  1018.                  DEC A
  1019.                  MOV R2,A
  1020.                  MOV B,#100
  1021.                  DIV AB
  1022.                  MOV T1_3,A
  1023.                  MOV A,B
  1024.                  MOV B,#10
  1025.                  DIV AB
  1026.                  MOV T1_2,A
  1027.                  MOV T1_1,B
  1028.                  MOV A,R2
  1029.                  JZ T1JC5
  1030.            T1JC4:RET

  1031.            T1JC5:MOV A,T2_1     ;先检查T2是否为0
  1032.                  ORL A,T2_2
  1033.                  ORL A,T2_3
  1034.                  JZ T1JC6    ;T1计数完后检查T2如果是0,那就停止输出
  1035.                  SETB F5     ;T1计数完后检查T2如果有数值,那置F5用于间歇计时
  1036.                  RET
  1037.            T1JC6:CLR F4   ;清标志位停止输出
  1038.                  CLR F5

  1039.                  MOV S1_1,S1_1A   ;把数值恢复,用于下一轮计时
  1040.                  MOV S1_2,S1_2A
  1041.                  MOV S2_1,S2_1A
  1042.                  MOV S2_2,S2_2A
  1043.                  SETB F9   ;报警输出

  1044.                  RET
  1045.            T2JC1:SETB F5  ;F5置位,用于后面的歇计时

  1046.                  MOV A,T2_3      ;T2计数
  1047.                  MOV B,#100
  1048.                  MUL AB
  1049.                  MOV R2,A
  1050.                  MOV A,T2_2
  1051.                  MOV B,#10
  1052.                  MUL AB
  1053.                  ADD A,R2
  1054.                  ADD A,T2_1
  1055.                  DEC A
  1056.                  MOV R2,A
  1057.                  MOV B,#100
  1058.                  DIV AB
  1059.                  MOV T2_3,A
  1060.                  MOV A,B
  1061.                  MOV B,#10
  1062.                  DIV AB
  1063.                  MOV T2_2,A
  1064.                  MOV T2_1,B
  1065.                  MOV A,R2
  1066.                  JZ T1JC6
  1067.                  RET

  1068.            ;------间歇计时S1JC

  1069.            S1JC1:JNB F5,S1JC8

  1070.                  JNB F2,S1JC8
  1071.                  CLR F2
  1072.                  MOV A,SWJC
  1073.                  JNZ S1JC8
  1074.            S1JC2:JB F6,S1JC4   ;如果标志F6此前已经置位,那说明已经开始了计时,如果还未置位,那就置位开始
  1075.                  MOV S1_1A,S1_1   ;把数值保存起来,用于下一轮重新加载
  1076.                  MOV S1_2A,S1_2
  1077.                  MOV S2_1A,S2_1
  1078.                  MOV S2_2A,S2_2
  1079.                  SETB F6     ;正在计时标志位
  1080.                  SETB F7     ;间歇翻转标志位
  1081.            S1JC3:MOV A,S1_1
  1082.                  ORL A,S1_2
  1083.                  JZ S1JC6   ;如果设置了S1为0,那退出,输出也就0

  1084.            S1JC4:JNB F7,S2JC1
  1085.                  MOV A,S1_2
  1086.                  MOV B,#10
  1087.                  MUL AB
  1088.                  ADD A,S1_1
  1089.                  DEC A
  1090.                  MOV R3,A
  1091.                  MOV B,#10
  1092.                  DIV AB
  1093.                  MOV S1_2,A
  1094.                  MOV S1_1,B
  1095.                  MOV A,R3
  1096.                  JZ S1JC5
  1097.                  RET
  1098.            S1JC5:CLR F7

  1099.                  MOV S1_1,S1_1A   ;重新加载S1
  1100.                  MOV S1_2,S1_2A

  1101.            S2JC1:MOV A,S2_2
  1102.                  MOV B,#10
  1103.                  MUL AB
  1104.                  ADD A,S2_1
  1105.                  DEC A
  1106.                  MOV R3,A
  1107.                  MOV B,#10
  1108.                  DIV AB
  1109.                  MOV S2_2,A
  1110.                  MOV S2_1,B
  1111.                  MOV A,R3
  1112.                  JZ S2JC2
  1113.                  RET
  1114.             S2JC2:SETB F7

  1115.                   MOV S2_1,S2_1A
  1116.                   MOV S2_2,S2_2A
  1117.                   RET

  1118.             S1JC6:CLR F6
  1119.                   CLR F7
  1120.             S1JC8:RET

  1121.             ;-----第1路输出

  1122.            OUT1_1:MOV C,F4
  1123.                 ANL C,F7
  1124.                 CPL C
  1125.                 MOV OUT1,C
  1126.                 RET

  1127.            ;----取消/停止 按键处理

  1128.            CLR_STOP1:MOV T1_1,#00  ; 清除计时数值
  1129.                      MOV T1_2,#00
  1130.                      MOV T1_3,#00
  1131.                      MOV T2_1,#00
  1132.                      MOV T2_2,#00
  1133.                      MOV T2_3,#00
  1134.                      MOV SWJC,#00
  1135.                     CLR  F4  ; 输出控制
  1136.                     CLR  F6  ;   间歇正在计时标志位
  1137.                     CLR  F7     ;间歇翻转标志位
  1138.                     CLR  F5
  1139.                     MOV S1_1,S1_1A   ;把数值恢复,用于下一轮计时
  1140.                     MOV S1_2,S1_2A
  1141.                     MOV S2_1,S2_1A
  1142.                     MOV S2_2,S2_2A
  1143.                     RET

  1144.           ;---开始运行操作---

  1145.            STAR_RUN1: MOV SWJC,#00;    清按键计数,开始倒计时
  1146.                MOV A,T1_1     ;先检查是否全部为0
  1147.                  ORL A,T1_2
  1148.                  ORL A,T1_3
  1149.                  JNZ STAR_RUN2
  1150.                  ORL A,T2_1
  1151.                  ORL A,T2_2
  1152.                  ORL A,T2_3
  1153.                  JZ STAR_RUN3
  1154.                  SETB F5     ;如果只有T2有数值那就置F5用于间歇计数
  1155.           STAR_RUN2:SETB F4        ; 如果不为0,那就接通输出
  1156.                    SETB F7           ;间歇翻转标志位
  1157.                    CLR F6          ; 间歇正在计时标志位

  1158.           STAR_RUN3:RET


  1159.           ;-----直接进入小火操作-----

  1160.            STAR_MIN1:MOV SWJC,#00;    清按键计数,开始倒计时
  1161.                      MOV A,T2_1     ;先检查是否全部为0
  1162.                      ORL A,T2_2
  1163.                      ORL A,T2_3
  1164.                      JNZ STAR_MIN2
  1165.                      RET
  1166.            STAR_MIN2:MOV T1_1,#00  ; 清除T1计时数值
  1167.                      MOV T1_2,#00
  1168.                      MOV T1_3,#00
  1169.                      SETB F5     ;置F5用于后面S1,S2间歇计数
  1170.                      SETB F7           ;间歇翻转标志位
  1171.                      SETB F4        ; 接通输出

  1172.                      RET


  1173.            ;报警响声输出

  1174.            BUZ1:JNB F9,BUZ10

  1175.                 JB F8,BUZ2

  1176.                 SETB F8 ;标志已经开始输出计时
  1177.                 MOV TSRAM2,#00
  1178.                 MOV BUZRAM,#5    ;响铃3秒
  1179.                 CLR BUZ   ;接通响铃
  1180.           BUZ2:JNB F2,BUZ10
  1181.                CLR F2
  1182.                DEC BUZRAM
  1183.                MOV A,BUZRAM
  1184.                JNZ BUZ10
  1185.                SETB BUZ  ;响铃时间已经完,关铃声
  1186.                CLR F9
  1187.                CLR F8
  1188.           BUZ10:RET
复制代码




3154d68b59653bbfdf343cebb0e2180.jpg

这张图片是后期做的第二版,与上面的电路图略有不同,多了一个继电器,按键位置改了一位。其他功能完全一样。

功能说明: T1时间是开始烧沸水的时间,是分钟  ,T1的时间走完后就转到T2,T2是慢火时间,也是分钟, T2计数期间内---  s1是接通时间(秒),走完后转到s2,   s2是断开时间(秒),走完后再转到s1, 反复间歇通断,  直到T2走完,跟着完全断电。


17楼提供电路PCB及程序下载:

打赏

参与人数 9家元 +150 收起 理由
suhui + 5 優秀文章
杨雪飞 + 20 原創內容
东成西就 + 20
jf201006 + 20 優秀文章
kkdkj + 20 謝謝分享
xiaoxuanfeng + 20 謝謝分享
ch104517745 + 20
兔包公 + 20 就服汇编
tulips + 5 優秀文章,会汇编程序的都是技术能手!.

查看全部打赏

发表于 2021-9-12 00:16:45 | 显示全部楼层
厉害,这个功能加的不错。

能玩汇编的人玩C语言不是小菜一碟? :praise:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-12 00:40:00 | 显示全部楼层
tulips 发表于 2021-9-12 00:16
厉害,这个功能加的不错。

能玩汇编的人玩C语言不是小菜一碟?

再学C语言也不容易,年纪大了啊。:cry:
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-12 07:50:18 来自手机浏览器 | 显示全部楼层
这个定时器是接在插座上的吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-12 07:57:51 来自手机浏览器 | 显示全部楼层
wfzdm 发表于 2021-9-12 07:50
这个定时器是接在插座上的吗

另外加一插座,继电器触点接在插座的开关上。
这电路的5v电源用旧手机充电头。
回复 支持 反对

使用道具 举报

发表于 2021-9-12 16:00:15 | 显示全部楼层
本帖最后由 junyee 于 2021-9-12 16:02 编辑
tulips 发表于 2021-9-12 00:16
厉害,这个功能加的不错。

能玩汇编的人玩C语言不是小菜一碟?

也不一定.
汇编论语法来说比c要简单,但是助记符(指令集)太多,51/pic 等8位还好,ARM 32位单片机用汇编的人就少多了.

c是和汇编最接近的语言,但不代表懂c的人就懂汇编,懂汇编的就懂c. 还是要通过编译器来翻译.编程思想还有是区别的.

学一学汇编是有好处的,汇编能让每一个字节内存不被浪费,而c就做不到.c的优化看写代码者水平和编译器心情.

c写的代码可以转换为asm,而 asm不一定能翻译成c.




回复 支持 2 反对 0

使用道具 举报

发表于 2021-9-12 17:25:40 | 显示全部楼层
junyee 发表于 2021-9-12 16:00
也不一定.
汇编论语法来说比c要简单,但是助记符(指令集)太多,51/pic 等8位还好,ARM 32位单片机用汇编 ...

我现在用c写也是以前汇编的思路,但是现在竟然汇编不会了。。:mad:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-12 18:34:37 来自手机浏览器 | 显示全部楼层
1588858 发表于 2021-9-12 17:25
我现在用c写也是以前汇编的思路,但是现在竟然汇编不会了。。

我学和用PLC大概两年多,在去年中期暂停到现在,今天因工作需要翻出去年自己编写的一个控制程序,一个只有十几行的简单程序,今天竟然忘记了其中几行的意思,想了半小时才理解大概。
回复 支持 反对

使用道具 举报

发表于 2021-9-12 20:14:10 | 显示全部楼层
很佩服楼主的汇编功力,惭愧的是我学习汇编闲置10年后竟然毫无所余,开始玩单片机的时候又重新学习的C而且至今又10年了也没能真正入门。
回复 支持 反对

使用道具 举报

发表于 2021-9-13 11:55:09 | 显示全部楼层
这张图片是后期做的第二版,与上面的电路图略有不同,多了一个继电器,按键位置改了一位。其他功能完全一样:doubt::doubt::doubt:电路图不更新一下?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-14 08:44:22 来自手机浏览器 | 显示全部楼层
long2012 发表于 2021-9-13 11:55
这张图片是后期做的第二版,与上面的电路图略有不同,多了一个继电器,按键位置改了一位。其他功能完全一样 ...

1楼那图的第一版挺好的,很实用,做好后就送同学了,我没焊接第二个,所有没有实物图片了。
跟着我改了下电路重新画板,增加一个继电器,减少一个按键。  程序只是把端口的定义改了几句,其他没变。
回复 支持 反对

使用道具 举报

发表于 2021-9-14 21:29:39 | 显示全部楼层
仅仅是一个定时器吗?感觉有点浪费单片机了,加入传感器,引入防溢功能,煲粥、煲汤更方便
回复 支持 反对

使用道具 举报

发表于 2021-9-14 22:40:55 | 显示全部楼层
汇编,一直没入门的路过。。。:mad:
回复 支持 反对

使用道具 举报

发表于 2021-9-17 16:20:06 | 显示全部楼层
看起来挺实用的,楼主能否上传一下电路图和PCB,方便大家仿制。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-17 17:25:01 来自手机浏览器 | 显示全部楼层
zidian 发表于 2021-9-17 16:20
看起来挺实用的,楼主能否上传一下电路图和PCB,方便大家仿制。

可以,明晚或后晚吧,这两天在外面。
回复 支持 反对

使用道具 举报

发表于 2021-9-18 14:23:05 | 显示全部楼层
全民学编程。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-18 19:05:12 | 显示全部楼层
本帖最后由 广东梁百万 于 2021-9-18 22:41 编辑
zidian 发表于 2021-9-17 16:20
看起来挺实用的,楼主能否上传一下电路图和PCB,方便大家仿制。



已经上传,
文件说明:文件夹里有三个JSON文件,要用立创EDA打开,这三个文件有一个是原理图,两个是PCB图,这两个PCB图其中一个是已经铺铜,另一个没有铺铜。
               程序文件有AMS汇编文件,下载用的HEX和BIN文件。
电路说明:这电路原设计不止于这个定时器,所以电路上有一些相对这个定时器来说是多余的元件,如4脚的电位器(在这电路无需要用),5. 6
脚的晶振(在这电路无需要用),程序上原本也有一些不是本电路用的代码和定义,但这程序里没有运行到。

666.JPG


stc8g1k17 LCD1602-电饭煲间歇定时器_2021-09-18_18-54-10.rar (200.29 KB, 下载次数: 14)

打赏

参与人数 1家元 +5 收起 理由
zidian + 5 熱心會員

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-9-18 21:44:15 | 显示全部楼层
为咗饮滚火靓汤,不如夫人落厨:lol:
回复 支持 反对

使用道具 举报

发表于 2021-9-21 09:50:34 | 显示全部楼层
我汇编只能看懂,不会写复杂工程,缺乏对应的编程思想。
回复 支持 反对

使用道具 举报

发表于 2021-9-21 20:23:03 来自手机浏览器 | 显示全部楼层
会写汇编语言程序的感觉都很厉害
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-28 21:57 , Processed in 0.171601 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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