论坛风格切换切换到宽版
  • 4057阅读
  • 11回复

请教一个简单的数码管显示问题 [复制链接]

上一主题 下一主题
离线BG4ABM
 
发帖
1139
只看楼主 倒序阅读 0楼 发表于: 2006-02-21
下面是一个简单的让数码管显示“1、2、3”符号的程序,想请教各位为什么每输入一个数字前,都要用到mov p2,#0ffh,不然显示的字符就会不正确,我使用的是4个数字合并在一起的那种数码管,共有12个管脚,8个是段控制位(p1),4个是位控制位(p2):

main:

mov p2,#0ffh
mov p1,#0f9h(输入1)
clr   p2.0(选第一位)

mov p2,#0ffh
mov p1,#0a4h(输入2)
clr   p2.1(选第二位)

mov p2,#0ffh
mov p1,#0b0h(输入3)
clr   p2.2(选第三位)

ljmp main
end
离线1a2b3c
发帖
204
只看该作者 1楼 发表于: 2006-02-21
因为你是采用的共段码的接法,而且你现在的程序是动态扫描的方式执行的,假如你不先在换位前进行mov p2,#0ffh的操作,那么你上一位的选择是有效的,也就是你就会让2个以上的数码管都显示了你现在送出的这个段码,也就是同一时刻有2个或者以上(循环一次后就是全部4位了)的数码管在显示同一个数字,再加上你这里显示是很快扫描的,所以人看起来就是1234全部叠加在一起显示了,因此看不出到底显示的是什么.
当你先把P2口置位后,在选择要显示的那一位,那么任意时刻你的数码管就只有一个在显示,所以是清晰的.
OK?
离线BG7IGJ
发帖
1998
只看该作者 2楼 发表于: 2006-02-21
如果你不用这条指命mov p2,#0ffh,那么,三只数码管都会同时显是同一个数,因为clr p2.0   clr p2.1   clr p2.2 这三条指命是命数码管发亮,一位点亮了,要显视下一位时,应该先将前一位点亮的那个息灭,可以用 setb 这位指令令p2口对应该的位置高,也可以用 mov p2,#0ffh 将p2口全置高
离线BG4XDO
发帖
1124
只看该作者 3楼 发表于: 2006-02-22
精辟!!俺也知道了
离线BG4ABM
发帖
1139
只看该作者 4楼 发表于: 2006-02-22
谢谢楼上的2位,我已经知道mov p2,#0ffh是关断前面显示的那一位,但是如果我把程序改成这样,按我的想象应该是在第二位上出现重叠的1和2,而实际上是在第一位出现重叠的1和2,请问这是为什么?

main:

mov p2,#0ffh
mov p1,#0f9h(输入1)
clr   p2.0(选第一位)

mov p1,#0a4h(输入2)
clr   p2.1(选第二位)

mov p2,#0ffh
mov p1,#0b0h(输入3)
clr   p2.2(选第三位)

ljmp main
end
离线1a2b3c
发帖
204
只看该作者 5楼 发表于: 2006-02-22
错了,当然应该是第一位看起来出现重叠才对!
因为当你选择第一位的时候,此时显示正确的第一位数据,当选第二位 的时候,而你在位选前已经把显示数据送到p1口了,那么此时第一位就马上显示的是“2”了,至少你在点亮第二位前(clr p2.1)第一位上面就已经是先显示了‘1’,再显示了‘2’,已经是叠加了显示(人眼看起来),而你第二位永远都不可能有显示‘1’的时候,因为在第二位有效前已经是数据‘2’送到p1口了。所以。。。
ok?
离线BG4ABM
发帖
1139
只看该作者 6楼 发表于: 2006-02-22
谢谢1a2b3c这次总算彻底搞清楚了 ,我发现ham中高手真不少 ,以后有了问题 ,我还来这里
离线bg6qbt
发帖
7255
只看该作者 7楼 发表于: 2006-02-23
我也爱汇编
main:

mov p2,#0ffh
mov p1,#0f9h(输入1)
clr p2.0(选第一位)
call delay
setb p2.0 ;关断第一位
mov p1,#0a4h(输入2)
clr p2.1(选第二位)
call delay
setb p2.1 ;关断第二位
mov p2,#0ffh
mov p1,#0b0h(输入3)
clr p2.2(选第三位)
call delay
setb p2.2 ;关断第三位
ljmp main
delay:
.
.
.
.
end
实际上运行时需要加入一点延时吧?
离线1a2b3c
发帖
204
只看该作者 8楼 发表于: 2006-02-23
实际上运行时需要加入一点延时吧?

他这里的使用无须加入延迟的,因为全部程序就是在动态扫描这几个数码管了,你所说的要加入延迟是受了平时我们做动态扫描时的影响,因为平时除了扫描外还要主要工作是做其他处理,因此扫描显示的时间很短,大概重复频率在几十Hz,每位显示时间在几个ms,那样做主要方便更多的时间用于其他处理.
而这个程序这里全部的工作就是扫描显示管子,虽然每次管子显示的时间只有几个机器周期,但是他重复频率很高,比传统的几十hz的扫描速度已经是高出几百甚至是上千倍了,因此平均下来的显示时间每个管子也比几十hz时高出很多很多倍,也就是相当于数码管的电流更大些,以至于显示的亮度应该还比传统的动态扫描亮度高些,如果不信可以搭个板子试试.
离线wycx
发帖
1497
只看该作者 9楼 发表于: 2006-02-23
用户被禁言,该主题自动屏蔽!
离线1a2b3c
发帖
204
只看该作者 10楼 发表于: 2006-02-23
'
不好不好。实际上在延时里做别的事最好了,,,要不用定时中断。这样多好啊。。。功能强大。。
见识到51的干扰了,,用动态扫描时,旁边收音机中波段根本没法用。
'

这里在针对楼主的这个代码在说事情,实际应用的时候谁会这样做啊,

另外对于干扰问题,这里实际上主要的恐怕是由于动态扫描的时候,IO口的变化引起的低频脉冲偕波落在了中波范围,你用任意一个单片机如果进行同样的操作,一样会有干扰,因为类似这个干扰是基本和使用什么样的单片机无关,只要是驱动数码管的电流\频率是一样的,那么就有同样的干扰存在.
离线bg6qbt
发帖
7255
只看该作者 11楼 发表于: 2006-02-24
学习了
'
实际上运行时需要加入一点延时吧?
他这里的使用无须加入延迟的,因为全部程序就是在动态扫描这几个数码管了,你所说的要加入延迟是受了平时我们做动态扫描时的影响,因为平时除了扫描外还要主要工作是做其他处理,因此扫描显示的时间很短,大概重复频率在几十Hz,每位显示时间在几个ms,那样做主要方便更多的时间用于其他处理.
而这个程序这里全部的工作就是扫描显示管子,虽然每次管子显示的时间只有几个机器周期,但是他重复频率很高,比传统的几十hz的扫描速度已经是高出几百甚至是上千倍了,因此平均下来的显示时间每个管子也比几十hz时高出很多很多倍,也就是相当于数码管的电流更大些,以至于显示的亮度应该还比传统的动态扫描亮度高些,如果不信可以搭个板子试试.
'
................................................