新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機的走馬燈C語言程序

        51單片機的走馬燈C語言程序

        作者: 時間:2016-11-28 來源:網絡 收藏
        #include
        unsigned char RunMode;
        void Delay1ms(unsigned int count)
        {
        unsigned int i,j;
        for(i=0;i
        for(j=0;j<120;j++);
        }
        unsigned char code LEDDisplayCode[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, //0~7
        0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
        void Display(unsigned char Value)
        {
        P3 = LEDDisplayCode[Value];
        }
        void LEDFlash(unsigned char Count)
        {
        unsigned char i;
        bit Flag;
        for(i = 0; i
        {
        Flag = !Flag;
        if(Flag)
        Display(RunMode);
        else
        Display(0x10);
        Delay1ms(100);
        }
        Display(RunMode);
        }
        unsigned char GetKey(void)
        {
        unsigned char KeyTemp,CheckValue,Key = 0x00;
        CheckValue = P2&0x32;
        if(CheckValue==0x32)
        return 0x00;
        Delay1ms(10);
        KeyTemp = P2&0x32;
        if(KeyTemp==CheckValue)
        return 0x00;
        if(!(CheckValue&0x02))
        Key|=0x01;
        if(!(CheckValue&0x10))
        Key|=0x02;
        if(!(CheckValue&0x20))
        Key|=0x04;
        return Key;
        }
        unsigned int TimerCount,SystemSpeed,SystemSpeedIndex;
        void InitialTimer2(void)
        {
        T2CON = 0x00; //16 Bit Auto-Reload Mode
        TH2 = RCAP2H = 0xFC; //重裝值,初始值 TL2 = RCAP2L = 0x18;
        ET2=1; //定時器 2 中斷允許
        TR2 = 1; //定時器 2 啟動
        EA=1;
        }
        unsigned int code SpeedCode[]={ 1, 2, 3, 5, 8, 10, 14, 17, 20, 30,
        40, 50, 60, 70, 80, 90, 100, 120, 140, 160,
        180, 200, 300, 400, 500, 600, 700, 800, 900,1000};//30
        void SetSpeed(unsigned char Speed)
        {
        SystemSpeed =SpeedCode[Speed];
        }
        void LEDShow(unsigned int LEDStatus)
        {
        P1 = ~(LEDStatus&0x00FF);
        P0 = ~((LEDStatus>>8)&0x00FF);
        }
        void InitialCPU(void)
        {
        RunMode = 0x00;
        TimerCount = 0;
        SystemSpeedIndex = 10;
        P1 = 0x00;
        P0 = 0x00;
        P2 = 0xFF;
        P3 = 0x00;
        Delay1ms(500);
        P1 = 0xFF;
        P0 = 0xFF;
        P2 = 0xFF;
        P3 = 0xFF;
        SetSpeed(SystemSpeedIndex);
        Display(RunMode);
        }
        //Mode 0
        unsigned int LEDIndex = 0;
        bit LEDDirection = 1,LEDFlag = 1;
        void Mode_0(void)
        {
        LEDShow(0x0001<
        LEDIndex = (LEDIndex+1);
        }
        //Mode 1
        void Mode_1(void)
        {
        LEDShow(0x8000>>LEDIndex);
        LEDIndex = (LEDIndex+1);
        }
        //Mode 2
        void Mode_2(void)
        {
        if(LEDDirection)
        LEDShow(0x0001<
        else
        LEDShow(0x8000>>LEDIndex);
        if(LEDIndex==15)
        LEDDirection = !LEDDirection;
        LEDIndex = (LEDIndex+1);
        }
        //Mode 3
        void Mode_3(void)
        {
        if(LEDDirection)
        LEDShow(~(0x0001<
        else
        LEDShow(~(0x8000>>LEDIndex));
        if(LEDIndex==15)
        LEDDirection = !LEDDirection;
        LEDIndex = (LEDIndex+1);
        }
        //Mode 4
        void Mode_4(void)
        {
        if(LEDDirection)
        {
        if(LEDFlag)
        LEDShow(0xFFFE<
        else
        LEDShow(~(0x7FFF>>LEDIndex));
        }
        else
        {
        if(LEDFlag)
        LEDShow(0x7FFF>>LEDIndex);
        else
        LEDShow(~(0xFFFE<
        }
        if(LEDIndex==15)
        {
        LEDDirection = !LEDDirection;
        if(LEDDirection) LEDFlag = !LEDFlag;
        }
        LEDIndex = (LEDIndex+1);
        }
        //Mode 5
        void Mode_5(void)
        {
        if(LEDDirection)
        LEDShow(0x000F<
        else
        LEDShow(0xF000>>LEDIndex);
        if(LEDIndex==15)
        LEDDirection = !LEDDirection;
        LEDIndex = (LEDIndex+1);
        }
        //Mode 6
        void Mode_6(void)
        {
        if(LEDDirection)
        LEDShow(~(0x000F<
        else
        LEDShow(~(0xF000>>LEDIndex));
        if(LEDIndex==15)
        LEDDirection = !LEDDirection;
        LEDIndex = (LEDIndex+1);
        }
        //Mode 7
        void Mode_7(void)
        {
        if(LEDDirection)
        LEDShow(0x003F<
        else
        LEDShow(0xFC00>>LEDIndex);
        if(LEDIndex==9)
        LEDDirection = !LEDDirection;
        LEDIndex = (LEDIndex+1);
        }
        //Mode 8
        void Mode_8(void)
        {
        LEDShow(++LEDIndex);
        }
        void TimerEventRun(void)
        {
        if(RunMode==0x00)
        {
        Mode_0();
        }
        else if(RunMode ==0x01)
        {
        Mode_1();
        }
        else if(RunMode ==0x02)
        {
        Mode_2();
        }
        else if(RunMode ==0x03)
        {
        Mode_3();
        }
        else if(RunMode ==0x04)
        {
        Mode_4();
        }
        else if(RunMode ==0x05)
        {
        Mode_5();
        }
        else if(RunMode ==0x06)
        {
        Mode_6();
        }
        else if(RunMode ==0x07)
        {
        Mode_7();
        }
        else if(RunMode ==0x08)
        {
        Mode_8();
        }
        }
        void Timer2(void) interrupt 5 using 3
        {
        TF2 = 0; //中斷標志清除( Timer2 必須軟件清標志!)
        if(++TimerCount>=SystemSpeed)
        {
        TimerCount = 0;
        TimerEventRun();
        }
        }
        unsigned char MusicIndex = 0;
        void KeyDispose(unsigned char Key)
        {
        if(Key&0x01)
        {
        LEDDirection = 1;
        LEDIndex = 0;
        LEDFlag = 1;
        RunMode = (RunMode+1)%9;
        Display(RunMode);
        }
        if(Key&0x02)
        {
        if(SystemSpeedIndex>0)
        {
        --SystemSpeedIndex;
        SetSpeed(SystemSpeedIndex);
        }
        else
        {
        LEDFlash(6);
        }
        }
        if(Key&0x04)
        {
        if(SystemSpeedIndex<28)
        {
        ++SystemSpeedIndex;
        SetSpeed(SystemSpeedIndex);
        }
        else
        {
        LEDFlash(6);
        }
        }
        }
        main()
        {
        unsigned char Key;
        InitialCPU();
        InitialTimer2();
        while(1)
        {
        Key = GetKey();
        if(Key!=0x00)
        {
        KeyDispose(Key);
        }
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 佳木斯市| 常宁市| 东光县| 南昌县| 南靖县| 南部县| 三都| 安福县| 峨眉山市| 台南县| 桃园市| 屯留县| 前郭尔| 永康市| 东山县| 额尔古纳市| 安阳县| 象山县| 翼城县| 镇坪县| 远安县| 北安市| 富蕴县| 宾阳县| 容城县| 宜宾县| 巴彦淖尔市| 叶城县| 荥阳市| 黎城县| 鲁山县| 镇巴县| 论坛| 西畴县| 无极县| 乌兰察布市| 蒙阴县| 枣阳市| 安化县| 滨州市| 浏阳市|