17年11月17日
数码管显示
#include<reg52.h>
单片机型号程序前辍
#include<intrins.h>
#include<intrins.h>
函数库调用
#define uchar unsigned char
#define uchar unsigned char
#define uint unsigned int
define函数名称替换
sbit we = P2^7;
sbit du = P2^6;
sbit we = P2^7;
sbit du = P2^6;
开发板上的位选和段选声明,也就是说告诉单片机我们要用位选和段选了
我们用的开发板上有八组/八位数码管一组/一位由八段数码管组成位选就是说我们要用这八组/八位数码管中的哪一位/组;段选是说我们要用一组/位的哪几段数码管组成我们想让它表示的内容
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
};
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
};
以上这组16进制数表示的是送什么样的段选信号,这个在51的数码管显示的小工具里可以找到,这里我们用的是共阴极数码管
void delay(uint z)
{
uint x,y;
for(x = z;x > 0;x --)
for(y = 112;y > 0;y --);
}
{
uint x,y;
for(x = z;x > 0;x --)
for(y = 112;y > 0;y --);
}
这个是前面我们讲过的延时函数即:1/11.0592*12*112*1000≈1.0080秒
void main()
主函数开始
{
P1 = 0x7f;
{
P1 = 0x7f;
这句可以没有,写这句主要是为了看看LED的位选位置和数码管的位选位置有什么不同
du = 1;
du = 1;
打开段选
P0 = leddata[10];
P0 = leddata[10];
给段选送入数据‘A’
du = 0;
du = 0;
关闭段选
delay(5);
delay(5);
一个小延时
P0 = 0xff;
P0 = 0xff;
P0口全置1,因为是共阴极数码管所以给它高电平它是不会亮的,这句和上面那句延时是为了消去数码管的余晖
we = 1;
we = 1;
位选打开
P0 = 0x7f;
P0 = 0x7f;
向P0口送入位选数据,告诉单片机P0口让它亮哪个数码管
we = 0;
we = 0;
关闭位选
while(1);
while(1);
一直循环
}
}