STC15F2K60S2学习笔记2——数码管动态显示

目录

1.STC15F2K60S2数码管简介

2.STC15F2K60S2数码管点亮原理

3.STC15F2K60S2数码管的原理图

①位选

②段选

③74HC138译码器 74HC02或非门

4.点亮一个数码管显示1

5.动态数码管显示01234567

6.动态数码管消除残影


1.STC15F2K60S2数码管简介

STC15F2K60S2所用数码管属于共阳数码管,所谓共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。

2.STC15F2K60S2数码管点亮原理

 如上图,单个数码管是由8个led灯组成,每个led的正极都连在同一个端口上,但各led负极不在同一个端口上。如果想让单个数码管点亮我们只需要将正极端口赋予高电平,负极端口赋予低电平即可。

接下来,我们来看看STC15F2K60S2数码管的原理图。

3.STC15F2K60S2数码管的原理图

①位选

 首先,如果要点亮数码管,我们要对其进行位置选择,也就是所要点亮数码管的位置。这种选择,我们称其为位选,与位选相关的就是原理图中的com1~com8端口(这里的com端口就是共阳极端)。com1~com8端口与u8锁存器有关,当我们想让第一个数码管点亮为1时,我们就将com1赋值为高电平,即将u8的P00口赋为高电平

②段选

接下来,我们根据所要点亮的图案,对第一个数码管进行段选。

 当我们想让其点亮为1时,我们就将b、c段的led赋值为低电平。即将u7锁存器的P01、P02赋值为低电平。但这里我们采用字节赋值的方法将P0端口赋值。P07~P00对应位为11111001,则将P0端口赋为0xf9。这样就完成了将第一个数码管点亮为1的关键操作。下面,我们还要对u7、u8锁存器进行开启,才可实现点亮数码管的操作。与此有关的是74hc138译码器和74HC02或非门。下面是其原理图

③74HC138译码器 74HC02或非门

 以u8锁存器为例。当Y6C输出1时,u8锁存器门栓开启,数据才能传送。下面,我们来看74HC02的输出功能表。

 当Y5输出和WR输出都为0时,Y5C输出为1。所以我们要将Y5输出和WR设置为0。又因为J13已经将WR于GND相连,所以我们只需要设置Y5输出0即可。Y5的输出由74HC138译码器控制,下面,我们来看看74HC138译码器。因为Y0~Y7的输出是由P25~P27三个端口控制。下面是其真值表。(从第三行开始看,因为原理图接的G1为H,G2'为低。)

 根据真值表,当我们要控制Y5输出低电平时,只需要将P25、P27赋值为高电平,P26赋值为低电平即可。

经过这些处理数码管即可被点亮。下面是根据原理我们点亮第一个数码管显示数字1。

4.点亮一个数码管显示1

首先我们先写其外设控制函数,也就是选取锁存器和设置锁存器P0的输出。

#include "Device.h"

/**
  * @brief 外设控制函数
  * @param None
  * @retval None
  */
void vDevice_Ctrl(unsigned char P2data,unsigned char P0data)
{
	P0=P0data;      //锁存器所输出的数据
	P2=P2data;     //选取的锁存器
	P2=0;
}

然后我们对定时器进行配置,这里用的stc-isp里的定时计算器,晶振为12MHz,时间为1ms。

void Timer2Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0x20;		//设置定时初值
	T2H = 0xD1;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
    IE2|=0x04;        //开启定时器2中断
    EA=1;
}

数码管显示函数

//数码管显示函数
void vSMG_Display()
{
	vDevice_Ctrl(0xe0,0xf9);   //段选
	vDevice_Ctrl(0xc0,0x01);   //位选
}

中断中刷新数码管

//中断服务程序
void vTimer2_ISR() interrupt  12 //中断入口
{
    vSMG_Display();
}

主函数

void main(void)
{
    Timer2Init();
    while(1)
	{
		
	}
}

实验现象:

5.动态数码管显示01234567

#include <STC15F2K60S2.H>
#include <STC15F2K60S2.H>
unsigned char smg_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
             //   0,   1,   2,   3,   4,   5,   6,   7,   8,   9

/**
  * @brief 外设控制函数
  * @param None
  * @retval None
  */
void vDevice_Ctrl(unsigned char P2data,unsigned char P0data)
{
	P0=P0data;      //锁存器所输出的数据
	P2=P2data;     //选取的锁存器
	P2=0;
}
//定时器2初始化函数
void Timer2Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0x20;		//设置定时初值
	T2H = 0xD1;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
    IE2|=0x04;        //开启定时器2中断
    EA=1;
}


//数码管显示函数
void vSMG_Display()
{
	static unsigned char i=0; 
	vDevice_Ctrl(0xe0,smg_code[i]);   //段选
	vDevice_Ctrl(0xc0,0x01<<i);   //位选
	i=(i+1)%8;    //i的范围在0~8
}

void main(void)
{
    Timer2Init();
    while(1)
	{
		
	}
}

//中断服务程序
void vTimer2_ISR() interrupt  12 //中断入口
{
	vSMG_Display();
}


这样我们就实现了动态数码管的显示,但是这里会有个小缺陷,就是会有残影的产生。这是因为当前一个位选被选后,下一个位的段选就已经开始发送数据。所以为了消除这个残影,我们需要在操作段选之前,先关闭所有的位选。

6.动态数码管消除残影

#include <STC15F2K60S2.H>
#include <STC15F2K60S2.H>
unsigned char smg_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
             //   0,   1,   2,   3,   4,   5,   6,   7,   8,   9

/**
  * @brief 外设控制函数
  * @param None
  * @retval None
  */
void vDevice_Ctrl(unsigned char P2data,unsigned char P0data)
{
	P0=P0data;      //锁存器所输出的数据
	P2=P2data;     //选取的锁存器
	P2=0;
}
//定时器2初始化函数
void Timer2Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0x20;		//设置定时初值
	T2H = 0xD1;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
    IE2|=0x04;        //开启定时器2中断
    EA=1;
}


//数码管显示函数
void vSMG_Display()
{
	static unsigned char i=0; 
    vDevice_Ctrl(0xc0,0);   //位选(消除残影)
	vDevice_Ctrl(0xe0,smg_code[i]);   //段选
	vDevice_Ctrl(0xc0,0x01<<i);   //位选
	i=(i+1)%8;    //i的范围在0~8
}

void main(void)
{
    Timer2Init();
    while(1)
	{
		
	}
}

//中断服务程序
void vTimer2_ISR() interrupt  12 //中断入口
{
	vSMG_Display();
}

这样数码管的动态显示就完成了。

写的笔记不是太好,有问题希望大家可以指正哟~

(学习资源:电子设计工坊)

  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值