不知道各位驱动数码管段码在不同一组IO口的方法是怎样的?
首先我想到了的方法是使用switch去选择,来看看代码:
void Digital(unsigned char Number,unsigned char dp) //Number为显示的数,dp是否显示小数点,
{
switch(Number)
{
case 0:
LED_A_LOW;LED_B_LOW;LED_C_LOW;LED_D_LOW;LED_E_LOW;LED_F_LOW;LED_G_HIGH;
if(dp)
{
LED_DP_LOW;
}
else
{
LED_DP_HIGH;
}
break;
case 1:
LED_A_HIGH;LED_B_LOW;LED_C_LOW;LED_D_HIGH;LED_E_HIGH;LED_F_HIGH;LED_G_HIGH;
if(dp)
{
LED_DP_LOW;
}
else
{
LED_DP_HIGH;
}
break;
case 2:
LED_A_LOW;LED_B_LOW;LED_C_HIGH;LED_D_LOW;LED_E_LOW;LED_F_HIGH;LED_G_LOW;
if(dp)
{
LED_DP_LOW;
}
else
{
LED_DP_HIGH;
}
break;
case 3:
LED_A_LOW;LED_B_LOW;LED_C_LOW;LED_D_LOW;LED_E_HIGH;LED_F_HIGH;LED_G_LOW;
if(dp)
{
LED_DP_LOW;
}
else
{
LED_DP_HIGH;
}
break;
case 4:
LED_A_HIGH;LED_B_LOW;LED_C_LOW;LED_D_HIGH;LED_E_HIGH;LED_F_LOW;LED_G_LOW;
if(dp)
{
LED_DP_LOW;
}
else
{
LED_DP_HIGH;
}
break;
case 5:
LED_A_LOW;LED_B_HIGH;LED_C_LOW;LED_D_LOW;LED_E_HIGH;LED_F_LOW;LED_G_LOW;
if(dp)
{
LED_DP_LOW;
}
else
{
LED_DP_HIGH;
}
break;
case 6:
LED_A_LOW;LED_B_HIGH;LED_C_LOW;LED_D_LOW;LED_E_LOW;LED_F_LOW;LED_G_LOW;
if(dp)
{
LED_DP_LOW;
}
else
{
LED_DP_HIGH;
}
break;
case 7:
LED_A_LOW;LED_B_LOW;LED_C_LOW;LED_D_HIGH;LED_E_HIGH;LED_F_HIGH;LED_G_HIGH;
if(dp)
{
LED_DP_LOW;
}
else
{
LED_DP_HIGH;
}
break;
case 8:
LED_A_LOW;LED_B_LOW;LED_C_LOW;LED_D_LOW;LED_E_LOW;LED_F_LOW;LED_G_LOW;
if(dp)
{
LED_DP_LOW;
}
else
{
LED_DP_HIGH;
}
break;
case 9:
LED_A_LOW;LED_B_LOW;LED_C_LOW;LED_D_LOW;LED_E_HIGH;LED_F_LOW;LED_G_LOW;
if(dp)
{
LED_DP_LOW;
}
else
{
LED_DP_HIGH;
}
break;
case 10:
LED_A_HIGH;LED_B_HIGH;LED_C_HIGH;LED_D_HIGH;
LED_E_HIGH;LED_F_HIGH;LED_G_HIGH;LED_DP_HIGH;break;
default:break;
}
}
此方法虽然可行,在紧张的MCU上是否用更省代码的方法呢,有,肯定有,先来看代码:
const unsigned SEG[11]={0x09,0x9f,0x25,0x07,0x93,0x43,0x41,0x1f,0x01,0x03,0xff};//从0-9到不显示
void Digital(unsigned char Number,unsigned char dp) //Number为数码管显示的段码数据,dp是否显示小数点。
{
if(dp)
{
Number=Number&0xfe;
}
//不在同一组IO口的计算方法
GPIO_Write(GPIOC,(GPIO_ReadInputData(GPIOC)&0xf1)|((Number>>4)&0x0e));
GPIO_Write(GPIOE,(GPIO_ReadInputData(GPIOE)&0xdf)|((Number<<1)&0x20));
GPIO_Write(GPIOB,(GPIO_ReadInputData(GPIOB)&0xf8)|(Number>>1&0x07));
GPIO_Write(GPIOD,((GPIO_ReadInputData(GPIOD)&0xfe)|(Number&0x01)));
}
以上是否要简洁许多,内存空间也是少占了不少。来看看是怎么实现的,首先,GPIO_ReadInputData(GPIOC)&0xf1) 读出端口的数据,与上你要显示的段码的位置,0显示,1不显示,Number>>4 由于硬件接的是PC口的低2,3,4位,数码管端是接的A、B、C,按照A到G的顺序。所以需要把高位往下移动4位。剩下的都是C语言的逻辑运算了,有兴趣的朋友自己算算。注,此方案的数码管为共阳数码管。
以上两代码都是通过验证的。完全可用。附原理图
stm8.jpg (684.85 KB, 下载次数: 0)
下载附件
数码原理图
2014-12-25 08:56 上传
一周热门 更多>