?? no3.asm
字號(hào):
;************* 宏方科技 HFKJAVR.asm ************************
;*
;* 標(biāo)題:AT90S8535 集散式潔凈空調(diào)自動(dòng)控制系統(tǒng)
;* 版本: 1.0
;* 最后更新日期: 2002.11.01
;* 支援 TEL: 8102124 & 8106097
;*
;*************************************************************
.include"8535def.inc"
.def temp = r19 ;十六進(jìn)制轉(zhuǎn)換暫存器
.def count = r8 ;十六進(jìn)制轉(zhuǎn)換計(jì)數(shù)器
.def res1 = r4
.def res2 = r5 ;res1、res2存放結(jié)果的十六進(jìn)制
.def cnt1d = r6
.def cnt2d = r7 ;cnt1、dcnt2d存放結(jié)果的十進(jìn)制
.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) ;設(shè)置堆棧
out SPL,R16
ldi R16,high(RAMEND)
out SPH,R16
ldi r16,$28 ;8279寫(xiě)控制寄存器
out portd,r16
ldi r16,$d1
out portb,r16
sbi portd,4
; ldi r20,0X30
; rcall Delay
;wdr ;看門(mén)狗復(fù)位
;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 ;設(shè)置ADC轉(zhuǎn)換,中斷觸發(fā),ADC為單次模式且32M分頻
out adcsr,R16
clr R16
out admux,R16 ;ADC 0通道
sbi adcsr,6 ;啟動(dòng)ADC
ldi r16,$98 ;初始化COM
out ucr,r16 ;設(shè)置UART控制寄存器---UCR
ldi r16,25
out ubrr,r16 ;設(shè)置UART波特率
;ldi r16,$40 ;INT0可用,INT1屏蔽
;out GIMSK,R16
;ldi r16,$3 ;INT0上升沿觸發(fā)
;out mcucr,r16
cbi portd,4
ldi r16,$00 ;8279鍵盤(pán)顯示方式初始
out portb,r16
sbi portd,4
nop
cbi portd,4
ldi r16,$22 ;8279時(shí)鐘分頻=2
out portb,r16
sbi portd,4
clr r17 ;ADIN 4051地址計(jì)數(shù)
main: rcall ADC1
mov res1,r2
mov res2,r3
rcall htd3 ;16進(jìn)制轉(zhuǎn)10進(jìn)制
rcall display ;調(diào)用顯示子程序
cpi r17,$07
brne addre1 ;不等于7則跳轉(zhuǎn)
clr r17 ;等于7
sbic admux,0 ;內(nèi)地址
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 ;延時(shí)1秒
rcall Delay
sbi adcsr,6 ;啟動(dòng)ADC
rjmp main ;
;**** 子程序
ADC1: sbic adcsr,adsc ;轉(zhuǎn)換結(jié)束跳行否則等待
rjmp ADC1
in r2,adcl ;把轉(zhuǎn)換結(jié)果送r2,r3
in r3,adch
sbic pina,2 ;讀開(kāi)關(guān)量
ldi r18,$0 ;開(kāi)關(guān)量關(guān)
ldi r18,$1 ;開(kāi)關(guān)量開(kāi)
ldi r27,$01 ;傳數(shù)據(jù)到SRAM 0100 處
mov r26,r17
st x,r18 ;傳開(kāi)關(guān)量到 0100
sbic admux,0
rjmp admux1
adiw r26,$10 ;傳A0數(shù)據(jù)到SRAM 0110 處
rjmp chuan
admux1: adiw r26,$20 ;傳A1數(shù)據(jù)到SRAM 0120 處
chuan: st x+,r2 ;傳低位數(shù)據(jù)
st x,r3 ;傳高位數(shù)據(jù)
ret
;**** 16位無(wú)符號(hào)乘法
.def mc16uL =r9 ;被乘數(shù)低字節(jié)
.def mc16uH =r10 ;被乘數(shù)高字節(jié)
.def mp16uL =r11 ;乘數(shù)低字節(jié)
.def mp16uH =r12 ;乘數(shù)高字節(jié)
.def m16ua =r11 ;結(jié)果 字節(jié) 0 (LSB)
.def m16ub =r12 ;結(jié)果 字節(jié) 1
.def m16u2 =r13 ;結(jié)果 字節(jié) 2
.def m16u3 =r14 ;結(jié)果 字節(jié) 3 (MSB)
.def mcnt16u =r21 ;循環(huán)計(jì)數(shù)
mpy16u: clr m16u3 ;清2.3
clr m16u2
ldi mcnt16u,16 ;
lsr mp16uH
ror mp16uL
m16u_1: brcc noad8 ;C清零轉(zhuǎn)
add m16u2,mc16uL ;加被乘數(shù)到2
adc m16u3,mc16uH ;加被乘數(shù)到3
noad8: ror m16u3 ;帶進(jìn)位右循環(huán)
ror m16u2 ;帶進(jìn)位右循環(huán)
ror m16ub ;帶進(jìn)位右循環(huán)
ror m16ua ;帶進(jìn)位右循環(huán)
dec mcnt16u ;計(jì)數(shù)減1
brne m16u_1 ;不為零轉(zhuǎn)
ret
;***** 16位無(wú)符號(hào)除法
.def drem16uL=r13 ;余數(shù) 低位
.def drem16uH=r14 ;余數(shù) 高位
.def dres16uL=r11 ; 商 低位
.def dres16uH=r12 ; 商 高位
.def dd16uL =r11 ;被除數(shù) 低位
.def dd16uH =r12 ;被除數(shù) 高位
.def dv16uL =r9 ;除數(shù) 低位
.def dv16uH =r10 ;除數(shù) 高位
.def dcnt16u =r21
div16u: clr drem16uL ;清除余數(shù)低位
sub drem16uH,drem16uH ;清除余數(shù)高位
ldi dcnt16u,17 ;循環(huán)計(jì)數(shù)
d16u_1: rol dd16uL ;帶進(jìn)位左移
rol dd16uH
dec dcnt16u ;decrement counter
brne d16u_2 ;不為0轉(zhuǎn)
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轉(zhuǎn)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通道號(hào)切換
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傳送數(shù)據(jù)結(jié)束
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延時(shí)子程序
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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -