📄 no5.asm
字号:
std z+6,r6
std z+7,r7
ldi xl,6
rcall eewrite
mov r16,r7
ldi xl,7
rcall eewrite
rjmp kqt
setup34:cpi r16,20 ;FL
brne setup35
ldd r6,y+12
ldd r7,y+13
rcall btoh
std z+8,r4
std z+9,r5
ldi xl,8
mov r16,r4
rcall eewrite
mov r16,r5
ldi xl,9
rcall eewrite
rjmp kqt
setup35:cpi r16,21 ;S1
brne setup36
ldd r6,y+12
clr r7
rcall btoh
std z+10,r4
ldi xl,10
mov r16,r4
rcall eewrite
rjmp kqt
setup36:cpi r16,22 ;S2
brne setup37
ldd r6,y+12
clr r7
rcall btoh
std z+11,r4
ldi xl,11
mov r16,r4
rcall eewrite
rjmp kqt
setup37:cpi r16,23 ;P1
brne setup38
ldd r6,y+12
clr r7
rcall btoh
std z+12,r4
ldi xl,12
mov r16,r4
rcall eewrite
rcall cansujs1 ;^^^^^^^^^^^^^^
rjmp kqt
setup38:cpi r16,24 ;I1
brne setup39
ldd r6,y+12
clr r7
rcall btoh
std z+13,r4
ldi xl,13
mov r16,r4
rcall eewrite
rcall cansujs1 ;^^^^^^^^^^^^^^
rjmp kqt
setup39:cpi r16,25 ;D1
brne setup40
ldd r6,y+12
clr r7
rcall btoh
std z+14,r4
ldi xl,14
mov r16,r4
rcall eewrite
rcall cansujs1 ;^^^^^^^^^^^^^^
rjmp kqt
setup40:cpi r16,26 ;P2
brne setup41
ldd r6,y+12
clr r7
rcall btoh
std z+15,r4
ldi xl,15
mov r16,r4
rcall eewrite
rcall cansujs2 ;^^^^^^^^^^^^^^
rjmp kqt
setup41:cpi r16,27 ;I2
brne setup42
ldd r6,y+12
clr r7
rcall btoh
std z+16,r4
ldi xl,16
mov r16,r4
rcall eewrite
rcall cansujs2 ;^^^^^^^^^^^^^^
rjmp kqt
setup42:cpi r16,28 ;D2
brne setup43
ldd r6,y+12
clr r7
rcall btoh
std z+17,r4
ldi xl,17
mov r16,r4
rcall eewrite
rcall cansujs2 ;^^^^^^^^^^^^^^
rjmp kqt
setup43:cpi r16,29 ;MODLE
brne setup44
ldd r16,y+12
ldi r18,1
sbrc r16,0
rjmp setup44
clr r18
setup44:std z+18,r18
ldi xl,18
mov r16,r18
rcall eewrite
rjmp kqt
setup45:cpi r16,30 ;SN
brne setup46
ldd r6,y+12
clr r7
rcall btoh
std z+19,r4
ldi xl,19
mov r16,r4
rcall eewrite
rjmp kqt
setup46:cpi r16,31 ;UBR
; brne setup47
ldd r6,y+12
clr r7
rcall btoh
std z+20,r4
ldi xl,20
mov r16,r4
rcall eewrite
rjmp kqt
setup47:cpi r16,32 ;t下限
brne setup48
clr r16
std y+13,r16
rcall wendubh
std z+21,r6
ldi xl,21
rcall eewrite
rjmp kqt
setup48:cpi r16,33 ;t上限
brne setup49
clr r16
std y+13,r16
rcall wendubh
std z+22,r6
ldi xl,22
rcall eewrite
rjmp kqt
setup49:cpi r16,34 ;h下限
brne setup50
ldd r6,y+12
clr r7
rcall shidubh
std z+23,r6
ldi xl,23
rcall eewrite
rjmp kqt
setup50:ldd r6,y+12 ;h上限
clr r7
rcall shidubh
std z+24,r6
ldi xl,24
rcall eewrite
rjmp kqt
LEFT: rcall beep ;键盘LEFT
ldi yh,$00 ;y >>> $0060
ldi yl,$60
ldd r16,y+5 ;参数设定计数器
cpi r16,0
brne LEFT1
ldi r16,1 ;通道锁定
st y,r16
rjmp kqt
LEFT1: cpi r16,1
breq left01
rjmp LEFT22 ;参数设定计数器=2
left01: ldd r16,y+1 ;通道号
dec r16
cpi r16,15
brne left2
ldi r16,35
left2: std y+1,r16
cpi r16,16
brne left3
ldi r16,$78 ;'t'
ldi r17,$06 ;'1'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left3: cpi r16,17
brne left4
ldi r16,$76 ;'h'
ldi r17,$06 ;'1'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left4: cpi r16,18
brne left5
ldi r16,$78 ;'t'
ldi r17,$5b ;'2'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left5: cpi r16,19
brne left6
ldi r16,$73 ;'P'
ldi r17,$77 ;'A'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left6: cpi r16,20
brne left7
ldi r16,$71 ;'F'
ldi r17,$38 ;'L'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left7: cpi r16,21
brne left8
ldi r16,$6D ;'S'
ldi r17,$06 ;'1'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left8: cpi r16,22
brne left9
ldi r16,$6D ;'S'
ldi r17,$5B ;'2'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left9: cpi r16,23
brne left10
ldi r16,$73 ;'P'
ldi r17,$06 ;'1'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left10: cpi r16,24
brne left11
ldi r16,$30 ;'I'
ldi r17,$06 ;'1'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left11: cpi r16,25
brne left12
ldi r16,$5E ;'D'
ldi r17,$06 ;'1'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left12: cpi r16,26
brne left13
ldi r16,$73 ;'P'
ldi r17,$5B ;'2'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left13: cpi r16,27
brne left14
ldi r16,$30 ;'I'
ldi r17,$5B ;'2'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left14: cpi r16,28
brne left15
ldi r16,$5E ;'D'
ldi r17,$5B ;'2'
ldi r18,$40 ;'-'
rcall XIANTD
rjmp kqt
left15: cpi r16,29
brne left16
ldi r16,$31 ;'R'
ldi r17,$7E ;'U'
ldi r18,$37 ;'N'
rcall XIANTD
rjmp kqt
left16: cpi r16,30
brne left17
ldi r16,$6D ;'S'
ldi r17,$40 ;'-'
ldi r18,$37 ;'N'
rcall XIANTD
rjmp kqt
left17: cpi r16,31
brne left18
ldi r16,$7E ;'U'
ldi r17,$7c ;'b'
ldi r18,$31 ;'R'
rcall XIANTD
rjmp kqt
left18: cpi r16,32
brne left19
ldi r16,$78 ;'t'
ldi r17,$40 ;'-'
ldi r18,$38 ;'L'
rcall XIANTD
rjmp kqt
left19: cpi r16,33
brne left20
ldi r16,$78 ;'t'
ldi r17,$40 ;'-'
ldi r18,$76 ;'H'
rcall XIANTD
rjmp kqt
left20: cpi r16,34
brne left21
ldi r16,$76 ;'H'
ldi r17,$40 ;'-'
ldi r18,$38 ;'L'
rcall XIANTD
rjmp kqt
left21: ldi r16,$76 ;'H'
ldi r17,$40 ;'-'
ldi r18,$76 ;'H'
rcall XIANTD
rjmp kqt
left22: clr r15
clr r14
ldd r13,y+13 ;$006d
ldd r12,y+12 ;$006c
rcall LRJIAN
rcall subcd
std y+13,r13 ;$006d
std y+12,r12 ;$006c
rjmp kqt
RIGHT: rcall beep ;键盘RIGHT
ldi yh,$00 ;y >>> $0060
ldi yl,$60
ldd r16,y+5 ;参数设定计数器
cpi r16,0
brne right1
ldi r16,0 ;通道锁定解除
st y,r16
rjmp kqt
right1: cpi r16,1
brne right2 ;参数设定计数器=2
ldd r16,y+1 ;通道号
inc r16
cpi r16,36
brne right01
ldi r16,16
right01:rjmp left2
right2: clr r15
clr r14
ldd r13,y+13 ;$006d
ldd r12,y+12 ;$006c
rcall LRJIAN
rcall adbcd
std y+13,r13 ;$006d
std y+12,r12 ;$006c
rjmp kqt
;/////////////////////////////////////////////////
;/////////////////////////////////////////////////
SHIDU1: mov r6,r2
mov r7,r3
ldi r18,$03 ;(r7,r6)*$30e
mov r5,r18
ldi r18,$0e
mov r4,r18
rcall mul16
mov r4,r6 ;R8,R7,R6>>>BCD
mov r5,r7
mov r6,r8
rcall htd3
ret
wendubh:ldd r6,y+12
ldd r7,y+13
rcall btoh
ldi r18,$03
ldi r16,$ff
mov r6,r16
mov r7,r18
rcall mul16 ;*1023
ldi r18,$0f
ldi r16,$a0
mov r4,r16
mov r5,r18
rcall div16 ;/4000
mov r16,r6
ret
shidubh:rcall btoh
ldi r18,$03
ldi r16,$ff
mov r6,r16
mov r7,r18
rcall mul16 ;*1023
ldi r18,$1f
ldi r16,$40
mov r4,r16
mov r5,r18
rcall div16 ;/8000
mov r16,r6
ret
tehpabh:ldd r6,y+12
ldd r7,y+13
rcall btoh
ldi r18,$03
ldi r16,$ff
mov r6,r16
mov r7,r18
rcall mul16 ;*1023
ldi r18,$03
ldi r16,$e8
mov r4,r16
mov r5,r18
rcall div16 ;/1000
mov r16,r6
ret
XIANTD: std y+7,r16 ;$0067
std y+8,r17 ;$0068
std y+9,r18 ;$0069
ldi r19,$40 ;'-'
std y+10,r19 ;$006a
std y+11,r19 ;$006b
ret
LRJIAN: clr r11
clr r10
clr r9
clr r8
ldd r16,y+6 ;参数位数选择
cpi r16,0
brne LRJIAN1
inc r8
ret
LRJIAN1:cpi r16,1
brne LRJIAN2
ldi r16,$10
mov r8,r16
ret
LRJIAN2:cpi r16,2
brne LRJIAN3
inc r9
ret
LRJIAN3:ldi r16,$10
mov r9,r16
ret
EERead:
sbic EECR,EEWE ;if EEWE not clear
rjmp EERead
out EEARH,r27 ;output address high for 8515
out EEARL,r26 ;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 ;数据传给R16
ret
EEWrite:
sbic EECR,EEWE ;if EEWE not clear
rjmp EEWrite ;wait more
out EEARH,r27 ;output address high for 8515
out EEARL,r26 ;output address low for 8515
out EEDR,r16 ;output data
sbi EECR,EEMWE ;set master write enable, remove if 1200 is used
sbi EECR,EEWE ;set EEPROM Write strobe
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
beep: sbi portd,6
ldi r20,$19 ;调用延时
rcall delay
cbi portd,6
ret
valjs1: ldi yh,$00 ;Y >>>0X00b0
ldi yl,$b0
ldi Zh,$00 ;Z >>>0X0080
ldi Zl,$80
rcall mubc
ldd r4,Z+32 ;E L
ldd r5,Z+33 ;E H
lds r6,$0100 ;Es L
lds r7,$0101 ;Es H
rcall muabc
clr r7
ldd r6,y+12 ;V0
rcall VAL0
std y+42,r17 ;AO2 热水阀
std y+12,r16 ;$00BC暂存冷水阀
ldd r17,y+28
cp r16,r17
brsh valbj1
mov r16,r17
valbj1: std y+41,r16 ;AO1冷水阀
ret
valjs2: ldi yh,$00 ;Y >>>0X00c0
ldi yl,$c0
ldi Zh,$00 ;Z >>>0X0090
ldi Zl,$90
rcall mubc
ldd r4,Z+18 ;E L
ldd r5,Z+19 ;E H
lds r6,$0102 ;Es L
lds r7,$0103 ;Es H
rcall muabc
clr r7
ldd r6,y+12 ;V0
rcall VAL0
std y+27,r17 ;AO3 加湿阀
std y+12,r16 ;$00BC暂存冷水阀
lds r17,$00bc
cp r16,r17
brsh valbj2
mov r16,r17
valbj2: std y+25,r16 ;AO1冷水阀
ret
AOOUT: out portc,r16 ;out data
sbi porta,7 ;打开DAC锁存
nop
cbi porta,7
out portc,r17 ;地址
sbi porta,6 ;打开地址锁存
nop
cbi porta,6
ret
DOOUT: out portc,r16 ;out data
sbi portD,7 ;打开DO锁存
nop
cbi portD,7
ret
;**********************
;********主程序********
;**********************
;.cseg
;.org 0x01b6
RESET:
ldi R16,low(RAMEND) ;设置堆栈
out SPL,R16
ldi R16,high(RAMEND)
out SPH,R16
ldi R16,$F8 ;0B11111000
out DDRA,R16 ;A口0~2输入,3~7输出
sbi porta,2
ldi R16,$FA ;0b11111110
out DDRD,R16 ;D口0/2输入,1/3~7输出
ldi R16,$FF ;0B11111111
out DDRC,R16 ;C口输出
out DDRB,R16 ;B口输出
ldi r16,$28 ;8279写控制寄存器
out portd,r16
ldi r16,$d1 ;清8279寄存器
out portb,r16
sbi portd,4
clr r16
out ddrb,r16
ldi r16,$30
out portd,r16
wait: sbis portb,7 ;等待清除结束
rjmp wait
cbi portd,4
sbi portd,3
ser r16
out ddrb,r16 ;B口方向输出
clr R16
out admux,R16 ;ADC 0通道
ldi R16,$85 ;设置ADC转换,中断触发,ADC为单次模式且32M分频
out adcsr,R16
sbi adcsr,adif ;写1复位中断为0
sbi adcsr,6 ;启动ADC
ldi r27,$01 ;把EEP中的参数映射到SRAM的0X0100~0X0118处
ldi r26,$00 ;x >>> $0100
EEpRead:rcall eeread
st x+,r16
cpi r26,$1a
brne EEpRead
ldi r16,$98 ;初始化COM
out ucr,r16 ;设置UART控制寄存器---UCR
lds r16,$0114 ;SRAM 0X0114>>>R16
out ubrr,r16 ;设置UART波特率
rcall cansujs1 ;^^^^^^^^^^^^^^^^^^^^
rcall cansujs2 ;^^^^^^^^^^^^^^^^^^^^
ldi r16,$3 ;INT0上升沿触发 0b00000011
out mcucr,r16
ldi r16,$05 ;Timer1设置为CK/1024分频
out tccr1b,r16
ldi r16,$e1
ldi r17,$7c
out tcnt1h,r16
out tcnt1l,r17
ldi r16,$4 ;$80=0b00000100
out timsk,r16 ;toie1=1允许timer中断
ldi r16,$40
out GIMSK,R16 ;INT0可用,INT1屏蔽 0b01000000
out GIFR,r16
sei
wdr ;看门狗复位
ldi R16,$0f ;0b00001111
out WDTCR,R16 ;狗周期2048MS
cbi portd,4
ldi r16,$00 ;8279键盘显示方式初始
out portb,r16
sbi portd,4
nop
cbi portd,4
ldi r16,$22 ;8279时钟分频=2
out portb,r16
sbi portd,4
ldi r29,$00
ldi r28,$60
clr r16 ;显示通道号
sys1: st Y+,r16 ;$0060通道号锁定
cpi r28,$70
brne sys1
ldi r28,$b6
sys2: st Y+,r16 ;温度偏差
cpi r28,$c0
brne sys2
ldi r28,$c6
sys3: st Y+,r16 ;湿度偏差
cpi r28,$d0
brne sys3
ldi r28,$d8
sys4: st Y+,r16 ;AO输出
cpi r28,$e0
brne sys4
sts $011a,r16 ;DO OUT
sts $011b,r16 ;静音
rcall beep ;系统初始化成功
main: wdr
clr r29 ;Y >>>>> SRAM 00d0 处
ldi r28,$d0
rcall ADC1
sbi porta,3
cbi porta,4
cbi porta,5
st y,r16 ;传开关量到 00d0
sts $00a0,r2 ;传A0L >>> 00a0
sts $00a1,r3 ;传A0H >>> 00a1
rcall wendu
std y+16,r8 ;传A0L >>> 00e0
std y+17,r9 ;传A0H >>> 00e1
rcall ADC1
cbi porta,3
sbi porta,4
cbi porta,5
std y+1,r16 ;传开关量到 00d1
sts $00a2,r2 ;传A1L >>> 00a2
sts $00a3,r3 ;传A1H >>> 00a3
rcall shidu
std y+18,r8 ;传A1L >>> 00e2
std y+19,r9 ;传A1H >>> 00e3
rcall ADC1
sbi porta,3
sbi porta,4
cbi porta,5
std y+2,r16 ;传开关量到 00d2
rcall wendu
std y+20,r8 ;传A2L >>> 00e4
std y+21,r9 ;传A2H >>> 00e5
rcall ADC1
cbi porta,3
cbi porta,4
sbi porta,5
std y+3,r16 ;传开关量到 00d3
rcall shidu
std y+22,r8 ;传A3L >>> 00e6
std y+23,r9 ;传A3H >>> 00e7
rcall ADC1
sbi porta,3
cbi porta,4
sbi porta,5
std y+4,r16 ;传开关量到 00d4
rcall wendu
std y+24,r8 ;传A4L >>> 00e8
std y+25,r9 ;传A4H >>> 00e9
rcall ADC1
cbi porta,3
sbi porta,4
sbi porta,5
std y+5,r16 ;传开关量到 00d5
rcall shidu
std y+26,r8 ;传A5L >>> 00ea
std y+27,r9 ;传A5H >>> 00eb
rcall ADC1
sbi porta,3
sbi porta,4
sbi porta,5
std y+6,r16 ;传开关量到 00d6
rcall wendu
std y+28,r8 ;传A6L >>> 00ec
std y+29,r9 ;传A6H >>> 00ed
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -