第三章 数码管显示原理及应用实现 §3.1 数码管显示原理 ★ 共阴极数码管编码 符号 编码 符号 编码 0 0x 3f 8 0x7f 1 0x06 9 0x6f 2 0x5b 10 0x77 3 0x4f 11 0x7c 4 0x66 12 0x39 5 0x6d 13 0x5e 6 0x7d 14 0x79 7 0x07 15 0x71 ★ C语言编程时,编码定义方法如下: unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; 上面unsigned char是数组类型,也就是数组中元素变量类型,table是数组名,我们可以自由定义它,但是不要和关键字重名;table后面必须加中括号[],等号右边用一个大括号包含所有的元素,大括号后面加一个分号,大括号内部元素与元素之间用逗号隔开,注意,最后一个元素后面不要加逗号。 调用数组方法如下: P0=table[3]; 即将table这个数组中的第4个元素直接赋给P0口,即 P0=0x4f; 需要注意的是,在调用数组时,table后面中括号的数字是从0开始的,对应后面大括号里的第一个元素。 ★ 锁存器(74HC573) X :三态允许控制端(低电平有效),通常叫做输出使能端,或输出允许端都可以 1D~8D:数据输入端 1Q~8Q:数据输出端 LE:锁存允许端,或叫锁存控制端 §3.2 数码管静态显示 当多位数码管应用于某以系统时,他们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选信号都是相同的,那么它们显示的数字必定一样,数码管的这种显示方法叫做静态显示。 下面我们就用C语言写一段程序,先让第一个共阴数码管显示一个8字。 1、只打开第一个数码管的位选 2、(U1锁存器控制控制段选、U2锁存器控制位选) 位选,给U2锁存器的锁存端一个高电平,然后将数据0xfe(二进制为11111110)从单片机的P0口直接送出到锁存器U2的数据输出端,然后再关闭U2锁存器 段选,用操作U2的方法给U1的数据输出端再送出一个数据0x7f(二进制为0111 1111) 例:3.2.1 让第一个数码管显示一个8字 ◤ #include sbit dula=P2^6; //声明U1锁存器的锁存端 sbit wula=P2^7; //声明U2锁存器的锁存端 void main() { wela=1; //打开U2锁存器 P0=0xfe; //送入位选信号 wela=0; //关闭U2锁存器 dula=1; //打开U1锁存器 P0=0x7f; //送入段选信号 dula=0; //关闭U1锁存器 while(1); //程序停止到这里 } ◣ 例3.2.2 让实验板上6个数码管同时点亮,依次显示0到f,时间间隔为1s,循环下去 ◤ #include #define uchar unsigned char #define uint unsigned int sbit FM=P2^3; //声明蜂鸣器定义端 sbit dula=P2^6; //声明U1锁存器的锁存端 sbit wela=P2^7; //声明U2锁存器的锁存端 uchar num; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint); void main() { wela=1; //打开U2锁存端 P0=0xc0; //送入位选信号 wela=0; //打开U2锁存端 while(1) { for(num=0;num<16;num++)>16;num++)> { dula=1; //打开U1锁存端 P0=table[num]; //送入段选信号 FM=0; //蜂鸣器开 dula=0; //关闭U1锁存端 delayms(500); //延时0.5秒 FM=1; //蜂鸣器关 delayms(500); //延时0.5秒 } } } void delayms(uint xms) //延时子函数 { uint i,j; for(i=xms;i>0;i--) for(j=113;j>0;j--); } ◣ §3.3 数码管动态显示 数码管的动态显示又叫数码管的动态扫描显示。 所谓动态扫描显示,即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时在显示,而实际上多位数码管是一位一位轮流显示的,只是轮流的速度非常快人眼已经无法分辨出来。 下面我们来看例子 例子3.3.1第一个数码管显示1,时间由0.5s缩短到1ms,然后关闭它,立即让第二个数码管显示2,时间为1ms,在关闭它……一直到最后一个数码管显示6,时间同样为1ms,关闭它后再回来显示第一个数码管,一直循环下去 ◤ #include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint); void main() { while(1) { dula=1; P0=table[1]; //送段选数据 dula=0; P0=0xff; //消影,送位选数据前关闭所有显示,防止打开位选锁存时 wela=1; //原来的段选数据通过位选锁存器造成混乱 P0=0xfe; //送位选数据 wela=0; delayms(1); //延时 dula=1; P0=table[2]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delayms(1); dula=1; P0=table[3]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delayms(1); dula=1; P0=table[4]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delayms(1); dula=1; P0=table[5]; dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delayms(1); dula=1; P0=table[6]; dula=0; P0=0xff; wela=1; P0=0xdf; wela=0; delayms(1); } } void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=113;j>0;j--); } ◣
|