📄 no3a.lst
字号:
.equ OC2addr =$003 ;Timer2 compare match Vector Address
.equ OVF2addr=$004 ;Timer2 overflow Vector Address
.equ ICP1addr=$005 ;Timer1 Input Capture Vector Address
.equ OC1Aaddr=$006 ;Timer1 Output Compare A Interrupt Vector Address
.equ OC1Baddr=$007 ;Timer1 Output Compare B Interrupt Vector Address
.equ OVF1addr=$008 ;Overflow1 Interrupt Vector Address
.equ OVF0addr=$009 ;Overflow0 Interrupt Vector Address
.equ SPIaddr =$00A ;SPI Interrupt Vector Address
.equ URXCaddr=$00B ;UART Receive Complete Interrupt Vector Address
.equ UDREaddr=$00C ;UART Data Register Empty Interrupt Vector Address
.equ UTXCaddr=$00D ;UART Transmit Complete Interrupt Vector Address
.equ ADCCaddr=$00E ;ADC Conversion Complete Interrupt Vector Address
.equ ERDYaddr=$00F ;EEPROM Write Complete Interrupt Vector Address
.equ ACIaddr =$010 ;Analog Comparator Interrupt Vector Address
.def temp = r19 ;十六进制转换暂存器
.def count = r8 ;十六进制转换计数器
.def res1 = r4 ;存放结果的十六进制低位
.def res2 = r5 ;存放结果的十六进制高位
.def cnt1d = r6 ;存放结果的十进制低位
.def cnt2d = r7 ;存放结果的十进制高位
.org 0x00
.equ label=$0400
000000 c270 rjmp RESET
.org INT0addr ;外部中断服务子程序
000001 c0ab rjmp EXT_INT0
.org URXCaddr ;UART接收结束
00000b c014 rjmp UART_RXC
;.org UDREaddr ;UART数据空
;rjmp UART_DRE
.org UTXCaddr ;UART发送结束
;rjmp UART_TXC
;.org 0x06 ;timerl
;INTTT: RJMP TINT ;
00000d 9518 reti
.org 0x0020 ;
;********************************
;************ 中断区 ************
;********************************
UART_RXC: ;通讯中断子程序
000020 923f push r3 ;压栈
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 c015 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 c003 rjmp xgml4
00009e 35cd xgml5: cpi r28,$5D
00009f f7d1 brne xgml3
;rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
0000a0 9508 ret
0000a1 2f8c xgml4: mov r24,r28
0000a2 5481 subi r24,$41 ;对应EEP地址为0x0100开始
0000a3 2f71 mov r23,r17
0000a4 d0f3 rcall EEWrite
0000a5 95ca dec r28
0000a6 9319 st y+,r17 ;更新SRAM中的EEP参数
0000a7 cff6 rjmp xgml5
0000a8 ef0c xgml2: ldi r16,$fc
0000a9 9b5d sbis usr,5 ;测试USR第5位发送寄存器是否空
0000aa cffd rjmp xgml2
0000ab b90c out udr,r16 ;修改参数失败,返回FC
0000ac 9508 ret
EXT_INT0: ;键盘中断子程序
0000ad 923f push r3
0000ae 924f push r4
0000af 925f push r5
0000b0 926f push r6
0000b1 927f push r7
0000b2 930f push r16 ;压栈
0000b3 931f push r17
0000b4 932f push r18
0000b5 933f push r19
0000b6 934f push r20
0000b7 935f push r21
0000b8 936f push r22
0000b9 937f push r23
0000ba 938f push r24
0000bb 93cf push r28
0000bc 93df push r29
0000bd 2799 clr r25
0000be 2788 clr r24
;sei
0000bf b332 in r19,portd ;保存D口状态
0000c0 b348 in r20,portb ;保存B口状态
0000c1 b357 in r21,ddrb ;保存B口方向
0000c2 b72f in r18,SREG
0000c3 d0e3 rcall readkey ;读按键值
0000c4 3c10 cpi r17,$c0 ;启动编码
0000c5 f129 breq startsystem
0000c6 3c18 cpi r17,$c8 ;停止编码
0000c7 f159 breq stopsystem
0000c8 3d10 cpi r17,$d0 ;设定编码
0000c9 f0f1 breq setup1
0000ca 3d18 cpi r17,$d8 ;退出编码
0000cb f179 breq quit
0000cc 3e10 cpi r17,$e0 ;加编码
0000cd f0d9 breq keyup1
0000ce 3e18 cpi r17,$e8 ;减编码
0000cf f0d1 breq keydown1
0000d0 3c11 cpi r17,$c1 ;消音
0000d1 f189 breq mute
0000d2 bb32 kqt: out portd,r19 ;恢复D口状态
0000d3 9a96 sbi portd,6
0000d4 bb48 out portb,r20 ;恢复B口状态
0000d5 bb57 out ddrb,r21 ;恢复B口方向
0000d6 bf2f out SREG,r18
0000d7 91df pop r29 ;弹出
0000d8 91cf pop r28
0000d9 918f pop r24
0000da 917f pop r23
0000db 916f pop r22
0000dc 915f pop r21
0000dd 914f pop r20
0000de 913f pop r19
0000df 912f pop r18
0000e0 911f pop r17
0000e1 910f pop r16
0000e2 907f pop r7
0000e3 906f pop r6
0000e4 905f pop r5
0000e5 904f pop r4
0000e6 903f pop r3
0000e7 9518 reti ;中断返回
0000e8 c01d setup1: rjmp setup
;quit1: rjmp quit ;转退出子程序
0000e9 c051 keyup1: rjmp keyup ;转向左子程序
0000ea c06f keydown1:rjmp keydown ;转向右子程序
startsystem:
0000eb d0f0 rcall beep ;BEEP
0000ec e001 ldi r16,01 ;启动风机输出
0000ed bb05 out portc,r16
0000ee 9a97 sbi portd,7
0000ef 0000 nop
0000f0 0000 nop
0000f1 9897 cbi portd,7
0000f2 cfdf rjmp kqt
stopsystem:
0000f3 d0e8 rcall beep
0000f4 e000 ldi r16,00 ;停止风机输出
0000f5 bb05 out portc,r16
0000f6 9a97 sbi portd,7
0000f7 0000 nop
0000f8 0000 nop
0000f9 9897 cbi portd,7
0000fa cfd7 rjmp kqt
0000fb d0e0 quit: rcall beep
0000fc 3092 cpi r25,$02
0000fd f419 brne quit0 ;退出按钮
0000fe d0ea rcall showcs
0000ff 959a dec r25
000100 cfd1 rjmp kqt
000101 2799 quit0: clr r25 ;0次或1次
000102 cfcf rjmp kqt
000103 d0d8 mute: rcall beep
000104 9a96 sbi portd,6 ;消音报警
000105 cfcc rjmp kqt
000106 d0d5 setup: rcall beep ;设定按钮
000107 9593 inc r25
000108 3091 cpi r25,$01
000109 f461 brne jmkz1
00010a d0af rcall setupxs ;setup键按了1次
00010b e0d1 ldi r29,$01 ;yh=$01
00010c e9cd ldi r28,$9d ;yl=$9d
00010d e0b1 ldi r27,$01 ;xh=$01
00010e e4a0 ldi r26,$40 ;xl=$40
00010f 2700 clr r16
000110 9309 st y+,r16 ;初始0x019d为0
000111 910d ld r16,x+
000112 9309 st y+,r16 ;SRAM 0x019e中数=0x0140中数
000113 910d ld r16,x+
000114 9309 st y+,r16 ;SRAM 0x019f中数=0x0141中数
000115 cfbc rjmp kqt ;退出
000116 3092 jmkz1: cpi r25,$02
000117 f021 breq jmkz2 ;读出EEP在SRAM中的映射值,以便修改
000118 3093 cpi r25,$03
000119 f069 breq jmkz3 ;修改完毕,保存EEP值
00011a 2799 clr r25
00011b cfb6 rjmp kqt
00011c e0d1 jmkz2: ldi r29,$01 ;yh=$01
00011d e9cd ldi r28,$9d ;yl=$9d
00011e 91a9 ld r26,y+
00011f 95a3 inc r26
000120 96df adiw r26,63 ;xl=$40+xl
000121 e0b1 ldi r27,$01 ;xh=$01
000122 910d ld r16,x+
000123 9309 st y+,r16 ;SRAM 0x019e中数=0x0140中数
000124 910c ld r16,x
000125 8308 st y,r16 ;SRAM 0x019f中数=0x0141中数
; rcall xsgy
000126 cfab rjmp kqt
000127 e0d1 jmkz3: ldi r29,$01 ;yh=$01
000128 e9cd ldi r28,$9d ;yl=$9d
000129 91a9 ld r26,y+
00012a 2e3a mov r3,r26
00012b 95a3 inc r26
00012c 96df adiw r26,63 ;xl=$40+xl
00012d e0b1 ldi r27,$01 ;xh=$01
00012e 9109 ld r16,y+
00012f 930d st x+,r16 ;SRAM 0x019e中数=0x0140中数
000130 2f70 mov r23,r16
000131 d066 rcall EEWrite ;保存EEP值L
000132 8108 ld r16,y
000133 930c st x,r16 ;SRAM 0x019f中数=0x0141中数
000134 2f70 mov r23,r16
000135 9433 inc r3
000136 d061 rcall EEWrite ;保存EEP值H
;rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
000137 959a dec r25
000138 959a dec r25
000139 d0af rcall showcs
00013a cf97 rjmp kqt
00013b d0a0 keyup: rcall beep ;键盘LEFT
00013c 3090 cpi r25,$0
00013d f0d9 breq left5
00013e e0d1 ldi r29,$01 ;yh=$01
00013f e9cd ldi r28,$9d ;yl=$9d
000140 81a8 ld r26,y ;通道号在r26
000141 3091 cpi r25,$01
000142 f439 brne left2
000143 50a2 subi r26,$02
000144 f00a brmi left1 ;负数转移
000145 c001 rjmp left6
000146 e1ac left1: ldi r26,$1c
000147 93a9 left6: st y+,r26 ;保存通道号到0x019d
000148 d0a0 rcall showcs ;显示通道标示
000149 cf88 rjmp kqt
00014a 3092 left2: cpi r25,$02
00014b f469 brne left5
00014c 95a3 inc r26
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -