点亮数码管方法:
1.P0输出数据(期望显示的数字/英文),选通Y7C段选,关闭锁存器
2.P0输出数据(期望点亮的位),选通Y6C位选,关闭锁存器
为了更方便的去控制P0口和P2口,我们可以创建一个单独的函数Device_Ctrl()来对这两个口进行控制,方便后续的使用。这个函数记住就可以,不用强行理解它的逻辑。
void Device_Ctrl(unsigned char p2data,unsigned char p0data)
{
P0=p0data;
P2=P2&0x1f|p2data;
P2=&=0x1f;
}
由于数码管需要循环显示1-8位,所以需要编写一个数码管显示程序,并放在中断函数里。
数码管显示程序:
void vSMG_Display()
{
static u8 i=0;//使用static关键字是为了只初始化i一次,每次调用的时候保留其值,直到程序结束
vDevice_Ctrl(0xc0,0);
vDevice_Ctrl(0xe0,~smg_code[i]);//创建smg_code数组,存放要显示的共阴极数码管的值
vDevice_Ctrl(0xc0,0x01<<i);//在数码管的1-8位上循环显示数值
i=(i+1)%8;//i的取值范围是0-7
}
注意:
- 数码管是共阳极点亮
- 我们可以通过STC-ISP例程查询《共阴数码管表》,如下图,通过按位取反~转换成《共阳数码管表》
- 推荐单个数码管显示时间为1ms或者2ms
- 数码管显示函数放在定时器中断里
查找共阴数码表:
STC-ISP->右上角的范例程序 ->如图红色荧光笔标注选项->向下查找即可
STC-ISP软件程序中的数码表包含了0-9的数字和大部分字母的大小写,非常方便。
程序示例:(在数码管上依次显示0-7)
void vTimer2_Init(void)//12Mhz,定时1ms
{
AUXR &= 0xFB;
T2L = 0x18;
T2H = 0xFC;
AUXR |= 0x10;
IE2 |=0x04;
EA=1;
//定时器初始化的部分与我上一篇博客讲的一样
}
unsigned char smg_code[8]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07};// 0 1 2 3 4 5 6 7
void main()
{
vTimer2_Init();
while(1)
{
}
}
void vSMG_Display()
{
static u8 i=0;
vDevice_Ctrl(0xc0,0x00);
vDevice_Ctrl(0xe0,~smg_code[i]);
vDevice_Ctrl(0xc0,0x01<<i);
i=(i+1)%8;
}
void vTimer2_ISR() interrupt 12
{
vSMG_Display();
}