找回密码
 立即注册
查看: 116|回复: 2

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:559
  • 最近打卡:2025-09-15 05:04:29
已绑定手机

86

主题

6110

回帖

1万

积分

超级版主

积分
11302
发表于 2025-9-7 08:47:25 | 显示全部楼层 |阅读模式
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脚查理复用数码管:


TB2MaQQyr4npuFjSZFmXXXl4FXa_!!778449721.avif.jpg
TB2NHcQyr4npuFjSZFmXXXl4FXa_!!778449721.avif.jpg
5脚数码管.zip (8.85 KB, 下载次数: 9)

6脚查理复用数码管:


TB2oYY2xbBnpuFjSZFGXXX51pXa_!!778449721.avif.jpg
TB2iv.JqSXlpuFjy0FeXXcJbFXa_!!778449721.avif.jpg
6脚数码管.zip (9.49 KB, 下载次数: 8)





回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:559
  • 最近打卡:2025-09-15 05:04:29
已绑定手机

86

主题

6110

回帖

1万

积分

超级版主

积分
11302
发表于 2025-9-7 08:52:56 | 显示全部楼层
5脚查理复用数码管:
  1. #include <AI8H.H>
  2. unsigned char Count;
  3. /*----------------------------延时10us@AI8@11.0592MHz----------------------------*/
  4. void Delay_10us(void)
  5. {
  6.         unsigned char data i;
  7.         i=35;
  8.         while(--i);
  9. }
  10. /*----------------------------延时x10us----------------------------*/
  11. void Delay_x10us(unsigned char x)
  12. {
  13.         while(x--)
  14.                 Delay_10us();
  15. }
  16. void PIN1_ENA(bit x){P2M0|=0x01;P2M1&=0xFE;P20=x;}
  17. void PIN1_DIS(void){P2M0&=0xFE;P2M1|=0x01;}
  18. void PIN2_ENA(bit x){P2M0|=0x02;P2M1&=0xFD;P21=x;}
  19. void PIN2_DIS(void){P2M0&=0xFD;P2M1|=0x02;}
  20. void PIN3_ENA(bit x){P2M0|=0x04;P2M1&=0xFB;P22=x;}
  21. void PIN3_DIS(void){P2M0&=0xFB;P2M1|=0x04;}
  22. void PIN4_ENA(bit x){P2M0|=0x08;P2M1&=0xf7;P23=x;}
  23. void PIN4_DIS(void){P2M0&=0xf7;P2M1|=0x08;}
  24. void PIN5_ENA(bit x){P2M0|=0x10;P2M1&=0xEF;P24=x;}
  25. void PIN5_DIS(void){P2M0&=0xEF;P2M1|=0x10;}
  26. void Clear_Display(void)
  27. {
  28.         PIN1_DIS();
  29.         PIN2_DIS();
  30.         PIN3_DIS();
  31.         PIN4_DIS();
  32.         PIN5_DIS();
  33. }
  34. void Display(unsigned char x,unsigned char brightness)
  35. {
  36.         unsigned char a,b,c;
  37.         if(x>=200)
  38.         {
  39.                 a=0xFF;
  40.                 b=0xFF;
  41.                 c=0xFF;
  42.         }
  43.         else
  44.         {
  45.                 a=x/100;
  46.                 b=x%100/10;
  47.                 c=x%10;
  48.         }
  49.         if(a==1)
  50.         {PIN3_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  51.         if(a==1)
  52.         {PIN2_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  53.         if(b==0||b==2||b==3||b==5||b==6||b==7||b==8||b==9)
  54.         {PIN2_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  55.         if(b==0||b==1||b==2||b==3||b==4||b==7||b==8||b==9)
  56.         {PIN3_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  57.         if(b==0||b==1||b==3||b==4||b==5||b==6||b==7||b==8||b==9)
  58.         {PIN4_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  59.         if(b==0||b==2||b==3||b==5||b==6||b==8||b==9)
  60.         {PIN4_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  61.         if(b==0||b==2||b==6||b==8)
  62.         {PIN5_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  63.         if(b==0||b==4||b==5||b==6||b==8||b==9)
  64.         {PIN5_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  65.         if(b==2||b==3||b==4||b==5||b==6||b==8||b==9)
  66.         {PIN5_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  67.         if(c==0||c==2||c==3||c==5||c==6||c==7||c==8||c==9)
  68.         {PIN1_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  69.         if(c==0||c==1||c==2||c==3||c==4||c==7||c==8||c==9)
  70.         {PIN2_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  71.         if(c==0||c==1||c==3||c==4||c==5||c==6||c==7||c==8||c==9)
  72.         {PIN1_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  73.         if(c==0||c==2||c==3||c==5||c==6||c==8||c==9)
  74.         {PIN3_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  75.         if(c==0||c==2||c==6||c==8)
  76.         {PIN1_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  77.         if(c==0||c==4||c==5||c==6||c==8||c==9)
  78.         {PIN4_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  79.         if(c==2||c==3||c==4||c==5||c==6||c==8||c==9)
  80.         {PIN5_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  81. }
  82. void Init(void)
  83. {
  84.         Clear_Display();
  85.         TL0=0x00;
  86.         TH0=0x4C;
  87.         TF0=0;
  88.         ET0=1;
  89.         EA=1;
  90.         TR0=1;
  91. }
  92. void main(void)
  93. {
  94.         Init();
  95.         while(1)
  96.         {
  97.                 Display(Count,5);
  98.         }
  99. }
  100. void Timer0(void) interrupt 1
  101. {
  102.         static unsigned char count;
  103.         count++;
  104.         if(count==2)
  105.         {
  106.                 count=0;
  107.                 Count++;
  108.                 if(Count==200)
  109.                         Count=0;
  110.         }
  111. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:559
  • 最近打卡:2025-09-15 05:04:29
已绑定手机

86

主题

6110

回帖

1万

积分

超级版主

积分
11302
发表于 2025-9-7 08:53:04 | 显示全部楼层
6脚查理复用数码管:
  1. #include <AI8H.H>
  2. unsigned int Count;
  3. /*----------------------------延时10us@AI8@11.0592MHz----------------------------*/
  4. void Delay_10us(void)
  5. {
  6.         unsigned char data i;
  7.         i=35;
  8.         while(--i);
  9. }
  10. /*----------------------------延时x10us----------------------------*/
  11. void Delay_x10us(unsigned char x)
  12. {
  13.         while(x--)
  14.                 Delay_10us();
  15. }
  16. void PIN1_ENA(bit x){P2M0|=0x01;P2M1&=0xFE;P20=x;}
  17. void PIN1_DIS(void){P2M0&=0xFE;P2M1|=0x01;}
  18. void PIN2_ENA(bit x){P2M0|=0x02;P2M1&=0xFD;P21=x;}
  19. void PIN2_DIS(void){P2M0&=0xFD;P2M1|=0x02;}
  20. void PIN3_ENA(bit x){P2M0|=0x04;P2M1&=0xFB;P22=x;}
  21. void PIN3_DIS(void){P2M0&=0xFB;P2M1|=0x04;}
  22. void PIN4_ENA(bit x){P2M0|=0x08;P2M1&=0xf7;P23=x;}
  23. void PIN4_DIS(void){P2M0&=0xf7;P2M1|=0x08;}
  24. void PIN5_ENA(bit x){P2M0|=0x10;P2M1&=0xEF;P24=x;}
  25. void PIN5_DIS(void){P2M0&=0xEF;P2M1|=0x10;}
  26. void PIN6_ENA(bit x){P2M0|=0x20;P2M1&=0xDF;P25=x;}
  27. void PIN6_DIS(void){P2M0&=0xDF;P2M1|=0x20;}
  28. void Clear_Display(void)
  29. {
  30.         PIN1_DIS();
  31.         PIN2_DIS();
  32.         PIN3_DIS();
  33.         PIN4_DIS();
  34.         PIN5_DIS();
  35.         PIN6_DIS();
  36. }
  37. void Display(unsigned int x,bit dp,unsigned char brightness)
  38. {
  39.         unsigned char a,b,c,d;
  40.         if(x>=2000)
  41.         {
  42.                 a=0xFF;
  43.                 b=0xFF;
  44.                 c=0xFF;
  45.                 d=0xFF;
  46.         }
  47.         else
  48.         {
  49.                 a=x/1000;
  50.                 b=x%1000/100;
  51.                 c=x%100/10;
  52.                 d=x%10;
  53.         }
  54.         if(a==1)
  55.         {PIN4_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  56.         if(a==1)
  57.         {PIN5_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  58.         if(b==0||b==2||b==3||b==5||b==6||b==7||b==8||b==9)
  59.         {PIN2_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  60.         if(b==0||b==1||b==2||b==3||b==4||b==7||b==8||b==9)
  61.         {PIN3_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  62.         if(b==0||b==1||b==3||b==4||b==5||b==6||b==7||b==8||b==9)
  63.         {PIN4_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  64.         if(b==0||b==2||b==3||b==5||b==6||b==8||b==9)
  65.         {PIN5_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  66.         if(b==0||b==2||b==6||b==8)
  67.         {PIN6_ENA(1);PIN1_ENA(0);Delay_x10us(brightness);PIN6_DIS();PIN1_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  68.         if(b==0||b==4||b==5||b==6||b==8||b==9)
  69.         {PIN3_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  70.         if(b==2||b==3||b==4||b==5||b==6||b==8||b==9)
  71.         {PIN4_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN4_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  72.         if(c==0||c==2||c==3||c==5||c==6||c==7||c==8||c==9)
  73.         {PIN1_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  74.         if(c==0||c==1||c==2||c==3||c==4||c==7||c==8||c==9)
  75.         {PIN1_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  76.         if(c==0||c==1||c==3||c==4||c==5||c==6||c==7||c==8||c==9)
  77.         {PIN1_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  78.         if(c==0||c==2||c==3||c==5||c==6||c==8||c==9)
  79.         {PIN1_ENA(1);PIN5_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN5_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  80.         if(c==0||c==2||c==6||c==8)
  81.         {PIN1_ENA(1);PIN6_ENA(0);Delay_x10us(brightness);PIN1_DIS();PIN6_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  82.         if(c==0||c==4||c==5||c==6||c==8||c==9)
  83.         {PIN5_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN5_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  84.         if(c==2||c==3||c==4||c==5||c==6||c==8||c==9)
  85.         {PIN6_ENA(1);PIN2_ENA(0);Delay_x10us(brightness);PIN6_DIS();PIN2_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  86.         if(dp==1)
  87.         {PIN6_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN6_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  88.         if(d==0||d==2||d==3||d==5||d==6||d==7||d==8||d==9)
  89.         {PIN2_ENA(1);PIN3_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN3_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  90.         if(d==0||d==1||d==2||d==3||d==4||d==7||d==8||d==9)
  91.         {PIN2_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  92.         if(d==0||d==1||d==3||d==4||d==5||d==6||d==7||d==8||d==9)
  93.         {PIN2_ENA(1);PIN5_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN5_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  94.         if(d==0||d==2||d==3||d==5||d==6||d==8||d==9)
  95.         {PIN2_ENA(1);PIN6_ENA(0);Delay_x10us(brightness);PIN2_DIS();PIN6_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  96.         if(d==0||d==2||d==6||d==8)
  97.         {PIN3_ENA(1);PIN4_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN4_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  98.         if(d==0||d==4||d==5||d==6||d==8||d==9)
  99.         {PIN3_ENA(1);PIN5_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN5_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  100.         if(d==2||d==3||d==4||d==5||d==6||d==8||d==9)
  101.         {PIN3_ENA(1);PIN6_ENA(0);Delay_x10us(brightness);PIN3_DIS();PIN6_DIS();}else Delay_x10us(brightness);Delay_x10us(10-brightness);
  102. }
  103. void Init(void)
  104. {
  105.         Clear_Display();
  106.         TL0=0x00;
  107.         TH0=0xEE;
  108.         TF0=0;
  109.         ET0=1;
  110.         EA=1;
  111.         TR0=1;
  112. }
  113. void main(void)
  114. {
  115.         Init();
  116.         while(1)
  117.         {
  118.                 Display(Count,1,5);
  119.         }
  120. }
  121. void Timer0(void) interrupt 1
  122. {
  123.         static unsigned char count;
  124.         count++;
  125.         if(count==2)
  126.         {
  127.                 count=0;
  128.                 Count++;
  129.                 if(Count==2000)
  130.                         Count=0;
  131.         }
  132. }
复制代码


回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-9-15 21:53 , Processed in 0.116641 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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