|
楼主 |
发表于 2009-10-21 21:32:47
|
显示全部楼层
这是程序,已好用。
.INCLUDE "m8def.INC" ; 4M内部RC
.def dl=r12
.DEF DT=R17
.equ sz0=0x0100
.equ sz1=0x0101
.equ sz2=0x0102
.equ sz3=0x0103
.ORG $0000
RJMP RESET
.ORG 0X0010
RESET: ldi r16,0x04 ; Put stack near top of SRAM (0x045F)
out SPH,r16
ldi r16,0x5F
out SPL,r16
ldi r16,0xff ;看门狗2秒
out wdtcr,r16
ldi r16,0x0f ;看门狗2秒
out wdtcr,r16
ldi r16,0 ;关输出
out portb,R16 ;0-3数据
out ddrb,R16
ldi r16,0
out ddrd,R16 ;设D口 3,第一位 4第2位数据 5,6,7 高电平时选通
out portd,R16 ;d输出0
ldi r16,0
out ddrc,R16 ;设c低4位为输入高4位为输出pc3,pc2为4052的A,B
out portc,R16 ;设c没有上拉电阻
ldi r16,0b00100000 ;串囗初始化
out ucsra,r16
ldi r16,0b00001000 ;串囗初始化
out ucsrb,r16
ldi r16,0b10001110 ;串囗初始化
out ucsrc,r16
ldi r16,0b0000000 ;串囗初始化
out ubrrh,r16
ldi r16,25 ;9600bit/s 4M时25
out ubrrl,r16
main: wdr
sbis pind,7 ;=1跳一行
rjmp main
rcall dell
in r16,pinb
andi r16,0x0f
sts sz1,r16
jc1: nop
sbis pind,6 ;=1跳一行
rjmp jc1
rcall dell
in r16,pinb
andi r16,0x0f
swap r16
sts sz2,r16
jc2: nop
sbis pind,5 ;=1跳一行
rjmp jc2
rcall dell
in r16,pinb
andi r16,0x0f
lds r17,sz2
or r17,r16
sts sz2,r17
jc3: nop
sbis pind,4 ;=1跳一行
rjmp jc3
rcall dell
in r16,pinb
andi r16,0x0f
swap r16
sts sz3,r16
jc4: nop
sbis pind,3 ;=1跳一行
rjmp jc4
rcall dell
in r16,pinb
andi r16,0x0f
lds r17,sz3
or r17,r16
sts sz3,r17
rcall dyzcx
ldi dt,200 ;延时2。5秒
rcall delay
rjmp main
dyzcx: ldi r16,0xaa
sts sz0,r16
ldi r18,4 ;20个字串行发送 发送温度和输出
ldi zh,0x01 ;01
ldi zl,0 ;4e
dy4: sbis ucsra,udre
rjmp dy4
ld r21,z+
ldi dt,4
rcall delay
WDR
out udr,r21
subi r18,0x01 ;计数减1
brne dy4 ;不等转移
dy5: sbis ucsra,udre
rjmp dy5
ret
dell: ldi r16,10
del3: nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
dec r16
brne del3
ret
delay: ldi r16,250 ;4M时钟延时1.25MS
del2: nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
dec r16
brne del2
dec dt
brne delay
ret
.exit |
|