📄 no3a.asm
字号:
;************* 宏方科技 HFKJAVR.asm ************************
;*
;* 标题:AT90S8535 集散式洁净空调自动控制系统
;* 版本: 1.0
;* 最后更新日期: 2002.11.01
;* 支援 TEL: 8102124 & 8106097
;*
;*************************************************************
.include"8535def.inc"
.def temp = r19 ;十六进制转换暂存器
.def count = r8 ;十六进制转换计数器
.def res1 = r4 ;存放结果的十六进制低位
.def res2 = r5 ;存放结果的十六进制高位
.def cnt1d = r6 ;存放结果的十进制低位
.def cnt2d = r7 ;存放结果的十进制高位
.org 0x00
.equ label=$0400
rjmp RESET
.org INT0addr ;外部中断服务子程序
rjmp EXT_INT0
.org URXCaddr ;UART接收结束
rjmp UART_RXC
;.org UDREaddr ;UART数据空
;rjmp UART_DRE
.org UTXCaddr ;UART发送结束
;rjmp UART_TXC
;.org 0x06 ;timerl
;INTTT: RJMP TINT ;
reti
.org 0x0020 ;
;********************************
;************ 中断区 ************
;********************************
UART_RXC: ;通讯中断子程序
push r3 ;压栈
push r4
push r16
push r17
push r18
push r19
push r23
push r24
push r28
push r29
in r18,SREG ;保存状态寄存器
clr r19
lp00: sbic usr,4 ;低电平跳行,高电平帧错误
rjmp lp01
rjmp lp02
lp01: inc r19
cpi r19,$ff
breq qt
rjmp lp00
lp02: in r17,udr ;读串口数据到r17
ldi r29,$01
ldi r28,$58 ;SRAM中站号地址
ld r16,y
cpse r17,r16 ;是本站则跳行执行
rjmp qt ;非本站,退出通讯中断
lp03: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp lp03
out udr,r16 ;是本站,请求发送第二次指令数据
clr r19
lp04: sbic usr,4 ;低电平跳行,高电平帧错误
rjmp lp05
rjmp lp06
lp05: inc r19
cpi r19,$ff
breq qt
rjmp lp04
lp06: in r17,udr ;读串口数据到r17
cpi r17,$ff ;第二次指令数据处理
brne lp07
rcall txdata ;FF指令为上传数据
rcall txdata
rjmp qt
lp07: cpi r17,$fe
brne lp08
rcall zxml ;FE指令为执行命令
rjmp qt
lp08: cpi r17,$fd
brne qt
rcall xgml ;FD指令为修改参数
qt: out sreg,r18 ;退出通讯中断
pop r29
pop r28
pop r24
pop r23
pop r19
pop r18
pop r17
pop r16
pop r4
pop r3
reti
txdata: ldi r29,$01 ;发送数据
ldi r28,$00
lp09: ld r16,y+
lp10: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp lp10
out udr,r16 ;发送数据
cpi r28,$5D
brne lp09
lp11: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp lp11
ldi r16,$ff ;上传数据结束符号FF
out udr,r16
lp12: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp lp12
ldi r16,$ff ;上传数据结束符号FF
out udr,r16
ret
zxml: clr r19 ;执行命令
lp13: sbis usr,7 ;测试接收寄存器是否为空
rjmp lp14
rjmp lp15
lp14: inc r19
cpi r19,$ff
breq qt
rjmp lp13 ;低电平为空
lp15: clr r19
lp16: sbic usr,4 ;测试帧是否正确
rjmp lp17
rjmp lp18
lp17: inc r19
cpi r19,$ff
breq qt
rjmp lp16 ;帧错误为高电平
lp18: in r17,udr
ret
xgml: ldi r29,$01 ;修改参数子程序
ldi r28,$60
clr r19
lp19: sbis usr,7 ;测试接收寄存器是否为空
rjmp lp20
rjmp lp21
lp20: inc r19
cpi r19,$ff
breq qt
rjmp lp19 ;低电平为空
lp21: in r17,udr
st y+,r17
cpi r28,$9A ;接收参数29*2=58个
brne lp19
ldi r28,$60
lp22: ldd r17,y+29 ;第一次参数
ld r16,y+ ;第二次参数
cpse r17,r16
rjmp xgml2 ;如果两次参数不一致
cpi r28,$7D
brne lp22 ;如果未比较完
ldi r16,$fd
lp23: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp lp23
out udr,r16 ;接收数据成功,可以修改参数,返回FD
ldi r28,$40
xgml3: ldd r17,y+32
ld r16,y+
cpse r17,r16
rjmp xgml4
xgml5: cpi r28,$5D
brne xgml3
;rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
ret
xgml4: mov r24,r28
subi r24,$41 ;对应EEP地址为0x0100开始
mov r23,r17
rcall EEWrite
dec r28
st y+,r17 ;更新SRAM中的EEP参数
rjmp xgml5
xgml2: ldi r16,$fc
sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp xgml2
out udr,r16 ;修改参数失败,返回FC
ret
EXT_INT0: ;键盘中断子程序
push r3
push r4
push r5
push r6
push r7
push r16 ;压栈
push r17
push r18
push r19
push r20
push r21
push r22
push r23
push r24
push r28
push r29
clr r25
clr r24
;sei
in r19,portd ;保存D口状态
in r20,portb ;保存B口状态
in r21,ddrb ;保存B口方向
in r18,SREG
rcall readkey ;读按键值
cpi r17,$c0 ;启动编码
breq startsystem
cpi r17,$c8 ;停止编码
breq stopsystem
cpi r17,$d0 ;设定编码
breq setup1
cpi r17,$d8 ;退出编码
breq quit
cpi r17,$e0 ;加编码
breq keyup1
cpi r17,$e8 ;减编码
breq keydown1
cpi r17,$c1 ;消音
breq mute
kqt: out portd,r19 ;恢复D口状态
sbi portd,6
out portb,r20 ;恢复B口状态
out ddrb,r21 ;恢复B口方向
out SREG,r18
pop r29 ;弹出
pop r28
pop r24
pop r23
pop r22
pop r21
pop r20
pop r19
pop r18
pop r17
pop r16
pop r7
pop r6
pop r5
pop r4
pop r3
reti ;中断返回
setup1: rjmp setup
;quit1: rjmp quit ;转退出子程序
keyup1: rjmp keyup ;转向左子程序
keydown1:rjmp keydown ;转向右子程序
startsystem:
rcall beep ;BEEP
ldi r16,01 ;启动风机输出
out portc,r16
sbi portd,7
nop
nop
cbi portd,7
rjmp kqt
stopsystem:
rcall beep
ldi r16,00 ;停止风机输出
out portc,r16
sbi portd,7
nop
nop
cbi portd,7
rjmp kqt
quit: rcall beep
cpi r25,$02
brne quit0 ;退出按钮
rcall showcs
dec r25
rjmp kqt
quit0: clr r25 ;0次或1次
rjmp kqt
mute: rcall beep
sbi portd,6 ;消音报警
rjmp kqt
setup: rcall beep ;设定按钮
inc r25
cpi r25,$01
brne jmkz1
rcall setupxs ;setup键按了1次
ldi r29,$01 ;yh=$01
ldi r28,$9d ;yl=$9d
ldi r27,$01 ;xh=$01
ldi r26,$40 ;xl=$40
clr r16
st y+,r16 ;初始0x019d为0
ld r16,x+
st y+,r16 ;SRAM 0x019e中数=0x0140中数
ld r16,x+
st y+,r16 ;SRAM 0x019f中数=0x0141中数
rjmp kqt ;退出
jmkz1: cpi r25,$02
breq jmkz2 ;读出EEP在SRAM中的映射值,以便修改
cpi r25,$03
breq jmkz3 ;修改完毕,保存EEP值
clr r25
rjmp kqt
jmkz2: ldi r29,$01 ;yh=$01
ldi r28,$9d ;yl=$9d
ld r26,y+
inc r26
adiw r26,63 ;xl=$40+xl
ldi r27,$01 ;xh=$01
ld r16,x+
st y+,r16 ;SRAM 0x019e中数=0x0140中数
ld r16,x
st y,r16 ;SRAM 0x019f中数=0x0141中数
; rcall xsgy
rjmp kqt
jmkz3: ldi r29,$01 ;yh=$01
ldi r28,$9d ;yl=$9d
ld r26,y+
mov r3,r26
inc r26
adiw r26,63 ;xl=$40+xl
ldi r27,$01 ;xh=$01
ld r16,y+
st x+,r16 ;SRAM 0x019e中数=0x0140中数
mov r23,r16
rcall EEWrite ;保存EEP值L
ld r16,y
st x,r16 ;SRAM 0x019f中数=0x0141中数
mov r23,r16
inc r3
rcall EEWrite ;保存EEP值H
;rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
dec r25
dec r25
rcall showcs
rjmp kqt
keyup: rcall beep ;键盘LEFT
cpi r25,$0
breq left5
ldi r29,$01 ;yh=$01
ldi r28,$9d ;yl=$9d
ld r26,y ;通道号在r26
cpi r25,$01
brne left2
subi r26,$02
brmi left1 ;负数转移
rjmp left6
left1: ldi r26,$1c
left6: st y+,r26 ;保存通道号到0x019d
rcall showcs ;显示通道标示
rjmp kqt
left2: cpi r25,$02
brne left5
inc r26
adiw r26,63 ;通道号+$40=xl
ldi r27,$01 ;xh=$01
ld r16,x+ ;eep映射参数低字节
ld r17,x
;rcall tdhpd ;根据通道号判断是否需转换成BCD码
cpi r24,$01
brne left3 ;r24<>1则需转换
dec r16 ;单字节EEP参数
rjmp left4
left3: ldi r16,$0;1 ;000000
;rcall subcd ;BCD码减法
;rcall tzbcd ;BCD码调整
left4: rcall display;1
st y+,r16
st y,r17
left5: rjmp kqt
keydown:rcall beep ;键盘RIGHT
cpi r25,$0
breq right5
ldi r29,$01 ;yh=$01
ldi r28,$9d ;yl=$9d
ld r26,y ;通道号在r26
cpi r25,$01
brne right2
adiw r26,$02
cpi r26,$1e
brne right1
ldi r26,$0
right1: st y+,r26 ;保存通道号到0x019d
rcall showcs ;显示通道标示
rjmp kqt
right2: cpi r25,$02
brne right5
inc r26
adiw r26,63 ;通道号+$40=xl
ldi r27,$01 ;xh=$01
ld r16,x+ ;eep映射参数低字节
ld r17,x
;rcall tdhpd ;根据通道号判断是否需转换成BCD码
cpi r24,$01
brne right3 ;r24<>1则需转换
inc r16 ;单字节EEP参数
rjmp right4
right3: ldi r16,$0;1 ;0000000
;rcall adbcd ;BCD码加法
;rcall tzbcd ;BCD码调整
right4: rcall display;1
st y+,r16
st y,r17
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
EERead: sbic EECR,EEWE ;if EEWE not clear
rjmp EERead
ldi r16,$01
mov r4,r16
mov r3,r24 ; wait more
out EEARH,r4 ;output address high for 8515
out EEARL,r3 ;output address low for 8515
sbi EECR,EERE ;set EEPROM Read strobe
;This instruction takes 4 clock cycles since
;it halts the CPU for two clock cycles
in r16,EEDR ;get data
ret
EEWrite:sbic EECR,EEWE ;if EEWE not clear
rjmp EEWrite ; wait more
ldi r16,$01
mov r4,r16
mov r3,r24
out EEARH,r4 ;output address high for 8515
out EEARL,r3 ;output address low for 8515
out EEDR,r23 ;output data
sbi EECR,EEMWE ;set master write enable, remove if 1200 is used
sbi EECR,EEWE ;set EEPROM Write strobe
nop ;This instruction takes 4 clock cycles since
nop ;it halts the CPU for two clock cycles
nop
nop
ret
readkey:
ser r16
out ddrb,r16
sbi portd,5 ;初始化8279控制字
cbi portd,4
ldi r16,$40
out portb,r16
sbi portd,4
cbi portd,5
clr r16
out ddrb,r16
out portb,r16
cbi portd,3
nop
in r17,pinb
sbi portd,5
sbi portd,3
ser r16
out ddrb,r16
ret
setupxs:rcall cs8279 ;显示字符
ldi r16,$6d ;'S'
rcall outxs
ldi r16,$79 ;'E'
rcall outxs
ldi r16,$78 ;'t'
rcall outxs
ldi r16,$3e ;'u'
rcall outxs
ldi r16,$73 ;'p'
rcall outxs
sbi portd,5
ldi r20,$56 ;调用延时
rcall delay
rcall cs8279 ;显示温度设定
ldi r16,$78 ;'t'
rcall outxs
ldi r16,$06 ;'-'
rcall outxs
rcall jy
ret
cs8279: sbi portd,5 ;初始化8279控制字
cbi portd,4
sbi portd,3
ldi r16,$90
out portb,r16
nop
sbi portd,4
cbi portd,5
ret
outxs: ;显示输出
cbi portd,4
out portb,r16
sbi portd,4
ret
beep:
sbi portd,6
ldi r20,$19 ;调用延时
rcall delay
cbi portd,6
ret
jy: ldi r16,$40 ;'-'
rcall outxs
ldi r16,$40 ;'-'
rcall outxs
ldi r16,$40 ;'-'
rcall outxs
sbi portd,5
ret
showcs: rcall cs8279
cpi r24,$00 ;显示温度设定
brne csbsf1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -