求救:一个数码管的部分笔画相对较暗 原因

[复制链接]
lu50211 发表于 2015-11-9 16:13 | 显示全部楼层
目前公司提出节约成本,故而提出把数码管的8段码的电阻取消,改为在公共脚串接.但在写程序出现开多段和少段时亮度不同的情况.现在我有想到反过来扫描,即扫段码(通常我们是扫描位码).但想了很久也没有想出应该如何编写程序.不知各位有没有更好的程序方法来解决这种问题.常用接法:

简化后接法:


参考代码:
  1. void display_scan(void)
  2. {
  3.     unsigned char i;
  4.     P1 &= Bin(11111110);
  5.     P1 |= Bin(11111000);
  6.     P2 &= Bin(00000000);
  7.     P3 &= Bin(01100111);
  8.     P3 |= Bin(01100110);  //关闭段码和位码,如共阳数码管(公共脚置低,段码置高)
  9. //======================================//
  10.     for(i = 0;i < 4;i ++)
  11.     {
  12.         r_dis_data = table_seg[r_dis_buff];    //查LED段码表
  13.     }
  14.     switch (r_dig_bit)                                      //在公共端接限流电阻,在数码管位数少时布线时有优势
  15.     {
  16.         case 1:
  17.             p_seg_a = 0;   //扫描a段
  18.             // if(r_dis_data[0] & 0x01) p_dig_1 = 1;  //如果r_dis_data[0]第0位为高,则需要点亮,反之则不点亮
  19.             // if(r_dis_data[1] & 0x01) p_dig_2 = 1;
  20.             // if(r_dis_data[2] & 0x01) p_dig_3 = 1;
  21.             // if(r_dis_data[3] & 0x01) p_dig_4 = 1;
  22.             // if(r_dis_buff[4] & 0x01) p_dig_5 = 1;
  23.             // if(r_dis_buff[5] & 0x01) p_dig_6 = 1;
  24.                         //i=0x01;
  25.                         
  26.             break;
  27.         case 2:
  28.             p_seg_b = 0;
  29.             break;
  30.         case 3:
  31.             p_seg_c = 0;
  32.             break;
  33.         case 4:
  34.              p_seg_d = 0;
  35.             break;
  36.         case 5:     
  37.             p_seg_e = 0;
  38.             break;
  39.         case 6:
  40.             p_seg_f = 0;
  41.             break;
  42.         case 7:
  43.             p_seg_g = 0;
  44.             break;
  45.         case 8:
  46.             p_seg_h = 0;
  47.             break;
  48.         default:
  49.             keyscan_process();      //按键扫描
  50.             break;
  51.     }
  52.         if((r_dig_bit<9)&&(r_dig_bit))
  53.         {
  54.         
  55.                 i=0x01<<(r_dig_bit-1);
  56.             if(r_dis_data[0] & i) p_dig_1 = 1;
  57.              if(r_dis_data[1] & i) p_dig_2 = 1;
  58.              if(r_dis_data[2] & i) p_dig_3 = 1;
  59.              if(r_dis_data[3] & i) p_dig_4 = 1;
  60.              if(r_dis_buff[4] & i) p_dig_5 = 1;
  61.              if(r_dis_buff[5] & i) p_dig_6 = 1;               
  62.                
  63.                         
  64.         }
  65.         
  66.         
  67.     r_dig_bit ++;
  68.     if(r_dig_bit >= 9)    //扫描时基
  69.     r_dig_bit = 0;
  70. }

可以看看我发的贴子:
http://www.amobbs.com/thread-5534576-1-1.html
http://www.amobbs.com/thread-5576556-1-1.html

有外部链接,如果不合适,请版主删除。。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
小小怪下士 发表于 2015-11-9 23:03 | 显示全部楼层
消隐即可解决...
zhaoyu2005 发表于 2015-11-10 08:36 | 显示全部楼层

消隐有毛用,如果按位扫描,这个电路不管红色还是绿色,都会出现亮度不匀,如果段的一致性比较好,那只有位之间的亮度会不匀,1 和 8对比很明显,如果段的一致性不好,段的亮度差别也会很明显。如果按段扫,段之间的亮度差异会小些,但是四位都有数字和只一位有数字时,亮度差异也会大。所以段限流效果好
lvyunhua 发表于 2015-11-10 11:27 | 显示全部楼层
你动态扫描吗,还是静态显示的。
autopccopy 发表于 2015-11-10 12:48 | 显示全部楼层
lvyunhua 发表于 2015-11-10 11:27
你动态扫描吗,还是静态显示的。

明显是动态扫描。

就是数码管的各段LED性能不一致导致的,因为该种接法是每个字的各段是纯并联。若果各段LED特性一致,不会造成单个字的各段亮度有差异,只会不同字之间有不同。按13、14楼可解决。:)


(364)
ocon 发表于 2015-11-10 14:16 | 显示全部楼层
autopccopy 发表于 2015-11-10 12:48
明显是动态扫描。

就是数码管的各段LED性能不一致导致的,因为该种接法是每个字的各段是纯并联。若果各 ...

从图上看用的是位扫描,LED电流的不足放大了压降的差异。不改电路的前提下有三种办法可改善亮度差异:换用红色LED;减小每个位三极管发射极上串接的电阻;改用段驱动的方式;
加油吧小鱼儿 发表于 2015-11-10 15:28 | 显示全部楼层
驱动能力不够吧,你程序是怎么写的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
快速回复 在线客服 返回列表 返回顶部