一、数码管模块代码
这部分包括将数码管想要显示的字符转换成对应段码的函数,另外还包括数码管显示函数
值得注意的是对于小数点和不显示部分的处理方式
由于小数点没有单独占一位,所以这里用到了两个变量i,j用于跳过小数点导致的占据其他字符显示在数码管上的位置
不想让某一位数码管显示的时候,用空格来代替,根据共阳数码管原理图,应将P0引脚全部设为高电平才可熄灭
#include "seg.h"
//段码转换函数
//0xc0
//1100 0000
//以上分别对应这8位dp g f e d c b a
//共阳数码管为低电平时被点亮
//传入两个数组,第一个为传入的想要转换的数,第二个为相对应的转换后的段码
//之所以为*,因为传进来的不只是一个字符,而是一个字符串或者是一个字符数组
void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code)
{
unsigned char i,j;
for(i=0,j=0;i<=7;i++,j++)
{
switch(pucSeg_Buf[j])
{
case '0':
pucSeg_Code[i]=0xc0;
break;
case '1':
pucSeg_Code[i]=0xf9;
break;
case '2':
pucSeg_Code[i]=0xa4;
break;
case '3':
pucSeg_Code[i]=0xb0;
break;
case '4':
pucSeg_Code[i]=0x99;
break;
case '5':
pucSeg_Code[i]=0x92;
break;
case '6':
pucSeg_Code[i]=0x82;
break;
case '7':
pucSeg_Code[i]=0xf8;
break;
case '8':
pucSeg_Code[i]=0x80;
break;
case '9':
pucSeg_Code[i]=0x90;
break;
case 'A':
pucSeg_Code[i]=0x88;
break;
case 'b':
pucSeg_Code[i]=0x83;
break;
case 'C':
pucSeg_Code[i]=0xc6;
break;
case 'd':
pucSeg_Code[i]=0xa1;
break;
case 'E':
pucSeg_Code[i]=0x86;
break;
case 'F':
pucSeg_Code[i]=0x8e;
break;
case ' ':
pucSeg_Code[i]=0xff;
break;
}
if(pucSeg_Buf[j+1] =='.')
{
pucSeg_Code[i]&=0x7F;//0111 1111l与运算,与1不变,与0取反
j++;
}
}
}
void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos)
{
P0 =pucSeg_Code[ucSeg_Pos];
P2=P2&0x1F|0xE0;
P2=P2&0x1F;
P0 =1<<ucSeg_Pos;//根据ucSeg_Pos的值,只有对应位置为1,实现了对任一个想要点亮的数码管的控制
P2=P2&0x1F|0xC0;
P2=P2&0x1F;
}
二、主函数代码
注意这里面的pucSeg_Buf最保险应该开到17位,因为还包括8个小数点
#include "seg.h"
#include "tim.h"
#include "led.h"
#include "init.h"
//Seg
unsigned char pucSeg_Buf[12],pucSeg_Code[9],pucSeg_Pos=0;//字符数组以/0结尾,所以要有9位
void Seg_Proc(void);
//Timer
unsigned long ulms =0;
unsigned int uiSeg_Dly=0;
void main(void)
{
Cls_Peripheral();
Timer0Init();
EA=1;
while(1)
{
Seg_Proc();
}
}
void Seg_Proc(void)
{
if(uiSeg_Dly<200)
return;
uiSeg_Dly =0;
sprintf(pucSeg_Buf,"12345678");//将指定的内容打印到字符数组里
Seg_Tran(pucSeg_Buf,pucSeg_Code);
}
void Time_0(void) interrupt 1
{
ulms++;
uiSeg_Dly++;
if(ulms % 2==0)
{
pucSeg_Pos=(pucSeg_Pos+1)%8;//实现pucSeg_Pos从0-7循环的操作
Seg_Disp(pucSeg_Code,pucSeg_Pos);
}
}
知识点
%4.1f
25.654
25.7\0
8.53
8.5\0
由于是4位,前面会加一个空格
如果想让上面的数左对齐,加一个负号
%-4.1f
126.34
126.3\0
虽然是4位,但是不满足条件时,也会超过4位