seg7.c
来自「STC51系列的源码」· C语言 代码 · 共 187 行
C
187 行
/********************************************************************************/
/* filename : SEG7.c */
/* created : xillinx */
/* descript : 本系统采用7端共阴极数码管 */
/* */
/* __________________________ */
/* D7 D6 D5 D4 D3 D2 D1 D0 | <A> | */
/* DOT G F E D C B A | +-----+ | */
/* | _|_ _|_ _|_ _|_ _|_ _|_ _|_ | <F> | |<B> | */
/* O \|/ \|/ \|/ \|/ \|/ \|/ \|/ | | <G> | | */
/* | | | | | | | | | +-----+ | */
/* +----+--- +--- +--- +--- +--- +--- + | <E> | |<C> | */
/* | | | | | */
/* ---+---- | +-----+ O <DOT> | */
/* CSX(GND) | <D> | */
/********************************************************************************/
/* */
/* 共阳极数码管 __________________________ */
/* CSX(VDD) | <A> | */
/* ---+---- | +-----+ | */
/* | | <F> | |<B> | */
/* +----+--- +--- +--- +--- +--- +--- + | | <G> | | */
/* | _|_ _|_ _|_ _|_ _|_ _|_ _|_ | +-----+ | */
/* O \|/ \|/ \|/ \|/ \|/ \|/ \|/ | <E> | |<C> | */
/* | | | | | | | | | | | | */
/* DOT G F E D C B A | +-----+ O <DOT> | */
/* D7 D6 D5 D4 D3 D2 D1 D0 | <D> | */
/********************************************************************************/
#include "../CPU/CPU.h"
#include "../SEG7/SEG7.h"
unsigned char SEG7_buffer[0x8]; //* 七段数码管的显示缓冲区
/********************************************************************************/
/* 显示数据编码,本系统采用共阴极,所以数码管的选择信号输出低电平,段码信号输出 */
/* 高电平,则点亮这个数码段,所以数据设计表为下表 */
/********************************************************************************/
unsigned char code SEG7_G_table[11]=
{/* 0 */ 0x3F, //* O/G=0;
/* 1 */ 0x06, //* O/G/F/E/D/A=0;
/* 2 */ 0x5B, //* O/F/C=0;
/* 3 */ 0x4F, //* O/F/E=0;
/* 4 */ 0x66, //* O/E/D/A=0;
/* 5 */ 0x6D, //* O/E/B=0;
/* 6 */ 0x7D, //* O/B=0;
/* 7 */ 0x07, //* O/G/F/E/D=0;
/* 8 */ 0x7F, //* O=0;
/* 9 */ 0x6F, //* O/E=0;
/* N */ 0x00, //* O/G/F/E/D/C/B/A=0;
};
unsigned char code SEG7_G_dot_table[11]=
{/* 0. */ 0xBF, //* /G=0;
/* 1. */ 0x86, //* /G/F/E/D/A=0;
/* 2. */ 0xDB, //* /F/C=0;
/* 3. */ 0xCF, //* /F/E=0;
/* 4. */ 0xE6, //* /E/D/A=0;
/* 5. */ 0xED, //* /E/B=0;
/* 6. */ 0xFD, //* /B=0;
/* 7. */ 0x87, //* /G/F/E/D=0;
/* 8. */ 0xFF, //* ;
/* 9. */ 0xEF, //* /E=0;
/* N. */ 0x80, //* /G/F/E/D/C/B/A=0;
};
/********************************************************************************/
/* 共有3片HC595,第一和第二片用作七段数码管显示,第三片用作LED的跑马灯 */
/* 其中第一片用作七段数码管的数据输出,第二片用作选择输出 */
/********************************************************************************/
unsigned char code SEG7_G_segment_table[0x8]=
{/* 1 */ 0xFE, //* 选择第1个数码显示数字
/* 2 */ 0xFD, //* 选择第2个数码显示数字
/* 3 */ 0xFB, //* 选择第3个数码显示数字
/* 4 */ 0xF7, //* 选择第4个数码显示数字
/* 5 */ 0xEF, //* 选择第5个数码显示数字
/* 6 */ 0xDF, //* 选择第6个数码显示数字
/* 7 */ 0xBF, //* 选择第7个数码显示数字
/* 8 */ 0x7F, //* 选择第8个数码显示数字
};
/********************************************************************************/
/* 显示数据编码,本系统采用共阳极,所以数码管的选择信号输出高电平,段码信号输出 */
/* 低电平,则点亮这个数码段,所以数据设计表为下表 */
/********************************************************************************/
unsigned char code SEG7_V_table[11]=
{/* 0 */ 0xC0, //* O/G=1;
/* 1 */ 0xF9, //* O/G/F/E/D/A=1;
/* 2 */ 0xA4, //* O/F/C=1;
/* 3 */ 0xB0, //* O/F/E=1;
/* 4 */ 0x99, //* O/E/D/A
/* 5 */ 0x92, //* O/E/B=1;
/* 6 */ 0x82, //* O/B=1;
/* 7 */ 0xF8, //* O/G/F/E/D=1;
/* 8 */ 0x80, //* O=1;
/* 9 */ 0x90, //* O/E=1;
/* N */ 0xFF, //* O/G/F/E/D/C/B/A=1;
};
unsigned char code SEG7_V_dot_table[11]=
{/* 0. */ 0x40, //* /G=1;
/* 1. */ 0x79, //* /G/F/E/D/A=1;
/* 2. */ 0x24, //* /F/C=1;
/* 3. */ 0x30, //* /F/E=1;
/* 4. */ 0x19, //* /E/D/A
/* 5. */ 0x12, //* /E/B=1;
/* 6. */ 0x02, //* /B=1;
/* 7. */ 0x78, //* /G/F/E/D=1;
/* 8. */ 0x00, //* ;
/* 9. */ 0x10, //* /E=1;
/* . */ 0x7F, //* /G/F/E/D/C/B/A=1;
};
/********************************************************************************/
/* 共有3片HC595,第一和第二片用作七段数码管显示,第三片用作LED的跑马灯 */
/* 其中第一片用作七段数码管的数据输出,第二片用作选择输出 */
/********************************************************************************/
unsigned char code SEG7_V_segment_table[0x8]=
{/* 1 */ 0x01, //* 选择第1个数码显示数字
/* 2 */ 0x02, //* 选择第2个数码显示数字
/* 3 */ 0x04, //* 选择第3个数码显示数字
/* 4 */ 0x08, //* 选择第4个数码显示数字
/* 5 */ 0x10, //* 选择第5个数码显示数字
/* 6 */ 0x20, //* 选择第6个数码显示数字
/* 7 */ 0x40, //* 选择第7个数码显示数字
/* 8 */ 0x80, //* 选择第8个数码显示数字
};
/********************************************************************************/
/* fun_name : SEG7_printf_ascii() */
/* version : v1.00 */
/* created : hw-chen */
/* descript : 向七段数码显示缓冲区缓存数据,刷新部分从这个缓冲区读取显示数据 */
/* 最后的显示是由HC595模块来刷新的 */
/********************************************************************************/
void SEG7_printf_ascii(unsigned char * string)
{ unsigned char i,length;
unsigned char * ptr;
unsigned char dot;
unsigned char num;
unsigned char index;
length=strlen(string); //* 计算输入缓冲区的长度
if( length==0x0) //* 缓冲区有错误
{ return;
}
num=0x8;
ptr=string+length-0x1; //* 指向字符串的尾部
/****************************************************************************/
/* 处理显示数据 */
/****************************************************************************/
for(i=0x0;i<length;i++)
{ dot=0x0;
if(ptr[0x0]=='.') //* 如果是'.',需要记录下来这个点,和前面的一位数据一起显示
{ dot=0x1;
i++;
ptr--; //* 跳过这个'.'字符
}
if(i==length) //* 这种情况只能在有点,并且前面已经没有数据才出现,如:".1234"
{ SEG7_buffer[num-0x1]=SEG7_dot_table[10]; //* 只显示点
break;
}
index=ptr[0x0]-'0';
ptr--; //* 跳过这个数据
if(index>0x9) //* 如果这个数据不是0~9,需要丢弃这个数据
{ continue;
}
if(dot==0x1)
{ SEG7_buffer[num-0x1]=SEG7_dot_table[index]; //* 显示带点的数据
}
else
{ SEG7_buffer[num-0x1]=SEG7_table[index]; //* 显示不带点的数据
}
num--;
if(num==0x0) //* 已经超过8位,丢弃前面的数据
{ break;
}
}
}
/********************************************************************************/
/* fun_name : SEG7_clear_screen() */
/* version : v1.00 */
/* created : hw-chen */
/* descript : 清除LED数码管显示区 */
/********************************************************************************/
void SEG7_clear_screen(void)
{ memset(&SEG7_buffer[0x0],SEG7_table[10],0x8);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?