IO口輸出之數碼管動態顯示

#include<reg52.h>

/*

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

*                       本地數據類型/宏定義

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

*/

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<<i)&0x80;  //74HC595 串行數據輸入引腳

  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 段選

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

}

}

IO口輸出之數碼管動態顯示的圖1

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP