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 + -
显示快捷键?