动态数码管原理解释及多种写法,消影
动态数码管涉及到很多写法;原理其实和点LED差不多,都是通过寄存器,找到引脚,对二极管进行点亮。
相比之下,管子多了,因此无法一次控制这么多,那不得写死你。
这是就需要借助芯片控制
38译码器
通过P22,P23,P24来控制数码管,一次只能控制一个数码管//注意,这是第几个就是一个8,位选;
ABC输入,右边的LED是输出端
二进制转化为十进制
000 0 控制第一个
001 1 控制第二个
010 2
011 3
前面的数是对应ABC来控制后面的LED,这涉及进制转换,后期会讲。
P00,P01,P02这些就是段选,控制内部的小数码管;
有一位大佬曾说过,单片机就是通过软件控制寄存器(那些P口)从而来控制硬件的;
/**************************************************************************************
实验现象:下载程序后"动态数码管模块"从左至右显示0-7
接线说明: 单片机-->动态数码管模块(具体接线图可见开发攻略对应实验的“实验现象”章节)注意事项:
***************************************************************************************/#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名 : DigDisplay
* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<8;i++){switch(i) //位选,选择点亮的数码管,{case(0):LSA=1;LSB=1;LSC=1; break;//显示第0位case(1):LSA=0;LSB=1;LSC=1; break;//显示第1位case(2):LSA=1;LSB=0;LSC=1; break;//显示第2位case(3): LSA=0;LSB=0;LSC=1; break;//显示第3位case(4):LSA=1;LSB=1;LSC=0; break;//显示第4位case(5):LSA=0;LSB=1;LSC=0; break;//显示第5位case(6):LSA=1;LSB=0;LSC=0; break;//显示第6位case(7):LSA=0;LSB=0;LSC=0; break;//显示第7位 }P0=smgduan[i];//发送段码delay(100); //间隔一段时间扫描 P0=0x00;//消隐}
}/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{ while(1){ DigDisplay(); //数码管显示函数 }
}
这种写法我是不太喜欢的,不灵活。要改动的话要在大函数中改,说实话,这是我第一次感受到子函数非常好用
#include <REGX52.H>//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//延时子函数
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}//数码管显示子函数
void Nixie(unsigned char Location,Number)
{switch(Location) //位码输出{case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number]; //段码输出Delay(1); //显示一段时间P0=0x00; //段码清0,消影
}void main()
{while(1){Nixie(1,1); //在数码管的第1位置显示1
// Delay(20);Nixie(2,2); //在数码管的第2位置显示2
// Delay(20);Nixie(3,3); //在数码管的第3位置显示3
// Delay(20);}
}
这种是比较灵活的,可以比较简单的调节。C语言要学好,很好的利用子函数。
另外还有一个消隐的问题
Nixie(1,1); //在数码管的第1位置显示1
Delay(20);
Nixie(2,2); //在数码管的第2位置显示2 Delay(20);
Nixie(3,3); //在数码管的第3位置显示3
Delay(20);
这个延时放在子函数比较好,
位选 段选 清零 位选 段选 位选 段选
计算机程序是一步步执行的,但是他的速度太快了,上一位的数据跟着段选命令蹿到了下一位,就会出现问题,
这时清零,就没有数据可以被带到下一位了,就不会出问题了。
嘿嘿,下面的代码能显示1314520;
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{unsigned char i, j;while(xms--){i = 12;j = 169;do{while (--j);} while (--i);
}
}unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void Nixie(unsigned char Location,Number)
{switch(Location){case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break; }P0= NixieTable[Number];
// Delay(1);P0=0x00;}void main()
{while(1){Nixie(1,1);
// Delay(100);Nixie(2,3);
// Delay(100);Nixie(3,1);
// Delay(100);Nixie(4,4);
// Delay(100);Nixie(5,5);
// Delay(100);Nixie(6,2);
// Delay(100); Nixie(7,0);
// Delay(100);}
}
动态数码管原理解释及多种写法,消影相关推荐
- 51单片机静态数码管和动态数码管原理及实验
数码管实验 数码管 多位数码管,即是两个或两个以上单个数码管并列集中在一起形成一体的数码管.当多位一体时,它们内部的公共端是独立的,而负责显示什么数字的段线全部是连接在一起的,独立的公共端可以控制多位 ...
- 51单片机~动态数码管的显示,消影,消抖,静态扫描,动态扫描,由浅入深,原理代码
动态数码管的显示,由浅入深,原理 (一)视觉暂留: code存储在程序存储器里,表示只读,不加code的数组存在内存里可读可写. #include"reg52.h"typedef ...
- 单片机原理与应用技术(三)———动态数码管显示汇编语言
一.数码管基础知识 1.数码管结构 一般数码管通常由八段LED灯组成,又分成共阳数码管和共阴数码管(如下图所示).共阴极数码管即为LED阴极连接在一起为公共阴极,共阳极数码光即为LED阳极连接在一起为 ...
- java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...
Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...
- 数字IC-1.8 子模块组建整模块-动态数码管设计代码实例
感谢野火开源教程的支持!EmbedFire – 东莞野火电子技术有限公司 本实验采用阳极6位数码管,其中段选是共用的. 一.实验目标 让六位数码管显示从十进制数 0 开始计数,每 0.1s 加 1,一 ...
- 【STC单片机学习】第七课:单片机控制静态/动态数码管
[朱老师课程总结 侵删] 第一部分.章节目录 1.7.1.什么是数码管 1.7.2.静态数码管的初步驱动 1.7.3.静态数码管显示数字 1.7.4.让数码管依次显示0到f 1.7.5.动态数码管 1 ...
- 6.0 动态数码管 _ [AT89C51/2] [从零开始的单片机]
数码管简介 上一个实验是静态数码管实验,动态和静态所用的数码管都一样,在开发板上是2个四位一体的共阴数码管,唯一的区别是要不断更改输入的电平,从而达到动态的效果. 这里所说的动态并不完全是动态.这里的 ...
- kafka原理_Kafka动态配置实现原理解析
总 第19篇 2019年 第15篇 一.问题导读Apache Kafka在全球各个领域各大公司获得广泛使用,得益于它强大的功能和不断完善的生态.其中Kafka动态配置是一个比较高频好用的功能,下面我们 ...
- Objective-C中,ARC下的 strong和weak指针原理解释
Objective-C中,ARC下的 strong和weak指针原理解释 提示:本文中所说的"实例变量"即是"成员变量","局部变量"即是& ...
最新文章
- Android组件化初探
- JS调用打印机打印Web页面
- 26 WM配置-策略-入库策略6-定义批量仓储的策略B(Bulk Storage Strategy)
- 019,Intelidea右键新建选项没有Java class选项
- Leetcode每日一题:327.count-of-range-sum(区间和的个数)
- UVA 583 素数打表(线性)
- 2020国际机器翻译大赛:火山翻译力夺五项冠军
- 《黑客大曝光:移动应用安全揭秘及防护措施》一3.1 了解iPhone
- 工商银行计算机网银不能连接u盾,工商银行网银U盾无法识别怎么办
- 邮箱地址是什么,163vip.com怎么注册、价格、申请入口、功能!
- Navicat自动运行批处理作业并发送附件邮件
- 《金山词霸2009 牛津版》插件工具加载
- 李飞飞学生新作:利用场景图生成图像
- 有备无患!DBS高性价比方案助力富途证券备份上云
- java mysql点赞功能_用Java做一个类似于微博QQ空间点赞的功能-Fun言
- 【MySQL 数据库】JDBC 编程之 Java 连接 MySQL
- apriori算法 python实现
- python 关联规则
- Linux Socket学习(十二)
- PDF如何生成电子书分享