C51:数码管的动态显示

点亮数码管方法:

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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱写代码的倒霉蛋

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值