hongtusy 发表于 2006-5-11 16:18:01

帮我看看这个汇编的问题在什么地方,关于时钟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。

问题是什么呢?谢谢帮助。

tyut 发表于 2006-5-11 16:35:36

;----------8位读出数据程序,读出的数据放在r18中----------------------

rbyte:      cbi      0x11,3         ;PD3暂时为输入ddrd=0x11

            sbi      0x12,3         ;portd3=1



把下面的

            sbi      0x12,3         ;portd3=1

这句去掉看看 行不行

tyut 发表于 2006-5-11 16:37:57

哪个脚接的DS1302?

hongtusy 发表于 2006-5-11 16:40:31

谢谢关注,接线是:PD2-CLK时钟 PD3-I/O数据入/出 PA2-RET复位。我试试看。

hongtusy 发表于 2006-5-11 16:43:48

仍然不行呀,读出的数据是FF,没有什么变化。

tyut 发表于 2006-5-11 16:46:19

我再看看程序,以前也没作过这,刚才只瞄了一下

tyut 发表于 2006-5-11 16:56:38

不知能否看下电路图``

PD3接的是什么?

hongtusy 发表于 2006-5-11 16:59:23

“上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。”这句话在很多关于1302的资料中都有。但是我们普通的电路好象没有针对这句话做什么处理,到底它影响工作吗?应该怎么处理?

hongtusy 发表于 2006-5-11 17:03:35

http://cache.amobbs.com/bbs_upload782111/files_6/armok01117085.JPG

这是我的电路

tyut 发表于 2006-5-11 17:18:40

今天没时间了``

顶一下``

期待高手中``

tyut 发表于 2006-5-11 17:30:44

你这是从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

顺序不一样

hongtusy 发表于 2006-5-11 17:42:58

不是的,这个只是个子程序,rbyte

我的首先RET=0,CLK=0等的部分在主程序中呀。

这个程序是用51的汇编改过来的。但时序应该是正确的呀?

谢谢你,有用过的帮忙看看呀,谢谢!

hongtusy 发表于 2006-5-12 11:45:12

经查找资料知,上面的程序对端口的读写确实有问题。谢谢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

;---------------------------------

zhanghanlai 发表于 2012-1-26 20:04:20

电路错误。应该是1脚接5v,8脚接电池

h542723151 发表于 2012-9-9 17:29:12

代码用大写的看的会舒服吧,难道小写有啥妙处?求教
页: [1]
查看完整版本: 帮我看看这个汇编的问题在什么地方,关于时钟DS1302。