更多单片机学习笔记:
单片机学习笔记 1. 点亮一个LED灯
单片机学习笔记 2. LED灯闪烁
单片机学习笔记 3. LED灯流水灯
单片机学习笔记 4. 蜂鸣器滴~滴~滴~
目录
0、实现的功能
1、Keil工程
1-1 数码管显示原理
1-2 静态与动态显示
1-3 74HC573锁存器的工作原理
1-4 上拉电阻的作用
1-5 原理图
2、代码实现
Q:发现如果没有代码最后一行的while(1),除了亮1之外,其他数码管还会亮!WHY?
0、实现的功能
数码管的静态显示
1、Keil工程
1-1 数码管显示原理
数码管在生活中运用的已经很广泛了。该板子用的是共阴极,可以拿万用表测数码管的公共端和任意一个管脚,来判断是共阴还是共阳极。
不同端口控制不同管脚,给出共阴极的数码码表
1-2 静态与动态显示
数码管的a b c d e是段选,P0口控制哪个管脚亮灭;公共脚GND是位选,P0口控制选择8个数码管中的某一个。静态显示就是让显示出的数字保持不变的状态,直到下一次输入新的状态
1-3 74HC573锁存器的工作原理
IO口资源很宝贵,所以尽量增加外设电路的可操作性。首先OE是低电平有效,否则输出高阻态。其次就是LE的状态,高电平时,随输入D变化而变化;低电平时,锁存上一状态数据
1-4 上拉电阻的作用
上拉电阻主要是可以钳位在高电平,且限流
P0口不是准双向口,没有上拉电阻。开漏状态只能输出低电平,不能输出高电平
P1 P2 P3口是准双向口,是有上拉电阻的。可以输出高低电平。所以要在P0加上拉电阻,实现输出高电平的效果
1-5 原理图
实际上就是P0口的分时复用,P0口就8个口,但是要先控制选择哪个数码管(要8个管脚控制),再控制亮什么数字(要8个管脚控制)。
为了同时实现这些条件,就需要用到锁存器,先位选出哪个数码管工作,锁存一下数据(因为一会要改变P0口数据实现亮什么数字),再段选出亮什么数字,再锁存一下
U8是位选,先选择亮哪个数码管,共阴的位选是接地的,置0即可;U9是段选,控制亮的数字,置1即可
2、代码实现
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit WE = P2^7; //锁存器位选,U8的LE,选择哪个数码管
sbit DU = P2^6; //锁存器段选,U9的LE,控制亮什么数字
//延时模块
//void delay(uint z)
//{
// uint x;
// uint y;
// for(x = z; x > 0; x--)
// for(y = 114; y > 0; y--);
//}
void main()
{
WE = 1;//位选锁存器打开
P0 = 0xfe;//选择第一个数码管
WE = 0; //关上位选锁存器,进入锁存
DU = 1;//段选锁存器打开
P0 = 0x06;//亮的数字为1
DU = 0;//关上段选锁存器,进入锁存
WE = 1;//位选锁存器打开
P0 = 0x0;//选择第二个数码管
WE = 0; //关上位选锁存器,进入锁存
DU = 1;//段选锁存器打开
P0 = 0x5B;//亮的数字为2
DU = 0;//关上段选锁存器,进入锁存
while(1)
{
}
}
这段代码会发现结果只显示2,因为静态显示当下一个操作来的时候,上一个锁存的数据就没了。实物展示:
此时静态显示只能亮同一个数字,想要同时亮多个不一样的数字需要把代码写到循环里