3.8 51单片机-M74HC138译码器驱动8位数码管

举报
DS小龙哥 发表于 2021/12/09 23:27:30 2021/12/09
【摘要】 3.8 采用38译码器驱动8位数码管 3.8.1 原理图 图3-8-1  图3-8-2 开发板连线:JP10(P0)接J12、J21跳线帽接左边、A.P22、B.P23、C.P24 3.8.2 74HC138译码器 M74HC138是一款高速COMS器件,引脚兼容低功耗肖基特TTL(LSTTL)系...

3.8 采用38译码器驱动8位数码管

3.8.1 原理图

图3-8-1 

图3-8-2

开发板连线:JP10(P0)接J12、J21跳线帽接左边、A.P22、B.P23、C.P24

3.8.2 74HC138译码器

M74HC138是一款高速COMS器件,引脚兼容低功耗肖基特TTL(LSTTL)系列。

TM74HC138有三个地址数据输入端(A0、A1、A2)和八个有效译码为低的输出端(Y0 - Y7);

TM74HC138有三个使能控制端(E1 、 E2 、E 3),当E1 、E2为低电平且E3为高电平时,八个译码输出端才有译码输出,否则八个译码输出端将全为高

TM74HC138通常应用于单个三地址数据输入八译码输出的3-6译码器,也可根据使能信号特点用两个TM74HC138实现四地址数据输入和16 译码输出的 4-16 译码器, 应用中未使用的使能端要处在译码有效输出使能电平状态。

图3-8-3 芯片引脚图 

 图3-8-4 管脚功能介绍

 

图3-8-5 真值表

3.8.3 示例代码: 8位数码管静态轮流显示数字

下面代码使用38译码器控制数码管的位选,单片机的P0口控制段选,程序实现在每个数码管上轮流显示数字0~9。

示例代码:


  
  1. #include <reg51.h>
  2. //共阴极数码管编码(要显示的段就输出1)
  3. //数字0~9
  4. code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  5. //定义38译码器的引脚
  6. sbit HC138_A0=P2^2//A
  7. sbit HC138_A1=P2^3//B
  8. sbit HC138_A2=P2^4//C
  9. #define LED P0  //定义LED引脚
  10. /*
  11. 静态数码管显示,共阴极数码管
  12. */
  13. void LED2_StaticDisplay(u8 number,u8 val)
  14. {
  15.     switch(number)   //位选,选择点亮的数码管,
  16.     {
  17.         case 0:
  18.             HC138_A0=0;HC138_A1=0;HC138_A2=0break;//显示第0位
  19.         case 1:
  20.             HC138_A0=1;HC138_A1=0;HC138_A2=0break;//显示第1位
  21.         case 2:
  22.             HC138_A0=0;HC138_A1=1;HC138_A2=0break;//显示第2位
  23.         case 3:
  24.             HC138_A0=1;HC138_A1=1;HC138_A2=0break;//显示第3位
  25.         case 4:
  26.             HC138_A0=0;HC138_A1=0;HC138_A2=1break;//显示第4位
  27.         case 5:
  28.             HC138_A0=1;HC138_A1=0;HC138_A2=1break;//显示第5位
  29.         case 6:
  30.             HC138_A0=0;HC138_A1=1;HC138_A2=1break;//显示第6位
  31.         case 7:
  32.             HC138_A0=1;HC138_A1=1;HC138_A2=1break;//显示第7位 
  33.     }
  34.     LED=LED2_Coding[val]; //显示数字: 0~9
  35. }
  36. //动态数码管一共有8个数码管
  37. //数码的控制端接P0端口
  38. //数码管的片选端接138译码器
  39. int main()
  40. {
  41.     u8 i,j;
  42.     while(1)
  43.     {
  44.         for(i=0;i<8;i++)
  45.         {
  46.             for(j=0;j<10;j++)
  47.             {
  48.                 LED2_StaticDisplay(i,j);
  49.                 DelayMs(500);
  50.             }
  51.         }
  52.     }
  53. }

3.8.4 示例代码: 显示指定的整数

下面代码使用38译码器控制数码管的位选,51单片机的P0口控制段选,程序实现在8位数码管上显示一个指定的整数。


  
  1. #include <reg51.h>
  2. //共阴极数码管编码(要显示的段就输出1)
  3. //数字0~9
  4. code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  5. //定义38译码器的引脚
  6. sbit HC138_A0=P2^2//A
  7. sbit HC138_A1=P2^3//B
  8. sbit HC138_A2=P2^4//C
  9. #define LED P0  //定义LED引脚
  10. //设置数码管显示指定的数字
  11. void LED_DisplayNumber(unsigned long number)
  12. {
  13.     u16 i,j;
  14.     u8 display_data[8];//存放当前数码管显示的数据
  15.     //以下代码将number按十进制位从低到高依次提取并转为数码管显示字符
  16.     display_data[0] = LED2_Coding[number/10000000%10];     
  17.     display_data[1] = LED2_Coding[number/1000000%10];
  18.     display_data[2] = LED2_Coding[number/100000%10];
  19.     display_data[3] = LED2_Coding[number/10000%10];
  20.     display_data[4] = LED2_Coding[number/1000%10];
  21.     display_data[5] = LED2_Coding[number/100%10];
  22.     display_data[6] = LED2_Coding[number/10%10];
  23.     display_data[7] = LED2_Coding[number/1%10];
  24.     for(i=0;i<8;i++)
  25.     {
  26.         switch(i)    //位选,选择点亮的数码管,
  27.         {
  28.             case 0:
  29.                 HC138_A0=0;HC138_A1=0;HC138_A2=0break;//显示第0位
  30.             case 1:
  31.                 HC138_A0=1;HC138_A1=0;HC138_A2=0break;//显示第1位
  32.             case 2:
  33.                 HC138_A0=0;HC138_A1=1;HC138_A2=0break;//显示第2位
  34.             case 3:
  35.                 HC138_A0=1;HC138_A1=1;HC138_A2=0break;//显示第3位
  36.             case 4:
  37.                 HC138_A0=0;HC138_A1=0;HC138_A2=1break;//显示第4位
  38.             case 5:
  39.                 HC138_A0=1;HC138_A1=0;HC138_A2=1break;//显示第5位
  40.             case 6:
  41.                 HC138_A0=0;HC138_A1=1;HC138_A2=1break;//显示第6位
  42.             case 7:
  43.                 HC138_A0=1;HC138_A1=1;HC138_A2=1break;//显示第7位 
  44.         }
  45.         LED=display_data[i];     //控制数码管的显示数据值
  46.         j = 100;                 //扫描间隔时间设定
  47.         while(j--){}    
  48.         LED=0x00;             //消隐,所有数码管都不显示
  49.     }
  50. }
  51. //动态数码管一共有8个数码管
  52. //数码的控制端接P0端口
  53. //数码管的片选端接138译码器
  54. int main()
  55. {
  56.     while(1)
  57.     {
  58.        LED_DisplayNumber(4579);
  59.     }
  60. }

图3-8-6 数码管显示效果  

文章来源: xiaolong.blog.csdn.net,作者:DS小龙哥,版权归原作者所有,如需转载,请联系作者。

原文链接:xiaolong.blog.csdn.net/article/details/121017864

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。