找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1056|回复: 7
打印 上一主题 下一主题
收起左侧

关于单片机数码管动态扫描程序处理

[复制链接]
跳转到指定楼层
#

用STC12W204S单片机 直接驱动一个4位数码管。我们平时都是把段选放在一个口,例如P0,P1,P2,每个口刚好8个IO口,但是这个单片机没有一个完整的8位口,如图这样,段选分散在了P1,P3,P5口。
如果段选全在一个P0口,平时是直接P0=table[num];但是像这样分散之后,P0这里应该要怎么处理呢?
要怎么把这8个分散在不同口的段选重新按顺序打包一下,并且还能套用段选在一个端口下那样的数组呢?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

7#
ID:383654 发表于 2023-8-28 15:38 | 只看该作者
cnfloatleaf 发表于 2023-8-27 01:36
sbit   TMP0 = temp^0;
sbit   TMP1 = temp^1;
sbit   TMP2 = temp^2;

感谢大佬,就是这个意思!
回复

使用道具 举报

6#
ID:161164 发表于 2023-8-28 10:34 | 只看该作者
  1. void IO_out(uchar dat)
  2. {
  3.         P34=dat&0x80;
  4.         P30=dat&0x40;
  5.         P12=dat&0x20;
  6.         P10=dat&0x10;
  7.         P32=dat&0x08;
  8.         P33=dat&0x04;
  9.         P13=dat&0x02;
  10.         P11=dat&0x01;
  11. }
复制代码


回复

使用道具 举报

5#
ID:123289 发表于 2023-8-28 10:12 | 只看该作者
1、这里不关P0的事。
2、你可以正常使用数组,完成你想要做的事。
3、驱动LED时,加一个【翻译】(自己写程序):
【翻译】这样工作:
3.1、取出的一个LED的显示数据是N,(假设你想显示3,这里的N也=3)
3.2、将N转LED码:M。(这里你可以做一个N转M的表格,其中N=3时,M=hgfedcba=01001111,h=dp),M一个字节共8位,M7-M0,每位对应一个LED的显示段。请自己先编一个码生产N-M表格。你想显示多少种N,就对应做出多少个M,不要怕麻烦。如显示3,abcdg=1,ef=0,dp=0。N=03H/M=40H。
3.3、取出M,因为M0=a,a接在P3.3上,就将M0送至P3.3(P3.3=M0)。类似处理M1-M7。
3.4、如果M需要显示在第2位G2,G2接在P3.7上,就让P3.7=0(共阴LED),其它3位G1/G3/G4=P3.2/P1.0/P1.2=1。
如果是共阳LED,则3.3、3.4、的结果需要求反。

总结:这个作业是为了让你真正地理解LED扫描显示的原理。就是不让你【顺心】,必须自己写驱动,并翻译LED码。
事实上,在实战产品中,大部分情况,为了省钱,也是以硬件优先,LED的引脚不一定与CPU【有序】。当然设计大师们为了方便软件,也会尽可能做成【有序】。不过,鱼和熊掌啊。
回复

使用道具 举报

地板
ID:459275 发表于 2023-8-27 09:11 | 只看该作者
http://www.51hei.com/bbs/dpj-56990-1.html
看看这里或许能帮到你。
回复

使用道具 举报

板凳
ID:1085441 发表于 2023-8-27 01:38 | 只看该作者
在这里敲程序真累啊,TABLE健不能用,一不小心没写完就发出了,应该现在编辑器上敲好复制过来
回复

使用道具 举报

沙发
ID:1085441 发表于 2023-8-27 01:36 | 只看该作者
sbit   TMP0 = temp^0;
sbit   TMP1 = temp^1;
sbit   TMP2 = temp^2;
sbit   TMP3 = temp^3;
sbit   TMP4 = temp^4;
sbit   TMP5 = temp^5;
sbit   TMP6 = temp^6;
sbit   TMP7 = temp^7;

// 显示程序
P32 = 1;   // 位选全部为1,不显示,假设数码管是共阴
P37 = 1;
P10 = 1;
P12 = 1;
temp = table[0];    // 赋值第一个数码管,数码管 a b c ~ dp 对应bit0~bit7
P33 = TMP0;
P11 = TMP1;
P14 = TMP2;
P54 = TMP3;
P55 = TMP4;
P36 = TMP5;
P13 = TMP6;
P15 = TMP7;
P32= 0;        // 显示第一位数码管
delay();           // 延时
P32= 1;
temp= table[1];   // 赋值第二个数码管,
// BIT位赋值同上
P37= 0;  // 显示第二位数码管
回复

使用道具 举报

楼主
ID:1085441 发表于 2023-8-27 01:22 | 只看该作者
可以吧每个bit分开送,然后驱动位选
unsigned char bdata tmp;       // 先定义一个可位寻址RAM
sbit
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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