目录

  • 一、实现原理
  • 二、具体实现
  • 三、例子

一、实现原理

数码管的驱动方式很简单,图中的A B C D E F G Dp (8个段 含点)分别代表的数码管的每个段(笔画),需要显示什么就把相应的段点亮即可。

例如: 数码管为共阴数码管 显示数字 1

A 并口驱动:P0 =0x06 ; COM =0;//单片机并口 B C 段置1,位选端口置 0 即可显示1 ,数码管的位数比较多的话就只需要采用动态扫描即可,只要扫描的时间足够短,人眼几乎看不到抖动。

**B 非并口驱动:**并不是所有的单片机并口都是完整的,对于小封装的单片机一个完成的并口几乎很难找。(大一暑假的时候也是通过这种当时想确定数码管结果失败了。。。 当时还在自学单片机,自己太菜了,当然现在也很菜 哈哈哈)
想通了其实也很简单:B+C 不就是1 吗?这种拼接的方式就是有点麻烦,后面主要采用这种方式

二、具体实现

由于手里的瑞萨单片机并口不完全,我只能采用拼接的方式实现驱动。

  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
  1. 数码扫描函数,这个函数主要放定时器中断里面
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 }}
  1. 设置显示内容函数,主要向显存中添加需要显示的数据
/*************************************************************************
**@函数功能: 数码管显示内容设置
**@参数:   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;  }
}
  1. 瑞萨单片机定时中断中:
__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);}
}

效果图片

瑞萨单片机之定时器中断实现数码管动态扫描(四)相关推荐

  1. 瑞萨单片机之外部中断实现频率采集(三)

    很多低端MCU没有像STM32 那样拥有强大脉冲捕获测频率,那么MCU只能依靠自身有的资源来实现这个功能,比较通用的方法是使用了外部中断+定时器来实现,该方法经过我在实际项目中的使用来看,频率50/6 ...

  2. 单片机学习笔记 —— 8位数码管动态扫描

    我们知道,依次只能让一个数码管/led灯亮起来,但是我们可以通过高频动态扫描得到8位数码管同时亮起来,这里介绍如何实现. 一.八位数码管 1.八位数码管原理图 下图为原理图: 段选信号:P0[7-0] ...

  3. 瑞萨e2studio(15)----外部中断定时器配置输入捕获测量频率

    瑞萨e2studio.15--外部中断&定时器配置输入捕获测量频率 概述 视频教学 csdn课程 完整代码下载 样品申请 硬件准备 开发板 新建工程 工程模板 保存工程路径 芯片配置 工程模板 ...

  4. 瑞萨单片机C语言,瑞萨单片机学习笔记(1)基本配置

    根据自己的芯片家族选择不同的代码编辑工具及仿真工具 对应78K0系列单片机,推荐的是cubeSuite+集成开发环境,具体使用可以看帮助手册. 有接触过PIC.STC的单片机,瑞萨单片机有其独特的地方 ...

  5. 33、基于CACX和R7F0C004M的瑞萨单片机入门教程

    代码资源下载:https://download.csdn.net/download/BaoTTing/58444918 一.开发环境介绍 CS+ for CACX: 瑞萨单片机开发环境,已经停止更新, ...

  6. 51单片机使用定时器进行数码管动态扫描程序

    数码管是51单片机学习中比较基础的一个模块,为简化电路连接,提高系统可靠性,降低制造成本,多位数码管广泛采用动态扫描的方式进行显示.如果程序编写不当,数码管动态扫描容易出现亮度不均匀.亮度过低.重影等 ...

  7. 瑞萨单片机-硬件I2C从设备

    开发环境 1.e2 studio 2.R5F1115AxFL 概述 1.网上关于I2C从机的资料很少,在这里分享下我在瑞萨单片机上实现I2C从机,根据主机发来的数据,从机返回或者保存数据 2.R5F1 ...

  8. 瑞萨单片机之电压检测器(低压复位)(六)

    目录 一.电压检测器的作用 二.电压检测器如何使用 一.电压检测器的作用 顾名思义,电压检测器就是用来检测电压的,电压检测器将检测到的电压与电源电压进行比较,比较完成后执行相应的动作:复位.复位&am ...

  9. 瑞萨单片机CAN口复用唤醒

    瑞萨单片机CAN口复用唤醒 瑞萨单片机睡眠模式 CAN总线唤醒的原理 外部GPIO口唤醒步骤 注意事项 目前笔者在公司实习接触到了瑞萨单片机 经过了一个月的踩坑已经对瑞萨单片机的开发有了一定的了解,现 ...

最新文章

  1. 67)vector的begin() end() 和 front() back()的区别 rbegin() rend()
  2. 安全专家:恶意软件盯上苹果Mac机用户
  3. 遇到 HTTP 错误 403.14 - Forbidden?
  4. 总结:ps aux指令
  5. boost::leaf::function_traits用法的测试程序
  6. linux usb ga驱动详解,Linux设备驱动之内存映射
  7. vue 计算文件hash值_vue的hash值原理,也是table切换。
  8. oracle数据库函数手册,Oracle分析函数参考手册(转)
  9. 【youcans 的 OpenCV 例程 200 篇】105. 湍流模糊退化模型
  10. ElasticSearch范围查询(英文检索)
  11. dcmtk在PACS开发中的应用(基础篇) 作者:冷家锋 第四章 工作列表(Work List)(二)...
  12. http请求头中包含未编码中文时webapi self host崩溃
  13. C#启动前为所有的Form设置统一的Icon
  14. 最新黑马程序员全套视频-.net视频,大家赶紧来下载吧,看图片水印上的QQ加我索取视频教程
  15. 大数据之编程语言:Scala视频教程-陈超-专题视频课程
  16. 四级信息安全工程师基础知识
  17. 浅谈新一代PGIS技术在智慧消防中的创新应用
  18. 一个dsp最小系统至少要有_DSP最小系统原理图设计
  19. 如何写一份前端开发简历
  20. cpu个人训练四 K 打地鼠游戏

热门文章

  1. 【读书笔记】《认知觉醒》- 周岭
  2. 书店售书管理系统(二)
  3. GTJ2018如何导出全部工程量_工程小达人:学习广联达GTJ2018,就用一站式Bim土建计量智能手册...
  4. EEGNET:开源的可视化分析脑网络工具
  5. android BLE蓝牙详细讲解(一)
  6. 程序隐藏助手下载//老板键下载//上班开小差工具
  7. 今天面了个腾讯拿25K出来的,让我见识到了开发基础的天花板
  8. RabbitMQ安装Erlang安装 windows
  9. 彻底解决诺基亚E71接电话死机的方法
  10. 金仓数据库KingbaseES服务启动方法