我们平时实验练手,点数码管基本上是同一个端口接一个数码管,这样操作非常方便,比如接P0口,全亮直接P0=0xff就行了。
但实际项目中,可能有各种各样的原因,不一定能接在同一个口中,怎么办呢?
这时候,就需要软件中做一些简单的处理了。
这里抛砖引玉,写一下我的想法,如大家有其他想法,请不吝赐教,感谢!
比如,原理图如下,随便接了几个端口的脚,分别在P1,P2,P3几个口上:
原来直接把一个显示数据往一个端口送进去就可以显示了,现在不同端口,就通过移位的方式,把一位位放入对应的IO口中。
代码如下:
#include <reg51.h>
//设置段对应的IO口
sbit a = P1^2;
sbit b = P1^4;
sbit c = P2^1;
sbit d = P3^5;
sbit e = P2^3;
sbit f = P3^7;
sbit g = P1^0;
//定义共阴极数码管0-9的显示数组
unsigned int code num[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x67};
//延时
void delay(unsigned int nms)
{
unsigned int i;
while(nms--)
{
for(i=0;i<500;i++){}
}
}
//显示数据处理,逐位放入对应的IO口
void display_num(unsigned char n)
{
unsigned char temp;
temp = num[n];
a = temp & (0x01<<0);
b = temp & (0x01<<1);
c = temp & (0x01<<2);
d = temp & (0x01<<3);
e = temp & (0x01<<4);
f = temp & (0x01<<5);
g = temp & (0x01<<6);
}
int main(void)
{
unsigned char i;
while(1)
{
for(i=0;i<10;i++) //循环显示0-9
{
display_num(i);
delay(100);
}
}
}