单片机C51 之(7)GPIO 显示"/>
单片机C51 之(7)GPIO 显示
数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元DP(decimal point),此时,发光二极管的外观是长条型,而不是常见的圆柱形。
可以理解成几个LED按照一定的位置摆放在一起的一个器件而已,包括类似于“米”型的数码管原理都是类似的,以及后面的点阵等。
按照连接方式 分为共阴与共阳。由于51 单片机GPIO默认是高电平、GPIO的电流驱动力有限,所以一般使用共阳比较多。
显示不同的数字,就是让不同位置的LED亮起来:
#include <reg51.h>
#define uchar unsigned charvoid DelayTime10ms(unsigned int DelayValue);
uchar code SegCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //共阳极0-9 a-f
void main()
{int i;for(;;) { for(i=0;i<16;i++) { //从0显示到F,每秒切换P0 = SegCode[i];DelayTime10ms(100);}}
}void DelayTime10ms(unsigned int DelayValue)
{unsigned int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<1828;b++);
}
一个数码管已经亮了,两个、三个也是比较简单的:
做个简单的6分钟倒计时
#include <reg51.h>
#define uchar unsigned charsfr AAA=0x80;
sfr BBB=0x90;
sfr CCC=0xA0;
sfr DDD=0xB0;
void DelayTime10ms(unsigned int DelayValue);
uchar code SegCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //共阳
void main()
{int sec,min;sec = 00;min = 6;for( ; ; ) { DDD=SegCode[sec % 10]; //拆分个位与十位CCC=SegCode[sec / 10];BBB=SegCode[min % 10] & 0x7f; //在分钟的末尾加上一个小数点,区分分钟与秒钟AAA=SegCode[min / 10];DelayTime10ms(100);if(sec == 00){sec = 59;min --;if(min < 0||min > 7) {min = min = 0;}}else sec--; }
}void DelayTime10ms(unsigned int DelayValue)
{unsigned int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<1828;b++);
}
这里加上按键,启动、暂停、清零,就可以做一个简单的秒表了。
更多推荐
单片机C51 之(7)GPIO 显示
发布评论