声明:1、我使用的STC89C52单片机
2、使用74HC573来做数码管锁存器,一次操控2个4位数码管。
3、数码管为8位共阴极数码管
数码管原理图:
共阳极:LED显示管的发光二极管的所有阳极连接在一起
共阴极:LED 显示管的发光二极管的所有共阴极连接在一起
要显示什么字符只需要通过点亮相应的LED灯就即可。
74HC573锁存器介绍: 就是把数据输入和输出隔离
看开发文档手册
因为手册是英文版的。我也是机器翻译的看。所以这里只总结一下它的用法:
输出口Q想要输出高低电平OE脚必须接地; LE脚为高电平时,输出Q随输入D的变化而变化
LE 脚为低电平时,输出Q不随输入D的变化而变化。 输入D不会改变Q的值。
总结表:
代码写起来就很简单了:
1 /*利用数码管显示一个3位数*/ 2 #include <reg52.h> //引入51头文件 3 #include <intrins.h> //引入循环库 4 5 #define uchar unsigned char 6 #define uint unsigned int 7 8 sbit DU = P2^6; //数码管段选 为1时锁存器输出端跟随输入端变化 反之亦然 9 sbit WE = P2^7; //数码管位选 10 /*共阴极数码管的段选表 code存放到rom区*/ 11 uchar code table [] = {0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F}; //0123456789 的16进制 12 13 void delay(uint z); 14 void display(uchar i); //函数声明 15 /*主函数*/ 16 void main() 17 { 18 while(1) 19 { 20 display(250); 21 } 22 23 } 24 /*ms级延迟函数*/ 25 void delay(uint z) 26 { 27 uint x,y; 28 for(x = z; x>0; x--) 29 for(y = 144; y>0 ; y--); 30 } 31 /*显示函数*/ 32 void display(uint i) 33 { 34 uint bai,shi,ge; //代表百十个 35 bai = i/100; 36 shi = i % 100 / 10; 37 ge = i % 10 ; 38 /*第一位数码管*/ 39 P0 =0XFF; //清除段码 40 WE = 1; //打开位选锁存器 41 P0 = 0XFE; // 1111 1110 42 WE = 0; //锁存数据 43 44 DU = 1; //打开段选锁存器 45 P0 = table[bai]; 46 DU = 0; // 锁存数据 47 delay(5); //延迟 5 毫秒 48 /*第二位数码管*/ 49 P0 = 0XFF; 50 WE = 1; //打开位选锁存器 51 P0 = 0XFD; // 1111 1101 52 WE = 0; //锁存数据 53 54 DU = 1; //打开段选锁存器 55 P0 = table[shi]; 56 DU = 0; // 锁存数据 57 delay(5); 58 /*第三位数码管*/ 59 P0 = 0XFF; 60 WE = 1; //打开位选锁存器 61 P0 = 0XFB; //1111 1011 62 WE = 0; //锁存数据 63 64 DU = 1; //打开段选锁存器 65 P0 = table[ge]; 66 DU = 0; // 锁存数据 67 delay(5); 68 }
原文:https://www.cnblogs.com/mengnan-konghai/p/12830448.html