如题,本文章实现三种数码管的演示效果
实现静态数码管计时
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
#define SMG_A_DP_PORT P0
u8 gsmg_code[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66,0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //设置管码数字显示
void delay_10us(u16 ten_us) //延时函数
{
while(ten_us--);
}
void main()
{
u16 i;
while(1)
{
for(i = 0;i<10;i++) // 1-16动态展示
{
SMG_A_DP_PORT = ~gsmg_code[i];
delay_10us(55000);
delay_10us(55000);
}
}
}
实现动态数码管后两位计时
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
#define SMG_A_DP_PORT P0
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 gsmg_code[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x40};
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void switch_LS(u16 i){ // 选位
switch(7-i)
{
case 0: LSC=1;LSB = 1; LSA = 1; break;
case 1: LSC=1;LSB = 1; LSA = 0; break;
case 2: LSC=1;LSB = 0; LSA = 1; break;
case 3: LSC=1;LSB = 0; LSA = 0; break;
case 4: LSC=0;LSB = 1; LSA = 1; break;
case 5: LSC=0;LSB = 1; LSA = 0; break;
case 6: LSC=0;LSB = 0; LSA = 1; break;
case 7: LSC=0;LSB = 0; LSA = 0; break;
}
}
void show_num(void)
{
u8 j = 0;
u8 k = 5000;
u16 num1;
u16 num2;
for(j=0;j<60;j++) // 一个循环为60次
{ for(k; k>0; k--) // 频闪次数
{
switch_LS(7); // 选位函数,选择最后一个位置写入数字
num1 = j%10; // 取两位数的个位
SMG_A_DP_PORT = gsmg_code[num1]; // 写入数字
delay_10us(400);
SMG_A_DP_PORT = 0x00;
switch_LS(6); //选择倒数第二个位置写入数字
num2 = j/10; // 取两位数的十位
SMG_A_DP_PORT = gsmg_code[num2];
delay_10us(400);
SMG_A_DP_PORT = 0x00;
}
k=5000;
}
j=0;
}
void main()
{
while(1)
{
show_num();
}
}
实现动态数码管前面7位显示固定内容,最后一位计时
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
#define SMG_A_DP_PORT P0
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 gsmg_code[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x40}; // 最后一位是 “-”
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void switch_LS(u16 i){ // 选位
switch(7-i)
{
case 0: LSC=1;LSB = 1; LSA = 1; break;
case 1: LSC=1;LSB = 1; LSA = 0; break;
case 2: LSC=1;LSB = 0; LSA = 1; break;
case 3: LSC=1;LSB = 0; LSA = 0; break;
case 4: LSC=0;LSB = 1; LSA = 1; break;
case 5: LSC=0;LSB = 1; LSA = 0; break;
case 6: LSC=0;LSB = 0; LSA = 1; break;
case 7: LSC=0;LSB = 0; LSA = 0; break;
}
}
void show_num(u16 birth[])
{
u8 i;
u8 j = 0;
u8 k = 500;
for(j=0;j<10;j++) // 一个循环为10次
{
for(k; k>0; k--) // 频闪次数
{
for(i=0;i<7;i++) // 为前七位赋固定值,值为函数传入的birth数组
{
switch_LS(i); // 选位
SMG_A_DP_PORT = gsmg_code[birth[i]]; // 写入数字
delay_10us(56);
SMG_A_DP_PORT = 0x00;
}
switch_LS(7);
SMG_A_DP_PORT = gsmg_code[j];
delay_10us(56);
SMG_A_DP_PORT = 0x00;
}
k=500;
}
}
void main()
{ u16 birth[7] = {2, 0, 0, 2, 0xf, 0 ,9};
while(1)
{
show_num(birth);
}
}
代码问题
上面的程序有个通病,计时不精确,不能准确到1秒变化一次,还需改进。