把操作码采用数码管的前三位显示出来
- 格式:docx
- 大小:14.44 KB
- 文档页数:7
数码管显示数据的分离方式
数码管是电子设计之中最常用的显示元器件,但是数码管一次只能显示一个数字,如果要显示多位数字只能使用多个数码管并且要把数字拆分开,一位一位的送到数码管中才能显示,今天就介绍把一个多位数字拆分的方法。
把一个多位数拆分要用到昨天讲过的两个运算符“/”除法运算符和“%”取余运算符,来晚的同学请点这里了解这两个运算符。
/:得到的运算结果是整数,68/10=6;
%:得到的运算结果是余数,68%10=8;是不是有点意思。
比如要显示524这个三位数,下面讲解这个数字的拆分算法。
百位:524/100 = 5;
十位:524%100=24;24/10=2;
各位:524%100=24;24%10=4;
通过这个例子是不是找出规律来了?简写入下:
百位:524/100 = 5;
十位:524%100/10=2;
各位:524%100%10=4;
再举一个四位数的例子,拆分6893如下:
千位:6893/1000=6;
百位:6893%1000/100 = 8;
十位:6893%1000%100/10 = 9;
各位:6893%1000%100%10 = 3;
是不是分离出来了?这时候就可以把数据送到数码管显示了。
以上分离方法只是众多分离方法中的一种,在使用的时候可以在纸上简单算一下,结果就很容易出来了。
共阳极数码管位选码
【最新版】
目录
1.共阳极数码管简介
2.共阳极数码管的位选码原理
3.共阳极数码管的位选码应用实例
4.共阳极数码管位选码的优缺点
正文
【共阳极数码管简介】
共阳极数码管是一种常用的数码显示器件,主要由七个 LED(发光二极管)组成,每个 LED 分别对应一个数字,通过点亮不同的 LED 可以显示 0-9 的数字。
共阳极数码管的阳极公共,阴极分别对应每个数字,因此得名共阳极数码管。
【共阳极数码管的位选码原理】
共阳极数码管的位选码原理是指通过编码方式选择需要显示的数字。
共阳极数码管的位选码是一种三态编码方式,即每个数码管的选通信号有三个状态:选通、断开和无效。
通过控制这三个状态,可以实现对共阳极数码管的位选码控制。
【共阳极数码管的位选码应用实例】
假设有一个三位共阳极数码管,需要显示数字“123”,我们可以通过以下位选码实现:
- 首位(百位):1,因此需要选通第 1 个数码管;
- 第二位(十位):2,因此需要选通第 2 个数码管;
- 第三位(个位):3,因此需要选通第 3 个数码管。
通过以上位选码操作,可以实现共阳极数码管显示数字“123”。
【共阳极数码管位选码的优缺点】
优点:
1.节省资源:共阳极数码管位选码可以实现多位数码管的共享控制,降低硬件资源消耗;
2.控制简单:共阳极数码管位选码控制逻辑简单,容易实现;
3.显示灵活:共阳极数码管位选码可以根据需要显示不同的数字,具有较好的灵活性。
数码管显示数字 1�数码管显示项目:在数码管的第1 位(最右边)显示数字1最终效果图:此项目练习的目的:(1)认识移位寄存器芯片74HC595 及其作用。
(2)认识贴片芯片封装(贴片、直插)(3)认识数码管(4)学会静态显示的步骤完整代码:#include <reg52.h>#include <intrins.h> // 因为此文件中用到了延时函数_nop_(),所以要包含_nop_()的头文件sbit DIG_DA TA = P0^2; // 74HC595 的数据输入引脚sbit DIG_SHCP = P0^4; // 74HC595 的移位脉冲引脚sbit DIG_STCP = P2^3; // 74HC595 的锁存脉冲引脚/*主函数,数码管第 1 位(最右侧)显示数字1*/void main(void){unsigned char i,SegmentByte,SelectByte;SegmentByte = 0xf9; // 段码字节赋值SelectByte = 0x01; // 位选字节赋值DIG_SHCP = 0; // 74HC595 的移位脉冲引脚输出低电平DIG_STCP = 0; // 74HC595 的锁存脉冲引脚输出低电平/* 将段码字节(共8 位,高位在前)移入74HC595 芯片*/for(i=0; i<8; i++){/* 判断数据的最高位,如果最高位是1,数据引脚输出高电平;如果是0,输出低电平*/if(SegmentByte&0x80){DIG_DA TA = 1;}else{DIG_DA TA = 0;}_nop_();/* 输出74HC595 芯片的数据移位脉冲,每输出一个移位脉冲,74HC595 内部的数据移动一位*/DIG_SHCP = 1;_nop_();DIG_SHCP = 0;_nop_();/* 要输出的数据左移一位,即为下一位数据的输出作准备*/ SegmentByte <<= 1;}/* 将位选字节(共8 位,高位在前)移入74HC595 芯片*/for(i=0; i<8; i++){if(SelectByte&0x80){DIG_DA TA = 1;}else{DIG_DA TA = 0;}_nop_();DIG_SHCP = 1;_nop_();DIG_SHCP = 0;_nop_();SelectByte <<= 1;}/* 输出74HC595 芯片的数据锁存脉冲,即将74HC595 芯片接收到的最新数据输出到芯片的所有数据引脚*/DIG_STCP = 1;_nop_();DIG_STCP = 0;_nop_();while(1){}}长见识:(1)74HC595 芯片上图为74HC595 芯片的贴片封装图,共2*8=16 个引脚,左下角凹点所对应的引脚为 1 脚。
数码管位码数码管位码是计算机中一种用于显示数字的设备,通常我们所说的数码钟、计时器、分秒钟等都是采用了数码管位码的技术。
数码管有许多种类,它们虽然有些不同,但都是采用了“7段码”进行显示。
那么什么是7段码呢?7段码是指将字母、数字、符号等需要显示的信息拼成一个由7个线段组成的图案,然后通过控制这7个线段的亮灭状态来实现信息的显示。
这7个线段分别是:“a”、“b”、“c”、“d”、“e”、“f”、“g”。
而每个线段都可以控制亮或者灭,从而组成不同的图案显示出来。
例如数字“0”需要亮“a”、“b”、“c”、“d”、“e”、“f”这6个线段,而不需要亮“g”线段,这样“0”的数字图案就会显示出来。
不同的数字、字母、符号,需要控制的线段也不同,因此每种字符都有自己独特的7段码。
这些7段码一般是写在数据手册上,供开发人员参考。
下面是几个常见数字的7段码:数字0:abcdef,g不亮;数字1:bc,adefg不亮;数字2:abdeg,cf不亮;数字3:abcdg,ef不亮;数字4:bcfg,ade不亮;数字5:acdfg,b不亮;数字6:acdefg,b不亮;数字7:abc,defg不亮;数字8:abcdefg,不亮;数字9:abcdfg,e不亮。
通过7段码控制数码管的亮灭状态,可以实现数字、字母、符号等信息的显示,具有简单、可靠、高亮度、易于认读等特点。
同时,数码管位码的设计也有一些需要注意的问题:1、位码的输出电流大小需根据数码管的额定电流进行设计,避免烧坏数码管。
2、在设计时要充分考虑功耗问题,避免过度浪费。
3、尽量将位码输出信号与其他信号隔离,避免信号干扰。
4、为了方便PCB板设计,尽量将同一类型的7段码排在一起布局。
总之,数码管位码的设计不仅需要满足实际的显示需求,还需要考虑成本、功耗、可靠性等多方面的因素。
只有在这些方面做好充分的准备,才能设计出高质量的位码方案,有效地驱动数码管的显示。
在第6课里,我们讲到数码管的静态显示,利用静态显示法,通过控制位选和段选,可以让数任意几位数码管显示任意字符,但由于所有位数码管的相同的段选全部接在一起,所以只能同时显示相同的数字,例如8位同时显示8字,1、3、5位同时显示3字。
但大家想一下,如果我们要让数码管同一时刻显示不同的数字,如图1所示的现象,用静态显示的方法就不能够实现,这里就只能用到动态显示的方法,今天这一节我们主要讲解数码管动态显示的原理的程序实现的方法。
图1 数码管同时显示123456在讲解动态显示方法之前,我们先介绍在种数码管及单片机程序开发过程常用的方法-数组编码法。
1、数组编码在跟数码管相关的程序中,可以对位进行编码,也可对段进行编码,这里我们以段编码进行讲解。
通过第8课的程序我们知道,在位选确定后,要显示数字8时,P0=0x80,显示数字3时P0=0xb0,也就是0xb0,0x80分别可以表示数字3和8,按此方法,我们把在数码管上显示0-f,16个数字全部用16制度表示出来,这16个16进制数就称为数码管可显示0-f的相应的编码,如图2所示(注意共阳和共阴极数码管相应的编码有所不同,这里以实验板上共阳极的为例)。
图2 共阳极数码管编码在编程中,编码的表示方法如下:unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e };这里编码表示的方法与C语言中数组定义的方法基本一样。
table是数组名,后面需加[],中括号中需加上数组中元素的个数,也可以不写。
等号的右边用一个大括号将所有元素包含起来,里面的元素之间用“,”隔开,在大括号外用“;”结束。
等号左边的unsigned char 是数据元素的数据类型,这里定义为无符号字符型,也就是元素的值范围只能是0-255之间。
共阳极数码管位选码
摘要:
1.共阳极数码管简介
2.共阳极数码管的位选码原理
3.共阳极数码管的位选码应用实例
4.共阳极数码管位选码的优缺点
正文:
一、共阳极数码管简介
共阳极数码管是一种常见的数码管显示器件,广泛应用于计算机、电子仪器、数字时钟等领域。
它由若干个数码管单元组成,每个数码管单元包含七个LED(发光二极管)和一个小点,七个LED 分别对应数字0-9,小点则用于显示小数点。
共阳极数码管通过控制各个数码管单元的亮灭状态,可以显示数字和字符。
二、共阳极数码管的位选码原理
共阳极数码管的位选码原理是指通过编码方式,用较少的控制信号来驱动较多的数码管显示。
共阳极数码管的位选码主要有静态位选码和动态位选码两种。
1.静态位选码
静态位选码是一种简单的位选码方式,通过给定的编码,可以直接控制某个数码管单元的显示。
静态位选码的优点是编码简单,易于实现;缺点是当数码管数量较大时,所需的控制信号线较多,不利于降低硬件成本。
2.动态位选码
动态位选码是一种高效的位选码方式,通过较少的控制信号,可以动态地控制数码管单元的显示。
动态位选码的优点是节省控制信号线,降低硬件成本;缺点是编码相对复杂,实现难度较高。
三、共阳极数码管的位选码应用实例
以一个4 位共阳极数码管显示为例,需要用4 位二进制信号控制四个数码管单元的显示。
采用静态位选码,需要4 根控制信号线;采用动态位选码,可以通过3 根控制信号线实现。
四、共阳极数码管位选码的优缺点
共阳极数码管位选码的优点是可以节省控制信号线,降低硬件成本;缺点是编码相对复杂,实现难度较高。
数码管控制显示一、数码管控制电路结构1、段码、位码均由P0口输出,采用总线模式连接。
2、RP1为P0口上拉电阻。
3、74LS07为反相器。
4、74LS08为与门。
5、74HCT574分别作为段码与位码的八路D型触发器。
(功能等同于74HC377)工作原理为:当CP为由低电平到高电平时,D0输出到Q0(即Q状态为D的状态);当CP为低电平时,Q输出端保持不变。
OE为使能端,必须为低电平时,才会有输出(即D→Q)。
6、引脚控制:CS1:接P1.5CS2:接P1.4WR:接P1.7P0~P7:接D0~D7二、控制程序举例1、基本的数字显示功能#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit wr=P1^7;sbit cs1=P1^5;sbit cs2=P1^4;#define LEDdata P0void delay(uint x) //1秒延时函数{uint i,j;for(i=x;i>0;i--)for(j=115;j>0;j--);}void display(){cs1=0;cs2=1; //选择段码缓存LEDdata=0xc0; //输出段码wr=1;wr=0; //取缓冲区数据对应段码数据,并保持不变cs1=1;cs2=0; //选择位码缓存LEDdata=0xfe; //输出位码数据,显示第1个wr=1;wr=0; //}void main(){while(1){cs1=cs2=0; //选择两个触发器LEDdata=0xff; //实现初始的清屏操作wr=1;wr=0;display(); //调用显示函数}}2、采用动态显示八个数字#include <REG52.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define LEDdata P0sbit wr=P1^7;sbit cs1=P1^5;sbit cs2=P1^4;uchar code LEDcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9,- uchar buf[8]={7,6,5,4,3,2,1,0}; //定义的显示缓冲区void delay(uint i) { while(i--); } //公用延时函数,约10uSvoid display(){uchar i,j=0xfe;buf[0]=0;buf[1]=1;buf[2]=2;buf[3]=3;buf[4]=4;buf[5]=5;buf[6]=6;buf[7]=7;for(i=0;i<8;i++){cs1=0;cs2=1; //选择段码锁存器缓存LEDdata=LEDcode[buf[i]];wr=1;wr=0; //取缓冲区数据对应段码数据cs1=1;cs2=0; //选择位码缓存LEDdata=j;wr=1;wr=0; //取位码编码delay(100); //延时1mSj=_crol_(j,1); //改变位编码cs1=cs2=0; //同时选择两个锁存器LEDdata=0xff;wr=1;wr=0; //同时关闭所有数码管显示}}void main(){while(1){display(); //调用显示函数}}3、控制数字显示的变化(开机检测画面)#include <REG52.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define LEDdata P0sbit wr=P1^7;sbit cs1=P1^5;sbit cs2=P1^4;uchar code LEDcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9,- uchar buf[8]={7,6,5,4,3,2,1,0};//定义的显示缓冲区uchar code LEDcode1[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe};void delay(uint i) { while(i--); } //公用延时函数,约10uSvoid display(){uchar i,j=0xfe;buf[0]=0;buf[1]=1;buf[2]=2;buf[3]=3;buf[4]=4;buf[5]=5;buf[6]=6;buf[7]=7;for(i=0;i<8;i++){cs1=0;cs2=1;//选择段码锁存器缓存LEDdata=LEDcode[buf[i]];wr=1;wr=0;//取缓冲区数据对应段码数据cs1=1;cs2=0;//选择位码缓存LEDdata=j;wr=1;wr=0;//取位码编码delay(100);//延时1mSj=_crol_(j,1);//改变位编码cs1=cs2=0;//同时选择两个锁存器LEDdata=0xff;wr=1;wr=0;//同时关闭所有数码管显示}}void main(){uchar i;cs1=cs2=0;//同时选择位、段码缓存IC LEDdata=0xff;wr=1;wr=0;//关闭显示for(i=0;i<8;i++){cs1=0;cs2=1;//选择段码缓存ICLEDdata=LEDcode1[buf[i]];wr=1;wr=0;//取缓冲区数据对应段码数据cs1=1;cs2=0;//选择位码缓存ICLEDdata=0x00;wr=1;wr=0;//位码全点亮delay(50000);//延时50mscs1=cs2=0;//同时选择位、段码缓存ICLEDdata=0xff;wr=1;wr=0;//关闭显示}while(1){display();//调用显示函数}}。
三位共阳数码管是一种常用的显示器,它使用三个发光二极管来显示一个数字,每个发光二极管的阳极连接到一起,并且公共阳极连接到一起作为公共阳极。
因此,当某个位需要显示某个数字时,需要将公共阳极的电压设置为相应的数字,这样每个发光二极管就会发出相应的光。
这种显示器通常用于需要显示数字、字母和符号的应用中。
这种数码管的特点是亮度高、视角大、耐冲击、可靠性高、反应速度快、功耗小、价格低等。
它通常用于需要高亮度、大视角和耐用性的场合,例如仪表盘、计数器、倒计时器等。
同时,它也常用于嵌入式系统和单片机开发中。
由于这种数码管的使用方法相对简单,而且通常只需要显示数字和一些符号,因此在电子爱好者和嵌入式开发人员中很受欢迎。
此外,由于公共阳极的存在,这种数码管需要特定的驱动方式才能正确显示数字,这也使得它成为嵌入式系统和单片机开发中常用的显示器之一。
把操作码采用数码管的前三位显示出来
*/
#include
#include
#include
#define TURE 1
#define FALSE 0
sbit IR=P3^2; //红外接收标志
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/******************************************************************/
/* 变量声明 */
/******************************************************************/
unsigned char irtime;//红外用全局变量
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];
unsigned char cun[3];
/******************************************************************/
/* 函数声明 */
/******************************************************************/
void Delay(unsigned char mS);
void Ir_work(void);
void Ircordpro(void);
/******************************************************************/
/* 定时器0中断服务函数 */
/******************************************************************/
void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
irtime++; //用于计数2个下降沿之间的时间
}
/******************************************************************/
/* 外部中断0函数 */
/******************************************************************/
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
static unsigned char iii=0; //接收红外信号处理
static bit startflag,startflag_flag; //是否开始处理标志位
if(startflag)
{
if(irtime<145&&irtime>=80)//引导码 TC9012的头码,9ms+4.5ms
{ iii=0; startflag_flag=1; }
if(startflag_flag) //确保引导无误
{
irdata[iii]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
iii++;
if(iii==33)
{
irok=1;
iii=0;
EX0 = 0; //关闭外部中断
startflag=0;
startflag_flag=0;
}
}
}
else
{irtime=0;startflag=1;}
}
/******************************************************************/
/* 定时器0初始化 */
/******************************************************************/
void TIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=256-100; //重载值
TL0=256-100; //初始化值 定时时间为0.1ms
ET0=1; //开中断
TR0=1;
}
/******************************************************************/
/* 外部中断初始化 */
/******************************************************************/
void EX0init(void)
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //使能外部中断
EA = 1; //开总中断
}
/******************************************************************/
/* 红外键值处理 */
/******************************************************************/
void Ir_work(void)//红外键值散转程序
{
cun[2]=dofly[IRcord[3]%10];
cun[1]=dofly[IRcord[3]/10%10];
cun[0]=dofly[IRcord[3]/100] ;
irpro_ok=0;//处理完成标志
}
/******************************************************************/
/* 红外解码函数处理 */
/******************************************************************/
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value=0;
k=1;
for(i=0;i<4;i++) //处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>18)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误
差
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;
value=0;
} irpro_ok=1;//处理完毕标志位置1
}
void delay(unsigned char a)
{
unsigned char j;
unsigned char i;
for(i=0;i for(j=0;j<114;j++);
}
void xianshi(void)
{
unsigned char i,ii;
for(i=0;i<3;i++)
{
P0=cun[i];
P2=i;
delay(5);
}
}
/////////////////////////////////////////////////////////////////
void main(void)
{
EX0init(); //初始化外部中断
TIM0init();//初始化定时器
// P2=0x00;//1位数码管全部显示
while(1)//主循环
{
if(irok) //如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
{
Ir_work();
}
xianshi() ; //循环扫描数码管
}
}