怎么直接用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;
}
}
}
麻烦各位大佬帮忙看一下 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);
}
DebugLab 发表于 2024-7-16 11:40
8G系列没有硬件LED驱动,需要软件实现,建议用STC8H4K64TL,硬件LED驱动自动扫描,扫描过程不需要软件参与
...
谢谢大佬 正反接的LED数码管驱动不是这么做的,不能按位扫描,要按灯扫描,最好事先编个显示驱动表格,再查表处理 直驱建议使用tl芯片,如果使用非tl还是595或者tm1637控制比较好。 soma 发表于 2024-7-16 11:52
直驱建议使用tl芯片,如果使用非tl还是595或者tm1637控制比较好。
大佬,为了省钱啊 网老四 发表于 2024-7-16 11:49
正反接的LED数码管驱动不是这么做的,不能按位扫描,要按灯扫描,最好事先编个显示驱动表格,再查表处理 ...
这个按灯扫描怎么做了 IO5V,LED3V,要不软件快速扫描。IO复用极复杂,没有软件辅助计算{:smile:} 萌芽MENGYA 发表于 2024-7-16 12:19
IO5V,LED3V,要不软件快速扫描。IO复用极复杂,没有软件辅助计算
试过高速扫描是没有问题的,因为占空比极小,最高亮度单LED占空比还不到5%,一个周期还没来得及发热就断电了,单片机内部类似一个恒流源,有点压降也没事,试过IO推挽直接静态驱动LED不串电阻,LED和单片机都略微发热,也不会烧,当然严谨起见可以每个IO串个小电阻,比如100Ω