• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

[求助]自己用汇编写了个程序,目的是让2个7段数码管动态扫描。求指导

我用汇编写了个2位数码管动态扫描的程序,个位是1S加1,逢10进位,自己循环;十位1-9,逢10清零。但是2个数码管不能同时点亮,我知道是时间和延时上的问题,但是不知该如何修改。求大神指导,提供下思路。如果哪里不对请指出,谢谢了。

org 0000h            

clr p1.1                      ;打开数码管

clr p1.2

setb p1.3

clr p1.4

mov r5,#01h

 

main: clr p1.0                ;个位

sz0_9:mov dptr,#tab          ;从0-9    

 mov r0,#00h

GW:  mov a,r0    

movc a,@a+dptr    

mov p0,alcall YS1S                 ;延时1s

inc r0

cjne r0,#0ah,GW            ;判断各位到9没

 

setb P1.0                    ;十位

szjw:mov dptr,#tab          ;从0-9

JW:  mov a,r5    

movc a,@a+dptr    

mov p0,a    

inc r5

lcall YS1S   

cjne r5,#0ah,main   

mov r5,#01h   

ajmp main

 

YS1S:mov r1,#10

loop:mov r2,#200

loop1:mov r3,#250    

djnz r3,$    

djnz r2,loop1    

djnz r1,loop    

 ret

tab:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,98h

end

全部回复(26)
正序查看
倒序查看
2014-05-05 17:56
沙发我坐了,晚上来给你看,回去吃饭了!
0
回复
2014-05-05 20:39
@yueyunno1
沙发我坐了,晚上来给你看,回去吃饭了!

你最好发个电路来看看,你这个其实就是个99S显示程序

0
回复
2014-05-05 20:45

YS1S:mov r1,#10

loop:mov r2,#200

loop1:mov r3,#250  

改这地方,12M晶振的话,差不多500MS了改成

YS1S:mov r1,#10

loop:mov r2,#20

loop1:mov r3,#25

一共5MS

0
回复
2014-05-05 20:54
@wangchuangwccc
YS1S:movr1,#10loop:movr2,#200loop1:movr3,#250 改这地方,12M晶振的话,差不多500MS了改成YS1S:movr1,#10loop:movr2,#20loop1:movr3,#25一共5MS

我的这个帖子:

【原创】高山云教你学单片机--所有(C,汇编)程序更新OK

17讲有个59秒计时,你稍微改改就可以用了!

0
回复
2014-05-05 20:55
@yueyunno1
我的这个帖子:【原创】高山云教你学单片机--所有(C,汇编)程序更新OK17讲有个59秒计时,你稍微改改就可以用了!
第二十个程序
0
回复
cltwolf
LV.5
7
2014-05-05 21:23
@yueyunno1
第二十个程序

坐陪学习

0
回复
2014-05-05 22:32
@yueyunno1
我的这个帖子:【原创】高山云教你学单片机--所有(C,汇编)程序更新OK17讲有个59秒计时,你稍微改改就可以用了!

谢谢,我先学习下。

0
回复
2014-05-05 22:39
@戴眼镜的小鸟
谢谢,我先学习下。
OK  你自己选择一种语言就行了,汇编  C都有
0
回复
2014-05-05 22:39
@yueyunno1
OK 你自己选择一种语言就行了,汇编 C都有
我休息了,有问题明天来给你答复
0
回复
2014-05-07 16:41
@yueyunno1
我休息了,有问题明天来给你答复
大神啊,那个时间不能那么修改。那个延时1S的意思是,个位过1S加1。现在的情况是个位隔1s加1,到9后清零继续加1,十位是个位有进位加1。但是2个数码管不能同时亮,先是个位0-9亮,然后熄灭,十位亮显示1,然后熄灭,个位再亮0-9又熄灭,十位亮显示2再熄灭,个位0-9.。。。这么循环的。
0
回复
2014-05-07 17:10
@戴眼镜的小鸟
大神啊,那个时间不能那么修改。那个延时1S的意思是,个位过1S加1。现在的情况是个位隔1s加1,到9后清零继续加1,十位是个位有进位加1。但是2个数码管不能同时亮,先是个位0-9亮,然后熄灭,十位亮显示1,然后熄灭,个位再亮0-9又熄灭,十位亮显示2再熄灭,个位0-9.。。。这么循环的。
你想这样子,只能用定时器了,直接这么延时,肯定不能同时点亮两个数码管了
0
回复
2014-05-08 20:08
@戴眼镜的小鸟
大神啊,那个时间不能那么修改。那个延时1S的意思是,个位过1S加1。现在的情况是个位隔1s加1,到9后清零继续加1,十位是个位有进位加1。但是2个数码管不能同时亮,先是个位0-9亮,然后熄灭,十位亮显示1,然后熄灭,个位再亮0-9又熄灭,十位亮显示2再熄灭,个位0-9.。。。这么循环的。

你这个思路好像有点模糊,没有完全弄懂,你搞个详细的流程图,或者叫项目书之类的东西~!

0
回复
2014-05-08 20:15
@yueyunno1
你这个思路好像有点模糊,没有完全弄懂,你搞个详细的流程图,或者叫项目书之类的东西~!
他的意思是,有点像时钟,过1S加1,但是他的1S是直接延时的~~~延时完了在扫另一位数码管,这间隔都1S了,怎么可能点亮得两位数码管
0
回复
2014-05-08 20:17
@wangchuangwccc
他的意思是,有点像时钟,过1S加1,但是他的1S是直接延时的~~~延时完了在扫另一位数码管,这间隔都1S了,怎么可能点亮得两位数码管

我晕这个不科学,最好用定时器!~

0
回复
2014-05-09 12:43
@yueyunno1
我晕这个不科学,最好用定时器!~

新手不太懂,定时器是用在1S加1上,延时用在动态扫描上,是这个意思吗?

0
回复
2014-05-09 13:35
@戴眼镜的小鸟
新手不太懂,定时器是用在1S加1上,延时用在动态扫描上,是这个意思吗?
恩!是这个意思,要不然你的1S会不精确的!
0
回复
pppyyy02
LV.4
18
2014-05-10 23:49

给你一个最经典的思路:

1、直接写循环程序:不断扫描个位和十位,

2、扫到哪个位,就把哪个位的值通过查表得出数码值传给A再传到端口

3、定时器每到1S,判断个位进1,十位是否进1

0
回复
2014-05-12 15:48
@pppyyy02
给你一个最经典的思路:1、直接写循环程序:不断扫描个位和十位,2、扫到哪个位,就把哪个位的值通过查表得出数码值传给A再传到端口3、定时器每到1S,判断个位进1,十位是否进1

问题解决了没有?

0
回复
2014-05-16 16:12
@yueyunno1
恩!是这个意思,要不然你的1S会不精确的!
大神啊,我实在是没能写出程序来。你能不能写一个给我,让我学习学习。万分感谢!功能很简单,2个数码管,0-99,过1S加1.满了清零重新开始循环。
0
回复
2014-05-18 15:01
@yueyunno1
问题解决了没有?

还没。我重新写了几个程序还是不行。我把自动加1和进位放到主程序,把动态扫描作为子程序还是没成。最后我觉得是思路上有问题,在动态扫描做主程序,把自动加1做子程序调用会在扫描时间隔1S到时扫描不成功。自动加1做主程序,把动态扫描做子程序调用会在动态扫描前有1S间隔还是不成功。不知道该怎么弄了。我贴个程序,你看看应该怎么调整这个思路?还有程序?

;main:个位的自动加1和进位

;子程序:开始动态扫描

org 0000h

l1:mov r5,#00h        ;初始化

mov r6,#00h

mov r0,#01h

mov r1,#00h

mov dptr,#tab          ;开始

l0:mov a,r0  

movc a,@a+dptr

mov r5,a                  ;r5存储个位的段码

clr a                        ;清零a

mov a,r1

movc a,@a+dptr

mov r6,a                  ;r6存储十位的段码

call dtsm                  ;调用动态扫描

call ys1s                   ;调用延时1S

inc r0

cjne r0,#0ah,l0           ;个位是否有进位,没有返回

inc r1

cjne r1,#0ah,l0           ;十位是否有进位,没有返回

sjmp l1                      ;十位进位则重新计数

dtsm:mov p0,#00h      ;动态扫描

mov p2,#0ffh

mov p0,r5

call ys1ms

mov p0,#00h

mov p2,#0fbh

mov p0,r6

ret

ys1s:mov r2,#10     ;延时1S

loop:mov r3,#200

loop1:mov r4,#250

djnz r4,$

djnz r3,loop1

djnz r2,loop

ret

ys1ms:mov r2,#250    ;延时1ms

mov r3,#2

djnz r2,$

djnz r3,$

ret

tab:db 3fh,06h,5bh,4fh,66h,6dh,7ch,07h,7fh,67h

end

0
回复
2014-05-21 12:34
@yueyunno1
问题解决了没有?
我改用定时器来做延时1S,问题解决了。但是有个新问题,就是2个数码管亮度不一致,十位要比个位要暗些。这个应该怎么解决?
0
回复
2014-05-21 12:49
@戴眼镜的小鸟
我改用定时器来做延时1S,问题解决了。但是有个新问题,就是2个数码管亮度不一致,十位要比个位要暗些。这个应该怎么解决?

第一:扫描时间要一致,第二个每个数码管显示后要关掉(去鬼影处理)。

0
回复
2014-05-21 13:44
@yueyunno1
第一:扫描时间要一致,第二个每个数码管显示后要关掉(去鬼影处理)。
去鬼影处理我弄了,都是先关后开。扫描时间固定了还会变吗?
0
回复
2014-05-21 14:00
@戴眼镜的小鸟
去鬼影处理我弄了,都是先关后开。扫描时间固定了还会变吗?

要关位码    最主要是位码~关段码都没有效果

 

0
回复
2014-05-21 18:46
@yueyunno1
要关位码   最主要是位码~关段码都没有效果 
位码要怎么关?不能给赋值吧。。。
0
回复
2014-05-22 09:03
@yueyunno1
要关位码   最主要是位码~关段码都没有效果 

这个是电路图,采用的是38译码器选择位。这个怎么关位码?P2选位码,P0段码。

0
回复