瑞萨单片机之定时器中断实现数码管动态扫描(四)
目录
- 一、实现原理
- 二、具体实现
- 三、例子
一、实现原理
数码管的驱动方式很简单,图中的A B C D E F G Dp (8个段 含点)分别代表的数码管的每个段(笔画),需要显示什么就把相应的段点亮即可。
例如: 数码管为共阴数码管 显示数字 1
A 并口驱动:P0 =0x06 ; COM =0;//单片机并口 B C 段置1,位选端口置 0 即可显示1 ,数码管的位数比较多的话就只需要采用动态扫描即可,只要扫描的时间足够短,人眼几乎看不到抖动。
**B 非并口驱动:**并不是所有的单片机并口都是完整的,对于小封装的单片机一个完成的并口几乎很难找。(大一暑假的时候也是通过这种当时想确定数码管结果失败了。。。 当时还在自学单片机,自己太菜了,当然现在也很菜 哈哈哈)
想通了其实也很简单:B+C 不就是1 吗?这种拼接的方式就是有点麻烦,后面主要采用这种方式
二、具体实现
由于手里的瑞萨单片机并口不完全,我只能采用拼接的方式实现驱动。
- 驱动IO 宏定义
#define SEG_A P2.3
#define SEG_B P1.0
#define SEG_C P1.1
#define SEG_D P1.2
#define SEG_E P1.3
#define SEG_F P1.4
#define SEG_G P6.1
#define SEG_DP P6.0#define COM1 P4.2
#define COM2 P4.1
#define COM3 P2.1
#define COM4 P2.2
- 数码扫描函数,这个函数主要放定时器中断里面
void display_scan(u8 pos,u8 isPoint,u8 num)
{SEG_A=0;SEG_B=0;SEG_C=0;SEG_D=0;SEG_E=0;SEG_F=0;SEG_G=0;SEG_DP=0;switch(pos){ case 1:COM1=0;COM2=1;COM3=1;COM4=1;break;case 2:COM1=1;COM2=0;COM3=1;COM4=1;break;case 3:COM1=1;COM2=1;COM3=0;COM4=1;break;case 4:COM1=1;COM2=1;COM3=1;COM4=0;break;}switch(num){case 0:SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=1;SEG_E=1;SEG_F=1;SEG_G=0;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//0case 1:SEG_A=0;SEG_B=1;SEG_C=1;SEG_D=0;SEG_E=0;SEG_F=0;SEG_G=0;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//1case 2:SEG_A=1;SEG_B=1;SEG_C=0;SEG_D=1;SEG_E=1;SEG_F=0;SEG_G=1;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//2case 3:SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=1;SEG_E=0;SEG_F=0;SEG_G=1;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//3case 4:SEG_A=0;SEG_B=1;SEG_C=1;SEG_D=0;SEG_E=0;SEG_F=1;SEG_G=1;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//4case 5:SEG_A=1;SEG_B=0;SEG_C=1;SEG_D=1;SEG_E=0;SEG_F=1;SEG_G=1;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//5case 6:SEG_A=1;SEG_B=0;SEG_C=1;SEG_D=1;SEG_E=1;SEG_F=1;SEG_G=1;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//6case 7:SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=0;SEG_E=0;SEG_F=0;SEG_G=0;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//7case 8:SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=1;SEG_E=1;SEG_F=1;SEG_G=1;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//8case 9:SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=1;SEG_E=0;SEG_F=1;SEG_G=1;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//9case 10:SEG_A=0;SEG_B=1;SEG_C=1;SEG_D=1;SEG_E=1;SEG_F=1;SEG_G=0;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//10 Ucase 11:SEG_A=1;SEG_B=0;SEG_C=0;SEG_D=0;SEG_E=1;SEG_F=1;SEG_G=1;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//11 Fcase 12:SEG_A=0;SEG_B=0;SEG_C=0;SEG_D=0;SEG_E=0;SEG_F=0;SEG_G=1;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//12 -case 13:SEG_A=0;SEG_B=1;SEG_C=1;SEG_D=0;SEG_E=1;SEG_F=1;SEG_G=1;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//13 Hcase 14:SEG_A=0;SEG_B=0;SEG_C=0;SEG_D=0;SEG_E=0;SEG_F=0;SEG_G=0;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//14 关显示// case 15:SEG_A=0;SEG_B=1;SEG_C=1;SEG_D=0;SEG_E=1;SEG_F=1;SEG_G=0;if(isPoint)SEG_DP=1;else SEG_DP=0;break;//15 }}
- 设置显示内容函数,主要向显存中添加需要显示的数据
/*************************************************************************
**@函数功能: 数码管显示内容设置
**@参数: pos--->显示的位置
** isPoint--->是否带点 1:带点 0:不带点
** buffer ---->显示缓存
** data --->需要显示的数据
**@返回值: 无
**@作者: XiaoYoung
**@版本及日期 2021/9/23
**@更新说明:
**************************************************************************/
u8 display_buffer[8];//显示缓存void set_display_buffer(u8 pos,u8 isPoint,u8 *buffer,u8 data)
{switch(pos){case 1: if(isPoint) buffer[4] =1;else buffer[4]=0; buffer[0] = data; break;case 2: if(isPoint) buffer[5] =1;else buffer[5]=0; buffer[1] = data; break; case 3: if(isPoint) buffer[6] =1;else buffer[6]=0; buffer[2] = data; break;case 4: if(isPoint) buffer[7] =1;else buffer[7]=0; buffer[3] = data; break; }
}
- 瑞萨单片机定时中断中:
__interrupt static void r_tau0_channel0_interrupt(void)
{/**************数码管相关*********/seg_pos++;if(seg_pos>4) { seg_pos=1;} switch(seg_pos){case 1:display_scan(seg_pos,display_buffer[4],display_buffer[0]);break;case 2:display_scan(seg_pos,display_buffer[5],display_buffer[1]);break;case 3:display_scan(seg_pos,display_buffer[6],display_buffer[2]);break;case 4:display_scan(seg_pos,display_buffer[7],display_buffer[3]);break; } }
}
三、例子
显示 666.6
int main(void)
{while(1){set_display_buffer(1,0,display_buffer,6);set_display_buffer(2,0,display_buffer,6);set_display_buffer(3,1,display_buffer,6);set_display_buffer(4,0,display_buffer,6);}
}
效果图片
瑞萨单片机之定时器中断实现数码管动态扫描(四)相关推荐
- 瑞萨单片机之外部中断实现频率采集(三)
很多低端MCU没有像STM32 那样拥有强大脉冲捕获测频率,那么MCU只能依靠自身有的资源来实现这个功能,比较通用的方法是使用了外部中断+定时器来实现,该方法经过我在实际项目中的使用来看,频率50/6 ...
- 单片机学习笔记 —— 8位数码管动态扫描
我们知道,依次只能让一个数码管/led灯亮起来,但是我们可以通过高频动态扫描得到8位数码管同时亮起来,这里介绍如何实现. 一.八位数码管 1.八位数码管原理图 下图为原理图: 段选信号:P0[7-0] ...
- 瑞萨e2studio(15)----外部中断定时器配置输入捕获测量频率
瑞萨e2studio.15--外部中断&定时器配置输入捕获测量频率 概述 视频教学 csdn课程 完整代码下载 样品申请 硬件准备 开发板 新建工程 工程模板 保存工程路径 芯片配置 工程模板 ...
- 瑞萨单片机C语言,瑞萨单片机学习笔记(1)基本配置
根据自己的芯片家族选择不同的代码编辑工具及仿真工具 对应78K0系列单片机,推荐的是cubeSuite+集成开发环境,具体使用可以看帮助手册. 有接触过PIC.STC的单片机,瑞萨单片机有其独特的地方 ...
- 33、基于CACX和R7F0C004M的瑞萨单片机入门教程
代码资源下载:https://download.csdn.net/download/BaoTTing/58444918 一.开发环境介绍 CS+ for CACX: 瑞萨单片机开发环境,已经停止更新, ...
- 51单片机使用定时器进行数码管动态扫描程序
数码管是51单片机学习中比较基础的一个模块,为简化电路连接,提高系统可靠性,降低制造成本,多位数码管广泛采用动态扫描的方式进行显示.如果程序编写不当,数码管动态扫描容易出现亮度不均匀.亮度过低.重影等 ...
- 瑞萨单片机-硬件I2C从设备
开发环境 1.e2 studio 2.R5F1115AxFL 概述 1.网上关于I2C从机的资料很少,在这里分享下我在瑞萨单片机上实现I2C从机,根据主机发来的数据,从机返回或者保存数据 2.R5F1 ...
- 瑞萨单片机之电压检测器(低压复位)(六)
目录 一.电压检测器的作用 二.电压检测器如何使用 一.电压检测器的作用 顾名思义,电压检测器就是用来检测电压的,电压检测器将检测到的电压与电源电压进行比较,比较完成后执行相应的动作:复位.复位&am ...
- 瑞萨单片机CAN口复用唤醒
瑞萨单片机CAN口复用唤醒 瑞萨单片机睡眠模式 CAN总线唤醒的原理 外部GPIO口唤醒步骤 注意事项 目前笔者在公司实习接触到了瑞萨单片机 经过了一个月的踩坑已经对瑞萨单片机的开发有了一定的了解,现 ...
最新文章
- 67)vector的begin() end() 和 front() back()的区别 rbegin() rend()
- 安全专家:恶意软件盯上苹果Mac机用户
- 遇到 HTTP 错误 403.14 - Forbidden?
- 总结:ps aux指令
- boost::leaf::function_traits用法的测试程序
- linux usb ga驱动详解,Linux设备驱动之内存映射
- vue 计算文件hash值_vue的hash值原理,也是table切换。
- oracle数据库函数手册,Oracle分析函数参考手册(转)
- 【youcans 的 OpenCV 例程 200 篇】105. 湍流模糊退化模型
- ElasticSearch范围查询(英文检索)
- dcmtk在PACS开发中的应用(基础篇) 作者:冷家锋 第四章 工作列表(Work List)(二)...
- http请求头中包含未编码中文时webapi self host崩溃
- C#启动前为所有的Form设置统一的Icon
- 最新黑马程序员全套视频-.net视频,大家赶紧来下载吧,看图片水印上的QQ加我索取视频教程
- 大数据之编程语言:Scala视频教程-陈超-专题视频课程
- 四级信息安全工程师基础知识
- 浅谈新一代PGIS技术在智慧消防中的创新应用
- 一个dsp最小系统至少要有_DSP最小系统原理图设计
- 如何写一份前端开发简历
- cpu个人训练四 K 打地鼠游戏