📄 no3b.lst
字号:
000021 924f push r4
000022 930f push r16
000023 931f push r17
000024 932f push r18
000025 933f push r19
000026 937f push r23
000027 938f push r24
000028 93cf push r28
000029 93df push r29
00002a b72f in r18,SREG ;保存状态寄存器
00002b 2733 clr r19
00002c 995c lp00: sbic usr,4 ;低电平跳行,高电平帧错误
00002d c001 rjmp lp01
00002e c004 rjmp lp02
00002f 9533 lp01: inc r19
000030 3f3f cpi r19,$ff
000031 f0f9 breq qt
000032 cff9 rjmp lp00
000033 b11c lp02: in r17,udr ;读串口数据到r17
000034 e0d1 ldi r29,$01
000035 e5c8 ldi r28,$58 ;SRAM中站号地址
000036 8108 ld r16,y
000037 1310 cpse r17,r16 ;是本站则跳行执行
000038 c018 rjmp qt ;非本站,退出通讯中断
000039 9b5d lp03: sbis usr,5 ;测试USR第5位发送寄存器是否空
00003a cffe rjmp lp03
00003b b90c out udr,r16 ;是本站,请求发送第二次指令数据
00003c 2733 clr r19
00003d 995c lp04: sbic usr,4 ;低电平跳行,高电平帧错误
00003e c001 rjmp lp05
00003f c004 rjmp lp06
000040 9533 lp05: inc r19
000041 3f3f cpi r19,$ff
000042 f071 breq qt
000043 cff9 rjmp lp04
000044 b11c lp06: in r17,udr ;读串口数据到r17
000045 3f1f cpi r17,$ff ;第二次指令数据处理
000046 f419 brne lp07
000047 d015 rcall txdata ;FF指令为上传数据
000048 d014 rcall txdata
000049 c007 rjmp qt
00004a 3f1e lp07: cpi r17,$fe
00004b f411 brne lp08
00004c d021 rcall zxml ;FE指令为执行命令
00004d c003 rjmp qt
00004e 3f1d lp08: cpi r17,$fd
00004f f409 brne qt
000050 d02f rcall xgml ;FD指令为修改参数
000051 bf2f qt: out sreg,r18 ;退出通讯中断
000052 91df pop r29
000053 91cf pop r28
000054 918f pop r24
000055 917f pop r23
000056 913f pop r19
000057 912f pop r18
000058 911f pop r17
000059 910f pop r16
00005a 904f pop r4
00005b 903f pop r3
00005c 9518 reti
00005d e0d1 txdata: ldi r29,$01 ;发送数据
00005e e0c0 ldi r28,$00
00005f 9109 lp09: ld r16,y+
000060 9b5d lp10: sbis usr,5 ;测试USR第5位发送寄存器是否空
000061 cffe rjmp lp10
000062 b90c out udr,r16 ;发送数据
000063 35cd cpi r28,$5D
000064 f7d1 brne lp09
000065 9b5d lp11: sbis usr,5 ;测试USR第5位发送寄存器是否空
000066 cffe rjmp lp11
000067 ef0f ldi r16,$ff ;上传数据结束符号FF
000068 b90c out udr,r16
000069 9b5d lp12: sbis usr,5 ;测试USR第5位发送寄存器是否空
00006a cffe rjmp lp12
00006b ef0f ldi r16,$ff ;上传数据结束符号FF
00006c b90c out udr,r16
00006d 9508 ret
00006e 2733 zxml: clr r19 ;执行命令
00006f 9b5f lp13: sbis usr,7 ;测试接收寄存器是否为空
000070 c001 rjmp lp14
000071 c004 rjmp lp15
000072 9533 lp14: inc r19
000073 3f3f cpi r19,$ff
000074 f2e1 breq qt
000075 cff9 rjmp lp13 ;低电平为空
000076 2733 lp15: clr r19
000077 995c lp16: sbic usr,4 ;测试帧是否正确
000078 c001 rjmp lp17
000079 c004 rjmp lp18
00007a 9533 lp17: inc r19
00007b 3f3f cpi r19,$ff
00007c f2a1 breq qt
00007d cff9 rjmp lp16 ;帧错误为高电平
00007e b11c lp18: in r17,udr
00007f 9508 ret
000080 e0d1 xgml: ldi r29,$01 ;修改参数子程序
000081 e6c0 ldi r28,$60
000082 2733 clr r19
000083 9b5f lp19: sbis usr,7 ;测试接收寄存器是否为空
000084 c001 rjmp lp20
000085 c004 rjmp lp21
000086 9533 lp20: inc r19
000087 3f3f cpi r19,$ff
000088 f241 breq qt
000089 cff9 rjmp lp19 ;低电平为空
00008a b11c lp21: in r17,udr
00008b 9319 st y+,r17
00008c 39ca cpi r28,$9A ;接收参数29*2=58个
00008d f7a9 brne lp19
00008e e6c0 ldi r28,$60
00008f 8d1d lp22: ldd r17,y+29 ;第一次参数
000090 9109 ld r16,y+ ;第二次参数
000091 1310 cpse r17,r16
000092 c016 rjmp xgml2 ;如果两次参数不一致
000093 37cd cpi r28,$7D
000094 f7d1 brne lp22 ;如果未比较完
000095 ef0d ldi r16,$fd
000096 9b5d lp23: sbis usr,5 ;测试USR第5位发送寄存器是否空
000097 cffe rjmp lp23
000098 b90c out udr,r16 ;接收数据成功,可以修改参数,返回FD
000099 e4c0 ldi r28,$40
00009a a118 xgml3: ldd r17,y+32
00009b 9109 ld r16,y+
00009c 1310 cpse r17,r16
00009d c004 rjmp xgml4
00009e 35cd xgml5: cpi r28,$5D
00009f f7d1 brne xgml3
0000a0 d1bd rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
0000a1 9508 ret
0000a2 2f8c xgml4: mov r24,r28
0000a3 5481 subi r24,$41 ;对应EEP地址为0x0100开始
0000a4 2f71 mov r23,r17
0000a5 d0df rcall EEWrite
0000a6 95ca dec r28
0000a7 9319 st y+,r17 ;更新SRAM中的EEP参数
0000a8 cff5 rjmp xgml5
0000a9 ef0c xgml2: ldi r16,$fc
0000aa 9b5d sbis usr,5 ;测试USR第5位发送寄存器是否空
0000ab cffd rjmp xgml2
0000ac b90c out udr,r16 ;修改参数失败,返回FC
0000ad 9508 ret
EXT_INT0: ;键盘中断子程序
0000ae 923f push r3
0000af 924f push r4
0000b0 925f push r5
0000b1 926f push r6
0000b2 927f push r7
0000b3 930f push r16 ;压栈
0000b4 931f push r17
0000b5 932f push r18
0000b6 933f push r19
0000b7 934f push r20
0000b8 935f push r21
0000b9 936f push r22
0000ba 937f push r23
0000bb 938f push r24
0000bc 93cf push r28
0000bd 93df push r29
0000be 2799 clr r25
0000bf 2788 clr r24
0000c0 b332 in r19,portd ;保存D口状态
0000c1 b348 in r20,portb ;保存B口状态
0000c2 b357 in r21,ddrb ;保存B口方向
0000c3 b72f in r18,SREG
0000c4 d0cf rcall readkey ;读按键值
0000c5 3c10 cpi r17,$c0 ;启动编码
0000c6 f129 breq startsystem
0000c7 3c18 cpi r17,$c8 ;停止编码
0000c8 f159 breq stopsystem
0000c9 3d10 cpi r17,$d0 ;设定编码
0000ca f0f1 breq setup1
0000cb 3d18 cpi r17,$d8 ;退出编码
0000cc f179 breq quit
0000cd 3e10 cpi r17,$e0 ;加编码
0000ce f0d9 breq keyup1
0000cf 3e18 cpi r17,$e8 ;减编码
0000d0 f0d1 breq keydown1
0000d1 3c11 cpi r17,$c1 ;消音
0000d2 f189 breq mute
0000d3 bb32 kqt: out portd,r19 ;恢复D口状态
0000d4 9a96 sbi portd,6
0000d5 bb48 out portb,r20 ;恢复B口状态
0000d6 bb57 out ddrb,r21 ;恢复B口方向
0000d7 bf2f out SREG,r18
0000d8 91df pop r29 ;弹出
0000d9 91cf pop r28
0000da 918f pop r24
0000db 917f pop r23
0000dc 916f pop r22
0000dd 915f pop r21
0000de 914f pop r20
0000df 913f pop r19
0000e0 912f pop r18
0000e1 911f pop r17
0000e2 910f pop r16
0000e3 907f pop r7
0000e4 906f pop r6
0000e5 905f pop r5
0000e6 904f pop r4
0000e7 903f pop r3
0000e8 9518 reti ;中断返回
0000e9 c01d setup1: rjmp setup
;quit1: rjmp quit ;转退出子程序
0000ea c052 keyup1: rjmp keyup ;转向左子程序
0000eb c070 keydown1:rjmp keydown ;转向右子程序
startsystem:
0000ec d0dc rcall beep ;BEEP
0000ed e001 ldi r16,01 ;启动风机输出
0000ee bb05 out portc,r16
0000ef 9a97 sbi portd,7
0000f0 0000 nop
0000f1 0000 nop
0000f2 9897 cbi portd,7
0000f3 cfdf rjmp kqt
stopsystem:
0000f4 d0d4 rcall beep
0000f5 e000 ldi r16,00 ;停止风机输出
0000f6 bb05 out portc,r16
0000f7 9a97 sbi portd,7
0000f8 0000 nop
0000f9 0000 nop
0000fa 9897 cbi portd,7
0000fb cfd7 rjmp kqt
0000fc d0cc quit: rcall beep
0000fd 3092 cpi r25,$02
0000fe f419 brne quit0 ;退出按钮
0000ff d0d6 rcall showcs
000100 959a dec r25
000101 cfd1 rjmp kqt
000102 2799 quit0: clr r25 ;0次或1次
000103 cfcf rjmp kqt
000104 d0c4 mute: rcall beep
000105 9a96 sbi portd,6 ;消音报警
000106 cfcc rjmp kqt
000107 d0c1 setup: rcall beep ;设定按钮
000108 9593 inc r25
000109 3091 cpi r25,$01
00010a f461 brne jmkz1
00010b d09b rcall setupxs ;setup键按了1次
00010c e0d1 ldi r29,$01 ;yh=$01
00010d e9cd ldi r28,$9d ;yl=$9d
00010e e0b1 ldi r27,$01 ;xh=$01
00010f e4a0 ldi r26,$40 ;xl=$40
000110 2700 clr r16
000111 9309 st y+,r16 ;初始0x019d为0
000112 910d ld r16,x+
000113 9309 st y+,r16 ;SRAM 0x019e中数=0x0140中数
000114 910d ld r16,x+
000115 9309 st y+,r16 ;SRAM 0x019f中数=0x0141中数
000116 cfbc rjmp kqt ;退出
000117 3092 jmkz1: cpi r25,$02
000118 f021 breq jmkz2 ;读出EEP在SRAM中的映射值,以便修改
000119 3093 cpi r25,$03
00011a f069 breq jmkz3 ;修改完毕,保存EEP值
00011b 2799 clr r25
00011c cfb6 rjmp kqt
00011d e0d1 jmkz2: ldi r29,$01 ;yh=$01
00011e e9cd ldi r28,$9d ;yl=$9d
00011f 91a9 ld r26,y+
000120 95a3 inc r26
000121 96df adiw r26,63 ;xl=$40+xl
000122 e0b1 ldi r27,$01 ;xh=$01
000123 910d ld r16,x+
000124 9309 st y+,r16 ;SRAM 0x019e中数=0x0140中数
000125 910c ld r16,x
000126 8308 st y,r16 ;SRAM 0x019f中数=0x0141中数
; rcall xsgy
000127 cfab rjmp kqt
000128 e0d1 jmkz3: ldi r29,$01 ;yh=$01
000129 e9cd ldi r28,$9d ;yl=$9d
00012a 91a9 ld r26,y+
00012b 2e3a mov r3,r26
00012c 95a3 inc r26
00012d 96df adiw r26,63 ;xl=$40+xl
00012e e0b1 ldi r27,$01 ;xh=$01
00012f 9109 ld r16,y+
000130 930d st x+,r16 ;SRAM 0x019e中数=0x0140中数
000131 2f70 mov r23,r16
000132 d052 rcall EEWrite ;保存EEP值L
000133 8108 ld r16,y
000134 930c st x,r16 ;SRAM 0x019f中数=0x0141中数
000135 2f70 mov r23,r16
000136 9433 inc r3
000137 d04d rcall EEWrite ;保存EEP值H
000138 d125 rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
000139 959a dec r25
00013a 959a dec r25
00013b d09a rcall showcs
00013c cf96 rjmp kqt
00013d d08b keyup: rcall beep ;键盘LEFT
00013e 3090 cpi r25,$0
00013f f0d9 breq left5
000140 e0d1 ldi r29,$01 ;yh=$01
000141 e9cd ldi r28,$9d ;yl=$9d
000142 81a8 ld r26,y ;通道号在r26
000143 3091 cpi r25,$01
000144 f439 brne left2
000145 50a2 subi r26,$02
000146 f00a brmi left1 ;负数转移
000147 c001 rjmp left6
000148 e1ac left1: ldi r26,$1c
000149 93a9 left6: st y+,r26 ;保存通道号到0x019d
00014a d08b rcall showcs ;显示通道标示
00014b cf87 rjmp kqt
00014c 3092 left2: cpi r25,$02
00014d f469 brne left5
00014e 95a3 inc r26
00014f 96df adiw r26,63 ;通道号+$40=xl
000150 e0b1 ldi r27,$01 ;xh=$01
000151 910d ld r16,x+ ;eep映射参数低字节
000152 911c ld r17,x
;rcall tdhpd ;根据通道号判断是否需转换成BCD码
000153 3081 cpi r24,$01
000154 f411 brne left3 ;r24<>1则需转换
000155 950a dec r16 ;单字节EEP参数
000156 c001 rjmp left4
000157 e000 left3: ldi r16,$0;1 ;000000
;rcall subcd ;BCD码减法
;rcall tzbcd ;BCD码调整
000158 d2b7 left4: rcall display;1
000159 9309 st y+,r16
00015a 8318 st y,r17
00015b cf77 left5: rjmp kqt
00015c d06c keydown:rcall beep ;键盘RIGHT
00015d 3090 cpi r25,$0
00015e f0d9 breq right5
00015f e0d1 ldi r29,$01 ;yh=$01
000160 e9cd ldi r28,$9d ;yl=$9d
000161 81a8 ld r26,y ;通道号在r26
000162 3091 cpi r25,$01
000163 f439 brne right2
000164 9612 adiw r26,$02
000165 31ae cpi r26,$1e
000166 f409 brne right1
000167 e0a0 ldi r26,$0
000168 93a9 right1: st y+,r26 ;保存通道号到0x019d
000169 d06c rcall showcs ;显示通道标示
00016a cf68 rjmp kqt
00016b 3092 right2: cpi r25,$02
00016c f469 brne right5
00016d 95a3 inc r26
00016e 96df adiw r26,63 ;通道号+$40=xl
00016f e0b1 ldi r27,$01 ;xh=$01
000170 910d ld r16,x+ ;eep映射参数低字节
000171 911c ld r17,x
;rcall tdhpd ;根据通道号判断是否需转换成BCD码
000172 3081 cpi r24,$01
000173 f411 brne right3 ;r24<>1则需转换
000174 9503 inc r16 ;单字节EEP参数
000175 c001 rjmp right4
000176 e000 right3: ldi r16,$0;1 ;0000000
;rcall adbcd ;BCD码加法
;rcall tzbcd ;BCD码调整
000177 d298 right4: rcall display;1
000178 9309 st y+,r16
000179 8318 st y,r17
00017a cf58 right5: rjmp kqt
;xsgy: mov res1,r23
; ldi r16,$00
; mov res2,r16
; rcall htd3
; sbi portd,5 ;初始化8279控制字
; cbi portd,4
; sbi portd,3
; ldi r16,$91
; out portb,r16
; nop
; sbi portd,4
; cbi portd,5
; mov r16,cnt2d
; rcall outpd
; mov r16,cnt1d
; swap r16
; rcall outpd
; mov r16,cnt1d
; rcall outpd
; sbi portd,5
; ret
00017b 99e1 EERead: sbic EECR,EEWE ;if EEWE not clear
00017c cffe rjmp EERead
00017d e001 ldi r16,$01
00017e 2e40 mov r4,r16
00017f 2e38 mov r3,r24 ; wait more
000180 ba4f out EEARH,r4 ;output address high for 8515
000181 ba3e out EEARL,r3 ;output address low for 8515
000182 9ae0 sbi EECR,EERE ;set EEPROM Read strobe
;This instruction takes 4 clock cycles since
;it halts the CPU for two clock cycles
000183 b30d in r16,EEDR ;get data
000184 9508 ret
000185 99e1 EEWrite:sbic EECR,EEWE ;if EEWE not clear
000186 cffe rjmp EEWrite ; wait more
000187 e001 ldi r16,$01
000188 2e40 mov r4,r16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -