题目要求:模拟十字路口的两位信号灯显示计数(00-99),数字间隔时间不做特殊要求。采用软件延时方法。
#include"reg52.h"//可以添加<STC15F2K60S2.H>,读者自行百度如何添加此头文件,因为CT107D用的就是stc15f2k60s2芯片
#include"intrins.h"//软件延时需要
#define uchar unsigned char
#define sw 0x40
#define gw 0x80
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管编码表
void Delay10ms() //@11.0592MHz,软件延迟10ms,可以由STC烧录软件生成
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void init()//初始化开发板
{
P2=0xa0;P0=0x00;P2=0x00;//关掉蜂鸣器
P2=0x80;P0=0xff;P2=0x00;//灭led灯
}
void main()
{
uchar num=0,k;
init();
while(1)
{
for(k=0;k<10;k++)//这里加个循环,让一个数字显示十次,因为显示一次才延时20ms太快了,这里叠加十次,显得自然。
{ //显示十位
P2=0xc0;P0=sw;P2=0x00;//位选,选择亮那个数码管
P2=0xe0;P0=table[num/10];P2=0x00;//段选,给p0赋值先显示对应的数字
Delay10ms();
P2=0xc0;P0=gw;P2=0x00;//同理,位选
P2=0xe0;P0=table[num%10];P2=0x00;//同理段选。
Delay10ms();
}
num++;//显示数字加一
if(num==100)//数字等于100时归零
num=0;
}
}
这里,用到一些并口的知识,P0口的寄存器和P2口的。其次要理解数码管的显示原理,每次只能显示一位,人眼的残留才看起来是都显示的。
共阳数码管的编码表,比赛中例程中又共阴的,可以取反得到同样效果。