数码管动态显示数字
在数码管上动态显示矩阵键盘数字

/**********************************************程序功能:在数码管上动态显示矩阵键盘数字***********************************************/#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define LED_IN_USE 8//共阴极数码管7位段码:0--fuchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar led_Buf[LED_IN_USE]; // LED显示缓冲区,// 存放要显示数据uchar led_Ctrl;//记录显示位数的全局变量uchar key_Pressed; //按键是否被按下:1--是,0--否uchar key_val; //存放键值uchar key_Flag; //按键是否已放开:1--是,0--否//设置键盘逻辑键值与程序计算键值的映射uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};uchar Dispbuf[2];/******************************************************* * 模块初始化*******************************************************/ void init_LED(void){//uchar tmpv;P5DIR = 0xff; //设置P5的IO方向为输出P3DIR |= 0x18; //设置P3.3 P3.4的IO方向为输出P3OUT &= 0xe7;//设置P3.3 P3.4为0,关闭两锁存器P5OUT = 0x00;//设置P5的输出初值led_Ctrl = 0; // led_Ctrl用于控制哪个LED可显示//for(tmpv=0;tmpv<LED_IN_USE;tmpv++)//{ // 初始化缓冲区,可放入主函数//led_Buf[tmpv] = 0;// }}void led_Display(){//P5DIR = 0xff; //设置P5的IO方向为输出//P3DIR |= 0x18; //设置P3.3 P3.4的IO方向为输出//P3OUT &= 0xe7;//设置P3.3 P3.4为0,关闭两锁存器//P5OUT = 0x00;//设置P5的输出初值P5OUT = scandata[Dispbuf[led_Ctrl]]; // 设置显示值P3OUT |= 0x10; // 打开数据锁存器P3OUT &= 0xef; // 关闭数据锁存P5OUT = ~(1 << (led_Ctrl)); // 设置哪只LED显示P3OUT |= 0x08; // 打开控制锁存P3OUT &= 0xf7; // 关闭控制锁存led_Ctrl++;if(led_Ctrl == 2) led_Ctrl = 0; // 设置下一个要显示的LED}/*******************************************函数名称:Init_Keypad功能:初始化扫描键盘的IO端口参数:无返回值:无********************************************/void Init_Keypad(void){P1DIR = 0xf0; //P1.0~P1.3设置为输入状态, P1.4~P1.7设置为输出状态P1OUT |= 0xf0; // P1.4~P1.7输出高电平key_Flag = 0;key_Pressed = 0;key_val = 0;}/********************************************** Check_Key(),检查按键,确认键值*********************************************//*******************************************函数名称:Check_Key功能:扫描键盘的IO端口,获得键值参数:无返回值:无********************************************/void Check_Key(void){uchar row ,col,tmp1,tmp2;tmp1 = 0x80;for(row = 0;row < 4;row++) //行扫描{P1OUT = 0xf0; //P1.4~P1.7输出全1P1OUT -= tmp1; //P1.4~p1.7输出四位中有一个为0tmp1 >>=1;if ((P1IN & 0x0f) < 0x0f) //是否P1IN的P1.0~P1.3中有一位为0{tmp2 = 0x01; // tmp2用于检测出那一位为0for(col = 0;col < 4;col++) // 列检测{if((P1IN & tmp2) == 0x00) // 是否是该列,等于0为是{key_val = key_Map[row * 4 + col]; // 获取键值return; // 退出循环}tmp2 <<= 1; // tmp2左移1位}}}}/*******************************************函数名称:delay功能:延时约15ms,完成消抖功能参数:无返回值:无********************************************/void delay(){uint tmp;for(tmp = 12000;tmp > 0;tmp--);}/*******************************************函数名称:Key_Event功能:检测按键,并获取键值参数:无返回值:无********************************************/void Key_Event(void){uchar tmp;P1OUT &= 0x00; // 设置P1OUT全为0,等待按键输入tmp = P1IN; // 获取p1INif ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下{key_Pressed = 1; // 如果有按键按下,设置key_Pressed标识delay(); //消除抖动Check_Key(); // 调用check_Key(),获取键值}else if ((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放{key_Pressed = 0; // 清除key_Pressed标识key_Flag = 1; // 设置key_Flag标识}else{_NOP();}}/********************主函数********************/void main(void){WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次IE1 |= WDTIE; // 使能看门狗中断init_LED();_EINT(); //打开全局中断Init_Keypad();while(1){Key_Event();if(key_Flag == 1){key_Flag = 0;Dispbuf[0] = key_val / 10;Dispbuf[1] = key_val % 10;}}// _BIS_SR(GIE);//_BIS_SR(LPM3_bits + GIE); //CPU进入LPM3低功耗模式,同时打开全局中断//_BIS_SR(CPUOFF+ GIE); //进入LPM0//_BIS_SR(LPM0_bits + GIE); //进入LPM0 }/*******************************************函数名称:watchdog_timer功能:看门狗中断服务函数,在这里输出数码管的段选和位选信号参数:无返回值:无********************************************/#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){led_Display();}。
数码管动态显示数字

DisplayData[i]=DIG_CODE[i];
}
while(1)
{
DigDisplay();
}
}
void DigDisplay()
{
unsigned char i,j;
for(i=0;i<8;i++)
{
GPIO_PLACE=DIG_PLACE[i];//位
GPIO_DIG=DisplayData[i];//段
/***********************用译码器*******************************************/
#include<reg51.h>
#define GPIO_DIG P0
sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2;
unsigned char code DIG_COD,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char DisplayData[8];
//用来存放要显示的8位数的值
//--声明全局函数--//
void DigDisplay(); //动态显示函数
void delay(unsigned int t);
//main函数
void main()
{
unsigned char i;
for(i=0;i<8;i++)
{
unsigned char a, b;
数码管的动态显示原理及应用

数码管的动态显示原理及应用1. 数码管简介数码管是一种用于显示数字和符号的电子器件,常见的包括七段数码管、八段数码管等。
它由许多发光二极管(LED)组成,每个LED代表一个数字或符号。
数码管广泛应用于电子设备、仪器仪表等领域,具有直观、易读、低功耗等优点。
2. 数码管的工作原理数码管的工作原理主要依靠电流和电压的控制,通过控制每个LED的亮灭状态,实现数字和符号的显示。
数码管通常由多个LED组成,每个LED分别代表一个数字或符号。
在数码管中,每个LED的正极(阳极)接通位线,而负极(阴极)则分别连接到不同的控制引脚。
通过控制这些引脚的高低电平,可以控制相应的LED点亮或熄灭。
2.1 驱动方式数码管的驱动方式分为静态和动态两种。
静态驱动方式是指每个LED的亮灭状态不变,即只显示一个数字或符号。
动态驱动方式是通过快速地改变LED的亮灭状态,以达到显示多个数字或符号的效果。
2.2 动态显示原理动态显示原理是指通过快速地改变LED的亮灭状态,使人眼产生视觉暂留效应,从而在有限的时间内显示多个数字或符号。
动态显示使用了时间分片的原理,即将一个显示周期分为多个时间片段,在每个时间片段内只显示一个数字或符号。
通过控制每个时间片段内不同LED的亮灭状态,可以实现数字或符号的动态切换。
3. 数码管的应用数码管由于其直观、易读的特点,在各行各业都有广泛的应用。
3.1 仪器仪表数码管在仪器仪表领域得到广泛应用,例如数字万用表、电子测量仪器等。
它们通过控制不同的LED点亮或熄灭,可以直观地显示测量结果、电压、电流等信息。
3.2 数字时钟数码管常被用于制作数字时钟。
通过控制每个LED的亮灭状态,可以实时显示小时、分钟、秒等信息,方便人们了解当前的时间。
3.3 电子秤数码管还广泛应用于电子秤。
它们通过控制LED的亮灭状态,实时显示被称量物体的重量,方便人们进行称重工作。
3.4 电子计数器数码管常被用于制作电子计数器。
通过控制LED的亮灭状态,可以实时显示计数结果,常见于工业自动化、交通信号灯等领域。
数码管 动态显示原理

数码管动态显示原理
数码管的动态显示原理是通过快速地切换数字的显示段来实现连续的数字显示。
数码管通常由7个显示段构成,分别代表数字0-9的不同显示形式。
这些段也被称为a、b、c、d、e、f和
g段。
在动态显示过程中,每个数字被逐个切换显示的时间非常短,通常为几毫秒。
这个时间非常短,以至于人眼无法察觉数字的切换。
因此,当多个数码管以高速切换显示数字时,人眼会感觉到所有数码管上的数字同时显示。
要实现动态显示,需要使用一个计数器来控制切换显示的时间。
这个计数器通常是一个定时器,它会以一定的频率触发中断,每次中断时触发一次显示切换。
通过不断增加计数值,可以控制不同数字的显示时间。
为了显示一个多位数,需要使用多个数码管并连接到控制器上。
控制器会根据待显示的数字,将适当的段信号发送到对应的数码管上。
通过在不同的数码管上切换显示,就可以实现多位数的动态显示。
动态显示的基本原理如下:
1. 设置初始的数码管选择位,使其对应第一个数码管。
2. 将第一个数码管对应的段信号置为显示的数字。
3. 延时一段时间,使人眼无法察觉到数字的切换。
4. 将第一个数码管的段信号置为低电平(或不显示的状态)。
5. 设置下一个数码管的选择位,使其对应下一个数码管。
6. 重复2-5步骤,直至所有数码管都完成一轮显示。
7. 返回第一步,重复整个过程,以实现连续的动态显示。
通过以上步骤的循环,不断切换显示的数字会给人一种连续而平滑的显示效果。
这就是数码管动态显示的基本原理。
数码管动态数字显示

LED数码管动态显示共阳极的LED数码管,共阳就是7段的显示字码共用一个电源的正。
原理示意图:从上图可以看出,要是数码管显示数字,有两个条件:1、是要在VT端(3/8脚)加正电源;2、要使(a,b,c,d,e,f,g,dp)端接低电平或“0”电平。
这样才能显示的。
例:如要显示“0”,则要 a,b,c,d,e,f六个字段亮就显示“0”了,而g和dp字段不亮;这样只要向P0口送出相应的代码即可,编码方法如下表:程序使用时,只需将显示数字所对应的编码送P0口,然后打开相应的数码管显示位的电源控制即可显示相应的字符。
5双位数码管显示控制程序START: MOV R0,#0 ;清零MOV DPTR,#TABLE ;指定查表起始地址LOOP: ACALL DISPLAY ;调用子程序DISPLAY INC R0 ;R0加1CJNE R0,#100,LOOP ;R0未到100则转换JMP START ;跳转DISPLAY: MOV A,R0 ;把R0里的数据送入A MOV B,#10 ;把10送入BDIV AB ;a b相除MOV 20H,A ;十位送入20HMOV 21H,B ;个位送入21HMOV R3,#50 ;把50送入R3LOOP1: MOV A,21H ;取个位数ACALL CHANG ;调用子程序CHANG CLR P2.4 ;开个位显示ACALL DLY ;调用子程序DLYSETB P2.4 ;关闭个位显示MOV A,20H ;取十位数6ACALL CHANG ;调用子程序CHANGCLR P2.5 ;开十位显示ACALL DLY ;调用子程序DLYSETB p2.5 ;关闭十位显示DJNZ R3,LOOP1 ;循环50次RET ;子程序返回CHANG: MOVC A,@A+DPTR ;查表MOV P0,A ;查表结果送入P0RET ;子程序返回DLY: MOV R6,#20 ;典型延时子程序延时D1: MOV R7,#248 ;10msDJNZ R7,$DJNZ R6,D1RETTABLE: DB 0C0H,0F9H,0A4H ;表数据共阳极数码管显示代码 DB 0B0H,99H,92H,82HDB 0F8H,80H,90HEND。
数码管动态扫描显示01234567

实验5 数码管动态扫描显示01234567原理图:8个数码管它的数据线并联接到JP5, 位控制由8个PNP型三级管驱动后由JP8引出。
相关原理:数码管是怎样来显示1,2,3,4呢?数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。
我们分别把他命名为A,B,C,D,E,F,G,H。
搞懂了这个原理, 我们如果要显示一个数字2, 那么 A,B,G,E,D这5个段的发光管亮就可以了。
也就是把B,E,H(小数点)不亮,其余全亮。
根据硬件的接法我们编出以下程序。
当然在此之前,还必须指定哪一个数码管亮,这里我们就指定最后一个P2.7。
LOOP:CLR P2.7 ;选中最后的数码管SETB P0.7 ;B段不亮SETB P0.5 ;小数点不亮SETB P0.1 ;C段不亮CLR P0.2 ;其他都亮CLR P0.3CLR P0.4CLR P0.6CLR P0.0JMP LOOP ;跳转到开始重新进行END把这个程序编译后写入单片机,可以看到数码管的最后一位显示了一个数字2。
也许你会说:显示1个2字就要10多行程序,太麻烦了。
显示数字2则是C,F,H(小数点)不亮,同时由于接法为共阳接法,那么为0(低电平)是亮为1(高电平)是灭。
从高往低排列,(p0.7_p0.0)写成二进制为01111110, 把他转化为16进制则为A2H。
我们可以根据硬件的接线把数码管显示数字编制成一个表格, 以后直接调用就行了。
有了这个表格上面显示一个2的程序则可简化为:LOOP:CLR P2.7 ;选中左边的数码管MOV P0,#0A2H ;送数字2的代码到P0口JMP LOOP ;跳转到开始重新进行END原理图中把所有数码管的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。
CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,由8个PNP的三极管,来控制这8位哪一位工作,例如上面的例子中我们选中的是P2.7.就是最后的一位亮了. 同样的如果要第一位亮, 只需要把程序CLR P2.7改为CLR P2.0即可。
动态数码管显示原理

动态数码管显示原理
动态数码管显示原理是通过在特定的时间序列下,逐个刷新数码管的每一位来显示数字的。
数码管由七段LED组成,包括a、b、c、d、e、f、g七段。
根据7段LED的不同亮灭组合方式,可以显示0~9的数字,
以及一些字母和符号。
每一位数码管的显示由控制信号控制。
动态数码管的显示原理是,通过快速地逐个刷新每一位数码管的显示,给人造成多个数码管同时显示的错觉。
这需要两个关键信号:位选信号和段选信号。
位选信号是用于选择要显示的数码管的信号。
它连接到数码管的选择引脚,通过逐个地将相应的数码管的选择引脚置为低电平,来选择要显示的数码管。
段选信号是用于控制每一位要显示的数字的信号。
它连接到数码管的a、b、c、d、e、f、g七个引脚,通过对应的引脚组合,可以控制每一位显示相应的数字。
在动态数码管显示中,根据显示的需要,以一定的时间间隔连续切换不同的位选信号,同时通过段选信号控制每一位显示相应的数字。
这样,在切换速度较快的情况下,人眼会觉得多个数码管配合闪烁,呈现出完整的数字显示效果。
通过这种原理,可以实现在有限的数码管上显示多位数字,例如时钟、计时器等。
但需要注意的是,由于刷新速率较快,人
眼感觉到的是同时显示,因此要确保刷新频率足够高,以避免出现闪烁或者模糊的现象。
数码管动态显示,显示从1到9,每一位显示一个数字(单片机)

数码管动态显⽰,显⽰从1到9,每⼀位显⽰⼀个数字(单⽚机)//object: 动态显⽰数码管,从1显⽰到9//writer:mike//time: 2020,11,14#include<reg52.h>sbit wei = P2^7;sbit du = P2^6;//数组的类型指的是每⼀个元素的类型, code则指定存储在代码区,⽽⾮code 指存户在内存中。
unsigned int code data1[10] = {0x3F,//00x06,//10x5B,//20x4F,//30x66,//40x6D,//50x7D,//60x07,//70x7F,//80x6F//9};void delay(unsigned int);void main(){while(1){//⾸先打开位选wei = 1;P0 = 0xfe; //让第⼀位显⽰//关闭位选wei = 0;//打开段选du = 1;//显⽰数字1P0 = data1[1];//关闭段选du = 0;//点亮第⼀位之后,延时⼀段时间delay(1);//针对第⼆位数码管//打开位选wei = 1;//设置位选P0 = 0xfd;//关闭位选wei = 0;//打开段选du = 1;//设置段选P0 = data1[2];//关闭段选du = 0;delay(1);//针对第三位数码管//打开位选wei = 1;//设置位选P0 = 0xfb;//关闭位选wei = 0;//打开段选du = 1;//设置段选P0 = data1[3];//关闭段选du = 0;delay(1);//针对第四位数码管//打开位选wei = 1;wei = 0;//打开段选du = 1;//设置段选P0 = data1[4];//关闭段选du = 0;delay(1);//针对第五位数码管 //打开位选wei = 1;//设置位选P0 = 0xef;//关闭位选wei = 0;//打开段选du = 1;//设置段选P0 = data1[5];//关闭段选du = 0;delay(1);//针对第六位数码管 //打开位选wei = 1;//设置位选P0 = 0xdf;//关闭位选wei = 0;//打开段选du = 1;//设置段选P0 = data1[6];//关闭段选du = 0;delay(1);//针对第七位数码管 //打开位选wei = 1;//设置位选P0 = 0xbf;//关闭位选wei = 0;//打开段选du = 1;//设置段选P0 = data1[7];//关闭段选du = 0;delay(1);//针对第⼋位数码管 //打开位选wei = 1;//设置位选P0 = 0x7f;//关闭位选wei = 0;//打开段选du = 1;//设置段选P0 = data1[8];//关闭段选du = 0;delay(1);/* //针对第九位数码管 //打开位选wei = 1;//设置位选wei = 0xff;//关闭位选wei = 0;du = data1[9];//关闭段选du = 0;*/}}void delay(unsigned int x) {unsigned a, b;for(a=x;a>0;a--){for(b=120;b>0;b--); }}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、静态显示驱动:
静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单 片机的I/O口进行驱动,或者使用如BCD码二-十进位转换器进行驱动。静态驱 动的优点是编程简单,显示亮度高,缺点是占用I/O口多,如驱动5个数码管静
透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控 显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1〜2ms,
由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同
时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会
有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O口,而且
车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机 在同时工作!单片机的数量不仅远超过PC机和其他计算的综合,甚至比人类的 数量还要多。
LED数码管(LED Segment Displays)是由多个发光二极管圭寸装在一起组成
“8”字型的器件,弓I线已在内部连接完成,只需引出它们的各个笔划,公共电 极。LED数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。位数有半位,1,2,3,4,5,6,8,10位等等。数码管分为共阳 极的LED数码管、共阴极的LED数码管两种。要使数码管显示数字,有两个条 件:1、是要在VT端(3/8脚)加正电源;2、要使(a,b,c,d,e,f,g,dp端接低电平 或“0电平。
3、设计要求:
(1)采用STC90系统显示电路,实现数码管的控制
(2)绘制相应原理图,并完成电路分析。
(3)硬件电路的焊接
(4)外电路的连接问题。
4、时间安排:
顺序
任务
时间(天)
1
读任务书,搜集资料
1
2
设计、绘制及分析原理图
1
3
硬件电路的焊接
1
4
编写控制程序,进行调试
1
5
系统组合调试,编写说明书
1
合计
盛年不重来,一日难再晨。及时宜自勉,岁月不待人。
课题:
单片机实习
数码管动态显示数字
系
别:
电气工程系
班
级:
专
业:
机电一体化技术
学
号:
Hale Waihona Puke 77号学生姓名:指导老师:—
完成日期:2011年11月25日
指导教师评语:
指导教师:
年 月 日
成绩评定:
指导教师:
年 月 日
单片机实习任务书
1、实习班级:机电0902
2、设计题目:数码管动态显示数字
态显示则需要5X8=40根I/O口来驱动,要知道一个89S51单片机可用的I/O口才32个呢。故实际应用时必须增加驱动器进行驱动,增加硬体电路的复杂性。
1
2、动态显示驱动:
数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱
动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每 个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制, 当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码 管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要 将需要显示的数码管的选通控制打开, 该位就显示出字形,没有选通的数码管就 不会亮。
功耗更低。
共阳极LED数码管的内部结构原理图:
财好 财 枣护 护'电/
畦吐瞇瞇VV亡瞇瞇
6*t申
共阴极LED数码管的内部结构原理图:
Q\TV
萍茸耳彗萍聲萍弋
裁 护 計 护 尉 押 护如
原理图
参考文献
、八 、,
单片机是一种应用十分广泛的单心片微型计算机,在我国的普及应用已有若
干年,上至航天飞机,下至电动玩具,都能见到它的身影。单片机比专用处理器 更适合应用于嵌入式系统,因此它得到了最多的应用。事实上单片机是世界上数 量最多的计算机。现代人类生活中所用的几乎每件电子和机械产品中都会集成有 单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑 配件中都配有1-2部单片机。而个人电脑中也会有为数不少的单片机在工作。汽
5
54、 成绩评定:
根据学生独立分析问题和解决问题的能力、理论与实践相结合的能
力、实习实训中的工作态度综合给出成绩评定。 评定等级分为优、良、中、 及格和不及格五等。
沧州职业技术学院机电系数控教研室
2011年11月21日
.、八、-
刖言
原理图
程序说明
LED数码管动态显示
双位数码管显示控制程序及说明
心得体会