📄 no3.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 ;res1、res2存放结果的十六进制
.def cnt1d = r6
.def cnt2d = r7 ;cnt1、dcnt2d存放结果的十进制
.org 0x00
.equ label=$0200
rjmp RESET ;
;.org 0x01 ;通用中断
;INTT0: RJMP GINT ;
;.org 0x06 ;timerl
;INTTT: RJMP TINT ;
.org 0x020 ;
RESET:
SYS: ldi R16,low(RAMEND) ;设置堆栈
out SPL,R16
ldi R16,high(RAMEND)
out SPH,R16
ldi r16,$28 ;8279写控制寄存器
out portd,r16
ldi r16,$d1
out portb,r16
sbi portd,4
; ldi r20,0X30
; rcall Delay
;wdr ;看门狗复位
;ldi R16,$0F ;0b00001111
;out WDTCR,R16 ;狗周期2048MS
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,$85 ;设置ADC转换,中断触发,ADC为单次模式且32M分频
out adcsr,R16
clr R16
out admux,R16 ;ADC 0通道
sbi adcsr,6 ;启动ADC
ldi r16,$98 ;初始化COM
out ucr,r16 ;设置UART控制寄存器---UCR
ldi r16,25
out ubrr,r16 ;设置UART波特率
;ldi r16,$40 ;INT0可用,INT1屏蔽
;out GIMSK,R16
;ldi r16,$3 ;INT0上升沿触发
;out mcucr,r16
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
clr r17 ;ADIN 4051地址计数
main: rcall ADC1
mov res1,r2
mov res2,r3
rcall htd3 ;16进制转10进制
rcall display ;调用显示子程序
cpi r17,$07
brne addre1 ;不等于7则跳转
clr r17 ;等于7
sbic admux,0 ;内地址
rjmp addre2 ;如果admux=1则置0
sbi admux,0 ;如果admux=0则置1
rjmp addre3
addre2: cbi admux,0
rjmp addre3
addre1: inc r17
addre3: mov r18,r17
andi r18,$01
cpi r18,$01
brne addre4
sbi porta,3
rjmp addre5
addre4: cbi porta,3
addre5: mov r18,r17
andi r18,$02
cpi r18,$02
brne addre6
sbi porta,4
rjmp addre7
addre6: cbi porta,4
addre7: mov r18,r17
andi r18,$04
cpi r18,$04
brne addre8
sbi porta,5
rjmp addre9
addre8: cbi porta,5
addre9: ldi r20,0X56 ;延时1秒
rcall Delay
sbi adcsr,6 ;启动ADC
rjmp main ;
;**** 子程序
ADC1: sbic adcsr,adsc ;转换结束跳行否则等待
rjmp ADC1
in r2,adcl ;把转换结果送r2,r3
in r3,adch
sbic pina,2 ;读开关量
ldi r18,$0 ;开关量关
ldi r18,$1 ;开关量开
ldi r27,$01 ;传数据到SRAM 0100 处
mov r26,r17
st x,r18 ;传开关量到 0100
sbic admux,0
rjmp admux1
adiw r26,$10 ;传A0数据到SRAM 0110 处
rjmp chuan
admux1: adiw r26,$20 ;传A1数据到SRAM 0120 处
chuan: st x+,r2 ;传低位数据
st x,r3 ;传高位数据
ret
;**** 16位无符号乘法
.def mc16uL =r9 ;被乘数低字节
.def mc16uH =r10 ;被乘数高字节
.def mp16uL =r11 ;乘数低字节
.def mp16uH =r12 ;乘数高字节
.def m16ua =r11 ;结果 字节 0 (LSB)
.def m16ub =r12 ;结果 字节 1
.def m16u2 =r13 ;结果 字节 2
.def m16u3 =r14 ;结果 字节 3 (MSB)
.def mcnt16u =r21 ;循环计数
mpy16u: clr m16u3 ;清2.3
clr m16u2
ldi mcnt16u,16 ;
lsr mp16uH
ror mp16uL
m16u_1: brcc noad8 ;C清零转
add m16u2,mc16uL ;加被乘数到2
adc m16u3,mc16uH ;加被乘数到3
noad8: ror m16u3 ;带进位右循环
ror m16u2 ;带进位右循环
ror m16ub ;带进位右循环
ror m16ua ;带进位右循环
dec mcnt16u ;计数减1
brne m16u_1 ;不为零转
ret
;***** 16位无符号除法
.def drem16uL=r13 ;余数 低位
.def drem16uH=r14 ;余数 高位
.def dres16uL=r11 ; 商 低位
.def dres16uH=r12 ; 商 高位
.def dd16uL =r11 ;被除数 低位
.def dd16uH =r12 ;被除数 高位
.def dv16uL =r9 ;除数 低位
.def dv16uH =r10 ;除数 高位
.def dcnt16u =r21
div16u: clr drem16uL ;清除余数低位
sub drem16uH,drem16uH ;清除余数高位
ldi dcnt16u,17 ;循环计数
d16u_1: rol dd16uL ;带进位左移
rol dd16uH
dec dcnt16u ;decrement counter
brne d16u_2 ;不为0转
ret ;return
d16u_2: rol drem16uL ;shift dividend into remainder
rol drem16uH
sub drem16uL,dv16uL ;remainder = remainder - divisor
sbc drem16uH,dv16uH ;
brcc d16u_3 ;if result negative
add drem16uL,dv16uL ;restore remainder
adc drem16uH,dv16uH
clc ;clear carry to be shifted into result
rjmp d16u_1 ;else
d16u_3: sec ;set carry to be shifted into result
rjmp d16u_1
htd3: ;16转10子程序
ldi temp,16
mov count,temp
clr temp
clr cnt1d
clr cnt2d
clc
loopd:
rol res1
rol res2
rol cnt1d
rol cnt2d
dec count
brne c
ret
c: rcall adjn
rjmp loopd
adjn:
push count
mov count,cnt1d
rcall adjd1
mov cnt1d,count
mov count,cnt2d
rcall adjd1
mov cnt2d,count
pop count
ret
adjd1:
ldi temp,3
add temp,count
sbrc temp,3
mov count,temp
ldi temp,$30
add temp,count
sbrc temp,7
mov count,temp
ret
display:sbi portd,5 ;初始化8279控制字
cbi portd,4
ldi r23,$90
out portb,r23
sbi portd,4
cbi portd,5
ldi zh,high(label*2) ;0~15通道号切换
mov zl,r17
sbic admux,0
rjmp dis1
rjmp dis0
dis1: adiw zl,$08
dis0: lpm
out portb,r0
cbi portd,4
nop
sbi portd,4
mov r16,cnt2d
swap r16
rcall outpd
mov r16,cnt2d
rcall outpd
mov r16,cnt1d
swap r16
rcall outpd
mov r16,cnt1d
rcall outpd
sbi portd,5 ;向8279传送数据结束
ret
outpd: ldi zl,low(label*2)
andi r16,$0f
add zl,r16
lpm
out portb,r0
cbi portd,4
nop
sbi portd,4
ret
delay: push r20 ;2t延时子程序
l0: push r20 ;2t
l1: push r20 ;2t
l2: push r20 ;2t
l3: dec r20 ;1t
brne l3 ;1t/2t
pop r20 ;2t
dec r20 ;1t
brne l2 ;1t/2t
pop r20 ;2t
dec r20 ;1t
brne l1 ;1t/2t
pop r20 ;2t
dec r20 ;1t
brne l0 ;1T/2T
pop r20 ;2t
ret ;4t
.cseg
.org $0200
.dw 0x063f,0x4f5b,0x6d66,0x077d
.dw 0x6f7f,0x7c77,0x5e39,0x7179
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -