数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备,通常一位数码管的引脚是有10 个,其中7个用来组成数字(a,b,c,d,e,f,g),此外还有一个小数点(dp),所以数码管内部共有 8 个发光二极管,剩下两个引脚是公共端,如图所示第 3 和第 8 引脚连接在一起组成公共端。根据公共端所接电平的不同,分为共阴极和共阳极接法,中间图为共阴极接法内部原理图,右图为共阳极接法内部原理图。要点亮共阳极数码管,要在发光引脚提供低电平;反之点亮共阴极数码管,则要提供高电平。
下面展示了三种数码管显示情况。
#include <reg52.h>
unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴极接法的数码管段码
//unsigned char code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳极接法的数码管段码
void Delay()
{
unsigned char i, j;
for (i=0;i<255;i++)
for (j=0;j<255;j++);
}
//以上不变,以下有三种代码
//第一种0-9,9-0循环点亮
void main()
{
signed char k;
//char k;
while(1)
{
for(k=0;k<10;k++) //0-9循环点亮
{
P2 = tab[k]; // P1.0=0,LED点亮
Delay(); Delay(); //延时
}
for(k=9;k>=0;k--) //9-0循环点亮
{
P2 = tab[k]; // P1.0=0,LED点亮
Delay(); Delay(); //延时
}
}
}
//第二种,奇数点亮,偶数返回,即13579,86420
void main()
{
char k; //一定要注意k是有符号字符型,不然0-2=-2会使仿真报错
while(1)
{
for(k=1;k<10;k=k+2)
{
P2 = tab[k]; //1,3,5,7,9
Delay(); Delay();
}
for(k=8;k>=0;k=k-2)
//for(k=0;k<10;k=k+2) //用这种表示方法可以采用无符号字符型
{
P2 = tab[k]; //8,6,4,2,0
//P2 = tab[8-k]; //减法放在了数组索引里且=10就退出,不易报错
Delay(); Delay(); //延时
}
}
}
//第三种,偶数倒计时,奇数正计时。
void main()
{
unsigned char k;
while(1)
{
for(k=0;k<5;k++) //注意把乘2放在索引里了,for循环只有5次
{
P2 = tab[8-2*k]; //8,6,4,2,0
Delay(); Delay();
}
for(k=0;k<5;k++)
{
P2 = tab[2*k+1]; //1,3,5,7,9
//P2 = tab[9-2*k]; //奇数倒计时
Delay(); Delay();
}
}
}
代码中用到了code标识,这里对51单片机的存储方式做一个补充。在51单片机中,RAM(Random Access Memory,随机存取存储器)和 ROM(Read-Only Memory,只读存储器)是两种不同的存储器类型,有以下区别:
1. 功能不同:RAM是用来存储程序执行时产生的临时数据和变量,具有读写功能;而ROM是用来存储程序代码和常量数据,只能读取,不能写入。
2. 存储方式不同:RAM采用易失性存储方式,即断电后数据会丢失;而ROM采用非易失性存储方式,断电后数据会保持不变。
3. 容量和速度不同:RAM一般容量较大,可以存储大量数据;而ROM容量较小,主要用来存储程序代码。RAM的读写速度较快,可以实时读写数据;而ROM的读取速度较慢,仅限于程序代码的读取。
为了在断电后还能保存数组里的段码,要在变量类型和变量名之间加入“code”,代表该数据被写入ROM。
上述代码对于奇偶位变换实际上给出了三类写法,第一种就是最常见的for循环,赋初值i,i+2或-2;第二种是无符号字符型循环变量i,减法运算放在索引了,不用担心数组溢出;第三种是在第二种的基础上把i值变换的计算都放在索引里了,for循环只承担一个自增的作用。
数码管顺序循环及奇偶位演示
?
以上就是单个数码管的循环演示,下面我们会介绍多只数码管的静态显示和动态演示。谢谢大家。