51单片机数码管显示(共阴极)
1.先看一下显示的结果:
源代码:
#include <reg51.h>
typedef unsigned int u16;
typedef unsigned char u8;
u8 code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极
u16 num=2021;//要显示的数字
/*延时函数*/
void delay(u16 i)
{
while(i--);
}
/*显示函数*/
void display()
{
u16 x = 0;
while(1)
{
switch(x)
{
case 0:P2 = 0x0e;P0 = smg[num / 1000];break; //显示2
case 1:P2 = 0x0d;P0 = smg[(num % 1000) / 100];break; //显示0
case 2:P2 = 0x0b;P0 = smg[(num % 1000) % 100 / 10];break; //显示2
case 3:P2 = 0x07;P0 = smg[num % 10]; break; //显示1
}
delay(100);//延时,增大延时我们可以看到数码管是交替点亮的
P0=0x00;//消隐(消隐一定要在延时函数后)
x = ++x % 4;//取模,当x=4时,通过与4取模就让x的值重新变回0
}
}
/*主函数*/
void main()
{
display();
}
2.如何在数码管显示小数点呢?
对与共阴极数码管来说,直接将要显示的数字与0x80相或
例如:
要想在数码管上显示数字2,对于本电路图来说,直接让P0=0x5b即可; 0x5b=01011011,
但怎么显示'2.'呢? 对于共阴极数码管来说,只需要让P0=0x5b | 0x80, 即P0=11011011,即点亮dp位
显示结果:
源代码:
#include <reg51.h>
typedef unsigned int u16;
typedef unsigned char u8;
u8 code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极
u16 num=2021;//要显示的数字
/*延时函数*/
void delay(u16 i)
{
while(i--);
}
/*显示函数*/
void display()
{
u16 x = 0;
while(1)
{
switch(x)
{
case 0:P2 = 0x0e;P0 = smg[num / 1000]|0x80;break; //显示2. 只修改了此语句
case 1:P2 = 0x0d;P0 = smg[(num % 1000) / 100];break; //显示0
case 2:P2 = 0x0b;P0 = smg[(num % 1000) % 100 / 10];break; //显示2
case 3:P2 = 0x07;P0 = smg[num % 10]; break; //显示1
}
delay(100);//延时,增大延时我们可以看到数码管是交替点亮的
P0=0x00;//消隐(消隐一定要在延时函数后)
x = ++x % 4;//取模,当x=4时,通过与4取模就让x的值重新变回0
}
}
/*主函数*/
void main()
{
display();
}
一个问题:
之前我是在proteus上进行仿真的,没有进行消隐运行结果也是正确的,但是放到开发板上就有些看不清出,添加消隐处理就正常了.由此我们要知道用proteus仿真的结果正确,但在开发板上运行就不一定正确,大家学习硬件最好还是用实物!!!.
未消隐处理:
消隐处理:
以上就是51单片机数码管显示数字及小数点了,但仅仅以共阴极数码管为例,大家还可以思考一下如何用共阳极数码管实现
proteus中数码管: 7-SEG-MPX4 (CC是共阴极,CA是共阳极)