51单片机100例实例之07例
//项目名称:8位数码管上同时显示多个不同字符
//项目再创作者:科技小宅神
//完成时间:2021/01/19

//项目备注:
//1、本例实现在8位数码管上同时显示多个不同字符。
//2、本例使用了8只集成式7段共阳数码管(pruteus中元件标识为7seg-mpx8-ca-blu,共阳为ca,共阴为cc),
// 所有8个数码管的段码引脚a,b,c,d,e,f,g,dp都是分别并联在一起,任何时候发送的段码均会传送到所有数码管上,所有的数码管的共阳极是独立的,
// 本例中个数码管的共阳极分别与8只NPN三极管射极相连,程序运行时,任意时刻仅允许一只数码管的共阳极连接+5V,当向连接段码的端口发送段码值时,相应数字只会显示在某一只数码管上。
//3、为了使不同数码管显示不同字符,本例使用的是集成式多位数码管常用的动态扫描显示技术,他利用了人的视觉暂留特征,选通第一只数码管时,发送1的段码;选通第二只数码管时,发送2的段码,...
// 每次仅选通一只数码管,发送相应的段码,每次切换选通下一数码管并发送相应段码的时间间隔非常短,视觉惰性使人感觉不到字符是一个接一个显示在不同的数码管上的,而会觉得所有的字符很稳定的同时显示在不同数码管上。
// 在控制两位数码管选通的时间间隔时,要注意全屏的扫描频率要高于视觉暂留频率16-20Hz。对于程序中的点亮一位数码管的延时时间,我们可以尝试将延时时间改为其他数值,观察会出现什么样的效果
#include <reg52.h>
#include <intrins.h>//C51内部移位函数
#define uchar unsigned char
#define uint unsigned int
//7-seg数码管数组
uchar code DSY_CODE[11]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff
};//显示012345678
//1毫秒延时子程序
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=120;i>0;i--);
}
}
//主程序
void main()
{
uchar i,k=0x80; //常量定义
P3 = 0xff; //先关闭数码管
P2 = 0x00;
while(1)//死循环
{
for(i=0;i<8;i++)
{
P2=0x00;//关闭显示
k=_crol_(k,1);//逐次循环左移
P2=k; //发送位码
P3=DSY_CODE[i+1];//发送数字段码
DelayMS(2); //延时
}
}
}