stm8s驱动数码管段码不在同组IO口的方法

2019-12-14 13:25发布

        不知道各位驱动数码管段码在不同一组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 上传
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。