单片机数码管显示-消影问题
2014-01-15 17:35
197 查看
看郭天祥的单片机书中数码管部分,使用 P0=0xff 的方法可以消除段选数据对位选的干扰,另外使用我下面的方法可以达到同样的效果。但即便这样数码管仍有影子,这种状况是,当前数码管有下一个数码管的影子,或者当前数码管有前一个数码管的影子。
分析一下产生原因,当我们点亮一个数码管后,总要先将段选或者位选改为下一个数码管的值,而不能同时改变。当先改变段选时,那么当前数码管就会有短暂的时间显示下一个数码管的数字。当先改变位选时,下一个数码管就会有短暂的时间显示当前数码管的数字。
那么解决方法是,先将段选置0送入锁存器,改变位选的值为下一个数码管,最后再改变段选值。同理另一种方法是,先将位选赋值 0xff 即关闭所有数码管,改变段选值,最后改变位选值。
另外一种勉强可以的方法是,增加延时时间,这样正常数字显示时间就相对影子数字的短暂时间变长,看起来影子就变得暗了,但延时太长导致数码管闪烁,所以这种方法不建议,郭天祥书中的示例程序使用这种方法。
只贴出前2种方法的代码。
interrupt.c
参考 http://bbs.21ic.com/icview-413371-1-1.html
分析一下产生原因,当我们点亮一个数码管后,总要先将段选或者位选改为下一个数码管的值,而不能同时改变。当先改变段选时,那么当前数码管就会有短暂的时间显示下一个数码管的数字。当先改变位选时,下一个数码管就会有短暂的时间显示当前数码管的数字。
那么解决方法是,先将段选置0送入锁存器,改变位选的值为下一个数码管,最后再改变段选值。同理另一种方法是,先将位选赋值 0xff 即关闭所有数码管,改变段选值,最后改变位选值。
另外一种勉强可以的方法是,增加延时时间,这样正常数字显示时间就相对影子数字的短暂时间变长,看起来影子就变得暗了,但延时太长导致数码管闪烁,所以这种方法不建议,郭天祥书中的示例程序使用这种方法。
只贴出前2种方法的代码。
void show() { unsigned char i; while(1) for(i=0;i<6;i++) { P0=0xff; we=1; we=0; P0=table[num[i]]; du=1; du=0; P0=~(0x20>>i); we=1; we=0; delayms(1); } }
interrupt.c
参考 http://bbs.21ic.com/icview-413371-1-1.html
相关文章推荐
- 【特稿】总后副部长谷俊山被查已有两年
- 贵州警方通缉致15人死凯里赌场爆炸案嫌犯
- grails学习笔记-7、Domain创建过程中注意的问题
- java 合婚算法
- Android、iOS和Windows Phone中的推送技术
- C#关键字整理
- cocos2d XML读取
- win7下配置TortoiseGit使用Github
- [Java] 日期处理 03 Timestamp
- java 吕才合婚算法
- Qt国际化
- Pro Android学习笔记(七十):HTTP服务(4):SOAP/JSON/XML、异常
- [Java] 日期处理 03 Timestamp
- Makefile 一个简单例子
- 黑马程序员-------ADO.NET数据访问
- 转载:ubuntu下通过SSH+autoproxy+firefox上网
- java 神煞合婚法
- 隐马尔可夫模型细谈
- android 通过jni调用gsoap问题
- RGB与YCbCr颜色空间的转换