立即注冊 登錄
返回首頁

uid:65574的個人空間

日志

中國功夫

已有 658 次閱讀2014-8-29 12:08 | 中國功夫

/*;*******************************************************************************

;*  標題:  數(shù)碼管計時與流水燈同時運行

;*  文件:  中國功夫.C                                                                                                                           

;*  日期:  2014829日                                                                                                                             

;*  版本:  V80001.0                                                                                                                                              

;*  作者:  Eking 

;*  備注:                                                                                                                                                                                                                             

;******************************************************************************

;*  描述:                                                                                                                                                          

;*  數(shù)碼管計時與流水燈同時運行                                                          

;*                                                                                                                                                                    

;******************************************************************************/

 

#include <reg52.h>  //包含特殊功能寄存器定義的頭文件

 

sbit LE1=P2^0;           //位選573鎖存器使能

sbit LE2=P2^1;           //段選573鎖存器使能

 

unsigned char code LedChar[16]={  //數(shù)碼管顯示字符轉(zhuǎn)換表

 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,

                   //  0    1    2    3    4    5    6    7    

                     0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0~F的段碼

                   //  8    9    A    B    C    D    E    F

 

unsigned char LedBuff[9] = {  //數(shù)碼管+獨立LED顯示緩沖區(qū),初值0x00確保啟動時都不亮

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00

};

 

unsigned char cnt200 = 0;  //200ms計數(shù)

unsigned int cnt1000 = 0;  //1000ms計數(shù)

 

void ShowCount();

void FlowingLight();

 

void main()

{

    EA = 1;       //使能總中斷

    TMOD = 0x01;  //設置T0為模式1

    TH0  = 0xFC;  //T0賦初值0xFC67,定時1ms

    TL0  = 0x67;

    ET0  = 1;     //使能T0中斷

    TR0  = 1;     //啟動T0

    

    while (1)

    {

        if (cnt200 >= 200)  //200ms刷新一次流水燈

        {

            cnt200 = 0;

            FlowingLight();

        }

        if (cnt1000 >= 1000)  //1s刷新一次計數(shù)值

        {

            cnt1000 = 0;

            ShowCount();

        }

    }

}

 

/* 流水燈實現(xiàn)函數(shù) */

 

void FlowingLight()

{

    static unsigned char dir = 0;   //移位方向變量dir,用于控制移位的方向

    static unsigned char shift = 0x01;  //循環(huán)移位變量shift,并賦初值0x01

 

    P0 = ~shift;      //循環(huán)移位變量取反,控制8LED

    if (dir == 0)             //移位方向變量為0時,左移

    {

        shift = shift << 1;   //循環(huán)移位變量左移1

        if (shift == 0x80)    //左移到最左端后,改變移位方向

        {

            dir = 1;

        }

    }

    else                      //移位方向變量不為0時,右移

    {

        shift = shift >> 1;   //循環(huán)移位變量右移1

        if (shift == 0x01)    //右移到最右端后,改變移位方向

        {

            dir = 0;

        }

    }

}

 

/* 秒計數(shù)顯示函數(shù) */

 

void ShowCount()

{

    char i;  //循環(huán)變量

    unsigned char buf[8];   //中間轉(zhuǎn)換緩沖區(qū)

    static unsigned long sec = 0;  //記錄經(jīng)過的秒數(shù)

    

    sec++;  //秒計數(shù)自加1

 

    buf[0] = sec%10;  //sec按十進制位從低到高依次提取到buf數(shù)組中

    buf[1] = sec/10%10;

    buf[2] = sec/100%10;

    buf[3] = sec/1000%10;

    buf[4] = sec/10000%10;

    buf[5] = sec/100000%10;

buf[6] = sec/1000000%10;

buf[7] = sec/10000000%10;

 

    for (i=7; i>=1; i--)  //從最高為開始,遇到0不顯示,遇到非0退出循環(huán)

    {

        if (buf[i] == 0)

            LedBuff[i] = 0x00;

        else

            break;

    }

    for ( ; i>=0; i--)  //將剩余的有效數(shù)字位如實轉(zhuǎn)換

    {

        LedBuff[i] = LedChar[buf[i]];

    }

}

 

/* 定時器0中斷服務函數(shù) */

 

void InterruptTimer0() interrupt 1

{

    static unsigned char i = 0;   //動態(tài)掃描的索引

 

    TH0 = 0xFC;  //重新加載初值

    TL0 = 0x67;

    cnt200++;

    cnt1000++;

 

    //以下代碼完成數(shù)碼管動態(tài)掃描刷新

 

P1 = 0x00;   //顯示消隱

LE2 = 1;

LE2 = 0;   

 

    switch (i)

    {

        case 0: P1=0x7F; LE1=1; LE1=0; i++; P1=LedBuff[0]; LE2=1; LE2=0; break;

case 1: P1=0xBF; LE1=1; LE1=0; i++; P1=LedBuff[1]; LE2=1; LE2=0; break;

case 2: P1=0xDF; LE1=1; LE1=0; i++; P1=LedBuff[2]; LE2=1; LE2=0; break;

case 3: P1=0xEF; LE1=1; LE1=0; i++; P1=LedBuff[3]; LE2=1; LE2=0; break;

case 4: P1=0xF7; LE1=1; LE1=0; i++; P1=LedBuff[4]; LE2=1; LE2=0; break;

case 5: P1=0xFB; LE1=1; LE1=0; i++; P1=LedBuff[5]; LE2=1; LE2=0; break;

case 6: P1=0xFD; LE1=1; LE1=0; i++; P1=LedBuff[6]; LE2=1; LE2=0; break;

case 7: P1=0xFE; LE1=1; LE1=0; i=0; P1=LedBuff[7]; LE2=1; LE2=0; break;

        default: break;

    }

}

 


路過

雞蛋

鮮花

握手

雷人

評論 (0 個評論)

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

返回頂部