一、原理
原理很简单
如图,P0是共用引脚对应段码和位码,Y6和Y7分别对应数码管的位和段,只要把需要的值赋值给P0,然后再将P2对应的Y6和Y7使能端打开就可以实现数码管的显示。
二、编程
void Seg_Tran(unsigned char *seg_string,unsigned char *seg_buf)
{
unsigned char i=0,j=0,temp;//buf[i]=buf[0~7],seg_string[j]=seg_string[0~10]
for(i=0;i<=7;i++,j++)
{
switch(seg_string[j])
{
case '0': temp=0xc0;break;
case '1': temp=0xf9;break;
case '2': temp=0xa4;break;
case '3': temp=0xb0;break;
case '4': temp=0x99;break;
case '5': temp=0x92;break;
case '6': temp=0x82;break;
case '7': temp=0xf8;break;
case '8': temp=0x80;break;
case '9': temp=0x90;break;
case 'A': temp=0x88;break;
case 'B': temp=0x83;break;
case 'C': temp=0xC6;break;
case 'D': temp=0xA1;break;
case 'E': temp=0x86;break;
case 'F': temp=0x8E;break;
case 'H': temp=0x89;break;
case 'L': temp=0xC7;break;
case 'N': temp=0xC8;break;
case 'P': temp=0x8C;break;
case 'U': temp=0xC1;break;
case '_': temp=0xBF;break;
case ' ': temp=0xFF;break;
default : temp=0xFF;break;
}
if(seg_string[j+1]=='.')
{
temp &=0x7f;
j++;
}
seg_buf[i]=temp;
}
首先是把所需的字符转转换为数组中以十六进制保存,如果有.就把0x7f赋值给所需的temp,以便后面显示用。
void Seg_Disp(unsigned char *seg_buf,unsigned char pos)
{
P0=0xff; //ÏûÒþ
P2=P2 & 0X1F | 0XE0;//ѡͨY7£¬¼´¶ÎÂëËø´æÆ÷ 111
P2 &=0X1F; //¹Ø±ÕËø´æÆ÷
P0=1<<pos; //½«¶ÎÂëËÍÈë
P2=P2 & 0X1F | 0XC0;//ѡͨY6£¬¼´¶ÎÂëËø´æÆ÷ 110
P2 &=0X1F; //¹Ø±ÕËø´æÆ÷
P0=~seg_buf[pos]; //½«¶ÎÂëËÍÈë
P2=P2 & 0X1F | 0XE0;//ѡͨY7£¬¼´¶ÎÂëËø´æÆ÷ 111
P2 &=0X1F; //¹Ø±ÕËø´æÆ÷
}
显示数码管,像将P0口消隐,打开Y7,再关闭,之后再位选,1一直往左移,选8位,打开Y6,再进行段选,将转换后的数组赋值给P0,打开Y7,就可以完成数码管的显示了。
主函数,定义数组和字符串
%u为整数
主函数放字符串的转换
利用定时器1实现数码管的亮灭