帮我看看这个汇编的问题在什么地方,关于时钟DS1302。
;接线定义:PD2-CLK时钟 PD3-I/O数据入/出 PA2-RET复位.include "8515def.inc" ;Includes the 8515 definitions file定义头文件。
.org 0x0000 ;指定开始地址。
rjmp reset ;转移到“RESET”句。
.org 0x10
reset: ldi r16,0x02 ;设置堆栈指针0x025f
out sph,r16
ldi r16,0x5f
out spl,r16
;---------------------------
ldi r16,0xff ;加载立即数
out ddrc,r16 ;PC口为输出,数码管的段码端
out ddra,r16 ;PA口为输出,PA2接时钟芯片的复位端
ldi r16,0B11110111
out ddrd,r16 ;PD口为输入/出,PD2/3是时钟和数据端
rcall wrcr ;写入时钟需要的值
rcall datin ;装入初始数据
qq: rcall display ;动态显示
rcall rdcr ;读数据
rcall moin ;数据分开,装入显存
rjmp qq
;--------------------多字节模式写入各个寄存器数据程序------------------------
wrcr: cbi 0x12,2 ;clk=0,portd=0x12
sbi 0x1b,2 ;ret=1,porta=0x1b
ldi r18,0x8e ;写保护命令字节
rcall wbyte ;写指令
ldi r18,0x00 ;解除写保护命令
rcall wbyte
cbi 0x1b,2 ;ret=0,porta=0x1b
cbi 0x12,2 ;clk=0,portd=0x12
sbi 0x1b,2 ;ret=1,porta=0x1b
ldi r18,0xbe ;多字节写命令
rcall wbyte
ldi r18,0x52 ;52秒
rcall wbyte ;写指令
ldi r18,0x34 ;34分
rcall wbyte ;写指令
ldi r18,0x19 ;19时
rcall wbyte ;写指令
ldi r18,0x26 ;26日
rcall wbyte ;写指令
ldi r18,0x03 ;星期三
rcall wbyte ;写指令
ldi r18,0x12 ;12月
rcall wbyte ;写指令
ldi r18,0x03 ;03年
rcall wbyte ;写指令
ldi r18,0x00 ;写保护内容
rcall wbyte ;写指令
cbi 0x12,2 ;clk=0,portd=0x12
cbi 0x1b,2 ;ret=0,porta=0x1b
ret
;---------------------多字节模式读出各个寄存器数据程序---------------------
rdcr: cbi 0x12,2 ;clk=0,portd=0x12
sbi 0x1b,2 ;ret=1,porta=0x1b
ldi r18,0xbf ;多字节读命令
rcall wbyte ;写入命令
rcall rbyte ;读数据
mov r0,r18 ;秒
rcall rbyte ;读数据
mov r1,r18 ;分
rcall rbyte ;读数据
mov r2,r18 ;时
rcall rbyte ;读数据
mov r3,r18 ;日
rcall rbyte ;读数据
mov r4,r18 ;星期
rcall rbyte ;读数据
mov r5,r18 ;月
rcall rbyte ;读数据
mov r6,r18 ;年
rcall rbyte ;读数据
mov r7,r18 ;写保护数据
cbi 0x12,2 ;clk=0,portd=0x12
cbi 0x1b,2 ;ret=0,porta=0x1b
ret
;----------8位写入指令程序,数据需要事先放在r18中----------------------
wbyte: sbi 0x11,3 ;PD3暂时为输出ddrd=0x11
ldi r16,0x08 ;写入命令
wb0: cbi 0x12,2 ;clk=0,portd=0x12
ror r18 ;带C循环右移,r18放的是数据。
brbc 0,b0 ;若C为0跳转,输出0。
rjmp b1 ;否则肯定为1,输出1。
b0: cbi 0x12,3 ;I/Oout=0,输出0。portd=0x12
rjmp wb1 ;转移
b1: sbi 0x12,3 ;I/Oout=1,输出1。portd=0x12
nop
wb1: sbi 0x12,2 ;clk=1,portd=0x12
dec r16 ;寄存器减1
cpi r16,0 ;与立即数0比较
brne wb0 ;不为0,继续发送下一位。
ret
;----------8位读出数据程序,读出的数据放在r18中----------------------
rbyte: cbi 0x11,3 ;PD3暂时为输入ddrd=0x11
sbi 0x12,3 ;portd3=1
ldi r16,0x08 ;写入命令
rb0: cbi 0x12,2 ;clk=0,portd=0x12
in r17,0x10 ;读取端口PIND的数据pind=0x10
sbrc r17,3 ;指定位为0跳行
rjmp d1 ;否则肯定为1
d0: clc ;c=0
ror r18 ;带C循环右移,r18将放读出的数据
rjmp rb1 ;转移
d1: sec ;c=1
ror r18 ;带C循环右移,r18将放读出的数据
nop
rb1: sbi 0x12,2 ;clk=1,portd=0x12
dec r16 ;寄存器减1
cpi r16,0 ;与立即数0比较
brne rb0 ;不为0,继续发送下一位。
ret
;---------------------------------
现在读出的数据是FF。
问题是什么呢?谢谢帮助。 ;----------8位读出数据程序,读出的数据放在r18中----------------------
rbyte: cbi 0x11,3 ;PD3暂时为输入ddrd=0x11
sbi 0x12,3 ;portd3=1
把下面的
sbi 0x12,3 ;portd3=1
这句去掉看看 行不行 哪个脚接的DS1302? 谢谢关注,接线是:PD2-CLK时钟 PD3-I/O数据入/出 PA2-RET复位。我试试看。 仍然不行呀,读出的数据是FF,没有什么变化。 我再看看程序,以前也没作过这,刚才只瞄了一下 不知能否看下电路图``
PD3接的是什么? “上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。”这句话在很多关于1302的资料中都有。但是我们普通的电路好象没有针对这句话做什么处理,到底它影响工作吗?应该怎么处理? http://cache.amobbs.com/bbs_upload782111/files_6/armok01117085.JPG
这是我的电路 今天没时间了``
顶一下``
期待高手中`` 你这是从DS1302资料里的程序改过来的吧?
我看了下资料附带的程序与你的好多地方都不一样;***************************************************************************************
;接收数据程序;
;名称:Receive_Byte
;描述:从被控器DS1302 接收ByteCnt 个字节数据
;命令字节地址在Command 中
;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中
;***********************************************************************************
Receive_Byte:
CLR RST ;复位引脚为低电平所有数据传送终止
NOP
CLR SCLK 清时钟总线
NOP
SETB RST ;复位引脚为高电平逻辑控制有效
MOV A,Command 准备发送命令字节
;···
;----------8位读出数据程序,读出的数据放在r18中----------------------
rbyte: cbi 0x11,3 ;PD3暂时为输入ddrd=0x11
sbi 0x12,3 ;portd3=1
ldi r16,0x08 ;写入命令
rb0: cbi 0x12,2 ;clk=0,portd=0x12
顺序不一样 不是的,这个只是个子程序,rbyte
我的首先RET=0,CLK=0等的部分在主程序中呀。
这个程序是用51的汇编改过来的。但时序应该是正确的呀?
谢谢你,有用过的帮忙看看呀,谢谢! 经查找资料知,上面的程序对端口的读写确实有问题。谢谢tyut 的帮助。正确的在下面:
;--------------------多字节模式写入各个寄存器数据程序------------------------
wrcr: sbi 0x11,3 ;PD3暂时为输出ddrd=0x11
nop
cbi 0x1b,2 ;ret=0,porta=0x1b
nop
cbi 0x12,2 ;clk=0,portd=0x12
nop
sbi 0x1b,2 ;ret=1,porta=0x1b
nop
ldi r18,0x8e ;写保护命令字节,0b10001110
rcall wbyte ;写指令
ldi r18,0xbe ;多字节写命令,之后必须连续8个字节的读取
rcall wbyte
ldi r18,0x52 ;52秒
rcall wbyte ;写指令
ldi r18,0x43 ;32分
rcall wbyte ;写指令
ldi r18,0x07 ;20时
rcall wbyte ;写指令
ldi r18,0x11 ;11日
rcall wbyte ;写指令
ldi r18,0x03 ;星期三
rcall wbyte ;写指令
ldi r18,0x05 ;05月
rcall wbyte ;写指令
ldi r18,0x06 ;06年
rcall wbyte ;写指令
ldi r18,0x00 ;写保护内容
rcall wbyte ;写指令
cbi 0x1b,2 ;ret=0,porta=0x1b
ret
;---------------------多字节模式读出各个寄存器数据程序---------------------
rdcr: cbi 0x1b,2 ;ret=0,porta=0x1b
nop
cbi 0x12,2 ;clk=0,portd=0x12
nop
sbi 0x1b,2 ;ret=1,porta=0x1b
sbi 0x11,3 ;PD3暂时为输出ddrd=0x11
ldi r18,0xbf ;多字节读命令
rcall wbyte ;写入命令
cbi 0x11,3 ;PD3暂时为输入ddrd=0x11
rcall rbyte ;读数据
mov r0,r18 ;秒
rcall rbyte ;读数据
mov r1,r18 ;分
rcall rbyte ;读数据
mov r2,r18 ;时
rcall rbyte ;读数据
mov r3,r18 ;日
rcall rbyte ;读数据
mov r4,r18 ;星期
rcall rbyte ;读数据
mov r5,r18 ;月
rcall rbyte ;读数据
mov r6,r18 ;年
rcall rbyte ;读数据
mov r7,r18 ;写保护数据
cbi 0x1b,2 ;ret=0,porta=0x1b
ret
;----------8位写入指令程序,数据需要事先放在r18中----------------------
wbyte: ldi r16,0x08 ;写入命令
wb0: ror r18 ;带C循环右移,r18放的是数据。
brbc 0,b0 ;若C为0跳转,输出0。
rjmp b1 ;否则肯定为1,输出1。
b0: cbi 0x12,3 ;I/Oout=0,输出0。portd=0x12
rjmp wb1 ;转移
b1: sbi 0x12,3 ;I/Oout=1,输出1。portd=0x12
nop
wb1: sbi 0x12,2 ;clk=1,portd=0x12
nop
nop
cbi 0x12,2 ;clk=0,portd=0x12
dec r16 ;寄存器减1
cpi r16,0 ;与立即数0比较
brne wb0 ;不为0,继续发送下一位。
ret
;----------8位读出数据程序,读出的数据放在r18中----------------------
rbyte: ldi r16,0x08 ;写入命令
rb0: in r17,0x10 ;读取端口PIND的数据pind=0x10
sbrc r17,3 ;指定位为0跳行
rjmp d1 ;否则肯定为1
d0: clc ;c=0
ror r18 ;带C循环右移,r18将放读出的数据
rjmp rb1 ;转移
d1: sec ;c=1
ror r18 ;带C循环右移,r18将放读出的数据
nop
rb1: sbi 0x12,2 ;clk=1,portd=0x12
nop
cbi 0x12,2 ;clk=0,portd=0x12
dec r16 ;寄存器减1
cpi r16,0 ;与立即数0比较
brne rb0 ;不为0,继续发送下一位。
ret
;--------------------------------- 电路错误。应该是1脚接5v,8脚接电池 代码用大写的看的会舒服吧,难道小写有啥妙处?求教
页:
[1]