单片机IO口输出难稳定,需要数码管与单片机连接需要增加驱动电路, 使用 74HC245
abcdefgDP并联导出 74HC245 对数码管进行驱动,P0 是输出电流 来驱动各个段的 驱动芯片
增加电阻 是为了防止电流过大烧坏数码管 。P0输出段选的
共阴 就是所有阴极 连接 在一起,连接在公共端,接地 ,阳极给高电平 就可以导通 发亮
数码管的公共端 引出来
38译码器 是 3输入8 输出的芯片 由P2^2 P2^3 P2^4 输入 来控制位选的
数码管由8个端 或者7个端组成的发光二极管 多一个段是一个点,他可以组成小数点
一个数码管封装 10个引脚
阳极
所有二极管的阳极 全部连接起来, 阴极独立, 阴极 给低电平就亮
阴极
所有二极管的阴极 全部连接起来, 阳极独立, 阳极 给高电平就亮
两种 正极负极是放着来就可导通
假如以阴极 数码管来显示:
要是显示 0 , 从 阴极二进制就是 DP、g 为 0 低电平 其他为高 0011 1111 换算十六 3f
数码管就亮了
共阴数码管 abcdefg 要亮的 1111 1100 小数点为P0.7 为数据的高位
得从高位到地位P0.7~0.0 0011 1111 转换十六进制 为 0x3f
共阳数码管就是跟共阴数码管 相反的取值
段选 就是 数码管各个发光二极管显示的段 组成的字
位选 就是 公共端引出的引脚,选择哪个数码管来显示
A1A2A3 都为低电平,000 Y0 为有效 LED1
A1A2A3 为 100 Y1 为有效 LED2
A1A2A3 为 010 Y2 为有效 LED3
A1A2A3 为 110 Y3 为有效 LED4
A1A2A3 为001 Y4为有效 LED5
A1A2A3 为101 Y5 为有效 LED6
A1A2A3 为 011 Y6 为有效 LED7
A1A2A3 为 111 Y7 为有效 LED8
用人眼余晖,延时来 让人感觉数码管动态显示
- #include "reg52.h"
-
-
- typedef unsigned int u16;
- typedef unsigned char u8;
-
- #define SMG_A_DP_PORT P0
-
-
- u8 gsmg_code[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; // 段选0-F
-
-
-
- // 位选
- sbit LSA = P2^2;
- sbit LSB = P2^3;
- sbit LSC = P2^4;
-
-
- void delay_time(u16 times)
- {
- while(times--);
- }
-
- // 定义数码管显示的函数
- void smg_display(void)
- {
- u8 i = 0; // 用一个循环,需要定义一个变量
- for(i=0;i<8;i++)
- {
- //每次循环选择一个段选
- switch(i)
- {
- case 0:LSC=1; LSB=1; LSA=1; break; // Y7 输出
- case 1:LSC=1; LSB=1; LSA=0; break; // Y6 输出
- case 2:LSC=1; LSB=0; LSA=1; break; // Y5 输出
- case 3:LSC=1; LSB=0; LSA=0; break; // Y4 输出
- case 4:LSC=0; LSB=1; LSA=1; break; // Y3 输出
- case 5:LSC=0; LSB=1; LSA=0; break; // Y2 输出
- case 6:LSC=0; LSB=0; LSA=1; break; // Y1 输出
- case 7:LSC=0; LSB=0; LSA=0; break; // Y0 输出
- }
- SMG_A_DP_PORT = gsmg_code[i];
- delay_time(100); // 1ms = 100 us
- SMG_A_DP_PORT = 0x00;
- }
- }
-
- void main()
- {
- while(1)
- {
- smg_display();
- }
-
- }