在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2129|回复: 1

求助,程序哪里出问题了

[复制链接]
发表于 2008-7-16 22:35:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
MCU:AT89S51                         LCD:1602
实现LCD 上显示时间
;*******************************************************************
;DB[0-7]接P1.0-P1.7
;E接P0.0, R/W接P0.1, RS接P0.2
;*******************************************************************
    ;赋值给接LCD的功能引脚
    E EQU P0.0
    RW EQU P0.1
    RS EQU P0.2

    SDDRAM EQU 34H    ;用于储存设置 DDRAM 地址指令

    ;定义时, 分, 秒计数储存单元
    HOUR EQU 32H
    MIN EQU 31H
    SEC EQU 30H

    ;显示时间用   
    HH EQU 35H    ;小时的高位
    HL EQU 36H    ;小时的低位
    MH EQU 37H    ;分钟的高位
    ML EQU 38H    ;分钟的低位
    SH EQU 39H    ;秒钟的高位
    SL EQU 3AH    ;秒钟的低位

    ORG 0000H
    AJMP MAIN    ;上电跳往主程序

    ORG 000BH    ;定时器0溢出处理
    AJMP T0OVERFLOW

    ORG 0040H


MAIN:   ;初始化LCD
    MOV A, #38H    ;功能设置, 8位数据总线, 5*7点阵
    LCALL WRCMD
    MOV A, #01H    ;清屏LCD
    LCALL WRCMD
    MOV A, #0CH    ;显示开关控制, 开显示, 关光标显示, 关闪烁显示
    LCALL WRCMD
    MOV A, #06H    ;设置输入模式, 完成字符传送后, AC自动加1, 显示不发生移位
    LCALL WRCMD
    MOV A, #84H    ;初始时, 设置AC指向DDRAM的第5位
    LCALL SETAC

   
    ;时钟程序, 用SEC单元保存秒, 用MIN单元保存分, 用HOUR单元保存时
    MOV TMOD, #01H    ;启用定时器0的模式1, 作为定时器
    SETB ET0    ;允许定时器0溢出中断
    SETB EA        ;允许中断
    MOV TH0, #3CH    ;赋初值,每50ms中断一次
    MOV TL0, #0B0H
    SETB TR0    ;启动定时器0
   
    MOV HOUR, #00H    ;初始化为0时0分0秒
    MOV MIN, #00H
    MOV SEC, #00H

    ;显示初始时间
    LCALL DIS_H
    MOV A, #0B0H    ;显示间隔符-
    LCALL WRDATA
    LCALL DIS_M
    MOV A, #0B0H
    LCALL WRDATA
    LCALL DIS_S

    MOV 33H, #14    ;存储中断次数, 查看1秒是否到了

HERE:    SJMP HERE    ;等待中断

T0OVERFLOW:
    PUSH ACC    ;保护现场
    PUSH PSW

    CLR TR0        ;暂停计数, 重新装入数据
    MOV TH0, #3CH    ;装入数据, 20ms中断一次
    MOV TL0, #0B0H
    SETB TR0

    DJNZ SEC, RETURN;判断1秒是否到了
   
    ;1秒到了往下执行
    INC SEC        ;秒增1
   
    LCALL DIS_S    ;显示时间
    MOV 33H, #14H    ;重置中断次数
   
    ;判断1分是否到了
    MOV A, SEC   
    CJNE A, #3CH, RETURN

    ;1分到了往下执行
    MOV SEC, #00H    ;秒清0
    INC MIN        ;分增1
    MOV A, SEC
    LCALL DIS_M    ;显示时间

    ;判断1小时是否到了
    MOV A, MIN   
    CJNE A, #3CH, RETURN

    ;1小时到了往下执行
    MOV MIN, #00H    ;分清0
    INC HOUR        ;时增1
   
    ;判断小时是否为24
    MOV A, HOUR   
    CJNE A, #18H, RETURN

    ;小时为24往下执行
    MOV HOUR, #00H    ;24进制, 清0
    LCALL DIS_H    ;显示时间
   
    AJMP RETURN

RETURN: POP PSW        ;恢复现场
    POP ACC

    RETI

SETAC:    PUSH ACC    ;保护现场
    MOV A, SDDRAM    ;设置 AC 的地址
    LCALL WRCMD
    POP ACC        ;恢复现场
    RET

    ;往LCD中写入指令子程序
WRCMD:    ACALL CHEBUSY
    CLR RS
    CLR RW
    MOV P1, A
    SETB E
    NOP
    CLR E
    RET

    ;往LCD写数据子程序
WRDATA: ACALL CHEBUSY
    SETB RS
    CLR RW
    MOV P1, A
    SETB E
    NOP
    CLR E
    RET

    ;从LCD中读数据子程序
REDATA:    MOV P1, #0FFH
    ACALL CHEBUSY
    SETB RS
    SETB RW
    SETB E
    MOV A, P1
    CLR E
    RET
   
      ;检查LCD是否忙碌      
CHEBUSY:MOV P1, #0FFH
    CLR RS
    SETB RW
    SETB E
BUSY:    JB P1.7, BUSY
    CLR E
    RET

DIGIT:    DB '0123456789'

DIGIT1: DB '00-00-00'
   
DIS_H:    ;显示小时
    PUSH ACC    ;保护现场
    PUSH DPL
    PUSH DPH

    MOV HH, HOUR
    MOV R0, #HH
    MOV R1, #HL
    LCALL BSECVRT    ;转化成可显示的BCD码
    MOV DPTR, #DIGIT
   
    ;显示小时的高位
    MOV A, HH
    MOVC A, @A+DPTR
    MOV SDDRAM, #84H;设置 AC 的地址为DDRAM第5位
    LCALL SETAC   
    LCALL WRDATA

    ;显示小时的低位
    MOV A, HL
    MOVC A, @A+DPTR
    LCALL WRDATA

    POP DPH        ;恢复现场
    POP DPL
    POP ACC

    RET   

DIS_M:    ;显示分钟
    PUSH ACC    ;保护现场
    PUSH DPL
    PUSH DPH

    MOV MH, MIN
    MOV R0, #MH
    MOV R1, #ML
    LCALL BSECVRT
    MOV DPTR, #DIGIT
   
    ;显示分钟的高位
    MOV A, MH
    MOVC A, @A+DPTR
    MOV SDDRAM, #87H;设置 AC 的地址为DDRAM的第8位
    LCALL SETAC
    LCALL WRDATA

    ;显示分钟的低位
    MOV A, ML
    MOVC A, @A+DPTR
    LCALL WRDATA

    POP DPH        ;恢复现场
    POP DPL
    POP ACC

    RET   

DIS_S:    ;显示秒
    PUSH ACC    ;保护现场
    PUSH DPL
    PUSH DPH

    MOV SH, SEC
    MOV R0, #SH
    MOV R1, #SL
    LCALL BSECVRT
    MOVC A, @A+DPTR

    ;显示秒钟的高位
    MOV A, SH
    MOVC A, @A+DPTR
    MOV SDDRAM, #8BH;设置 AC 的地址为DDRAM的第11位
    LCALL SETAC
    LCALL WRDATA

    ;显示秒钟的低位
    MOV A, SL
    MOVC A, @A+DPTR
    LCALL WRDATA

    POP DPH        ;恢复现场
    POP DPL
    POP ACC

    RET

BSECVRT:;将8位2进制数转化成两个BCD码
    PUSH ACC    ;保护现场
    PUSH B
    PUSH DPH
    PUSH DPL
    MOV A, @R0
    MOV B, #0AH
    DIV AB
    MOV @R0, A
    MOV @R1, B
    POP DPL        ;恢复现场
    POP DPH
    POP B
    POP ACC

    RET   


    END
发表于 2008-7-18 07:55:10 | 显示全部楼层
你68X的时序有问题,写错了。
数据的读与写是在RW脚相应电平下,E的下降沿锁存的,你看看你的代码,不是这么做的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-16 22:49 , Processed in 0.029475 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表