3.8 采用38译码器驱动8位数码管
3.8.1 原理图
开发板连线: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 示例代码: 8位数码管静态轮流显示数字
下面代码使用38译码器控制数码管的位选,单片机的P0口控制段选,程序实现在每个数码管上轮流显示数字0~9。
示例代码:
#include <reg51.h> //共阴极数码管编码(要显示的段就输出1) //数字0~9 code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //定义38译码器的引脚 sbit HC138_A0=P2^2; //A sbit HC138_A1=P2^3; //B sbit HC138_A2=P2^4; //C #define LED P0 //定义LED引脚 /* 静态数码管显示,共阴极数码管 */ void LED2_StaticDisplay(u8 number,u8 val) { switch(number) //位选,选择点亮的数码管, { case 0: HC138_A0=0;HC138_A1=0;HC138_A2=0; break;//显示第0位 case 1: HC138_A0=1;HC138_A1=0;HC138_A2=0; break;//显示第1位 case 2: HC138_A0=0;HC138_A1=1;HC138_A2=0; break;//显示第2位 case 3: HC138_A0=1;HC138_A1=1;HC138_A2=0; break;//显示第3位 case 4: HC138_A0=0;HC138_A1=0;HC138_A2=1; break;//显示第4位 case 5: HC138_A0=1;HC138_A1=0;HC138_A2=1; break;//显示第5位 case 6: HC138_A0=0;HC138_A1=1;HC138_A2=1; break;//显示第6位 case 7: HC138_A0=1;HC138_A1=1;HC138_A2=1; break;//显示第7位 } LED=LED2_Coding[val]; //显示数字: 0~9 } //动态数码管一共有8个数码管 //数码的控制端接P0端口 //数码管的片选端接138译码器 int main() { u8 i,j; while(1) { for(i=0;i<8;i++) { for(j=0;j<10;j++) { LED2_StaticDisplay(i,j); DelayMs(500); } } } }
3.8.4 示例代码: 显示指定的整数
下面代码使用38译码器控制数码管的位选,51单片机的P0口控制段选,程序实现在8位数码管上显示一个指定的整数。
#include <reg51.h> //共阴极数码管编码(要显示的段就输出1) //数字0~9 code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //定义38译码器的引脚 sbit HC138_A0=P2^2; //A sbit HC138_A1=P2^3; //B sbit HC138_A2=P2^4; //C #define LED P0 //定义LED引脚 //设置数码管显示指定的数字 void LED_DisplayNumber(unsigned long number) { u16 i,j; u8 display_data[8];//存放当前数码管显示的数据 //以下代码将number按十进制位从低到高依次提取并转为数码管显示字符 display_data[0] = LED2_Coding[number/10000000%10]; display_data[1] = LED2_Coding[number/1000000%10]; display_data[2] = LED2_Coding[number/100000%10]; display_data[3] = LED2_Coding[number/10000%10]; display_data[4] = LED2_Coding[number/1000%10]; display_data[5] = LED2_Coding[number/100%10]; display_data[6] = LED2_Coding[number/10%10]; display_data[7] = LED2_Coding[number/1%10]; for(i=0;i<8;i++) { switch(i) //位选,选择点亮的数码管, { case 0: HC138_A0=0;HC138_A1=0;HC138_A2=0; break;//显示第0位 case 1: HC138_A0=1;HC138_A1=0;HC138_A2=0; break;//显示第1位 case 2: HC138_A0=0;HC138_A1=1;HC138_A2=0; break;//显示第2位 case 3: HC138_A0=1;HC138_A1=1;HC138_A2=0; break;//显示第3位 case 4: HC138_A0=0;HC138_A1=0;HC138_A2=1; break;//显示第4位 case 5: HC138_A0=1;HC138_A1=0;HC138_A2=1; break;//显示第5位 case 6: HC138_A0=0;HC138_A1=1;HC138_A2=1; break;//显示第6位 case 7: HC138_A0=1;HC138_A1=1;HC138_A2=1; break;//显示第7位 } LED=display_data[i]; //控制数码管的显示数据值 j = 100; //扫描间隔时间设定 while(j--){} LED=0x00; //消隐,所有数码管都不显示 } } //动态数码管一共有8个数码管 //数码的控制端接P0端口 //数码管的片选端接138译码器 int main() { while(1) { LED_DisplayNumber(4579); } }