一、seg.h代码
#include "STC15F2K60S2.H"
#include "stdio.h"
void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code);
void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos);
二、seg.c代码
#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;
}
三、主函数代码
unsigned char pucSeg_Buf[12],pucSeg_Code[8];
pucSeg_Buf开了12位因为有/0,并且可能有小数点
pucSeg_Code 一共有8位数码管,所以开8位
#include "tim.h"
#include "init.h"
#include "led.h"
#include "seg.h"
#include "stdio.h"
//Timer
unsigned long ulms=0;
unsigned int uiLed_Dly=0;
unsigned int uiSeg_Dly=0;
//LED
unsigned char ucLed=0x25;
//Seg
unsigned char ucSeg_Pos=0;
unsigned char pucSeg_Buf[12],pucSeg_Code[8];
//Function
void Led_Proc(void);
void Seg_Proc(void);
void main()
{
Cls_Peripheral();
Timer0Init();
EA=1;
while(1)
{
Led_Proc();
Seg_Proc();
}
}
void Led_Proc(void)
{
if(uiLed_Dly<200)
return;
uiLed_Dly=0;
Led_Disp(ucLed);
}
void Seg_Proc(void)
{
if(uiSeg_Dly<200)
return;
uiSeg_Dly=0;
sprintf(pucSeg_Buf,"12.34 124");//将文字存储到数组中
Seg_Tran(pucSeg_Buf,pucSeg_Code);//将存入的数组中的内容转换成段码
}
void Time_0(void) interrupt 1
{
ulms++;
uiLed_Dly++;
uiSeg_Dly++;
if(ulms%2==0)//数码管2ms循环一次,因为数码管没有办法一次性显示不同内容,因此逐位去点来点亮
{
ucSeg_Pos=(ucSeg_Pos+1)%8;//ucSeg_Pos会在0-7之间循环,依次点亮数码管的每个位
Seg_Disp(pucSeg_Code,ucSeg_Pos);//基于段码,让对应的位进行显示
}
}