yjx 发表于 2024-7-16 11:05:05

怎么直接用IO口驱动LED

本来想用IO口驱动LED灯当数码管的,但是用点数码管的方式操作,当第一组灯亮的时候其他的灯也亮了,不知道怎么处理,
代码如下
#include        "config.h"
#include        "STC8G_H_GPIO.h"
#include        "STC8G_H_Delay.h"

u8 code ledNum[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};这个是每相当于列,但是这个列也没用上
u8 code led_1[]={0x11,0xb7,0x45,0x25,0xa3,0x29,0x09,0xb5,0x01,0x21};这个是第一组灯的代码

void        GPIO_config(void)         IO口初始化
{
        GPIO_InitTypeDef        GPIO_InitStructure;               
        GPIO_InitStructure.Pin= GPIO_Pin_All;                I
        GPIO_InitStructure.Mode = GPIO_OUT_PP;               
        GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);       
       

}

void delay(u8 i)
{
        while(i--);
}

void main(void)
{
        EAXSFR();               
        GPIO_config();
P1=0X01;
                       
               
       
        while(1)
        {
               
                u8 a;
        for(a=0;a<10;a++)
                {
                       
                       
                  
                        P1=led_1;
                        delay_ms(200);
                        P1=0X00;
                       
                       
                }
        }

       
       
}


yjx 发表于 2024-7-16 11:05:33

麻烦各位大佬帮忙看一下

DebugLab 发表于 2024-7-16 11:40:30

8G系列没有硬件LED驱动,需要软件实现,建议用STC8H4K64TL,硬件LED驱动自动扫描,扫描过程不需要软件参与

看您这个好像是查理复用的结构?

这种结构需要使用PxMx修改GPIO模式,逐段扫描,其他IO设置为高阻


做过6脚188.8数码管驱动






以下供参考


void PIN1_ENA(bit x){P1M1|=0x40;P1M0&=0xbf;P16=x;}
void PIN1_DIS(void){P1M1&=0xbf;P1M0|=0x40;}
void PIN2_ENA(bit x){P1M1|=0x20;P1M0&=0xdf;P15=x;}
void PIN2_DIS(void){P1M1&=0xdf;P1M0|=0x20;}
void PIN3_ENA(bit x){P1M1|=0x10;P1M0&=0xef;P14=x;}
void PIN3_DIS(void){P1M1&=0xef;P1M0|=0x10;}
void PIN4_ENA(bit x){P1M1|=0x08;P1M0&=0xf7;P13=x;}
void PIN4_DIS(void){P1M1&=0xf7;P1M0|=0x08;}
void PIN5_ENA(bit x){P1M1|=0x04;P1M0&=0xfb;P12=x;}
void PIN5_DIS(void){P1M1&=0xfb;P1M0|=0x04;}
void PIN6_ENA(bit x){P1M1|=0x02;P1M0&=0xfd;P11=x;}
void PIN6_DIS(void){P1M1&=0xfd;P1M0|=0x02;}


void Clear_Display(void)
{
        PIN1_DIS();
        PIN2_DIS();
        PIN3_DIS();
        PIN4_DIS();
        PIN5_DIS();
        PIN6_DIS();
}


void Display(unsigned int x,bit dp,unsigned char brightness)
{
        unsigned char a,b,c,d;
        if(x>=2000)
        {
                a=0xff;
                b=0xff;
                c=0xff;
                d=0xff;
        }
        else
        {
                a=x/1000;
                b=x%1000/100;
                c=x%100/10;
                d=x%10;
        }
        if(a==1)
        {PIN4_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(a==1)
        {PIN5_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(b==0||b==2||b==3||b==5||b==6||b==7||b==8||b==9)
        {PIN2_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(b==0||b==1||b==2||b==3||b==4||b==7||b==8||b==9)
        {PIN3_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(b==0||b==1||b==3||b==4||b==5||b==6||b==7||b==8||b==9)
        {PIN4_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(b==0||b==2||b==3||b==5||b==6||b==8||b==9)
        {PIN5_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(b==0||b==2||b==6||b==8)
        {PIN6_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN6_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(b==0||b==4||b==5||b==6||b==8||b==9)
        {PIN3_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(b==2||b==3||b==4||b==5||b==6||b==8||b==9)
        {PIN4_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(c==0||c==2||c==3||c==5||c==6||c==7||c==8||c==9)
        {PIN1_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(c==0||c==1||c==2||c==3||c==4||c==7||c==8||c==9)
        {PIN1_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(c==0||c==1||c==3||c==4||c==5||c==6||c==7||c==8||c==9)
        {PIN1_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(c==0||c==2||c==3||c==5||c==6||c==8||c==9)
        {PIN1_ENA(1);PIN5_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN5_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(c==0||c==2||c==6||c==8)
        {PIN1_ENA(1);PIN6_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN6_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(c==0||c==4||c==5||c==6||c==8||c==9)
        {PIN5_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(c==2||c==3||c==4||c==5||c==6||c==8||c==9)
        {PIN6_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN6_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(dp)
        {PIN6_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN6_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(d==0||d==2||d==3||d==5||d==6||d==7||d==8||d==9)
        {PIN2_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(d==0||d==1||d==2||d==3||d==4||d==7||d==8||d==9)
        {PIN2_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(d==0||d==1||d==3||d==4||d==5||d==6||d==7||d==8||d==9)
        {PIN2_ENA(1);PIN5_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN5_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(d==0||d==2||d==3||d==5||d==6||d==8||d==9)
        {PIN2_ENA(1);PIN6_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN6_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(d==0||d==2||d==6||d==8)
        {PIN3_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(d==0||d==4||d==5||d==6||d==8||d==9)
        {PIN3_ENA(1);PIN5_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN5_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
        if(d==2||d==3||d==4||d==5||d==6||d==8||d==9)
        {PIN3_ENA(1);PIN6_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN6_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
}

yjx 发表于 2024-7-16 11:44:04

DebugLab 发表于 2024-7-16 11:40
8G系列没有硬件LED驱动,需要软件实现,建议用STC8H4K64TL,硬件LED驱动自动扫描,扫描过程不需要软件参与
...

谢谢大佬

网老四 发表于 2024-7-16 11:49:42

正反接的LED数码管驱动不是这么做的,不能按位扫描,要按灯扫描,最好事先编个显示驱动表格,再查表处理

soma 发表于 2024-7-16 11:52:46

直驱建议使用tl芯片,如果使用非tl还是595或者tm1637控制比较好。

yjx 发表于 2024-7-16 12:13:27

soma 发表于 2024-7-16 11:52
直驱建议使用tl芯片,如果使用非tl还是595或者tm1637控制比较好。

大佬,为了省钱啊

yjx 发表于 2024-7-16 12:16:19

网老四 发表于 2024-7-16 11:49
正反接的LED数码管驱动不是这么做的,不能按位扫描,要按灯扫描,最好事先编个显示驱动表格,再查表处理 ...

这个按灯扫描怎么做了

萌芽MENGYA 发表于 2024-7-16 12:19:12

IO5V,LED3V,要不软件快速扫描。IO复用极复杂,没有软件辅助计算{:smile:}

DebugLab 发表于 2024-7-16 13:10:22

萌芽MENGYA 发表于 2024-7-16 12:19
IO5V,LED3V,要不软件快速扫描。IO复用极复杂,没有软件辅助计算

试过高速扫描是没有问题的,因为占空比极小,最高亮度单LED占空比还不到5%,一个周期还没来得及发热就断电了,单片机内部类似一个恒流源,有点压降也没事,试过IO推挽直接静态驱动LED不串电阻,LED和单片机都略微发热,也不会烧,当然严谨起见可以每个IO串个小电阻,比如100Ω
页: [1] 2 3
查看完整版本: 怎么直接用IO口驱动LED