📄 no30a.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=$0300
rjmp RESET ;
.org INT0addr ;通用中断
INTT0: rjmp KEYINT ;
;.org 0x06 ;timerl
;INTTT: RJMP TINT ;
.org 0x0020 ;
;*****************************
;************中断*************
;*****************************
keyint: 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
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 setup
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 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 ;中断返回
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
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,cnt1d
swap r16
rcall outpd
mov r16,cnt1d
rcall outpd
sbi portd,5
rjmp intr
jmkz3: rcall EEWrite ;保存EEP值
dec r25
dec r25
rcall showcs
rjmp intr
quit: rcall beep
cpi r25,$02
brne kqt4 ;退出按钮eeeeeeeeeeeeeee
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
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,cnt1d
swap r16
rcall outpd
mov r16,cnt1d
rcall outpd
sbi portd,5
rjmp intr
lp1: ldi r24,$b
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,$c
brge lp3 ;r24>=$c 跳转
lp4: rcall showcs
rjmp intr
to1: cpi r25,$02
brne tczgc
inc r23
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,cnt1d
swap r16
rcall outpd
mov r16,cnt1d
rcall outpd
sbi portd,5
rjmp intr
lp3: ldi r24,$00
rjmp lp4
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
nop
nop
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 ;置B口方向为输出
;out portb,r16 ;置B口为输出
;clr r16
;out ddrb,r16
;out portb,r16 ;清B口
;sbi portd,5 ;8279写控制字
;sbi portd,4
;cbi portd,3
;nop
;in r17,pinb
;sbi portd,3
;andi r17,$7
;cpi r17,$00
;breq kqt1
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
ldi r16,$5b ;'2'
rcall outxs
rcall jy
ret
csbsf4: cpi r24,$04 ;显示P1
brne csbsf5
ldi r16,$73 ;'p'
rcall outxs
ldi r16,$06 ;'1'
rcall outxs
rcall jy
ret
csbsf5: cpi r24,$05 ;显示I1
brne csbsf6
ldi r16,$30 ;'i'
rcall outxs
ldi r16,$06 ;'1'
rcall outxs
rcall jy
ret
csbsf6: cpi r24,$06 ;显示D1
brne csbsf7
ldi r16,$5e ;'d'
rcall outxs
ldi r16,$06 ;'1'
rcall outxs
rcall jy
ret
csbsf7: cpi r24,$07 ;显示P2
brne csbsf8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -