DebugLab 发表于 2025-9-7 08:47:25

STC单片机,STC MCU 直接驱动:5脚6脚查理复用数码管程序

STC单片机,STC MCU 直接驱动
原理:发光二极管具有单向导电性,查理复用利用该特性正反向排列组合连接LED,可以使用较少的引脚驱动较多的LED,设脚数为n,根据数学排列组合公式可得最多驱动的LED数量为n*(n-1)
区别于矩阵排列方式,查理复用方式存在以下特性:MCU的IO口必须要支持高阻模式,一般同时只点亮1个段,占空比较小,节省IO口,但程序较复杂
查理复用数码管占空比一般为几十分之一,高速扫描的情况下不需要串电阻,允许峰值电流超过最大电流,这种工况下主要考虑的是EAS,即单脉冲雪崩能量,但LED通常没有这些数据,一般认为平均电流不超过LED最大电流(数码管和普通小功率LED一般为20mA)即可稳定工作,这也是IO口的最大电流
程序中display函数传入参数x为显示数据,dp为6脚数码管的小数点,brightness为亮度,值为1~10,1最暗,10最亮,修改IO口只需要修改程序前面部分带有ENA或DIS字样的函数,使IO口输出对应的状态即可

5脚查理复用数码管:
attach://114265.mp4




6脚查理复用数码管:
attach://114267.mp4








DebugLab 发表于 2025-9-7 08:52:56

5脚查理复用数码管:
#include <AI8H.H>

unsigned char Count;

/*----------------------------延时10us@AI8@11.0592MHz----------------------------*/
void Delay_10us(void)
{
      unsigned char data i;
      i=35;
      while(--i);
}

/*----------------------------延时x10us----------------------------*/
void Delay_x10us(unsigned char x)
{
      while(x--)
                Delay_10us();
}

void PIN1_ENA(bit x){P2M0|=0x01;P2M1&=0xFE;P20=x;}
void PIN1_DIS(void){P2M0&=0xFE;P2M1|=0x01;}
void PIN2_ENA(bit x){P2M0|=0x02;P2M1&=0xFD;P21=x;}
void PIN2_DIS(void){P2M0&=0xFD;P2M1|=0x02;}
void PIN3_ENA(bit x){P2M0|=0x04;P2M1&=0xFB;P22=x;}
void PIN3_DIS(void){P2M0&=0xFB;P2M1|=0x04;}
void PIN4_ENA(bit x){P2M0|=0x08;P2M1&=0xf7;P23=x;}
void PIN4_DIS(void){P2M0&=0xf7;P2M1|=0x08;}
void PIN5_ENA(bit x){P2M0|=0x10;P2M1&=0xEF;P24=x;}
void PIN5_DIS(void){P2M0&=0xEF;P2M1|=0x10;}

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

void Display(unsigned char x,unsigned char brightness)
{
      unsigned char a,b,c;
      if(x>=200)
      {
                a=0xFF;
                b=0xFF;
                c=0xFF;
      }
      else
      {
                a=x/100;
                b=x%100/10;
                c=x%10;
      }
      if(a==1)
      {PIN3_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
      if(a==1)
      {PIN2_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN4_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);PIN3_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN3_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);PIN2_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN2_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);PIN3_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
      if(b==0||b==2||b==3||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(b==0||b==2||b==6||b==8)
      {PIN5_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
      if(b==0||b==4||b==5||b==6||b==8||b==9)
      {PIN5_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
      if(b==2||b==3||b==4||b==5||b==6||b==8||b==9)
      {PIN5_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN4_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)
      {PIN2_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN1_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);PIN3_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
      if(c==0||c==2||c==3||c==5||c==6||c==8||c==9)
      {PIN3_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
      if(c==0||c==2||c==6||c==8)
      {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==4||c==5||c==6||c==8||c==9)
      {PIN4_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
      if(c==2||c==3||c==4||c==5||c==6||c==8||c==9)
      {PIN5_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
}

void Init(void)
{
      Clear_Display();
      TL0=0x00;
      TH0=0x4C;
      TF0=0;
      ET0=1;
      EA=1;
      TR0=1;
}

void main(void)
{
      Init();
      while(1)
      {
                Display(Count,5);
      }
}

void Timer0(void) interrupt 1
{
      static unsigned char count;
      count++;
      if(count==2)
      {
                count=0;
                Count++;
                if(Count==200)
                        Count=0;
      }
}

DebugLab 发表于 2025-9-7 08:53:04

6脚查理复用数码管:
#include <AI8H.H>

unsigned int Count;

/*----------------------------延时10us@AI8@11.0592MHz----------------------------*/
void Delay_10us(void)
{
      unsigned char data i;
      i=35;
      while(--i);
}

/*----------------------------延时x10us----------------------------*/
void Delay_x10us(unsigned char x)
{
      while(x--)
                Delay_10us();
}

void PIN1_ENA(bit x){P2M0|=0x01;P2M1&=0xFE;P20=x;}
void PIN1_DIS(void){P2M0&=0xFE;P2M1|=0x01;}
void PIN2_ENA(bit x){P2M0|=0x02;P2M1&=0xFD;P21=x;}
void PIN2_DIS(void){P2M0&=0xFD;P2M1|=0x02;}
void PIN3_ENA(bit x){P2M0|=0x04;P2M1&=0xFB;P22=x;}
void PIN3_DIS(void){P2M0&=0xFB;P2M1|=0x04;}
void PIN4_ENA(bit x){P2M0|=0x08;P2M1&=0xf7;P23=x;}
void PIN4_DIS(void){P2M0&=0xf7;P2M1|=0x08;}
void PIN5_ENA(bit x){P2M0|=0x10;P2M1&=0xEF;P24=x;}
void PIN5_DIS(void){P2M0&=0xEF;P2M1|=0x10;}
void PIN6_ENA(bit x){P2M0|=0x20;P2M1&=0xDF;P25=x;}
void PIN6_DIS(void){P2M0&=0xDF;P2M1|=0x20;}

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==1)
      {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);
}

void Init(void)
{
      Clear_Display();
      TL0=0x00;
      TH0=0xEE;
      TF0=0;
      ET0=1;
      EA=1;
      TR0=1;
}

void main(void)
{
      Init();
      while(1)
      {
                Display(Count,1,5);
      }
}

void Timer0(void) interrupt 1
{
      static unsigned char count;
      count++;
      if(count==2)
      {
                count=0;
                Count++;
                if(Count==2000)
                        Count=0;
      }
}

wangxiangtan 发表于 2025-9-19 09:17:39

查理复用,收藏备用
页: [1]
查看完整版本: STC单片机,STC MCU 直接驱动:5脚6脚查理复用数码管程序