📄 dout.lst
字号:
.equ RAMEND =$25F ;Last On-Chip SRAM location
.equ XRAMEND =$25F
.equ E2END =$1FF
.equ FLASHEND=$FFF
.equ INT0addr=$001 ;External Interrupt0 Vector Address
.equ INT1addr=$002 ;External Interrupt1 Vector Address
.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 c239 rjmp RESET
.org INT0addr ;外部中断服务子程序
000001 c09b 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 930f push r16 ;压栈
000021 931f push r17
000022 932f push r18
000023 933f push r19
000024 937f push r23
000025 938f push r24
000026 93cf push r28
000027 93df push r29
000028 b72f in r18,SREG ;保存状态寄存器
000029 995c loop: sbic usr,4 ;低电平跳行,高电平帧错误
00002a cffe rjmp loop
00002b b11c loop1: in r17,udr ;读串口数据到r17
00002c e0d1 ldi r29,$01
00002d e4cc ldi r28,$4c ;SRAM中站号地址
00002e 8108 ld r16,y
00002f 1310 cpse r17,r16 ;是本站则跳行
000030 c012 rjmp qt ;非本站,退出
000031 2d01 mov r16,r1
000032 3000 cpi r16,$00 ;本机是否为第一次接收到数据
000033 f009 breq EERead1 ;是第一次需验证站号
000034 c018 rjmp datapd ;第二次则处理命令
000035 99e1 EERead1:sbic EECR,EEWE ;if EEWE not clear
000036 cffe rjmp EERead1
000037 e001 ldi r16,$01
000038 bb0f out EEARH,r16 ;output address high for 8515
000039 e00c ldi r16,$c
00003a bb0e out EEARL,r16 ;output address low for 8515
00003b 9ae0 sbi EECR,EERE ;set EEPROM Read strobe
00003c b30d in r16,EEDR ;get data
00003d 1310 cpse r17,r16 ;比较相等跳行.
00003e c004 rjmp qt ;非本站,退出
00003f 9b5d loop3: sbis usr,5 ;测试USR第5位发送寄存器是否空
000040 cffe rjmp loop3
000041 b90c out udr,r16 ;是本站,请求发送第二次指令数据
000042 9413 inc r1
000043 bf2f qt: out sreg,r18 ;退出通讯中断
000044 91df pop r29
000045 91cf pop r28
000046 918f pop r24
000047 917f pop r23
000048 913f pop r19
000049 912f pop r18
00004a 911f pop r17
00004b 910f pop r16
00004c 9518 reti
datapd: ;第二次指令数据处理
00004d 3f1f cpi r17,$ff
00004e f419 brne tzxml
00004f d00c rcall txdata ;FF指令为上传数据
000050 2411 clr r1
000051 cff1 rjmp qt
000052 3f1e tzxml: cpi r17,$fe
000053 f419 brne tzxml1
000054 d00a rcall zxml ;FE指令为执行命令
000055 2411 clr r1
000056 cfec rjmp qt
000057 3f1d tzxml1: cpi r17,$fd
000058 f751 brne qt
000059 d00b rcall xgml ;FD指令为修改参数
00005a 2411 clr r1
00005b cfe7 rjmp qt
txdata: ;发送数据
00005c d02f rcall txdt ;上传数据
00005d d02e rcall txdt
00005e 9508 ret
zxml: ;执行命令
00005f 9b5f loop6: sbis usr,7 ;测试接收寄存器是否为空
000060 cffe rjmp loop6 ;低电平为空
000061 995c loop7: sbic usr,4 ;测试帧是否正确
000062 cffe rjmp loop7 ;帧错误为高电平
000063 b11c in r17,udr
000064 9508 ret
000065 e0d1 xgml: ldi r29,$01 ;修改参数子程序
000066 e5c0 ldi r28,$50
000067 9b5f xgml0: sbis usr,7 ;测试接收寄存器是否为空
000068 cffe rjmp xgml0 ;低电平为空
000069 b11c in r17,udr
00006a 9319 st y+,r17
00006b 36ce cpi r28,$6e
00006c f7d1 brne xgml0
00006d e5c0 ldi r28,$50
00006e 851f xgml1: ldd r17,y+15
00006f 9109 ld r16,y+
000070 1310 cpse r17,r16
000071 c015 rjmp xgml2
000072 35cf cpi r28,$5f
000073 f7d1 brne xgml1
000074 ef0d ldi r16,$fd
000075 9b5d sbis usr,5 ;测试USR第5位发送寄存器是否空
000076 c010 rjmp xgml2
000077 b90c out udr,r16 ;接收数据成功,可以修改参数,返回FD
000078 e4c0 ldi r28,$40
000079 851a xgml3: ldd r17,y+10
00007a 9109 ld r16,y+
00007b 1310 cpse r17,r16
00007c c003 rjmp xgml4
00007d 34cf xgml5: cpi r28,$4f
00007e f7d1 brne xgml3
;rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
00007f 9508 ret
000080 2f8c xgml4: mov r24,r28
000081 5481 subi r24,$41 ;对应EEP地址为0x0100开始
000082 2f71 mov r23,r17
000083 d0dd rcall EEWrite
000084 95ca dec r28
000085 9319 st y+,r17 ;更新SRAM中的EEP参数
000086 cff6 rjmp xgml5
000087 ef0c xgml2: ldi r16,$fc
000088 9b5d sbis usr,5 ;测试USR第5位发送寄存器是否空
000089 cffd rjmp xgml2
00008a b90c out udr,r16 ;修改参数失败,返回FC
00008b 9508 ret
00008c e0d1 txdt: ldi r29,$01
00008d e0c0 ldi r28,$00
00008e 9109 loop5: ld r16,y+
00008f 9b5d loop4: sbis usr,5 ;测试USR第5位发送寄存器是否空
000090 cffe rjmp loop4
000091 b90c out udr,r16 ;发送数据
000092 34cf cpi r28,$4F
000093 f7d1 brne loop5
000094 9b5d loep: sbis usr,5 ;测试USR第5位发送寄存器是否空
000095 cffe rjmp loep
000096 ef0f ldi r16,$ff ;
000097 b90c out udr,r16
000098 9b5d loep1: sbis usr,5 ;测试USR第5位发送寄存器是否空
000099 cffe rjmp loep1
00009a ef0f ldi r16,$ff ;
00009b b90c out udr,r16
00009c 9508 ret
EXT_INT0: ;键盘中断子程序
00009d 923f push r3
00009e 924f push r4
00009f 925f push r5
0000a0 926f push r6
0000a1 927f push r7
0000a2 930f push r16 ;压栈
0000a3 931f push r17
0000a4 932f push r18
0000a5 933f push r19
0000a6 934f push r20
0000a7 935f push r21
0000a8 936f push r22
0000a9 937f push r23
0000aa 938f push r24
0000ab 939f push r25
0000ac 93cf push r28
0000ad 93df push r29
0000ae 2799 clr r25
0000af 2788 clr r24
0000b0 b332 in r19,portd ;保存D口状态
0000b1 b348 in r20,portb ;保存B口状态
0000b2 b357 in r21,ddrb ;保存B口方向
0000b3 b72f in r18,SREG
0000b4 e000 ldi r16,$00 ;INT0可用,INT1屏蔽 0b01000000
0000b5 bf0b out GIMSK,R16
0000b6 d0b9 read: rcall readkey ;读按键值
0000b7 3c10 cpi r17,$c0 ;启动编码
0000b8 f169 breq startsystem
0000b9 3c18 cpi r17,$c8 ;停止编码
0000ba f1a9 breq stopsystem
0000bb 3d10 cpi r17,$d0 ;设定编码
0000bc f111 breq setup1
0000bd 3d18 cpi r17,$d8 ;退出编码
0000be f109 breq quit1
0000bf 3e10 cpi r17,$e0 ;加编码
0000c0 f101 breq keyup1
0000c1 3e18 cpi r17,$e8 ;减编码
0000c2 f0f9 breq keydown1
0000c3 3c11 cpi r17,$c1 ;消音
0000c4 f1a9 breq mute
kqt:
0000c5 e400 ldi r16,$40 ;INT0可用,INT1屏蔽 0b01000000
0000c6 bf0b out GIMSK,R16
0000c7 bf0a out GIFR,r16
0000c8 bb32 out portd,r19 ;恢复D口状态
0000c9 9a96 sbi portd,6
0000ca bb48 out portb,r20 ;恢复B口状态
0000cb bb57 out ddrb,r21 ;恢复B口方向
0000cc bf2f out SREG,r18
0000cd 91df pop r29 ;弹出
0000ce 91cf pop r28
0000cf 919f pop r25 ;弹出
0000d0 918f pop r24
0000d1 917f pop r23
0000d2 916f pop r22
0000d3 915f pop r21
0000d4 914f pop r20
0000d5 913f pop r19
0000d6 912f pop r18
0000d7 911f pop r17
0000d8 910f pop r16
0000d9 907f pop r7
0000da 906f pop r6
0000db 905f pop r5
0000dc 904f pop r4
0000dd 903f pop r3
0000de 9518 reti ;中断返回
0000df c01f setup1: rjmp setup
0000e0 c036 quit1: rjmp quit ;转退出子程序
0000e1 c03c keyup1: rjmp keyup ;转向左子程序
0000e2 c04d keydown1:rjmp keydown ;转向右子程序
0000e3 9b82 intr: sbis pind,2 ;8279的中断信号有则跳行
0000e4 cffe rjmp intr
0000e5 cfd0 rjmp read ;读8279中断信息
startsystem:
0000e6 d0be rcall beep ;BEEP
0000e7 e001 ldi r16,01 ;启动风机输出
0000e8 bb05 out portc,r16
0000e9 9a97 sbi portd,7
0000ea 0000 nop
0000eb 0000 nop
0000ec 9897 cbi portd,7
0000ed 3090 cpi r25,$00
0000ee f7a1 brne intr
0000ef cfd5 rjmp kqt
stopsystem:
0000f0 d0b4 rcall beep
0000f1 e000 ldi r16,00 ;停止风机输出
0000f2 bb05 out portc,r16
0000f3 9a97 sbi portd,7
0000f4 0000 nop
0000f5 0000 nop
0000f6 9897 cbi portd,7
0000f7 3090 cpi r25,$00
0000f8 f751 brne intr
0000f9 cfcb rjmp kqt
0000fa d0aa mute: rcall beep
0000fb 9a96 sbi portd,6 ;消音报警
0000fc 3090 cpi r25,$00
0000fd f729 brne intr
0000fe cfc6 rjmp kqt
0000ff d0a5 setup: rcall beep ;设定按钮
000100 9593 inc r25
000101 3091 cpi r25,$01
000102 f411 brne jmkz1
000103 d07f rcall setupxs ;setup键按了1次
000104 cfde rjmp intr ;再去读中断口
000105 3092 jmkz1: cpi r25,$02
000106 f019 breq jmkz2 ;读出EEP值,以便修改
000107 3093 cpi r25,$03
000108 f029 breq jmkz3 ;修改完毕,保存EEP值
000109 cfbb rjmp kqt
00010a d04c jmkz2: rcall EERead ;读出EEP值
00010b 2f70 mov r23,r16
00010c d035 rcall xsgy
00010d cfd5 rjmp intr
00010e d052 jmkz3: rcall EEWrite ;保存EEP值
00010f e0d1 ldi r29,$01
000110 e4c0 ldi r28,$40
000111 0fc8 add r28,r24
000112 8378 st y,r23
;rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
000113 959a dec r25
000114 959a dec r25
000115 d09c rcall showcs
000116 cfcc rjmp intr
000117 d08d quit: rcall beep
000118 3092 cpi r25,$02
000119 f419 brne kqt4 ;退出按钮
00011a d097 rcall showcs
00011b 959a dec r25
00011c cfc6 rjmp intr
00011d cfa7 kqt4: rjmp kqt
00011e d086 keyup: rcall beep ;键盘LEFT
00011f 3090 cpi r25,$00
000120 f409 brne kqt3
000121 cfa3 rjmp kqt
000122 3091 kqt3: cpi r25,$01
000123 f421 brne to
000124 958a dec r24
000125 f03a brmi lp1 ;r24为负转移
000126 d08b lp2: rcall showcs
000127 cfbb rjmp intr
000128 3092 to: cpi r25,$02
000129 f429 brne tczgc
00012a 957a dec r23
00012b d016 rcall xsgy
00012c cfb6 rjmp intr
00012d e08e lp1: ldi r24,$e
00012e cff7 rjmp lp2
00012f cfb3 tczgc: rjmp intr
000130 d074 keydown:rcall beep ;键盘RIGHT
000131 3090 cpi r25,$00
000132 f409 brne kqt2
000133 cf91 rjmp kqt
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -