数码管动态显示数字
时间:12-03
来源:互联网
点击:
LED数码管动态扫描显示数字(C语言)
#include
sbit P00 = P0 ^ 0;
sbit P01 = P0 ^ 1;
sbit P02 = P0 ^ 2;
sbit P03 = P0 ^ 3;
int DATA_LED[11] =
{
//0~9的数码管段码 A0H,BBH,62H,2AH,39H,2CH,24H,BAH,20H,28H 根据具体电路而定,不通用
0xA0,//0
0xBB,//1
0x62,//2
0x2A,//3
0x39,//4
0x2C,//5
0x24,//6
0xBA,//7
0x20,//8
0x28,//9
0xFF
};
void delay(int m)//延时程序,延时m*0.5毫秒
{
unsigned int i;
unsigned int j;
for (i = 0; i < m; i++)
{
for (j = 0; j < 500; j++){}
}
}
void led(int n)//数码管显示及数据处理程序
{
P1 = 0xFF;
P1 = DATA_LED[n % 10];//个位
P00 = 0;
delay(1);
P00 = 1;
P1 = 0xFF;
P1 = DATA_LED[n / 10 % 10];//十位
P01 = 0;
delay(1);
P01 = 1;
P1 = 0xFF;
P1 = DATA_LED[n / 100 % 10];//百位
P02 = 0;
delay(1);
P02 = 1;
P1 = 0xFF;
P1 = DATA_LED[n / 1000 % 10];//千位
P03 = 0;
delay(1);
P03 = 1;
}
void main(void)
{
while (1)
{
led(404);//显示数字404,实际显示的是0404,需要在led()函数中判断,没有千位的情况,不是让显示成0
}
}
#include
sbit P00 = P0 ^ 0;
sbit P01 = P0 ^ 1;
sbit P02 = P0 ^ 2;
sbit P03 = P0 ^ 3;
int DATA_LED[11] =
{
//0~9的数码管段码 A0H,BBH,62H,2AH,39H,2CH,24H,BAH,20H,28H 根据具体电路而定,不通用
0xA0,//0
0xBB,//1
0x62,//2
0x2A,//3
0x39,//4
0x2C,//5
0x24,//6
0xBA,//7
0x20,//8
0x28,//9
0xFF
};
void delay(int m)//延时程序,延时m*0.5毫秒
{
unsigned int i;
unsigned int j;
for (i = 0; i < m; i++)
{
for (j = 0; j < 500; j++){}
}
}
void led(int n)//数码管显示及数据处理程序
{
P1 = 0xFF;
P1 = DATA_LED[n % 10];//个位
P00 = 0;
delay(1);
P00 = 1;
P1 = 0xFF;
P1 = DATA_LED[n / 10 % 10];//十位
P01 = 0;
delay(1);
P01 = 1;
P1 = 0xFF;
P1 = DATA_LED[n / 100 % 10];//百位
P02 = 0;
delay(1);
P02 = 1;
P1 = 0xFF;
P1 = DATA_LED[n / 1000 % 10];//千位
P03 = 0;
delay(1);
P03 = 1;
}
void main(void)
{
while (1)
{
led(404);//显示数字404,实际显示的是0404,需要在led()函数中判断,没有千位的情况,不是让显示成0
}
}
原理很简单,这是LED动态显示方式, 当P1为高电平,P0为低电平是,灯就亮。显示写成了函数led(),调用很方便,这个还没有解决小数的问题,不过,把原理弄懂了,其他的理解起来就会很快了。
我这里是给P1赋值, 例如P1=0xBB,换成二进制,P1=10111011,可以看出刚好是八位,那P1^0=1;P1^1=1,P1^2=0…… ,不用分别给每个口赋值,把这个理解了就懂了。
P1 = 0xFF; //每次一定要重新赋值,不然可能会出现显示全是8的情况
P1 = DATA_LED[n / 1000 % 10]; //千位的数字对应的数码管段码
P03 = 0; //前面有定义 sbit P03 = P0 ^ 3,就是把P0.3接低电平
delay(1); //采用空循环执行延时1*0.5毫秒,再关闭显示下一位,利用人眼的视觉滞留,这种动态变换就感觉不到了,12MHz的晶体振荡器
P03 = 1; //每次显示完了一定要接高电平,不然会显示成全是8
数码管动态显示数 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)