




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 玩转数码管4.1 怎么才能点亮数码管(1)数码管简介 数码管是一种半导体发光器件,其基本单元是发光二极管,即用8个(或7个)LED灯做成的数码管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),按能显示多少个“8”可分为1位、2位、3位、4位等等数码管,如图4-1所示。图4-1 数码管实物图 按发光二极管单元连接方式分为共阳极数码管和共阴极数码管:共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段
2、的阴极为高电平时,相应字段就不亮;共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。共阳数码管和共阴数码管内部原理图如图4-2所示。 (a)单位数码管引脚排列 (b)共阳数码管内部连接 (c)共阴数码管内部连接图4-2 数码管内部原理图(2) 数码管驱动方式数码管的驱动方式有两种:静态显示和动态显示。静态显示驱动静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动。静态驱动的优点是编
3、程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要58=40根I/O端口来驱动,要知道一个AT89S5289S51单片机可用的I/O端口才32个呢。),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。 动态显示驱动数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划“a,b,c,d,e,f,g,dp”的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电
4、路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。 这两种显示方式各有利弊:静态显示虽然数据稳定,占用很少的CPU时间,但每个显示单元都需要单独的显示驱动电路,使用的硬件较多; 动态显示占用的
5、CPU时间多,但使用的硬件少,能节省线路板空间。在不同场合可以选择不同的使用方式去驱动数码管。它们之间的区别如下表4-1所示。表4-1 静态显示和动态显示区别静态显示动态显示编程方式简单复杂硬件连接复杂简单占用硬件资源多少功耗高低(3) 数码管显示常用编码 共阴极数码管和共阳极数码管都有相应的编码。编码的介绍如下: 一个数码管有八段:a,b,c,d,e,f,g,dp,即由八个发光二极管组成。因为发光二极管导通的方向是一定的,导通电压一般取为1.5V,这八个发光二极管的公共端有两种:共阳极(公共端接高电平或+5V电压)和共阴极(公共端接低电平或接地)。其中每个段均有0(不导通)和1(导通发光)两
6、种状态。它在程序中的应用是用一个八位二进制数表示,A为最低位(第一位),B为第二位,.,F为最高位(第八位)。共阴极数码管的编码如表4-2所示。表4-2 共阴数码管的编码显示字符dpgfedcba编码(dpa)0001111110x3f1000001100x062010110110x5b3010011110x4f4011001100x665011011010x6d6011111010x7d7000001110x078011111110x7f9011011110x6fA011101110x77B011111000x7cC001110010x39D010111100x5eE011110010x79
7、F011100010x71共阳极数码管的编码如表4-3所示。表4-3 共阳数码管的编码显示字符dpgfedcba编码(dpa)0110000000xc00111 110010xf92101001000xa43101100000xb04100110010x995100100100x926100000100x827111110000xf88100000000x809100100000x90A100010000x88B100000110x83C110001100xc6D101000010xa1E100001100x86F100011100x8e4.2数码管驱动电路4.2.1 数码管驱动基本电路 数码
8、管内部发光二极管点亮时,需要大概8mA左右的电流,而且电流不可过大,否则容易烧毁发光二极管。AT89S52单片机引脚最多只能提供1mA左右的拉电流,显然如果用单片机IO直接去驱动单位数码管,不能选择共阴极数码管,因为IO口提供不了8mA的电流。AT89S52单片机引脚最多可以提供10mA左右的管电流,可以直接去驱动共阳极单位数码管,让数码管的电流流入单片机的IO口。AT89S52单片机和单位共阳极数码管的电路图连接图如图4-3所示。图4-3 AT89S52和单位共阳极数码管连接图除了直接用单片机IO口去驱动数码管,也可以用一些驱动芯片,我们这里来介绍一下用74HC595芯片去驱动单位共阳数码管
9、。74HC595是硅结构的CMOS器件, 兼容低电压TTL电路, 它可以将串行输入的8位数字,转变为并行输出的8位数字。它具有8位移位寄存器和一个存储器,三态输出功能。74HC595芯片引脚图如图4-4所示。图4-4 74HC595芯片引脚图74HC575芯片引脚功能说明如下表4-4所示。表4-4 74HC595芯片引脚功能说明引脚号符号功能1、2、3、4、5、6、7、15 Q0Q7三态输出管脚 8 GND 电源地 9 Q7串行数据输出管脚 10 MR移位寄存器清零端 11 SHcp 数据输入时钟线 12 STcp输出存储器锁存时钟线 13 OE 输出使能 14 DS数据输入端16VCC 电源
10、端 74HC595芯片内部逻辑图如图4-5所示。 图4-5 74HC595芯片内部逻辑图74HC595是具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。数据在SHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。 移位寄存器有一个串行移位输入(DS),和一个串行输出(Q7),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。74HC595的真值表如表4-5所示。表4-5 74HC595芯片真值表输入引脚输出管脚DSMR
11、SHcpSTcpOEXXXXHQ0Q7输出高阻XXXXLQ0Q7输出有效值XLXXX移位寄存器清零LH XX移位寄存器存储LHH XX移位寄存器存储HXH XX移位寄存器状态保持XXXX输出存储器锁存移位寄存器中的状态值XXXX输出存储器状态保持 注:H高电平状态;L低电平状态;上升沿;下降沿;X无关 前面对74HC595芯片进行了介绍,下面我们来给大家介绍一下,如何让74HC595把AT89S52单片机和单位共阳数码管进行连接。74HC595芯片驱动单位共阳极数码管的电路图如图4-6所示。AT89S52单片机的IO口也可以直接驱动单位共阳极数码管,但是因为一般单片机系统中,单片机的IO口数量
12、有限,为了节省单片机IO口,所以会加一些串转并的驱动芯片。单片机的灌入电流也是有限的,用驱动芯片去控制数码管,可以避免电流直接流入单片机,增强了单片机系统的稳定性。图4-6 74HC595芯片驱动共阳极数码管4.2.2 驱动八位数码管由于单片机IO口灌电流有限,一个数码管就是几毫安了。如果是8位数码管,肯定是不能用单片机的IO口直接驱动的。所以实际应用中,我们常用一些驱动芯片去驱动八位数码管。常用的数码管的驱动芯片有74HC573、74HC245、74HC244、74HC595等等。我们这里给大家介绍74HC573芯片。 74HC573的八个锁存器都是透明的D 型锁存器,当使能(G)为高时,Q
13、 输出将随数据(D)输入而变。当使能为低时,输出将锁存在已建立的数据电平上,输出控制不影响锁存器的内部工作,即老数据可以保持。74HC573的引脚如图4-7所示。 图4-7 74HC573引脚图74HC573的引脚功能说明如表4-6所示。表4-6 74HC573的功能引脚说明引脚号符号功能1OE三态输出使能输入(低电平有效)29D0D7数据输入11LE锁存使能输入1219Q0Q7三态锁存输出10GND电源地20VCC电源正极74HC573的内部逻辑图如图4-8所示。图4-8 74HC573的内部逻辑图 74HC573的功能可以通过74HC573的真值表来表示。OE为三态输出使能输入,当它为高电
14、平时,无论LE和Dx为何状态,输出都是高阻状态。当OE为低电平,LE为低电平时,此时74HC573处于锁存状态,无论输入为何状态,输出都不会变化。当OE为低电平,LE为高电平时,输出Qx的电平随着Dx的电平变化。它的真值表如表4-7所示。表4-7 74HC573真值表控制输入输出OELEDxQxHXXZLLX不改变LHLLLHHH 注:H高电平状态;L低电平状态;Z高阻状态;X无关 通过对74HC573芯片的介绍,可以对74HC573控制八位共阴极数码管电路图理解更清楚一些。在图4-4中,74HC573芯片主要作用是为数码管提供电流,让数码管点亮。U1芯片提供电流从数码管的段流入,然后通过U2
15、芯片让电流从每位数码管的公共端流出。这里给大家介绍用两片74HC573去驱动八位共阴极数码管,实现八位共阴极数码管的动态显示任何的数据。用74HC573驱动八位共阴极数码管的电路图如图4-9所示。P0口通过74HC573去控制数码管的段选,P2口通过74HC573去控制数码管的位选。图4-9 74HC573驱动八位数码管电路图4.3 实例手把手讲解数码管【例4-1】共阴极数码管静态显示。按照以下四种方式去点亮某位数码管进行显示。设定八位数码管从右往左的编号为“0”“7”。 在第“0”位数码管上显示“5”。 在第“7”位数码管上显示“6.”。在第“3”位和第“6”位数码管上显示“7”。八个数码管
16、同时显示“9”。(1) 软件设计难点编写代码首先要看懂数码管和单片机连接的电路图,如图4-9所示。P0口通过74HC573去控制数码管的段选,P2口通过74HC573去控制数码管的位选。配套单片机开发板上的八位数码管是共阴极数码管,共阴数码管的编码在前面表4-2中已经列出了。比如P0口赋值为0x6d,数码管在公共端为低电平时,就会显示“5”。P2口的某些位给低电平,相应的数码管才可能会被点亮。比如P2口赋值0xfe,那么就是数码管的第“0”位数码管的公共端为低电平。还有P3.6端口和P3.7端口分别控制的是数码管的段选和位选的锁存。锁存的相关实验会在后面给大家介绍,这里给两个端口都置为高电平即
17、可。(2) 程序代码在第“0”位数码管上显示“5”。#include#define uchar unsigned char#define uint unsigned intuchar SegCode16 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /共阴极数码管的段码编码/*函数:Main参数:无返回:无功能:主函数*/void Main()P2 = 0xfe; /控制哪位数码管可被点亮P0 = SegCode5; /让数码管显示相应的字符while(1) 在第“7”位数码
18、管上显示“6.”。#include#define uchar unsigned char#define uint unsigned intuchar SegCode16 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /共阴极数码管的段码编码/*函数:Main参数:无返回:无功能:主函数*/void Main()P2 = 0x7f; /控制哪位数码管可被点亮P0 = SegCode6; /让数码管显示相应的字符 P0 = P0 | 0x80; /点亮数码管右下角的点while(
19、1) 在第“3”位和第“6”位数码管上显示“7”。#include#define uchar unsigned char#define uint unsigned intuchar SegCode16 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /共阴极数码管的段码编码/*函数:Main参数:无返回:无功能:主函数*/void Main()P2 = 0xb7; /控制哪位数码管可被点亮P0 = SegCode7; /让数码管显示相应的字符while(1) /停止 八个数码管
20、同时显示“9”。#include#define uchar unsigned char#define uint unsigned intuchar SegCode16 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /共阴极数码管的段码编码/*函数:Main参数:无返回:无功能:主函数*/void Main()P2 = 0x00; /控制哪位数码管可被点亮P0 = SegCode9; /让数码管显示相应的字符while(1) /停止 (3) 实验现象 在第“0”位数码管上显示“
21、5”,如图4-10所示。图4-10 第“0”位数码管上显示“5” 在第“7”位数码管上显示“6.”,如图4-11所示。图4-11 第“7”位数码管上显示“6.”在第“3”位和第“6”位数码管上显示“7”,如图4-12所示。图4-12 在第“3”位和第“6”位数码管上显示“7”在八个数码管同时显示“9”,如图4-13所示。如果显示多个数码管,不建议用静态方式,因为功耗较高。静态显示的功耗是动态显示的几倍。动态显示的代码编写方法,我们会在后面进行介绍。图4-13 在八个数码管同时显示“9”【例4-2】用74HC595驱动单位共阳极数码管显示。在单位共阳极数码管上显示“9”。(1) 软件设计难点初学
22、者对74HC595真值表的理解起来相对困难。表4-5,大家可以试着自己独立去读懂它。我们对它的常用功能,要对芯片怎么操作进行简单的介绍。移位寄存器清零:MR给低电平。移位寄存器储存L:DS=0,MR=1,SHcp为上升沿。移位寄存器储存H:DS=1,MR=1,SHcp为上升沿。输出存储器锁存移位寄存器中的状态值:STcp为上升沿。(2) 程序代码#include#include#define uchar unsigned char#define uint unsigned intsbit DS = P20; /数据输入端sbit SHCP = P21; /数据输入时钟线 sbit MR = P
23、22; /移位寄存器清零端 sbit STCP = P23; /输出存储器锁存时钟线sbit OE = P24; /输出使能uchar TAB59516 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;/* 名称 : X74HC595()* 功能 : 用74HC595来控制共阳数码管的显示* 输入 : 无* 输出 : 无*/void HC595(uchar zdata)uchar i,temp;OE = 1; /Q0Q7输出高阻MR = 0; /移位寄存器清零_nop_();_n
24、op_();MR = 1; temp=TAB595zdata;for(i=0;i8;i+)DS = temp & 0x80; /高低电平写入数据输入端SHCP = 0; /给数据输入时钟线提供上升沿的低电平_nop_();SHCP = 1; /给数据输入时钟线提供上升沿的高电平_nop_();temp=_crol_(temp,1); /数据左移一位OE = 0; /Q0Q7输出有效值STCP= 0; /给输出存储器锁存时钟线提供上升沿的低电平_nop_(); STCP = 1; /给输出存储器锁存时钟线提供上升沿的高电平_nop_();/* 名称 : Main()* 功能 : 主函数* 输入
25、: 无* 输出 : 无*/void main()HC595(9);while(1)(3) 实验现象 通过74HC595去控制共阳极数码管,并在数码管上显示“9”,如图4-14所示。图4-14 共阳极数码管上显示“9”【例4-3】共阴极数码管动态显示。数码管动态显示,功耗低,硬件连接简单,占用硬件资源少。单片机是如何控制八位共阴极数码管的电路图请参考图4-9。我们将按照下面四种方式去点亮数码管。 数码管的右边两位显示“12”。最开始每隔0.3秒交替显示“1”和“2”,然后逐渐减少间隔时间,以至于人眼看不到数码管在闪烁,并在数码管的最右边两位显示“12”。 数码管的右边四位显示“1234”。 在八
26、位数码管上显示生日。如果生日是“1985-3-15”,就在数码管上显示“19850315”。(1) 软件设计难点动态显示驱动原理:轮流点亮某一位数码管,才能使各位数码管显示不同的数字或符号,利用人眼睛视觉暂留现象(当人眼所看到的影像消失后,人眼仍能继续保留其影像0.05-0.2秒左右的图像),即对25Hz以上的图像闪烁不敏感。因此,对八个数码管的扫描时间为40毫秒,每个数码管闪烁时间不超过5毫秒,就看不到数码管的闪烁了。一般来说,一个数码管点亮的时间为13毫秒就可以了。八位数码管动态显示过程如表4-8所示,每隔2毫秒数码管依次被点亮。表4-8 数码管动态显示过程时刻第7位位6位第5位第4位第3
27、位第2位第1位第0位N2ms熄灭熄灭熄灭熄灭熄灭熄灭熄灭点亮(N+1)2ms熄灭熄灭熄灭熄灭熄灭熄灭点亮熄灭(N+2)2ms熄灭熄灭熄灭熄灭熄灭点亮熄灭熄灭(N+3)2ms熄灭熄灭熄灭熄灭点亮熄灭熄灭熄灭(N+4)2ms熄灭熄灭熄灭点亮熄灭熄灭熄灭熄灭(N+5)2ms熄灭熄灭点亮熄灭熄灭熄灭熄灭熄灭(N+6)2ms熄灭点亮熄灭熄灭熄灭熄灭熄灭熄灭(N+7)2ms点亮熄灭熄灭熄灭熄灭熄灭熄灭熄灭 上表是八位数码管的动态显示过程,弄懂了八位数码管动态显示过程,两位数码管,四位数码管的显示过程,也就清楚了。(2) 程序代码数码管的右边两位显示“12”。最开始每隔0.3秒交替显示“1”和“2”,然后逐
28、渐减少间隔时间,以至于人眼看不到数码管在闪烁,并在数码管的最右边两位显示“12”。#include#include#define uchar unsigned char#define uint unsigned intuchar SegCode10 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar SegPosi8 = 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /选择哪位数码管被点亮/*函数:Delay_1ms()参数:t返回:无功能:延时子程序,延时时间为 1ms * t。 使用晶振是1
29、1.0592M。*/void Delay_1ms(uint t)uint i,j;for(i=0;it;i+)for(j=0;j=100;j+)_nop_();/*函数:Main参数:无返回:无功能:主函数*/void Main(void)uchar i=300; /最大闪烁值为0.5秒while(1)P0 = 0; /这里让数码管每段不显示 ,这样可以取掉余晖。P2 = SegPosi1; /点亮第1位数码管P0 = SegCode1; /数码管上显示1Delay_1ms(i); /延时1乘以i毫秒P0 = 0;P2 = SegPosi0; /点亮第0位数码管P0 = SegCode2; /
30、数码管上显示2Delay_1ms(i);if(i!=2) /假如i没有减小到2,执行括号里的语句i=i-2; /i的值减2数码管的右边四位显示“1234”。#include#include#define uchar unsigned char#define uint unsigned intuchar SegCode10 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar SegPosi8 = 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /选择哪位数码管被点亮/*函数:Delay_1ms()参
31、数:t返回:无功能:延时子程序,延时时间为 1ms * t。 使用晶振是11.0592M。*/void Delay_1ms(uint t)uint i,j;for(i=0;it;i+)for(j=0;j=100;j+)_nop_();/*函数:Main参数:无返回:无功能:主函数*/void Main(void)uchar i;while(1)for(i=0;i4;i+)P0 = 0;P2 = SegPosii; /选择哪一位数码管点亮P0 = SegCode4-i; /给段码数据给P0口Delay_1ms(2); /延时0.02秒在八位数码管上显示生日。如果生日是“1985-3-15”,就在
32、数码管上显示“19850315”。#include#include#define uchar unsigned char#define uint unsigned intuchar SegCode10 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar SegPosi8 = 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /选择哪位数码管被点亮uchar Birthday8 = 1,9,8,5,0,3,1,5; /生日数据/*函数:Delay_1ms()参数:t返回:无功能:延时子程序,延时时间为
33、 1ms * t。 使用晶振是11.0592M。*/void Delay_1ms(uint t)uint i,j;for(i=0;it;i+)for(j=0;j=100;j+)_nop_();/*函数:Main参数:无返回:无功能:主函数*/void Main(void)uchar i;while(1)for(i=0;i8;i+)P0 = 0;P2 = SegPosii; /选择哪一位数码管点亮P0 = SegCodeBirthday7-i; /调用生日数组数据给P0口Delay_1ms(2); /延时0.02秒(3) 实验现象 数码管每隔0.3秒交替显示“1”和“2”,如图4-15和4-16
34、所示。然后逐渐减少间隔时间,以至于人眼看不到数码管在闪烁,并在数码管的最右边两位显示“12”,如图4-17所示。图4-15 数码管第1位显示“1”图4-16 数码管第1位显示“2”图4-17 数码管第1位和第2位分别显示“1”和“2” 数码管的右边四位显示“1234”,如图4-18所示。图4-18 数码管的右边四位显示“1234” 在八位数码管上显示生日“19850315”,如图4-19所示。图4-19 八位数码管上显示生日【例4-4】数码管锁存实验。在数码管上的每位每隔0.3秒,在八个数码管上从左到右依次显示“7”,“6”,“5”,“4”,“3”,“2”,“1”,“0”。如果按下S19不放(
35、左边的独立按键),数码管段选被锁存,这时,虽然代码在改变段选的值,但是,我们看到数码管上的值是不变的。如果按下S21不放(右边的独立按键),数码管位选被锁存,这时,虽然代码在改变位选的值,但是,我们看到八位数码管中被点亮的位会不变。(1) 软件设计难点该实验是通过对74HC573芯片的控制来实现的。74HC573的功能在表4-7中进行了说明,当OE和LE都为低电平时,74HC573处于锁存状态,这时无论输入什么数据,输出都不会改变。这个实验,我们借助了两个独立按键来控制段或位锁存,可以让大家更直观的看到锁存的现象,更容易理解。(2) 程序代码#include#include#define uc
36、har unsigned char#define uint unsigned intsbit KEY1 = P32; /按键S19sbit KEY2 = P34; /按键S21sbit LOCKWei = P36; /控制段码的锁存端口sbit LOCKDuan = P37; /控制位选的锁存端口uchar code SegCode10 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar code SegPosi8 = 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/*函数:Delay_1ms()
37、参数:t返回:无功能:延时子程序,延时时间为 1ms * t。 使用晶振是11.0592M。*/void Delay_1ms(uint t)uint i,j;for(i=0;it;i+)for(j=0;j=100;j+)_nop_();/*函数:Main参数:无返回:无功能:主函数*/void Main(void)uchar i;while(1)for(i=0;i8;i+)P2 = SegPosii; /选择哪一位数码管点亮P0 = SegCodei; /段码给到P0口Delay(300); /延时0.3秒if(KEY1 = 0) /判断S19是否按下LOCKWei = 0; /给段选芯片的7
38、4HC573锁存端口低电平elseLOCKWei = 1; /锁存端口置高电平if(KEY2 = 0) /判断S21是否按下LOCKDuan = 0; /给位选芯片的74HC573锁存端口低电平elseLOCKDuan = 1; /锁存端口置高电平(3) 实验现象在数码管上从右往左每隔0.3秒分别显示“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”。当按键S19按下不放,数码管的段码被锁存,数码管上的数据虽然往左移动显示,但是显示的内容不会发生变化,一直显示在按键S19按下时数码管上显示的值。当按键S21按下不放,数码管的位选被锁存,数码管上的值还是会变化,但是一直是当按键S21
39、按下时的那个数码管显示数据。数码管的锁存功能在单片机IO口需要进行复用时用到。让数码管显示需要显示的数据后,锁存数码管所显示的数据,单片机的IO口又可以用去处理其他事情了。【例4-5】数码管显示数据自加。在数码管的最后三位显示一个3位的数据,从000开始每隔0.9秒加1。(1) 软件设计难点把一个3位数据分解为百位,十位和个位,然后赋值给相应的数码管。比如数值为123,提取百位数据,只需要把123除以100即可得到。提取十位数据,那么可以先除以10,再对10进行取余,就是123/10=12,然后再12%10=2。取出个位数据只需要对数值对10取余即可:123%10=3。(2) 程序代码#inc
40、lude#include#define uchar unsigned char#define uint unsigned intuchar code SegCode10 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar code SegPosi8 = 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/*函数:Delay_1ms()参数:t返回:无功能:延时子程序,延时时间为 1ms * t。 使用晶振是11.0592M。*/void Delay_1ms(uint t)uint i,j;for(i=
41、0;it;i+)for(j=0;j=100;j+)_nop_();/*函数:Main参数:无返回:无功能:主函数*/void Main(void)uint i = 0,j;while(1)for(j=0;j100;j+) /100*(3*3)毫秒,大概为0.9秒P0 = 0; /消隐P2 = SegPosi2; /第2位数码管显示P0 = SegCode(i / 100) % 10; /取 i 的百位数Delay_1ms(3); /延时0.3秒P0 = 0; /消隐P2 = SegPosi1; /第1位数码管显示P0 = SegCode(i / 10) % 10; /取 i 的十位数Delay_1ms(3); /延时0.3秒P0 = 0; /消隐P2 = SegPosi0; /第0位数码管显示P0 = SegCodei % 10; /取 i 的个位数Delay_1ms(3); /延时0.3秒i+; /变量i加1 (3) 实验现象可以在配套单片机开
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安徽省芜湖市芜湖县2025-2026学年数学三上期末检测模拟试题含解析
- 知识产权培训课件图片
- 琵琶行教学课件设计
- 专业复习规划中级经济师试题及答案
- 销售量递增策略与实施路径
- 水利水电工程电气系统设计理解及试题及答案
- 贷款担保合同书
- 工程经济试题分析方法试题及答案
- 2025年公共关系学备考策略与试题总结
- 电子商务供应链管理协议
- 《安全生产法解读课件》
- (二模)临沂市2025年高三高考模拟考试英语试题卷(含答案)
- 解除分公司经营合同协议
- 山东省济南市重点中学2025届高考生物二模试卷含解析
- 新版gmp实务教程试题及答案
- 2025年下半年度中铁特货物流股份限公司招聘毕业生三易考易错模拟试题(共500题)试卷后附参考答案
- 老人财产处置协议书范本
- 2025年辽宁省各市农村电力服务有限公司招聘笔试参考题库附带答案详解
- 江西省赣州市2025届高三二模语文试题及参考答案
- 消化内科笔试试题及答案
- 2025年山东省青岛市崂山区中考数学一模试题(原卷版+解析版)
评论
0/150
提交评论