80C51单片机系列
- 80C51单片机介绍
- 照亮第一个发光二极管和流水灯案例
- 数字管显示、包装和隐藏
文章目录
- 80C51单片机系列
- 数码管显示
-
-
- 数字管的控制逻辑
- 循环显示
-
- 封装数码管
-
- 消隐
- 下一章:中断
在上一章中,我们学会了如何操作二极管的发光熄灭。
这一节我们讲如何操作数码管,让数码管显示出数字。
数码管显示
数字管的控制逻辑
简单地说:
现在我们大概知道数字管的控制逻辑了。
从上图(原理图)可以看出,控制数码管分为两部分。
在每个数字管上连接一个串口。分别是:。从上面说的,我们可以猜到这四个串口应该是。
因为只要控制是否显示,数字管和串口就能满足需求。
所以这四个串口是:
看下面的数码管,有八个串口,图片很清晰,a、b、c、b、e、f、g。
这八个串口连接到单片机P八串0口。
我们来看看第一个数字管的位选。。
从图的左侧可以看出,连接单片机P1 ^ 3这个嘴。所以只要给它。P1 ^ 3 = 即可!
现在数码管亮了!
我们希望数字管显示 ,还需要控制。
从上图可以看到显示,有两种选择。
#include<reg52.h> //位选 sbit LEDS4 = P1^3; //段选 sbit b = P0^1; sbit c= P0^2; void main() {
///初始化都是低电平 P1 = 0; P0 = 0; LEDS4 = 1; b = 1; c = 1; while(1); }
然后编译,下载到单片机,打开,然后你可以看到第一个数字管显示为1!
循环显示
有了上面的例子,我们来练习一下。
循环显示:0 1 2 3 4 5 6 7 8 9 A b c d e f 空
#include<reg52.h> typedef unsigned
int uint
;
typedef
unsigned
char uchar
;
void
Delayms
(
unsigned
char
)
;
// 0 1 2 3 4 5 6 7 8 9 A b c d e f 空 不显示
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void
main
(
)
{
uchar DUAN
[
17
]
=
{
0x3f
,
0x06
,
0x5b
,
0x4f
,
0x66
,
0x6d
,
0x7d
,
0x07
,
0x7f
,
0x6f
,
0x77
,
0x7c
,
0x39
,
0x5e
,
0x79
,
0x71
,
0x00
}
; uchar i
;
while
(
1
)
{
for
(i
=
0
; i
<
17
; i
++
)
{
P1
=
0xff
;
//数码管全部打开 P0
= DUAN
[i
]
;
Delayms
(
500
)
;
}
}
}
//延时函数
void
Delayms
(
unsigned
char c
)
{
unsigned
char a
;
for
(
;c
>
0
;c
--
)
for
(a
=
200
;a
>
0
;a
--
)
;
}
封装数码管
#include<reg52.h>
#include"num_led.h"
#define Wei P1
#define Duan P0
// 位选
//{0x08,0x04,0x02,0x01};
unsigned char LED_WEI[4] = {
0xf1,0xf2,0xf4,0xf8};
//段选
// 0 1 2 3 4 5 6 7 8 9 A B C D E F 空
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char LED_NUM[17] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
static void Num_Delayms(unsigned char c);
//处理数字并显示函数
void Num_show(unsigned int num)
{
unsigned char i,ge;
unsigned int show_num;
show_num = num;
// 数字达到9999 显示为“- - - -”
if(show_num >= 9999)
{
P0 = 0x40;
P1 = 0x0f;
return;
}
//将数字转换为16进制
for(i=0; i<4; i++)
{
ge = show_num % 10;
show_num = show_num / 10;
Wei = 0xf0;//置灭 消隐! 如果不先置灭,那么在位选重新赋值前,段选赋值后显示的是上一次位选的位置
Duan = LED_NUM[ge];//置段选
Wei = LED_WEI[i];//置亮
Num_Delayms(1);
if(show_num == 0)
{
break; //直接跳出节省时间
}
}
}
//数字延时函数
static void Num_Delayms(unsigned char c)
{
unsigned char a;
for(;c>0;c--)
for(a=200;a>0;a--);
}
#include<reg52.h>
//传入要显示的数字
void Num_show(unsigned int);
消隐
如果先置段选,那么在置段选之前,需要先把位选置灭。
下一章:中断
下一章: