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

这篇具有很好参考价值的文章主要介绍了STC15F2K60S2学习笔记2——数码管动态显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.STC15F2K60S2数码管简介

2.STC15F2K60S2数码管点亮原理

3.STC15F2K60S2数码管的原理图

①位选

②段选

③74HC138译码器 74HC02或非门

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

5.动态数码管显示01234567

6.动态数码管消除残影


1.STC15F2K60S2数码管简介

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

2.STC15F2K60S2数码管点亮原理

lcm1602k和stc15f2k60s的连接图,学习,单片机

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

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

3.STC15F2K60S2数码管的原理图

lcm1602k和stc15f2k60s的连接图,学习,单片机

①位选

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

②段选

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

lcm1602k和stc15f2k60s的连接图,学习,单片机

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

③74HC138译码器 74HC02或非门

lcm1602k和stc15f2k60s的连接图,学习,单片机

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

lcm1602k和stc15f2k60s的连接图,学习,单片机

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

lcm1602k和stc15f2k60s的连接图,学习,单片机

 根据真值表,当我们要控制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)
	{
		
	}
}

实验现象:lcm1602k和stc15f2k60s的连接图,学习,单片机

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();
}

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

写的笔记不是太好,有问题希望大家可以指正哟~lcm1602k和stc15f2k60s的连接图,学习,单片机

(学习资源:电子设计工坊)文章来源地址https://www.toymoban.com/news/detail-766521.html

到了这里,关于STC15F2K60S2学习笔记2——数码管动态显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STC15F100E单片机模拟串口

    STC15F100系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,新一代8051单片机,指令代码完全兼容传统8051,但是速度快6-12倍。 内部集成R/C时钟,5MHz~35MHz宽范围可设置,可以省掉外部晶振。 内部集成复位电路,可省掉外部复位电路。 6个通用I/O口,支持四种模式:准双

    2024年02月20日
    浏览(40)
  • 【STC15单片机】动态数码管

    目录 点亮一位数码管 动态数码管 100s倒计时 动态数码管封装代码 段选:选中哪一位数码管 位选:选中的数码管要显示的内容 这是我对段选位选的理解,就是选中某个位置,赋值字形码,显示想要的图形 如果只想让第一个数码管显示,就只需要让com1 = 1即可,其他comx都=0 如

    2024年02月13日
    浏览(38)
  • verilog学习笔记- 15)动态数码管显示实验

    目录 简介: 实验任务: 硬件设计: 程序设计: 下载验证: 由于一般的静态驱动操作虽然方便,但占用的 I/0 口较多,例如要驱动6 位 8 段数码管,以静态驱动方式让数码管各个位显示不同的数值,如“123456”,需要占用6 × 8 = 48个I/O 口,虽然对于 FPGA 这种 I/O 口较多的芯片

    2024年02月07日
    浏览(43)
  • 学习笔记|小数点控制原理|数码管动态显示|段码跟位码|STC32G单片机视频开发教程(冲哥)|第十集:数码管动态显示

    上述图片引用自:51单片机初学2-数码管动态扫描 用一排端口来控制段码,需要显示哪几个就点亮哪几个段,和看电影一样,一个一个的打开,关闭,一个个的画面,组成动画。 具体的控制的流程如图所示,N表示有几个数码管! 其中需要注意每个延时不能太短,我们这边程

    2024年02月07日
    浏览(42)
  • 学习笔记|认识数码管|控制原理|数码管实现0-9的显示|段码跟位码|STC32G单片机视频开发教程(冲哥)|第九集:数码管静态显示

    数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更的表示数码管想要显示的内容;按能显示多少个(8)可分为1位、2位、3位、4位、5位、6位、7位等数码管。 按发光二极管单元连接方

    2024年02月10日
    浏览(49)
  • nova7换红米k60

    换新机后一天的体验是巨大提升,nova7是3年前买的,配置是麒麟985cpu,当时新出是2900吧。现在换红米k60,已经出了5个月左右,买了2999的12+512G骁龙8+。体验直呼wc!!!玩爆nova7(可能是前一代技术) k60吊打nova7,毕竟不是一个迭代的产品。首先从一些表现来体验: 运行性能

    2024年02月10日
    浏览(46)
  • 树莓派4B接4K60p显示器要点

            Raspberry Pi 4可驱动多达两个显示器,刷新频率为60Hz时分辨率高达1080p。在4K分辨率下,如果连接两个显示器,则刷新率限制为30Hz。您还可以以60Hz的刷新率以4K的速度驱动单个显示器       硬件方面:1.HDMI线接0口(靠近电源接口那一个,也可进系统后看分辨率调试显示

    2024年02月13日
    浏览(51)
  • bat脚本 创建计划任务 一分钟设置ntp同步周期为60s

    要在Windows中使用批处理脚本(.bat)创建一个计划任务来每分钟同步一次NTP时间,你可以使用 schtasks 命令来创建计划任务。下面是一个示例脚本,展示了如何创建这样一个计划任务: 将上述代码保存为 .bat 文件,比如 create_ntp_sync_task.bat 。请注意以下几点: %#126;dp0  是一个变

    2024年02月22日
    浏览(40)
  • Webpack5构建性能优化:构建耗时从150s到60s再到10s

    作者:京东科技 牛志伟 近期对Webpack5构建性能进行了优化,构建耗时从150s到60s再到10s,下面详细讲解下优化过程。 1.历史项目基于Vue3 + Webpack5技术栈,其中webpack配置项由开发者自己维护(没有使用@vue/cli-service),并且做了环境分离。 2.项目体量大约5000个modules左右,每次本

    2024年02月03日
    浏览(51)
  • STC15系列单片机学习4:串口通讯

    在使用单片机的串口前,得先知道所使用的单片机有几个串口,再结合你的硬件电路图来使用哪个串口。 以下是STC15各系列单片机的串口数量,STC15W4K32S4系列有4个串口 工作模式0:同步移位寄存器(官方建议初学者不学) 工作模式1:8位串口,波特率可变 工作模式2:9位串口

    2024年04月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包