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 段選
//********************************************************************
}
}
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















