切换到宽版
  • 16587阅读
  • 45回复

7段式数码管任意IO接线的驱动方法(代码更新成截图,这下应该能看明白了) [复制链接]

上一主题 下一主题
离线595953427@qq
 

发帖
440
M币
29
专家
0
粉丝
12
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2016-11-22
    大家在作产品或者DIY的时候总会遇到数码管的SEG口跟单片机连接时不在同一总线的时候,这时候有人开发了编码软件,我觉得是完全没有必要的,大家看一下我的程序,只要是段式数码管或段式液晶显示,都是用的同一个数组,不管SEG口接到哪个IO口上都可以用。
先看数码管IO口的定义
  1. /*                    
  2. LED数码管接口,13脚单?
  3.      ┌─┐_┌─┐ SEG
  4. SEG5─┤1    │ P31  
  5. SEG4─┤2    │ P32  
  6. SEG8─┤3    │ P33  
  7. SEG3─┤4    │ P34  
  8. SEG7─┤5    │ P35  
  9. COM4─┤6   │      P
  10. SEG2─┤7    │ P23  
  11. COM3─┤8    │      P
  12. COM2─┤9   │      P
  13. SEG6─┤10   │ P14  
  14. SEG1─┤11   │ P13  
  15. COM1─┤12   │      P
  16.     ─┤13   │ P12  
  17.      └─────┘  
  18. 芯片脚位              
  19.     ┌─┐_┌─┐    
  20. VSS─┤1  20├─VDD  
  21. P41─┤2  19├─P31  
  22. P40─┤3  18├─P32  
  23. P17─┤4  17├─P33  
  24. P16─┤5  16├─P34  
  25. P15─┤6  15├─P35  
  26. P14─┤7  14├─P22  
  27. P13─┤8  13├─P23  
  28. P12─┤9  12├─P24  
  29. P26─┤10 11├─P25  
  30.     └─────┘    
  31. */                    
  32. //数码管IO定义        
  33. #define    com1    P26
  34. #define    com2    P25
  35. #define    com3    P24
  36. #define    com4    P22
  37. #define    seg1    P13
  38. #define    seg2    P23
  39. #define    seg3    P34
  40. #define    seg4    P32
  41. #define    seg5    P31
  42. #define    seg6    P14
  43. #define    seg7    P35
  44. #define    seg8    P33



这里是数码7段的数据,不管数码和的SEG脚是接到单片机的哪个IO口,都是用这个数组里面的数据,我所有用到数码管显示或段式液晶数字显示的程序都是用这个数组
  1. code     u8 table[19]={   //这里是数码管的显示数据                                                  
  2.     0x3f,    // 0       此符号在表中地址为    0                                                        
  3.     0x06,    // 1       此符号在表中地址为    1                                                        
  4.     0x5b,    // 2       此符号在表中地址为    2                                                        
  5.     0x4f,    // 3       此符号在表中地址为    3                                                        
  6.     0x66,    // 4       此符号在表中地址为    4                                                        
  7.     0x6d,    // 5       此符号在表中地址为    5                                                        
  8.     0x7d,    // 6       此符号在表中地址为    6                                                        
  9.     0x07,    // 7       此符号在表中地址为    7                                                        
  10.     0x7f,    // 8       此符号在表中地址为    8                                                        
  11.     0x6f,    // 9       此符号在表中地址为    9                                                        
  12.     0x77,    // A       此符号在表中地址为    10                                                        
  13.     0x7c,    // B       此符号在表中地址为    11                                                        
  14.     0x39,    // C       此符号在表中地址为    12                                                        
  15.     0x5e,    // D       此符号在表中地址为    13                                                        
  16.     0x79,    // E       此符号在表中地址为    14                                                        
  17.     0x71,    // F       此符号在表中地址为    15                                                        
  18.     0x40,    // -       此符号在表中地址为    16                                                        
  19.     0x00,    // 全灭    此符号在表中地址为    17                                                    
  20.     0xff,    // 全亮    此符号在表中地址为    18                                                    
  21. };
下面是数码管的显示程序
  1. 这里是SEG的设置,根据要显示的参数设置SEG的状态
  2. void set_seg(u8 dat_led)//设置SEG的状态
  3. {
  4. seg1=dat_led&0x01;
  5. seg2=dat_led&0x02;
  6. seg3=dat_led&0x04;
  7. seg4=dat_led&0x08;
  8. seg5=dat_led&0x10;
  9. seg6=dat_led&0x20;
  10. seg7=dat_led&0x40;
  11. seg8=col_flag;[/font]
  12. }
  13. void scan_led()
  14. {
  15. if(++cnt_led>=4)//扫描分为4个阶段
  16. {
  17. cnt_led=0;
  18. }
  19. //数码管第1位显示dig1
  20. //数码管第2位显示dig2
  21. //数码管第3位显示dig3
  22. //数码管第4位显示dig4
  23. switch(cnt_led)//每次显示一个COM
  24. {
  25. case 0: set_seg(table[dig1]);com1=0;break;//设置SEG的状态,打开COM1显示
  26. case 1: set_seg(table[dig2]);com2=0;break;
  27. case 2: set_seg(table[dig3]);com3=0;break;
  28. case 3: set_seg(table[dig4]);com4=0;break;
  29. default:break;
  30. }
  31. }

论坛的代码显示有误 ,看一下我的截图吧,这下应该都明白了
8--22行是数码和芯片的脚位,数码管的1脚是SEG5,对的单片机的脚拉是P31,下面依次类推,再不明白我话我就。。。。。。
24--35行是单片机的脚位图,1脚是VSS,20脚是GND,这样明白了吧




下面是数码管的IO脚定义,不同的数码管只需要改这里就好,其它的程序不需要修改




下面是数码管SEG的设置程序,不需要修改的,直接调用就可以了
这里用的是共阴数码管,如果是共阳数码管的话加一行dat_led-=0xff;也就是把dat_led取反




下面是关闭数码管显示,每次显示之前先关闭显示,以免出现鬼影
这里用的是共阴数码管,关闭数码管显示的时候把所有COM设置为高电平,所有的SEG设置为低电平




下面是数码的扫描程序,定时扫描就行了,每次显示1位数码管
第1位数码管显示dig1
第2位数码管显示dig2
第3位数码管显示dig3
第4位数码管显示dig4









[ 此帖被595953427@qq在2016-11-23 12:23重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共11条打赏M币+31
12
离线595953427@qq

发帖
440
M币
29
专家
0
粉丝
12
只看该作者 1楼 发表于: 2016-11-22
这里是程序
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共1条打赏M币+3
离线cao57508

发帖
2194
M币
4142
专家
9
粉丝
79
只看该作者 2楼 发表于: 2016-11-22
看上去有些复杂
离线595953427@qq

发帖
440
M币
29
专家
0
粉丝
12
只看该作者 3楼 发表于: 2016-11-22
回 cao57508 的帖子
cao57508:看上去有些复杂 (2016-11-22 16:24) 回 cao57508 的帖子

不复杂呀,只需要定义好SEG口,然后根据要显示的数字查找数组中的数据,然后根据查找来的数据设置每个SEG口的高低电平
离线595953427@qq

发帖
440
M币
29
专家
0
粉丝
12
只看该作者 4楼 发表于: 2016-11-22
如果改了IO口,只需要改数码管的IO定义就可以了
离线66ok66

发帖
1259
M币
1000
专家
7
粉丝
18
只看该作者 5楼 发表于: 2016-11-22
看的头痛,还不如数码管软件快
本帖最近打赏记录:共1条打赏M币+1
离线wc86110

发帖
692
M币
46
专家
0
粉丝
8
只看该作者 6楼 发表于: 2016-11-22
这个跟没说一样。对不同的数码管要想布线得顺,关键还得自个会修改才行
离线zhjipi100

发帖
127
M币
5052
专家
1
粉丝
12
只看该作者 7楼 发表于: 2016-11-22
謝謝分享 楼主提供了很好的一种思路。
离线qiang7260

发帖
276
M币
1817
专家
2
粉丝
12
只看该作者 8楼 发表于: 2016-11-22
回 595953427@qq 的帖子
595953427@qq:不复杂呀,只需要定义好SEG口,然后根据要显示的数字查找数组中的数据,然后根据查找来的数据设置每个SEG口的高低电平 (2016-11-22 17:09) 回 595953427@qq 的帖子

能讲解注释一下4---11,25---28就能让人好理解。
离线zhkrid

发帖
25000
M币
111895
专家
446
粉丝
353
只看该作者 9楼 发表于: 2016-11-22
我还是用软件算编码来的简单,本来就没学好C,这个改起来还得人工,