我们先来看一下蓝桥杯板中数码管部分的电路图:
对于动态数码管的控制,是需要有段选和位选的,位选是控制数码管哪一位显示,段选是控制该位显示什么数字,由上图可知,当Y6C有效时,P0控制的是数码管的位;当Y7C有效时,可以给P0写入显示数字的断码。以下依次是数码管0~F以及熄灭的段码:
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xff}
为了方便以后直接调用程序,直接用中断来写
上程序:
#include<STC15F2K60S2.H>
#include<intrins.h>
#define uchar unsigned char
unsigned char code SMG_NoDot[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xA1,0x86,0x8e,0xbf,0xff};//段码
unsigned char SMG_SJ[] = {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8};//对应每个位显示的数据非静态数组,可以直接改变对应的数值,比如SMG_SJ[0]=3,则第一个数码管显示3
uchar a=0,b=00;
void Timer0Init(void) //1000微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x20; //设置定时初始值
TH0 = 0xD1; //设置定时初始值
EA=1;
ET0=1;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Init74HC138(unsigned char n)
{
switch(n)
{
case 4: //LED
P2=(P2 & 0x1f) | 0x80;
break;
case 5: //蜂鸣器与继电器
P2=(P2 & 0x1f) | 0xa0;
break;
case 6: //数码管位选
P2=(P2 & 0x1f) | 0xc0;
break;
case 7: //数码管段码
P2=(P2 & 0x1f) | 0xe0;
break;
}
}
void main()
{
Timer0Init();
//SMG_SJ[7]=3;
while(1);
}
void T0() interrupt 1
{
Init74HC138(6); //打开位选
P0 = (0x01 << a); //控制位选,从第一个到第八个数码管
b=SMG_SJ[a]; //将对应的数据放到B
Init74HC138(7); //打开段码
P0=SMG_NoDot[b]; //输出段码
a++; //下次进入下一个数码管
if(a==8) //到第八个数码管后从第一个开始
a=0;
}