数码管

单片机运用,七段数码管如何用单片机控制

自作多情 提交于 2020-01-08 10:44:56
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 相信大家都见过数码管,数码管上面有abcdefg七个笔画,构成一个“日”字。那么它在单片机电路上一般是起什么作用呢?数码管都知道它是半导体发光器件,那么它的具体原理你知道多少?本文将会逐步解析这些问题,给你还原一个真实的数码管。 数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元DP(decimal point),其基本单元是发光二极管。数码管是一类价格便宜使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示的参数的器件。 在电器特别是家电领域应用极为广泛,如显示屏、空调、热水器、冰箱等等。绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。 数码管常用段数一般为7段有的另加一个小数点,还有一种数码管是类似于3位“+1”型。数码管位数有半位,1,2,3,4,5,6,8,10位等等。..。,数码管根据LED的接法不同分为共阴和共阳两类,了解数码管的这些特性,数码管对编程是很重要的,因为不同类型的数码管,除了数码管的硬件电路有差异外,数码管编程方法也是不同的。数码管的发光原理是一样的,只是数码管的电源极性不同而已。数码管颜色有红,绿,蓝,黄等几种。数码管广泛用于仪表

数码管显示

陌路散爱 提交于 2020-01-05 02:59:12
.NET MF系列目录: http://www.cnblogs.com/lscy/archive/2012/08/23/2651768.html LG3641BH 一、设备介绍 LG3641BH数码管的资不好找,在网上找到一些,跟大家分享一下。 引脚定义: 1-E 2-D 3-H 4-C 5-G 6-COM1 7-B 8-COM2 9-COM3 10-F 11-A 12-COM4 LG3641BH是共阳数码管,关于共阳数码管和共阴数码管: 3614A是共阴级,3641B是共阳级。共阴极数据码是为ABCDEFGH输出高电平,COM1~4输出低电平,共阳极正好相反。 更多资料,请大家查到后,共同分享。 二、数码管显示原理 数码管原理如图: 每一个8字,分为ABCDEFG7段和右下角一个点H,共8段。每一段对应于探索者上一个引脚。然后,COM1~4是对应于显示第几个数字,顺序从右往左。 看到这里,可能会比较奇怪,为什么数码管是四个数字共用一个组ABCDEFGH?嘿嘿,自己查相关资料,不作过多描述。 那么程序中应该如何控制呢? 举例说明:比如要让最后边的数字显示数字7。 1. 确定7对应哪几个引脚:A B C 2. 使COM1输出高电平 (取决于数码管共阳极) 3. 使ABC三个引脚输出低电平 4. 让COM1和ABC恢复原样,重复2,3两步。 5. 由于人眼识别有视频暂留的影响

数码管和灯

不想你离开。 提交于 2020-01-05 02:54:42
对 led 中所涉及到的几个地址的说明: #define CS1BASE (0x11000000) #define SEGP ((0x10000000+0x248)) #define DIGIP ((CS1BASE+0x0800)) #define LEDP ((CS1BASE+0x 0C 00)) 上述几个值都是由硬件设计人员给出的。其中, DIGIP 为位寄存器地址(总共有 8 个数码管,用来控制要对哪个数码管进行操作); SEGP 为段寄存器地址(其作用有两个:一是控制某个数码管的具体显示内容;二是设定要控制哪个灯 ); LEDP 为控制灯的亮与灭(即只存在两个有效的值:0和1) 例子如下: void myledtest() { //数组的内容分别为:8 7 6 unsigned long int tt[ 3 ] = { 0x0000fe , 0x0000e0 , 0x0000be }; int i = 0 ; while (i < 3 ) { //所有数码管的显示清空,即不显示 * (unsigned short * )(DIGIP) = 0x00 ; //指定数码管显示的内容 * (unsigned short * )(SEGP) = tt[i]; //指定用哪个数码管来显示 * (unsigned short * )(DIGIP) = 0x0080 >> i; i ++

数字秒表(键盘+数码管)

大憨熊 提交于 2020-01-05 02:23:27
差不多最近三天都在忙着调试秒表这个程序,其实昨天就能实现秒表的功能的,就是键盘这里出现的问题,当按键下去时,秒表没有停止计数,我很仔细检查了键盘消抖模块,觉得应该没什么问题,这个模块在前面的johnson计数器中用过,消抖情况良好,没有一点抖动!那到底是什么问题呢? 接下来差不多一天时间里,都在思考这个问题,我还是觉的是计数模块出了问题,为什么键盘按下去没有停止计数呢?起初,我还在想,我让分频时钟停下来,不就可以了吗?往往想法是好的,但是实践起来,却事与愿违,现在体会到了实践的重要性,这样还是不能解决,那应该用什么方法解决了?我上网查了很多资料,还是没什么实质的办法。今天突然想到是不是按键下去的值必须用一个寄存器保存起来,不然,当手动开后,按键值状态发生变化,又开始计数,所以键盘按下去没反应!我通过验证,果然是这个原因,现在键盘终于按下去有反应了,秒表终于弄好了! //程序实现的功能:秒表(数码管+键盘),当key1按下时,停止计数,当key2按下时,开始计数! //复位键按下时,数码管清零; //顶层模块; module miao_biao ( sysclk, rst_b, key1, key2, smg_sel, smg_data ); input sysclk; //系统时钟 50MHZ input rst_b; //复位:低电平有效; input key1; //key1:

数码管、按键、定时器、ds18b20综合应用

断了今生、忘了曾经 提交于 2020-01-01 00:53:01
利用 8051 单片机设计秒表,包括 3 个按键、3 位数码管。按键分别用于启动、暂停、 显示学号,显示温度,时间用数码管显示。开始后显示学号后 3 位。按启动键下后,显示 0.00 以 0.01 秒的频率从 0.00 递增,期间按暂停键时暂停,再次按暂停继续递增,当递增到 9.99 以后循 环。按显示学号键,显示学号。 1、电路仿真: 2、程序设计: (1)项目结构: (2)主函数: #include <reg52.h> #define uchar unsigned char #define uint unsigned int #include<display.c> #include<key.c> #include<DS18B20.C> unsigned int cp; void display(void); void key(void); /*Timer0中断服务函数*/ void timer0_isr(void) interrupt 1 { TH0=(65535-2000)/256; //重装初值 TL0=(65535-2000)%256; //重装初值 cp++; //2000代表2ms,1000ms=1s if(mode == 2)cp=0;//按下暂停按键后,mode为2 else{ if(cp>=5) //0.01s到了 { cp=0; xiaoshu++; } if

STM32ZET6学习记录之数码管部分

↘锁芯ラ 提交于 2019-12-26 12:35:10
开发板原理图 上图可以看到数码管是共阳连接,说明给一个低电平的时候数码管的相应段会被点亮。 相关的准备工作和LED总体类似(因为数码管和LED用的线路是相同的都是GPIOC的前八个引脚) 区别只在定义宏的时候将LED_PORT_RCC\LED_PORT\LED_PIN改为SMG_PORT_RCC\SMG_PORT\SMG_PIN即可,其余均完全类似,挂接总线和初始化的管脚操作均类似。 当然为了方便管理和提高程序的可移植性我们还是创建了一个名为SMG的文件夹。(在魔术棒中配置相应的编译路径)。 之后将初始化函数调用到主函数中即可。 以上都是和LED实验的相似点。 之后不同的是,我们用数码管显示一般通过 void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) 函数。该函数可以对指定的GPIOx进行值写入,也就是批量。通常我们会使用好几段数码管来显示我们的目标。再使用ResetBits和SetBits函数会很繁琐。 此时我们可以将我们要显示的目标转换成数码管中对应的二进制,换算成16进制的数,保存在一个数组当中,之后我们再对数组进行调用即可。 因为数码管分共阳和共阴连接。但是我们不必写两组数组。 我们可只写共阴的数组,若是共阳解法我们就取反,共阴就直接调用即可。 /***********************************

Verilog 实现数码管闪烁显示

a 夏天 提交于 2019-12-18 04:24:40
实现数码管闪烁显示不是简简单单地和一个2hz的闪烁信号相与,我在这里用了使能端的思想,通过把一个闪烁信号传递到使能端,来使数码管闪烁。 使能端可以做很多事的 module segflitter ( clk , segled , cat , enable ) ; input enable ; input clk ; output reg [ 7 : 0 ] cat ; output reg [ 6 : 0 ] segled ; //段选7duan reg [ 2 : 0 ] pianxuan ; //4个 reg [ 6 : 0 ] seg [ 9 : 0 ] ; initial //共阴极 begin seg [ 0 ] = 7 'b1111110 ; seg [ 1 ] = 7 'b0110000 ; seg [ 2 ] = 7 'b1101101 ; seg [ 3 ] = 7 'b1111001 ; seg [ 4 ] = 7 'b0110011 ; seg [ 5 ] = 7 'b1011011 ; seg [ 6 ] = 7 'b1011111 ; seg [ 7 ] = 7 'b1110000 ; seg [ 8 ] = 7 'b1111111 ; seg [ 9 ] = 7 'b1111011 ; end initial begin cat = 8 'hef ; /

数逻实验七段数码管相关要点

廉价感情. 提交于 2019-12-11 06:26:11
(这篇文章不是为了科普,而是为了记住我在复习数逻实验时的一些以前没有的发现或者猜想。作为一位小白,里面难免会有错误和不成熟的想法。) 通过复杂的逻辑分析和卡诺图化简,不难得出七段数码管每个管的逻辑等式。 输入D0——D3控制表达的数,4位,可以表示0~F(16进制),point控制小数点,LE控制使能。 整个逻辑图如上图所示,通过AN0~AN3控制四个七段数码管的亮灭,MyMC14495负责将输入的二进制数转化为可以显示在数码管上的信号。 这里有点特别的地方。动态扫描显示,也叫时分复用显示,利用人眼视觉残留,一个7段码译码电路分时为每个7段码提供译码。 肉眼观察,只是感觉当拨动某个AN所分配的开关后数码管会亮或者灭,但实际上是通过分时扫描显示来实现。 在这个实验中,仅仅要求显示数字,四个数码管显示的是同一个数字,(四组七段数码管同一位置的数码管所分配的引脚应该是相同的)所以不需要考虑通过分时利用一个七段译码电路,而在接下来的实验里,会通过一个控制信号来实现AN的时分复用显示控制方法。 下一个实验:四个七段数码管显示四个不同的数字 首先的一个4位四选一扩展MUX4to1b4开始让我迷惑了好久,后来仔细想想,其实是这样: 给定的I0,I1,I2,I3是四个要显示的数,每个数都是4位,这样假设选择信号是00,会选择那四组与门中每组的最上面一个值,这样就把I0给选出来了

小蜜蜂单片机03-共阳数码管的静态显示

人盡茶涼 提交于 2019-12-07 17:46:13
要求8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0 ~F的值,如此往复。 训练重点:1、弄清楚数码管的段码与显示数值之间的关系 2、共阳数码管的基本控制方法,特别是弄清楚com端与显示码的关系。 come端口控制数码管的位置。而come端口是通过一个锁存器的P0端口输入来控制的,但前提是138译码器的输出值要选中这个锁存器,才能使P0口输入的值给了输出。 同样的数码管的段码也是由一个锁存器控制的,而锁存器只要当38译码器输出值选中这个锁存器才能使P0端口的输入给输出。 先考虑如何使一个数码管显示,假设要让come1的数码管显示6 # include "reg52.h" void Delay ( unsigned int t ) { while ( t -- ) ; while ( t -- ) ; } void InitHC138 ( unsigned char channel ) { switch ( channel ) { case 4 : P2 = ( P2 & 0x1f ) | 0x80 ; break ; case 5 : P2 = ( P2 & 0x1f ) | 0xa0 ; break ; case 6 : P2 = ( P2 & 0x1f ) | 0xc0 ; break ; case 7 : P2 = ( P2 & 0x1f ) | 0xe0

【蓝桥杯|单片机组】| 数码管与LED流水灯动态显示

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-04 17:54:32
void LedScan() { /*数码管操作*/ static unsigned char i=0; static bit ledflag=0; static unsigned char j=0; P2=(P2&0X1F)|0X80; P0=0XFF; P2&=0X1F; P2|=0X90; P0=0XFF; P2&=0X1F; P2&=0X1F; P0=0X80>>i; P2|=0XC0; P2&=0X1F; P0=LedBuff[i]; P2|=0Xe0; P2&=0X1F; /*LED操作*/ if(led1000>=1000) { led1000=0; if(ledflag==0) { P0=~(0X01<<j); //LED亮 P2|=0X90; P2&=0X1F; ledflag=1; j++; // j 自加的位置很关键,若置于与led1000同一位置内,小灯一次点亮的顺序是LED1->LED3->LED5->LED7 } // 这是因为小灯在熄灭的同时j也会自加一次,从一个LED到下一个LED实际j自加了两次 else if(ledflag==1) { P0=0xff; //LED 灭 P2|=0X90; P2&=0X1F; ledflag=0; } if(j==8) j=0;} i++; if(i==8) i=0; } 讲LedScan()置于中断函数即可