找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17784|回复: 19
收起左侧

CD4094的应用,驱动四位数码管

  [复制链接]
ID:56331 发表于 2016-8-4 15:45 | 显示全部楼层 |阅读模式
用CD4094来驱动数码管可以解放更多的I/O口,同时也能提高数码管的驱动电流。只需要三个I/O就能驱动多位数码管。
我这里用的是四位数码管,里面包含了共阴极数码管的驱动和共阳极数码管的驱动,让初学者更容易上手。

下图所示的是共阴极的四位数码管
11.jpg
22.jpg
33.jpg

  1. #include<reg51.h>

  2. sbit KEY = P3^2; // 定义按键使用的 I/O 口 P3.2


  3. sbit STR4094=P1^0; //锁存器移位使能端,H 使能
  4. sbit D4094=P1^1; //串行数据输出端,H 使能
  5. sbit CLK4094=P1^2; //串行时钟输出端,H 使能输出状态使能端,H 使能
  6. //sbit E4094=P1^3; //输出状态使能端,H 使能,直接接高电平
  7. #define HOWMANY4094 2 //定义 4094 个数

  8. unsigned char bdata P4,P5;//定义模拟 I/O 口 P4, P5 口

  9. //unsigned char code TABLE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
  10. unsigned char code TABLE[]  ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
  11.                   //数字显示编码表:  0    1    2   3    4    5     6    7   8    9     A     b   C    d    E    F   空
  12.                   //当 P4 输出相应的数值时,数码管就会按照上面的数字进行显示。例如:P4=0xB0,数码管就显示"3"
  13.                  //以上编码可以使用附赠目录下的 数码管段位计算小程序计算。方便又快捷。

  14. void update4094()
  15. {
  16.         unsigned char i,j,tt;
  17.         STR4094=0;
  18.         for (j=HOWMANY4094;j>0;j--)
  19.         {
  20.                 tt=*(&P4+j-1);
  21.                 for(i=0;i<8;i++)
  22.                 {
  23.                         D4094=(tt&0x80)>0;//数据脚
  24.                         CLK4094=0;
  25.                         CLK4094=1;
  26.                         tt<<=1;
  27.                 }
  28.         }
  29.         STR4094=1;
  30. }

  31. void delay_ms(unsigned short ms)
  32. {
  33.         unsigned short i;
  34.         unsigned char j;
  35.         for(i=0;i<ms;i++)
  36.         {
  37.                 for(j=0;j<200;j++);
  38.                 for(j=0;j<102;j++);
  39.         } //for(i=0;i<ms;i++)
  40. }
  41. /*
  42. void delay_us(unsigned short us)
  43. {
  44.         while(us--);
  45. }
  46. */

  47. void disp(unsigned char *p) //数码管按位显示函数,
  48. {
  49.         unsigned char i,x=1;
  50.         for(i=0;i<4;i++)
  51.         {
  52.                 P5=~x; //选择一位数码管
  53.                 P4=TABLE[p[i]]; //查表显示一个数字。
  54.                 update4094(); //显示数字。
  55.                 delay_ms(5);
  56.                 x<<=1; //数码管选择位左移 1 位
  57.         }
  58. }
  59. //将一个短整型数,个,十,百,千位分别填入一个 4 位数组,用于数码管显示
  60. void deal_value(unsigned short input,unsigned char *p) //数据处理函数
  61. {
  62.         //unsigned short kk;
  63.         unsigned char ge,shi,bai,qian; //定义输入的整型变量的个,十,百,千位 数值

  64.             qian= input%10000/1000;
  65.                 bai = input%1000/100;
  66.                 shi = input%100/10;
  67.                 ge  = input%10;
  68.                        
  69.                 p[0]=qian;        //千位
  70.                 p[1]=bai;        //百位
  71.                 p[2]=shi; //十位
  72.                 p[3]=ge; //个位

  73. }

  74. void main(void)
  75. {
  76.         unsigned short kk=0; //声明一个短整型变量,作为数码管显示的数字
  77.         unsigned char dis_buff[4];
  78.         unsigned char i;
  79.         bit last_key,this_key;
  80.         while(1)
  81.         {
  82.                 if(++i>=50) //循环增加 50 次,大约 1 秒钟
  83.                 {
  84.                         i=0;
  85.                         kk++; //大约 1 秒钟时,显示值增加 1。
  86.                         if(kk>9999) kk=0;
  87.                         deal_value(kk,&dis_buff); //将 kk 值分解为个位,十位,百位,千位,装入缓冲区
  88.                 }
  89.                 disp(dis_buff); //用数码管显示 kk 每一个显示过程大概 20ms
  90.                 last_key=this_key;
  91.                 this_key=KEY;
  92.                 if((last_key==1)&&(this_key==0)) //如果按键被按下,从 0 开始重新显示
  93.                 {
  94.                         kk=0;
  95.                         deal_value(kk,&dis_buff); //将 kk 值分解为个位,十位,百位,千位,装入缓冲区
  96.                 }
  97.         }
  98. }





















复制代码

打开的keil的时候如果提示你sub4094.C什么什么的话请忽略,或是自己在重新建立一个工程,将我的程序复制进去。解释一下为什么会出现这个问题,是因为我的程序根目录下有一个sub4094.c的文件,但是主函数中没有调用,keil提示未启用,所以请个位放心。

写这个程序的时候本想是分段展开的,结果后来都汇总到一个.C里了,所以就多了那么一个文件。

CD4094 四位数码管.zip

150.5 KB, 下载次数: 110, 下载积分: 黑币 -5

评分

参与人数 2黑币 +101 收起 理由
963214785 + 1 共享资料的黑币奖励!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:126297 发表于 2018-2-13 13:43 | 显示全部楼层
深受启迪!谢谢楼主分享!
请问老师:为什么用共阳极数码管显示的时候,除了个位的数码管显示正常外,其它各位的数码管显示均不正常呢?我反复对照共阴极数码管的例子,找不出问题所在。还请楼主不吝赐教
回复

使用道具 举报

ID:126297 发表于 2018-2-13 13:51 | 显示全部楼层
感谢楼主分享!非常受启发。
只是在仿真共阳极数码管的时候,除了个位上的数值显示正常外,其它三位(千位、百位。十位)上的数值均显示不正常。具体的现象是,只有当各个位上的数值都相同的时候,才正常显示,如果不相同就不能正常显示。我反复对照共阴极的程序和仿真原理图,发现除了数码管的段码不相同,以及共阳极的仿真原理图上加入了反相器外,其它没有任何不同的地方。但是共阳极的仿真结果就是不正常,不知是什么原因

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:56331 发表于 2016-8-4 15:46 | 显示全部楼层
自己下自己的程序也是要扣黑币的????
回复

使用道具 举报

ID:56331 发表于 2016-8-4 15:46 | 显示全部楼层
下载了自己的程序怎么还扣币呢?
回复

使用道具 举报

ID:152838 发表于 2016-12-7 11:07 | 显示全部楼层
好东西,需要赞一个
回复

使用道具 举报

ID:152422 发表于 2016-12-15 18:38 | 显示全部楼层
资料里面有仿真就好了。
回复

使用道具 举报

ID:56331 发表于 2017-1-6 09:01 | 显示全部楼层
gshuxiao8 发表于 2016-12-15 18:38
资料里面有仿真就好了。

里面带有仿真的,你没有仔细看?
回复

使用道具 举报

ID:197773 发表于 2017-5-8 22:49 | 显示全部楼层
支持一下
回复

使用道具 举报

ID:187675 发表于 2017-5-13 11:36 | 显示全部楼层
请教

按照楼住的图和程序,仿真时显示不全是什么问题?

QQ图片.png

回复

使用道具 举报

ID:56331 发表于 2017-8-3 16:37 | 显示全部楼层
rs7cai 发表于 2017-5-13 11:36
请教

按照楼住的图和程序,仿真时显示不全是什么问题?

你是不是没有按照我的定义去编辑,我的实物都是没有任何问题的!
回复

使用道具 举报

ID:232860 发表于 2017-9-13 13:50 | 显示全部楼层
楼主好厉害。我也在弄。
回复

使用道具 举报

ID:232860 发表于 2017-9-13 14:17 | 显示全部楼层
楼主的P5的作用是什么呢?
回复

使用道具 举报

ID:344751 发表于 2018-6-4 16:23 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:344751 发表于 2018-6-4 16:53 | 显示全部楼层
请楼主加我qq,想请教有关CD4094级联的问题,感谢!qq:732373166
回复

使用道具 举报

ID:56331 发表于 2018-9-5 00:28 | 显示全部楼层
zhnjun63 发表于 2018-2-13 13:43
深受启迪!谢谢楼主分享!
请问老师:为什么用共阳极数码管显示的时候,除了个位的数码管显示正常外,其它 ...

你需要调用共阳级的数码管程序,调用错了的话会出现显示的都是反码
回复

使用道具 举报

ID:56331 发表于 2018-9-5 00:29 | 显示全部楼层
zhnjun63 发表于 2018-2-13 13:51
感谢楼主分享!非常受启发。
只是在仿真共阳极数码管的时候,除了个位上的数值显示正常外,其它三位(千位 ...

共阴和共阳是正好为反码 所以你会发现其实程序没有变,但是我用反相器也能实现一样的效果。
回复

使用道具 举报

ID:56331 发表于 2018-9-5 00:30 | 显示全部楼层
linux100 发表于 2017-9-13 14:17
楼主的P5的作用是什么呢?

P5是我虚拟出一组输出口
回复

使用道具 举报

ID:412814 发表于 2019-1-2 11:00 | 显示全部楼层
谢谢楼主分享,先收藏了慢慢看
回复

使用道具 举报

ID:280006 发表于 2019-6-24 14:41 | 显示全部楼层
昭通音响-小倪 发表于 2018-9-5 00:29
共阴和共阳是正好为反码 所以你会发现其实程序没有变,但是我用反相器也能实现一样的效果。

不用反相器,应该怎么弄?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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