找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2753|回复: 17
收起左侧

单片机+74HC595控制数码管最后一位特别亮

[复制链接]
ID:997026 发表于 2022-1-18 21:22 | 显示全部楼层 |阅读模式
大家好,

我用两片74HC595D 控制8位数码管动态扫描,一片做8位段码的控制,另一片做8位位码的控制。
因为之前是直接用单片机IO连接数码管来控制的,代码里面需要有消隐和延时程序,用起来没啥问题,现在改用74HC595后,发现不需要消隐和延时了,加了消隐和延时发现反而无法正常显示了,我不知道为啥是这样,代码里我就直接放显示部分了。

显示是没啥问题,但是现在有一个小问题,就是前面7位亮度一致,最后一位比较亮,也就是最后一位比前7位都亮。这个应该是最后一位扫描到的时间比前面长造成的,但是我不知道如何解决。

各位大神有解决这个问题的比较成熟的方法么?

显示程序大概如下:

void SendData595(uint8_t  DataSendH15_8, uint8_t DataSendL7_0);  // 74HC595数据发送

uint8_t  weima_table[]= {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}  //8位位码
uint8_t  duanma_table[]={0xd7,0x82,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f} //段码,0~9

void SHG_DISPLAY()  // 数码管显示,此处无需消隐和延时

{
         SendData_hc595(weima_table[0],  duanma_table[5]);
         SendData_hc595(weima_table[1],  duanma_table[2]);
         SendData_hc595(weima_table[2],  duanma_table[1])
         SendData_hc595(weima_table[3],  duanma_table[4])
         SendData_hc595(weima_table[4],  duanma_table[0]);
         SendData_hc595(weima_table[5],  duanma_table[8])
         SendData_hc595(weima_table[6],  duanma_table[3]); //以上7位显示亮度均匀一致
         SendData_hc595(weima_table[7],  duanma_table[7]);  //这一位特别亮,比前7位都亮
}


回复

使用道具 举报

ID:161164 发表于 2022-1-18 23:43 | 显示全部楼层
不知到你其它代码是如何写滴
  1. void SHG_DISPLAY()  // 数码管显示,此处无需消隐和延时
  2. {
  3.         static uchar mode = 0;
  4.         switch(mode)
  5.         {
  6.         case 0:
  7.                 SendData_hc595(weima_table[0],  duanma_table[5]);
  8.                 break;
  9.         case 1:
  10.                 SendData_hc595(weima_table[1],  duanma_table[2]);
  11.                 break;
  12.         case 2:
  13.                 SendData_hc595(weima_table[2],  duanma_table[1]);
  14.                 break;
  15.         case 3:
  16.                 SendData_hc595(weima_table[3],  duanma_table[4]);
  17.                 break;
  18.         case 4:
  19.                 SendData_hc595(weima_table[4],  duanma_table[0]);
  20.                 break;
  21.         case 5:
  22.                 SendData_hc595(weima_table[5],  duanma_table[8]);
  23.                 break;
  24.         case 6:
  25.                 SendData_hc595(weima_table[6],  duanma_table[3]); //以上7位显示亮度均匀一致
  26.                 break;
  27.         case 7:
  28.                 SendData_hc595(weima_table[7],  duanma_table[7]);  //这一位特别亮,比前7位都亮
  29.                 break;
  30.         }
  31.         mode = ++mode % 8;
  32. }
复制代码
回复

使用道具 举报

ID:857072 发表于 2022-1-19 00:05 来自手机 | 显示全部楼层
写个case 8:把595所有数据清零不就完事了。
回复

使用道具 举报

ID:332444 发表于 2022-1-19 08:41 | 显示全部楼层
早上刚想写这方面的内容巧了就看到这帖,有些类似的提问,回复要硬消隐+软消隐,可是有些人就是爱钻牛角尖说已经消隐了,有些人看了回复就去试看结果就解决了,就有这样人的区别,对于爱钻牛角尖的不撞南墙不回头的怎么办,佛门有个典故说佛菩萨教众生长富财宝十善法有人信行果长富财宝,有人不信认为只有损人利己有财宝,佛菩萨对于不听的众生只好暂时远离,因为知道缘分未到多说无益,已为说明只能暂时做个远缘分,待缘分到了成熟了才能明白才能回头是岸才能知错投路径反远知回头才能达目的地。今天得闲就做个荔枝演示取消硬消隐和取消软消隐会造成什么现象,稍后发动画。首先取消软消隐看现象,次取消硬消隐看现象。
回复

使用道具 举报

ID:332444 发表于 2022-1-19 08:42 | 显示全部楼层
录像132_转.gif
回复

使用道具 举报

ID:332444 发表于 2022-1-19 08:50 | 显示全部楼层
录像134_转.gif
回复

使用道具 举报

ID:879809 发表于 2022-1-19 21:15 | 显示全部楼层
每个 SendData_hc595后面都加delay可以让每个位显示时间均匀一些。
回复

使用道具 举报

ID:824490 发表于 2022-1-21 09:18 | 显示全部楼层
这是你的代码逻辑问题:
显示的前7个数据,会被紧接的下一个数据代替,所以它们的亮度是一致的,而第8个数据显示完了之后,并没有第9个数据来顶它 ,所以会一直存活,直到下一轮的显示扫描的第一个数据来顶它,存活时间很长,看上去就比前面7个亮了!
如同板凳所说,最后清数据就OK了




SendData_hc595(weima_table[7],  duanma_table[7]);
SendData_hc595(0x00, 0x00); //<===加入此行或者直接把595的OE关了。
回复

使用道具 举报

ID:824490 发表于 2022-1-21 09:21 | 显示全部楼层
lkc8210 发表于 2022-1-18 23:43
不知到你其它代码是如何写滴

顺序扫显而已,不需要用分支来走。显得累赘、臃肿。。
回复

使用道具 举报

ID:161164 发表于 2022-1-21 13:31 | 显示全部楼层
名字不是重点 发表于 2022-1-21 09:21
顺序扫显而已,不需要用分支来走。显得累赘、臃肿。。

细心一点
不是顺序的
回复

使用道具 举报

ID:824490 发表于 2022-1-21 16:00 | 显示全部楼层
lkc8210 发表于 2022-1-21 13:31
细心一点
不是顺序的

楼主是“两片74HC595D 控制8位数码管动态扫描,一片做8位段码的控制,另一片做8位位码的控制”
而且他给出的代码也确实是从位0-位7依次送显,变的只是段码,
如果把段码做一个显示BUF,整个显示函数只要一个语句:
for(i=0;i<8;i++)
{
。。。
}
不就可以了?短小精干。。

回复

使用道具 举报

ID:161164 发表于 2022-1-21 16:16 | 显示全部楼层
名字不是重点 发表于 2022-1-21 16:00
楼主是“两片74HC595D 控制8位数码管动态扫描,一片做8位段码的控制,另一片做8位位码的控制”
而且他给 ...

for循环不能解决最后一位特别亮的问题
回复

使用道具 举报

ID:824490 发表于 2022-1-21 16:22 | 显示全部楼层
lkc8210 发表于 2022-1-21 16:16
for循环不能解决最后一位特别亮的问题

。。。。。
for完了再加一个条发送空数据,或是在显存中多开一个字节,最后一个成员直接赋值为0:
for(i=0;i<9;i++)
{
。。。
}
就OK了
回复

使用道具 举报

ID:161164 发表于 2022-1-21 16:44 | 显示全部楼层
名字不是重点 发表于 2022-1-21 16:22
。。。。。
for完了再加一个条发送空数据,或是在显存中多开一个字节,最后一个成员直接赋值为0:
for( ...

这样也可以
char Phone[8] = "52140837";
void SHG_DISPLAY()  // 数码管显示,此处无需消隐和延时
{
        static unsigned char mode = 0;
        SendData_hc595(weima_table[mode],  duanma_table[Phone[mode] - '0']);   
        mode = ++mode % 8;
}
回复

使用道具 举报

ID:824490 发表于 2022-1-21 17:19 | 显示全部楼层
lkc8210 发表于 2022-1-21 16:44
这样也可以
char Phone[8] = "52140837";
void SHG_DISPLAY()  // 数码管显示,此处无需消隐和延时

你这个没有循环哦
回复

使用道具 举报

ID:161164 发表于 2022-1-21 17:42 | 显示全部楼层

利用main while来循环
回复

使用道具 举报

ID:824490 发表于 2022-1-21 21:06 | 显示全部楼层
lkc8210 发表于 2022-1-21 17:42
利用main while来循环


字数补丁、、、、、
回复

使用道具 举报

ID:883031 发表于 2022-1-23 11:03 | 显示全部楼层
时间停留问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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