zlg7290数码管显示驱动_IO口输出之数码管动态显示

该博客详细介绍了使用ZLG7290驱动数码管进行动态显示和消影的技术实现。通过C语言编程,展示了如何控制74HC595和74HC573芯片来驱动数码管,同时通过实验验证了消影效果,以消除数码管显示时的闪烁现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

/*

**********************************************************************

*                       本地数据类型/宏定义

**********************************************************************

*/

typedef signed char int8;         //8位有符号字符型

typedef signed int int16;         //16位有符号整型

typedef signed long int32;        //32位有符号长整型

typedef unsigned char uint8;      //8位无符号字符型

typedef unsigned int uint16;      //16位无符号整型

typedef unsigned long uint32;     //32位无符号长整型

/*

**********************************************************************

*                        单片机IO口位定义

**********************************************************************

*/

sbit DATA_A_595      = P1^0;  //74HC595 串行数据输入引脚

sbit SHIFT_CLOCK_595 = P1^4;  //74HC595 移位寄存器时钟信号输入引脚

sbit LATCH_CLOCK_595 = P2^3;  //74HC595 锁存器时钟信号输入引脚

sbit duanxuan = P2^5;            //数码管驱动芯片74HC573 段选 

sbit weixuan  = P2^6;            //数码管驱动芯片74HC573 位选

/*

**********************************************************************

*                      本地全局变量/数组定义

**********************************************************************

*/

uint8 zifu_test;  //自加变量  测试我们编码表

uint8 code zifu[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf};  //共阳数码管编码表

/*

**********************************************************************

*                         函数原型声明

**********************************************************************

*/

void delay(uint16 x_ms); //延迟  x_ms*1  毫秒

void write_byte_74hc595(uint8 dat);  //给595芯片写一字节数据函数

void delay_100us(uint16 x_100us); //延迟  x_100*100  微秒

void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time);//把一个任意的八位数以内的十进制数,通过动态扫描显示在数码管上,可以指定扫描时间

/*********************************************************************

*函数名称:main

*函数功能:主函数

*函数调用:

*参数列表:无

*返 回 值:无

*结    果:

*备    注:

*********************************************************************/

void main(void)

{

P1=0XFF;

write_byte_74hc595(0X40);  //给595芯片写一字节数据函数

write_byte_74hc595(0X00);  //给595芯片写一字节数据函数  关掉595被控制的所有功能

zifu_test = 0;  //自加变量  测试我们编码表

while(1)

{

/***************************************************************************************************

//数码管消斗试验 

  duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[1];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X01;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      delay(1000); //延迟  x_ms*1  毫秒

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[2];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X02;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      delay(1000); //延迟  x_ms*1  毫秒

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[3];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X04;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      delay(1000); //延迟  x_ms*1  毫秒

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[4];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X08;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      delay(1000); //延迟  x_ms*1  毫秒

/********************************************************************************************/

/****************************************************************************************

     //验证影子产生的原因

duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[1];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

// delay(1); //延迟  x_ms*1  毫秒  放大影子显现,验证我们的理论

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X01;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      //delay(4); //延迟  x_ms*1  毫秒

  delay_100us(1); //延迟  x_100*100  微秒

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[2];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

// delay(1); //延迟  x_ms*1  毫秒  放大影子显现,验证我们的理论

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X02;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      //delay(4); //延迟  x_ms*1  毫秒

delay_100us(1); //延迟  x_100*100  微秒

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[3];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

// delay(1); //延迟  x_ms*1  毫秒  放大影子显现,验证我们的理论

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X04;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      //delay(4); //延迟  x_ms*1  毫秒

delay_100us(1); //延迟  x_100*100  微秒

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[4];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

// delay(1); //延迟  x_ms*1  毫秒  放大影子显现,验证我们的理论

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X08;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      //delay(4); //延迟  x_ms*1  毫秒

delay_100us(1); //延迟  x_100*100  微秒

//****************************************************************************************/

    //数码管消影

/*  duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[1];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

// delay(1); //延迟  x_ms*1  毫秒  放大影子显现,验证我们的理论

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X01;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      //delay(4); //延迟  x_ms*1  毫秒

  delay_100us(1); //延迟  x_100*100  微秒

//******************************************************************************************

    //消影

  duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X00;          //数码管位选清零

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

//******************************************************************************************

  duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[2];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

// delay(1); //延迟  x_ms*1  毫秒  放大影子显现,验证我们的理论

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X02;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      //delay(4); //延迟  x_ms*1  毫秒

delay_100us(1); //延迟  x_100*100  微秒

//******************************************************************************************

    //消影

  duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X00;          //数码管位选清零

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

//******************************************************************************************

duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[3];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

// delay(1); //延迟  x_ms*1  毫秒  放大影子显现,验证我们的理论

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X04;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      //delay(4); //延迟  x_ms*1  毫秒

delay_100us(1); //延迟  x_100*100  微秒

//******************************************************************************************

    //消影

  duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X00;          //数码管位选清零

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

//******************************************************************************************

duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[4];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

// delay(1); //延迟  x_ms*1  毫秒  放大影子显现,验证我们的理论

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X08;          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      //delay(4); //延迟  x_ms*1  毫秒

delay_100us(1); //延迟  x_100*100  微秒

//******************************************************************************************

    //消影

  duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X00;          //数码管位选清零

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

//******************************************************************************************

*/

  // Disp_smg_number(1,8,12345678,15);//数码管显示12375678 把任意一个八位以内的十进制数,在数码管上x坐标任意位置,任意扫描时间,通过动态扫描显示

Disp_smg_number(3,6,198866,15);//数码管显示198866 

}

}

/*********************************************************************

*函数名称:write_byte_74hc595

*函数功能:74HC595芯片数据输入

*函数调用:write_byte_74hc595(uint8 dat); 

*参数列表:dat

*返 回 值:无

*结    果:把一个字节数 dat 写到 74HC595芯片的八个输出引脚上

*备    注:dat 数据对应的功能

           蜂鸣器         0X04            继电器           0X80

           时钟芯片片选   0X10            流水灯           0X40

*********************************************************************/

void write_byte_74hc595(uint8 dat)  //给595芯片写一字节数据函数

{

  uint8 i; 

for(i=0;i<8;i++)

{

    DATA_A_595      =(dat<

  SHIFT_CLOCK_595 = 0;  //74HC595 移位寄存器时钟信号输入引脚

  SHIFT_CLOCK_595 = 1;  //74HC595 移位寄存器时钟信号输入引脚

}

LATCH_CLOCK_595 = 0;  //74HC595 锁存器时钟信号输入引脚

LATCH_CLOCK_595 = 1;  //74HC595 锁存器时钟信号输入引脚

}

/*********************************************************************

*函数名称:delay

*函数功能:延时函数

*函数调用:delay(uint16 x_ms); 

*参数列表:x_ms

*返 回 值:无

*结    果:延迟时间=1* x_ms(毫秒)

*备    注:

*********************************************************************/

void delay(uint16 x_ms) //延迟  x_ms*1  毫秒

{

   uint16 i,j;

for(i=x_ms;i>0;i--)

for(j=114;j>0;j--);

}

/*********************************************************************

*函数名称:delay_100us

*函数功能:延时函数

*函数调用:delay(uint16 x_100us); 

*参数列表:x_100us

*返 回 值:无

*结    果:延迟时间=100* x_100us(微秒)

*备    注:

*********************************************************************/

void delay_100us(uint16 x_100us) //延迟  x_100*100  微秒

{

   uint16 i,j;

for(i=x_100us;i>0;i--)

for(j=11;j>0;j--);

}

/*********************************************************************

*函数名称:Disp_smg_number

*函数功能:把任意一个八位以内的十进制数,在数码管上x坐标任意位置,任意扫描时间,通过动态扫描显示

*函数调用:void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time);

*参数列表: 

             uint8 x_smg       数码管写入位置X坐标     取值范围1-8

             uint8 count_smg   写入几位十进制数        取值范围1-8

             uint32 number     写入的十进制数值        取值范围0-99999999 

             uint16 time       动态扫描时间            延迟时间 = time*100us  

*返 回 值:无

*结    果:在八位数码管任意位置通动态扫描写一个八位以内的任意数

*备    注: 

                         共阳数码管编码表

十六进制:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf

显示字符:  0    1    2    3    4    5    6    7    8    9    A    b    C    D    E    F    H    .    -

                  共阳数码管从左至右,依次位选编码数据

十六进制  :  0X01    0X02    0X04    0X08    0X10    0X20    0X40    0X80

数码管编号:     1       2       3       4       5       6       7       8

*********************************************************************/

void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time)

{

uint8 i;

uint8 number1[8]; //定义一个存储八位数的每一位的数字用的数组

uint8 code zifu[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf}; 

uint8 code wei_dat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};       //定义八位数码管位选数据数组

number1[0] = number % 10;                      //个        

number1[1] = number % 100 / 10;                //十   

number1[2] = number % 1000 / 100;              //百

number1[3] = number % 10000 / 1000;            //千

number1[4] = number % 100000 / 10000;          //万 

number1[5] = number % 1000000 / 100000;        //十万

number1[6] = number % 10000000 / 1000000;      //百万 

number1[7] = number % 100000000 / 10000000;     //千万 

for(i=0;i < count_smg;i++)

{/*

  duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =zifu[number1[count_smg-i-1]];          //数码管段码显示 0     zifu_test自加变量  测试我们编码表 

  duanxuan = 1;            //数码管驱动芯片74HC573 段选

  duanxuan = 0;            //数码管驱动芯片74HC573 段选

// delay(1); //延迟  x_ms*1  毫秒  放大影子显现,验证我们的理论

    duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =wei_dat[x_smg+i-1];          //数码管段码显示 0

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

      //delay(4); //延迟  x_ms*1  毫秒

  delay_100us(time); //延迟  x_100*100  微秒

//******************************************************************************************

    //消影

  duanxuan = 0;            //数码管驱动芯片74HC573 段选 

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

  P0       =0X00;          //数码管位选清零

      weixuan  = 1;            //数码管驱动芯片74HC573 位选

      weixuan  = 0;            //数码管驱动芯片74HC573 位选

//****************************************************************************************** */

//********************************************************************

//数码管段选写入

duanxuan = 0;  //数码管驱动芯片74hc573 段选

weixuan  = 0; //数码管驱动芯片74hc573 位选

    P0=zifu[number1[count_smg-i-1]];      //数码管段选显示0 段码数据

duanxuan = 1;  //数码管驱动芯片74hc573 段选

duanxuan = 0;  //数码管驱动芯片74hc573 段选

//********************************************************************

//数码管位选写入

duanxuan = 0;  //数码管驱动芯片74hc573 段选

weixuan  = 0; //数码管驱动芯片74hc573 位选

    P0=wei_dat[x_smg+i-1];      //数码管段选显示0 段码数据

    weixuan  = 1; //数码管驱动芯片74hc573 位选

weixuan  = 0; //数码管驱动芯片74hc573 位选

//********************************************************************

    delay_100us(time);  

//delay(smg_time); //延迟  x_ms*1  毫秒

//********************************************************************

//消影

duanxuan = 0;  //数码管驱动芯片74hc573 段选

weixuan  = 0; //数码管驱动芯片74hc573 位选

    P0=0x00;      //数码管段选显示0 段码数据

weixuan  = 1;  //数码管驱动芯片74hc573 段选

weixuan  = 0;  //数码管驱动芯片74hc573 段选

//********************************************************************

}

}

2294c5cee280251b82c3c9a2083bcec9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值