📄 no3a1.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 r16 ;压栈
push r17
push r18
push r19
push r23
push r24
push r28
push r29
in r18,SREG ;保存状态寄存器
loop: sbic usr,4 ;低电平跳行,高电平帧错误
rjmp loop
loop1: in r17,udr ;读串口数据到r17
ldi r29,$01
ldi r28,$4c ;SRAM中站号地址
ld r16,y
cpse r17,r16 ;是本站则跳行
rjmp qt ;非本站,退出
mov r16,r1
cpi r16,$00 ;本机是否为第一次接收到数据
breq EERead1 ;是第一次需验证站号
rjmp datapd ;第二次则处理命令
EERead1:sbic EECR,EEWE ;if EEWE not clear
rjmp EERead1
ldi r16,$01
out EEARH,r16 ;output address high for 8515
ldi r16,$c
out EEARL,r16 ;output address low for 8515
sbi EECR,EERE ;set EEPROM Read strobe
in r16,EEDR ;get data
cpse r17,r16 ;比较相等跳行.
rjmp qt ;非本站,退出
loop3: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp loop3
out udr,r16 ;是本站,请求发送第二次指令数据
inc r1
qt: out sreg,r18 ;退出通讯中断
pop r29
pop r28
pop r24
pop r23
pop r19
pop r18
pop r17
pop r16
reti
datapd: ;第二次指令数据处理
cpi r17,$ff
brne tzxml
rcall txdata ;FF指令为上传数据
clr r1
rjmp qt
tzxml: cpi r17,$fe
brne tzxml1
rcall zxml ;FE指令为执行命令
clr r1
rjmp qt
tzxml1: cpi r17,$fd
brne qt
rcall xgml ;FD指令为修改参数
clr r1
rjmp qt
txdata: ;发送数据
rcall txdt ;上传数据
rcall txdt
ret
zxml: ;执行命令
loop6: sbis usr,7 ;测试接收寄存器是否为空
rjmp loop6 ;低电平为空
loop7: sbic usr,4 ;测试帧是否正确
rjmp loop7 ;帧错误为高电平
in r17,udr
ret
xgml: ldi r29,$01 ;修改参数子程序
ldi r28,$50
xgml0: sbis usr,7 ;测试接收寄存器是否为空
rjmp xgml0 ;低电平为空
in r17,udr
st y+,r17
cpi r28,$6e
brne xgml0
ldi r28,$50
xgml1: ldd r17,y+15
ld r16,y+
cpse r17,r16
rjmp xgml2
cpi r28,$5f
brne xgml1
ldi r16,$fd
sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp xgml2
out udr,r16 ;接收数据成功,可以修改参数,返回FD
ldi r28,$40
xgml3: ldd r17,y+10
ld r16,y+
cpse r17,r16
rjmp xgml4
xgml5: cpi r28,$4f
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
txdt: ldi r29,$01
ldi r28,$00
loop5: ld r16,y+
loop4: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp loop4
out udr,r16 ;发送数据
cpi r28,$4F
brne loop5
loep: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp loep
ldi r16,$ff ;
out udr,r16
loep1: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp loep1
ldi r16,$ff ;
out udr,r16
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 r25
push r28
push r29
clr r25
clr r24
in r19,portd ;保存D口状态
in r20,portb ;保存B口状态
in r21,ddrb ;保存B口方向
in r18,SREG
ldi r16,$00 ;INT0可用,INT1屏蔽 0b01000000
out GIMSK,R16
read: rcall readkey ;读按键值
cpi r17,$c0 ;启动编码
breq startsystem
cpi r17,$c8 ;停止编码
breq stopsystem
cpi r17,$d0 ;设定编码
breq setup1
cpi r17,$d8 ;退出编码
breq quit1
cpi r17,$e0 ;加编码
breq keyup1
cpi r17,$e8 ;减编码
breq keydown1
cpi r17,$c1 ;消音
breq mute
kqt:
ldi r16,$40 ;INT0可用,INT1屏蔽 0b01000000
out GIMSK,R16
out GIFR,r16
out portd,r19 ;恢复D口状态
sbi portd,6
out portb,r20 ;恢复B口状态
out ddrb,r21 ;恢复B口方向
out SREG,r18
pop r29 ;弹出
pop r28
pop r25 ;弹出
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 ;转向右子程序
intr: sbis pind,2 ;8279的中断信号有则跳行
rjmp intr
rjmp read ;读8279中断信息
startsystem:
rcall beep ;BEEP
ldi r16,01 ;启动风机输出
out portc,r16
sbi portd,7
nop
nop
cbi portd,7
cpi r25,$00
brne intr
rjmp kqt
stopsystem:
rcall beep
ldi r16,00 ;停止风机输出
out portc,r16
sbi portd,7
nop
nop
cbi portd,7
cpi r25,$00
brne intr
rjmp kqt
mute: rcall beep
sbi portd,6 ;消音报警
cpi r25,$00
brne intr
rjmp kqt
setup: rcall beep ;设定按钮
inc r25
cpi r25,$01
brne jmkz1
rcall setupxs ;setup键按了1次
rjmp intr ;再去读中断口
jmkz1: cpi r25,$02
breq jmkz2 ;读出EEP值,以便修改
cpi r25,$03
breq jmkz3 ;修改完毕,保存EEP值
rjmp kqt
jmkz2: rcall EERead ;读出EEP值
mov r23,r16
rcall xsgy
rjmp intr
jmkz3: rcall EEWrite ;保存EEP值
ldi r29,$01
ldi r28,$40
add r28,r24
st y,r23
;rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
dec r25
dec r25
rcall showcs
rjmp intr
quit: rcall beep
cpi r25,$02
brne kqt4 ;退出按钮
rcall showcs
dec r25
rjmp intr
kqt4: rjmp kqt
keyup: rcall beep ;键盘LEFT
cpi r25,$00
brne kqt3
rjmp kqt
kqt3: cpi r25,$01
brne to
dec r24
brmi lp1 ;r24为负转移
lp2: rcall showcs
rjmp intr
to: cpi r25,$02
brne tczgc
dec r23
rcall xsgy
rjmp intr
lp1: ldi r24,$e
rjmp lp2
tczgc: rjmp intr
keydown:rcall beep ;键盘RIGHT
cpi r25,$00
brne kqt2
rjmp kqt
kqt2: cpi r25,$01
brne to1
inc r24
cpi r24,$f
brge lp3 ;r24>=$c 跳转
lp4: rcall showcs
rjmp intr
to1: cpi r25,$02
brne tczgc
inc r23
rcall xsgy
rjmp intr
lp3: ldi r24,$00
rjmp lp4
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
kqt1: 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:
cbi portd,6
ldi r20,$19 ;调用延时
rcall delay
sbi 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
ldi r16,$78 ;'t'
rcall outxs
ldi r16,$06 ;'1'
rcall outxs
rcall jy
ret
csbsf1: cpi r24,$01 ;显示温度周期
brne csbsf2
ldi r16,$6d ;'s'
rcall outxs
ldi r16,$06 ;'1'
rcall outxs
rcall jy
ret
csbsf2: cpi r24,$02 ;显示湿度设定
brne csbsf3
ldi r16,$76 ;'h'
rcall outxs
ldi r16,$06 ;'1'
rcall outxs
rcall jy
ret
csbsf3: cpi r24,$03 ;显示湿度周期
brne csbsf4
ldi r16,$6d ;'s'
rcall outxs
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -