找回密码
 立即注册
查看: 1473|回复: 28

怎么直接用IO口驱动LED

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:138
  • 最近打卡:2025-04-29 21:28:54

5

主题

38

回帖

703

积分

高级会员

积分
703
发表于 2024-7-16 11:05:05 | 显示全部楼层 |阅读模式
本来想用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[a];
                        delay_ms(200);
                        P1=0X00;
                       
                       
                }
        }

       
       
}


原理图

原理图

实际效果

实际效果
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:138
  • 最近打卡:2025-04-29 21:28:54

5

主题

38

回帖

703

积分

高级会员

积分
703
发表于 2024-7-16 11:05:33 | 显示全部楼层
麻烦各位大佬帮忙看一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-7-16 11:40:30 | 显示全部楼层
8G系列没有硬件LED驱动,需要软件实现,建议用STC8H4K64TL,硬件LED驱动自动扫描,扫描过程不需要软件参与

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

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


做过6脚188.8数码管驱动


截图202407161140212673.jpg



以下供参考


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

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:138
  • 最近打卡:2025-04-29 21:28:54

5

主题

38

回帖

703

积分

高级会员

积分
703
发表于 2024-7-16 11:44:04 | 显示全部楼层
Debu*** 发表于 2024-7-16 11:40
8G系列没有硬件LED驱动,需要软件实现,建议用STC8H4K64TL,硬件LED驱动自动扫描,扫描过程不需要软件参与
...

谢谢大佬
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:363
  • 最近打卡:2025-04-30 00:05:02

6

主题

319

回帖

2200

积分

金牌会员

积分
2200
发表于 2024-7-16 11:49:42 | 显示全部楼层
正反接的LED数码管驱动不是这么做的,不能按位扫描,要按灯扫描,最好事先编个显示驱动表格,再查表处理

点评

是的  发表于 2024-7-16 11:54
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-7-16 11:52:46 来自手机 | 显示全部楼层
直驱建议使用tl芯片,如果使用非tl还是595或者tm1637控制比较好。

点评

行列结构才能用8H4K64TL和其他ASIC  发表于 2024-7-16 11:57
查理复用结构只能软件驱动  发表于 2024-7-16 11:56
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:138
  • 最近打卡:2025-04-29 21:28:54

5

主题

38

回帖

703

积分

高级会员

积分
703
发表于 2024-7-16 12:13:27 | 显示全部楼层
so*** 发表于 2024-7-16 11:52
直驱建议使用tl芯片,如果使用非tl还是595或者tm1637控制比较好。

大佬,为了省钱啊

点评

这一看量就大,能省则省,但软件就复杂了,不过是一劳永逸的,批量烧录无限复制,硬件能省很多成本  发表于 2024-7-16 13:02
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:138
  • 最近打卡:2025-04-29 21:28:54

5

主题

38

回帖

703

积分

高级会员

积分
703
发表于 2024-7-16 12:16:19 | 显示全部楼层
网*** 发表于 2024-7-16 11:49
正反接的LED数码管驱动不是这么做的,不能按位扫描,要按灯扫描,最好事先编个显示驱动表格,再查表处理 ...

这个按灯扫描怎么做了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:290
  • 最近打卡:2025-05-01 11:04:37
已绑定手机

5

主题

57

回帖

226

积分

中级会员

积分
226
发表于 2024-7-16 12:19:12 | 显示全部楼层
IO5V,LED3V,要不软件快速扫描。IO复用极复杂,没有软件辅助计算

点评

试过高速扫描是没有问题的,因为占空比极小,最高亮度单LED占空比还不到5%,一个周期还没来得及发热就断电了,单片机内部类似一个恒流源,有点压降也没事,试过IO推挽直接静态驱动LED不串电阻,LED和单片机都略微发  详情 回复 发表于 2024-7-16 13:10
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-7-16 13:10:22 | 显示全部楼层
萌芽M*** 发表于 2024-7-16 12:19
IO5V,LED3V,要不软件快速扫描。IO复用极复杂,没有软件辅助计算

试过高速扫描是没有问题的,因为占空比极小,最高亮度单LED占空比还不到5%,一个周期还没来得及发热就断电了,单片机内部类似一个恒流源,有点压降也没事,试过IO推挽直接静态驱动LED不串电阻,LED和单片机都略微发热,也不会烧,当然严谨起见可以每个IO串个小电阻,比如100Ω
DebugLab
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 17:13 , Processed in 0.135413 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表