历史上的今天
今天是:2025年08月11日(星期一)
2021年08月11日 | 51单片机——八段数码管
2021-08-11 来源:eefocus
在对LED灯的应用有了一定的了解之后,我开始学习了一些关于数码管的应用。
在我的开发板上,有独立共阳管和八位共阴管 。数码管从高位到低位的段码依次是h(dp),g,f,e,d,c,b,a共八位。共阴管是“1”表示亮,“0”表示灭,而共阳管则是相反的。顺便提一句,若是要检测数码管是否完好,可以用数码管“8”来检测。
若是要在数码管上显示0~F,则可以用一套固定的十六进制数表示,可以放在数组中,为{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}。这一个数组是用来表示共阴管的亮的,而若是共阳管的时候,需要在前面加上“~”。
独立共阳管显示0-F
自己写的几个延时函数
void DelayUs2X(unsigned char t)//微秒级延时
{
while(t--);
}
void DelayMs(unsigned char t)//毫秒级延时
{
while(t--)
{
DelayUs2X(245);
DelayUs2X(245);
}
}
void DelayS(unsigned char t)//秒级延时
{
while(t--)
{
DelayMs(245);
}
}
段码和位码的用数组存放
unsigned char code Seg_Code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//段码,显示器现实的数字对应0~15
unsigned char code Bit_Code[]={0xfe,0xfd,0xfb,0xf7,0xef,0x0df,0xbf,0x7f};
//位码,对应8个数码管
unsigned char code LOVE[]={0x06,0x00,0x38,0x3f,0x3e,0x79,0x00,0x3e};
// I L O V E U
单个数码管从0——15的显示,因为板子上的单个数码管是共阳极的,所以需要给代码去反
void main()//单个数码管零到16的显示
{
while(1)
{
if(i==16)
{
i=0;
}
P1 =~Seg_Code[i];
i++;
DelayS(5);//相当于1秒的延迟
}
}
八位数码管一次显示从1到15,每次位选一个数码管
void show_0_15()//0到15的八位数码管一次显示
{
DataPort = 0;//清除数据,防止重影
for(i=0;i<16;i++,j++)//先送位码,再选段码
{
if(j==8)
{
j=0;
}
DataPort =Bit_Code[j];//送位码确定哪个数码管显示
Bit_Latch = 1;//开门
Bit_Latch = 0;//关门
// Delay();
DataPort = Seg_Code[i];//送段码,确定显示的数字
Seg_Latch = 1;//开门
Seg_Latch = 0;//关门
Delay();
}
}
Display显示函数,用来确认需要从第几码管显示以及显示几位数码管
void DisPlay(unsigned char FirstBit,unsigned char Num)//显示几位数码管以及各自上面的数字
{
unsigned char i;
for(i=0;i DataPort =0; Seg_Latch=1; Seg_Latch=0; DataPort=Bit_Code[i+FirstBit]; Bit_Latch=1; Bit_Latch=0; DataPort=TempData[i];//显示数据//需要在对应的数码管现实的数字 Seg_Latch=1;//位锁存 Seg_Latch=0; DelayUs2X(255); } } 8位累加器,从0到99999999 void leijiaqi()//累加器8位 { unsigned long int num=0; unsigned int j; while(1) { j++; if(j==24)//延时空跑24圈,num+1;这24圈只是为了跑亮八个灯 { j=0; num++; if(num==10000000) num=0; } TempData[0]=Seg_Code[num/10000000]; TempData[1]=Seg_Code[(num%10000000)/1000000]; TempData[2]=Seg_Code[(num%1000000)/100000]; TempData[3]=Seg_Code[(num%100000)/10000]; TempData[4]=Seg_Code[(num%10000)/1000]; TempData[5]=Seg_Code[(num%1000)/100]; TempData[6]=Seg_Code[(num%100)/10]; TempData[7]=Seg_Code[(num%10)/1]; DisPlay(0,8); } } 在八位数码管上动态显示11位的手机号码,将上一位空格共12位 void main() { unsigned long int num=0; unsigned int j; while(1) { j++; if(j==40)//延时空跑24圈,num+1;这24圈只是为了跑亮八个灯 { temp%=1000; temp++; j=0; } //temp%=8; for(i=0;i<8;i++) { TempData[i]=PhoneNumber[(i+temp)%12]; } DisPlay(0,8); } }
史海拾趣
|
从0开始教你学单片机-反对用标准实验板的学习方法? geyin 闲来无事,准备学学单片机.... 寻找试验板和书籍 发现这本书有个这种观点,吃惊不小啊:) =============================== 定价:25元 作者:赵星寒 刘小波 王庚兰 ...… 查看全部问答> |
|
Skinput能够解决MP3等小玩意儿触摸屏越来越小的问题 Skinput能够识别在手上敲打出来的电话号码 研究人员表示,我们的皮肤是一个完美的显示面,能够永远伴随着我们 与MP3播放器结合在一起的Skinput原型,可用于改换歌曲和调整音量 Ski ...… 查看全部问答> |
|
hFile = CreateFileForMapping(); hMap = CreateFileMapping(hFile,); pHead = MapViewOfFile(hMap); BYTE * pData = new BYTE[nSiz ...… 查看全部问答> |
|
在WINCE5.0 系统中,控制面板--电源--电源属性--方案, 当我在电源使用方案中选电池电源时,将状态切换为挂起的时间不准(即是系统定时睡眠的时间不准), 请高手指点应该怎么样修改,谢谢!… 查看全部问答> |
|
我有一个内部测试机器的系统,有两只表:一只电能表,一只热能表.热能表有RS232接口,已经有软件支持了,接入电脑后运行软件就可以读取数据了,而电能表 只有RS485接口.现欲将两个表的软体整合成一个软件,并要求达到如下功能: 将测试的负 ...… 查看全部问答> |




