[求助] 汇编编写数字时钟,显示有问题,请大神帮忙看一下

阳阳学通信   2014-11-13 10:21 楼主
实验板原理图及代码如下:

回复评论 (4)

        DU                BIT                P2.6
        WE                BIT                P2.7

        LCD_RS        BIT                P1.0         ;LCD1602
        LCD_RW        BIT                P1.1
        LCD_EN        BIT                P2.5

        DS_SCLK BIT                P2.1         ;DS1302
        DS_IO        BIT                P2.0
        DS_RST        BIT                P2.4
               
        COM                EQU                20H
        DAT                EQU                21H

        BYTE1        EQU                22H
        BYTE2        EQU                23H

        TEAR        EQU                29H                 ;定义时钟显示位
        MONTH        EQU                2AH
        DAY                EQU                2BH
        SHI                EQU                2CH
        FEN                EQU                2DH
        MIAO           EQU                2EH
        WEEK        EQU                2FH


/******************************主函数*******************************************/
                        ORG                0000H
                        AJMP        START
                        ORG                0030H
               
START:                MOV                SP,#30H
                        LCALL        LCD_INIT                  ;LCD1602初始化
                        LCALL        DS_INIT                          ;DS1302初始化
LOOP1:                MOV                COM,#80H
                        LCALL        LCD_W_COM                       
                        MOV                A,#81H
                        LCALL        DS_W_BYTE
                        NOP
                        LCALL        DS_R_DAT
                        NOP
                        LCALL        BCD_TRANS
                        MOV                DAT,A
                        LCALL        LCD_W_DAT
                        NOP
                        MOV                DAT,B
                        LCALL        LCD_W_DAT
                        LJMP        LOOP1
                       
/*******************DS1302初始化****************************************/
DS_INIT:        MOV                A,#8EH                        ;打开写保护
                        LCALL        DS_W_BYTE
                        NOP
                        MOV                A,#00H
                        LCALL        DS_W_BYTE
                        MOV                A,#80H                   ;miao位初始化
                        LCALL        DS_W_BYTE
                        NOP
                        MOV                A,#20H
                        LCALL        DS_W_BYTE
                       
                ;        MOV                A,#8EH                   ;关闭写保护
                ;        LCALL        DS_W_BYTE
                ;        MOV                A,#80H
                ;        LCALL        DS_W_BYTE                                       
                        RET
/*******************DS1302写字节*********************************************/                                       
DS_W_BYTE:        MOV                R3,#08H
                        CLR                DS_RST
                        CLR                DS_SCLK
                        SETB        DS_RST
LOOP3:                RRC                A                       
                        MOV                DS_IO,C       
                        SETB        DS_SCLK
                        NOP
                        NOP
                        CLR                DS_SCLK
                        DJNZ        R3,LOOP3
                        RET

/*******************DS1302读数据**********************************************/
DS_R_DAT:        MOV                R3,#08H
                        CLR                DS_RST
                        SETB        DS_SCLK
                        SETB        DS_RST
                        CLR                A
                        CLR                C
LOOP4:                MOV                C,DS_IO
                        CLR                DS_SCLK
                        NOP
                        NOP
                        RRC                A
                        SETB        DS_SCLK                               
                        DJNZ        R3,LOOP4
                        RET

BCD_TRANS:        MOV                B,#16
                        DIV                AB
                        MOV                R4,B                  ;BCD码转成十进制
                        MOV                B,#10
                        MUL                AB
                        ADD                A,R4

                        MOV                B,#10                  ;十进制转成ASCII码
                        DIV                AB
                        ADD                A,#30H
                        MOV                R4,A
                        MOV                A,B
                        ADD                A,#30H
                        MOV                B,A
                        MOV                A,R4                       
                        RET


LCD_INIT:        CLR                DU
                        CLR                WE
                        MOV                COM,#38H                 ;设置16*2显示
                        LCALL        LCD_W_COM
                        MOV                COM,#01H                 ;清屏
                        LCALL        LCD_W_COM
                        MOV                COM,#06H                 ;地址指针加1
                        LCALL        LCD_W_COM
                        MOV                COM,#0CH                 ;显示开关
                        LCALL        LCD_W_COM
                        RET
                       
LCD_W_COM:        CLR                LCD_RS                          ;写指令
                        CLR                LCD_RW
                        MOV                P0,COM
                        CLR                LCD_EN
                        SETB        LCD_EN
                        LCALL        DELAY_5ms
                        CLR                LCD_EN
                        RET
                               
LCD_W_DAT:        SETB        LCD_RS                         ;写数据
                        CLR                LCD_RW
                        MOV                P0,DAT
                        CLR                LCD_EN
                        SETB        LCD_EN
                        LCALL        DELAY_5ms
                        CLR                LCD_EN
                        RET
               
DELAY_5ms:        MOV                R6,#13H                           ;延时
LOOP2:                MOV                R7,#82H
                        DJNZ        R7,$
                        DJNZ        R6,LOOP2
                        RET



/*TAB1:                DB        "XIAO KE AI"
TAB2:                DB        "I LOVE YOU" */
END











  • 1.JPG
  • 2.JPG
点赞  2014-11-13 10:22
什么问题?
点赞  2014-11-13 19:09
引用: ahshmj 发表于 2014-11-13 19:09
什么问题?

因为读数据都一样,我只测试了 秒 位,但是显示*5就不变,*是乱码;反复查了程序,查不出原因,能帮忙看看吗
点赞  2014-11-13 20:52
BCD_TRANS:              MOV                B,#10
                        DIV                AB
;                        MOV                R4,B                  ;BCD码转成十进制
;                        MOV                B,#10
;                        MUL                AB
;                        ADD                A,R4

;                        MOV                B,#10                  ;十进制转成ASCII码
;                        DIV                AB

                        ADD                A,#30H
                        MOV                R4,A
                        MOV                A,B
                        ADD                A,#30H
                        MOV                B,A
                        MOV                A,R4                        
                        RET
数据转换部分按上面的改一下。时间关系,其余部分没有看。如有问题再问。
点赞  2014-11-19 20:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复