矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 4178|回复: 8

实在不行了,请各位老师帮帮忙吧。

[复制链接]
     
发表于 2008-10-19 20:06:09 | 显示全部楼层 |阅读模式
实在不行了,东拼西凑写了一个数字钟的程序,调试了将近一个月了,还是不能运行,在这里麻烦各位老师帮帮忙吧。
其实就是一个很简单的数字钟,12时制显示,秒点闪烁,带有消隐无效零的功能(因为用的是18:88的LED屏,所以必需要消隐无效零,否则无法读数)。

  1. ;简单的89C2051时钟程序
  2. ;显示方式为.12:34
  3. ;P1口输出段数据,P3口输出位数据
  4. ;P1.7为秒点,P3.7为PM输出
  5. ;P3.4校时,P3.5校分
  6. ;晶振12MHz

  7.        flash equ 21h
  8.        sec equ 22h      ;定义秒存储位置
  9.        min equ 23h      ;定义分存储位置
  10.        hour equ 24h
  11.        hourk bit p3.4   ;调时按钮
  12.        mink bit p3.5    ;调分按钮
  13.        pm bit p3.7      ;PM输出端

  14.        org 0000h
  15.        ljmp start
  16.        org 000bh
  17.        ljmp int_t0
  18.        org 0030h
  19. start: mov a,#00h       ;清0
  20.        mov flash,a
  21.        mov sec,a        ;秒清0
  22.        mov min,a        ;分清0
  23.        mov hour,#01
  24.        setb pm           ;PM清0
  25.        mov p1,#0ffh
  26.        mov p3,#0ffh
  27.        mov ip,#02h      ;IP,IE初始化
  28.        mov ie,#82h
  29.        mov tmod,#01h    ;设定定时器0工作于方式1
  30.        mov tl0,#0b0h    ;设定定时初始值50ms
  31.        mov th0,#3ch
  32.        setb tr0         ;启动定时
  33.        setb et0
  34.        setb ea
  35.        mov sp,#60h      ;重设堆栈指针
  36. next:  lcall disp       ;调用显示子程序
  37.        lcall key        ;调用按键检测子程序
  38.        jz next          ;没有键按下返回
  39.        lcall ankey      ;调用按键处理子程序
  40.        sjmp next        ;重新循环

  41. int_t0:push acc         ;保护现场
  42.        push psw
  43.        mov tl0,#0b0h    ;赋定时初值
  44.        mov th0,#3ch
  45.        inc 20h          ;20H地址加1
  46.        mov a,20h
  47.        cjne a,#10,reti1
  48.        mov 20h,#00h     ;半秒钟时间到
  49.        inc flash        ;半秒加1
  50.        mov a,flash
  51.        cjne a,#2,reti1
  52.        mov flash,#00h
  53.        inc sec          ;秒加1
  54.        mov a,sec
  55.        cjne a,#60,reti1
  56.        mov sec,#00h     ;一分钟时间到
  57.        inc min          ;分加1
  58.        mov a,min
  59.        cjne a,#60,reti1
  60.        mov min,#00h     ;一小时时间到
  61.        inc hour         ;时加1
  62.        mov a,hour
  63.        cjne a,#12,reti1
  64.        mov hour,#00h    ;12小时到,清零.
  65.        cpl pm           ;PM取反
  66. reti1: pop psw          ;恢复现场
  67.        pop acc
  68.        reti             ;中断返回

  69. disp:  mov a,#10        ;显示子程序
  70.        mov b,a
  71.        mov a,hour
  72.        div ab
  73.        cjne a,#01,zero
  74.        ajmp normal
  75. zero:  mov a,#11
  76. normal:mov r1,a
  77.        mov a,@r1
  78.        mov dptr,#tab
  79.        movc a,@a+dptr
  80.        mov p1,a
  81.        clr p3.0
  82.        lcall dely
  83.        setb p3.0
  84.        mov a,b
  85.        mov r1,a
  86.        mov a,@r1
  87.        mov dptr,#tab
  88.        movc a,@a+dptr
  89.        mov p1,a
  90.        clr p3.1
  91.        lcall dely
  92.        setb p3.1
  93.        mov a,#10
  94.        mov b,a
  95.        mov a,min
  96.        div ab
  97.        mov r1,a
  98.        mov a,@r1
  99.        mov dptr,#tab
  100.        movc a,@a+dptr
  101.        mov p1,a
  102.        clr p3.2
  103.        lcall dely
  104.        setb p3.2
  105.        mov a,b
  106.        mov r1,a
  107.        mov a,@r1
  108.        mov dptr,#tab
  109.        movc a,@a+dptr
  110.        mov p1,a
  111.        clr p3.3
  112.        lcall dely
  113.        setb p3.3
  114.        mov a,flash
  115.        cjne a,#00,light
  116.        setb p1.7
  117. light: clr p1.7
  118.        ret              ;子程序返回
  119. tab:   db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0ffh;共阳段码表0123456789不亮

  120. dely:  mov r6,#10
  121. d1:    mov r7,#20
  122. d2:    djnz r7,d2
  123.        djnz r6,d1
  124.        ret

  125. key:   lcall disp       ;按键处理子程序
  126.        jb hourk,mmm
  127. hhh:   lcall disp
  128.        lcall dely
  129.        jnb hourk,hhh
  130.        inc hour
  131. mmm:   jb mink,key
  132. nnn:   lcall disp
  133.        lcall dely
  134.        jnb mink,nnn
  135.        inc min
  136.        ret

  137.        end
复制代码

评分

1

查看全部评分

     
发表于 2008-10-19 21:45:32 | 显示全部楼层
出的是什么问题呢,一点一点调试一下吧。
先写个显示数字的程序,能把缓冲区里的字显示出来。
再写个调时的程序,按键能调节时间,并能显示出来。
再写个走时的程序。
这样就好了。
汇编的东西好长时间不看了,看着头大。

评分

1

查看全部评分

     
 楼主| 发表于 2008-10-20 12:16:40 | 显示全部楼层
上电后会随机的出现“  :1 ”、“10:10”、“11:11”、“12:12”、“13:13”、“14:14”、“15:15”等,秒点不闪烁,并且也不走时。在调试时,我曾经将按键调时部分去掉,只调试走时和显示部分,也是出现上述现象。做这个表的目的主要是为了给老妈晚上看时间用,单位很忙,周六周日也不休,只能用晚上的时间调试一下,真的不行了,都调了一个多月了。
     
发表于 2008-10-20 18:29:56 | 显示全部楼层
COPY了您的程序
编译到第41行
  1. lcall ankey
复制代码
不过没找到ankey部分
程序是您自己写的吗????
还是没提供全???
试着用C吧
个人推荐SDCC(开源C编译器)+CODEBLOCKS(开源IDE)
http://www.crystalradio.cn/bbs/thread-48054-1-1.html
有空大家一起研究
汇编并非一定就效率高体积小

评分

1

查看全部评分

     
 楼主| 发表于 2008-10-20 20:47:47 | 显示全部楼层
谢谢您的答复,这程序是我写的,但在调试时我已将按键部分去掉了,只保留计时和显示部分,但一直没有调试成功。因为时间有限,也很想学C,但是汇编还没学明白呢,还是先把汇编搞明白之后再去学C吧。

您提到的41行lcall ankey应该是笔误,实际就应该是lcall key。
111.jpg
222.jpg
     
发表于 2008-10-20 22:41:35 | 显示全部楼层
看现象应该是显示部分出问题了。
显示部分这样写好些:
先在内存开辟一块地方放显示数据,比如你这个可以用四个字节的空间,里面存的是对应位的段字形数据,而不要在扫描时再计算,在显示子程序时查表把相应的数据放在那里,然后扫描子程序只根据这里的数据去扫描。也就是说把扫描跟显示分开。
先把这个调通再弄计时和校时。
建议扫描也用中断,每若干次中断开始扫描下一位,都完成再从第0位开始。这样就不用写延时程序了。
先把显示的东西弄好,比如事先放好12:34,开机能稳定显示12:34了再加上走时的程序试一试。
发表于 2008-10-21 09:28:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
     
发表于 2008-10-21 09:54:59 | 显示全部楼层
要不你就别费劲了,采用LED显示数字钟专用集成电路好了,即可靠又省事.
发表于 2008-10-21 11:17:02 | 显示全部楼层
用MCU做LED时钟,我以前在网上下载的程序放到Protus中进行模拟,显示也会出现乱跳,不稳定。这大概与刷新的频率有关,你看看是不是扫描速度有问题?汇编的很搞,但C要花点时间去记忆理解那些命令格式。还不如结合DS1302做一个试试吧!
您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-6-17 06:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表