单片机SEG模块笔记

单片机的SEG模块是指数码管输出模块,用于控制数码管的显示。数码管可以显示数字、字母、符号等信息,常用于电子钟、计时器、计数器、温度显示器等应用中。

SEG模块可以实现数码管的驱动和显示控制,通常包含数码管的驱动芯片和显示控制电路。单片机可以通过SEG模块控制数码管的显示内容,包括显示的数字、字母、符号的选择和显示位置的控制。通过编程控制SEG模块,可以实现数码管的动态显示、静态显示、闪烁显示等效果。

使用SEG模块可以方便地实现对数码管的控制和显示,提高了单片机在数字显示方面的应用能力。


数码管根据其公共端的接线方式,可分为共阴极数码管和共阳极数码管两类。

(1)共阴极数码管:在此类数码管中,公共端是接地的。要想点亮某个字段,需要将其对应的发光二极管阳极设置为高电平,即逻辑“1”。

(2)共阳极数码管:与共阴极数码管相反,共阳极数码管的公共端连接到电源上。为了激活某个特定字段,需将该字段的发光二极管阳极设为低电平,也就是逻辑“0”(例如,在单片机竞赛板上常使用的就是共阳极数码管,即本文所用)。


首先新建工程,建立seg.c文件 seg.h文件

seg.c

在使用数码管前,应先认识数码管的段选与位选,下面将分别进行简要介绍:

一、段选(选择数码管显示的数据)

定义:段选指的是选择数码管中的哪一段(LED)亮起来,以显示对应数字的哪一部分。例如,7段数码管的每一段可以表示数字0-9中的一部分。
控制方式:段选通常使用BCD码(二进制编码十进制)或其他编码方式,将要显示的数字转化为对应的段选信号。这些信号会控制数码管内部各个LED段的亮灭,从而显示出相应的数字或字符。
表示方法:在共阳极数码管中,所有的LED段的阳极(正极)都是连接在一起的,而每个LED段的阴极(负极)则分别连接到不同的引脚。控制时,通过给某一段的阴极引脚接通电流,同时将共阳极引脚设置为高电平,该段就会被激活。在共阴极数码管中,控制方式与共阳极相反,即通过给某一段的阳极引脚接通电流,同时将共阴极引脚设置为低电平来激活该段。

56697ee2bff14674b03d39f6134cd76d.jpeg

我们标按照dp->g->f->e->d->c->b->a的由高位至低位顺序写出,若采用共阳极数码管,即0亮1灭型时,如要输出“2”,对应的二进制码即1010_0100->0xa4,这个值在显示中就代表着“2”了

由此规律可以推出段选数组

unsigned char code Seg_Dula[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

二、位选(选择哪一个数码管进行显示)

定义:位选是指在多位数码管中选择哪一位进行显示。例如,4位数码管就有4个位选引脚,通过控制这些引脚的电平状态,可以选择显示哪一位的数字。
控制方式:位选的常见方式是通过一个计时器或者控制芯片,轮流地激活每一位,以达到依次显示多个数字的效果。这种动态扫描的方式可以节省硬件资源,并使得多位数码管能够同时显示出不同的数字。
表示方法:位选引脚一般用特定的标识符来表示,如W0、W1、W2等,其中W0对应最低位,W1对应次低位,以此类推。在控制过程中,通过给这些引脚输入相应的电平信号来选择需要显示的数码管位数。

综上所述,段选和位选是数码管显示中不可或缺的两个要素。它们通过控制数码管内部各个LED段的亮灭以及选择显示的位数,共同实现了数码管对数字或字符的准确显示。

47fd9bf899ee431cb7315e7c1aba0b81.png

20bbe387f3274c05a356c1a879bf6437.png

A,B,C,D,E,F,G,DP为我们的段选,COM1-8为我们的位选

我们知道锁存器是用P25,P26,P27进行控制,即P2的高三位进行的控制。如Y7C,高三位为111,将其放在高位,即为1110 0000

我们需要先对P0进行段选显示后,使用P2将锁存器打开(Y7C->1110 0000->0xe0);在对P0进行位选配置后,使用P2将锁存器打开(Y6C->1100 0000->0xc0)

我们只需要按照如下的命令进行书写即可

//消影
P2=((P2&0x1f)|0xe0);//P2=xxxx xxxx&0001 0000=000x xxxx|1110 0000=111x xxxx  P27=P26=P25=1
P0=0xff;
P2&=0x1f;//P27=P26=P25=0

//位选
P2=((P2&0x1f)|0xc0);
P0=0x01<<i;
P2&=0x1f;//P27=P26=P25=0

//段选
P2=((P2&0x1f)|0xe0);
P0=Seg_Table[dspbuf[i]];
P2&=0x1f;//P27=P26=P25=0

其中消影一步是为了避免数码管显示异常。

若要在此基础上实现显示小数点的话,我们就要让DP为0,其他不变,即在段选后加上&0x7f即可

#include "seg.h"

# 共阳数码管段码表
code unsigned char Seg_Table[] =
{
0xc0,
//0
0xf9,
//1
0xa4,
//2
0xb0,
//3
0x99,
//4
0x92,
//5
0x82,
//6
0xf8,
//7
0x80,
//8
0x90,
//9
0xff,
//空
};


//point判断是否显示小数点,1显示,0不显示
void Seg_Disp(unsigned char wela, unsigned char dula, unsigned char point) {
  // 消隐
  P0 = 0xff;
  P2=((P2&0x1f)|0xe0);
  P2 &= 0x1f;

  // 位选
  P0 = 0x01 << wela;
  P2=((P2&0x1f)|0xc0);
  P2 &= 0x1f;

  // 段选
  P0 = seg_dula[dula];
  if (point) P0 &= 0x7f;
  P2=((P2&0x1f)|0xe0);
  P2 &= 0x1f;
}


seg.h

注意声明函数格式即可

#include <STC15F2K60S2.H>
void Seg_Disp(unsigned char wela, unsigned char dula, unsigned char point);


数码管显示技术

主要分为静态显示动态显示两种方式。

(1)静态显示

在这种显示方式中,每个数码管的段选都需连接到一个8位数据线上,以确保能够持续显示特定的字形码。一旦字形码被送入,数码管就会持续显示该字形,直到接收到新的字形码为止。静态显示的优势在于其稳定性和可靠性,每个数码管都能独立地显示一个固定的数字。然而,这种方式需要较多的引脚和驱动器,且一次只能显示一组数字

(2)动态显示

与静态显示不同,动态显示将所有数码管的段选线合并,并通过单一的接口进行控制。公共端并不直接接地(共阴极)或接电源(共阳极),而是通过相应的I/O接口进行调控。这种方式允许使用一组I/O口来控制多个数码管。由于人眼具有视觉暂留效应,通过快速切换数码管的亮灭状态,可以营造出多个数码管同时显示多个数字的视觉效果(尽管实际上数码管是依次进行亮灭切换的)。动态显示的优势在于节省引脚和驱动器,且能同时显示多组数字。然而,其显示稳定性较差,需要维持一定的刷新频率来确保显示效果。为了显示正确,我们需进行消影步骤,以避免“鬼影”。动态显示的关键步骤包括消隐、位选通、段码输入以及切换位选标志。为了确保数码管显示不出现乱码,需要在合理的时间范围内(如1-3毫秒)定时刷新数码管的状态,从而有效防止亮度不均和闪烁等问题的发生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值