新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > AVR單片機(jī)M8控制256級七彩流水燈程序

        AVR單片機(jī)M8控制256級七彩流水燈程序

        作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
        #include "inc.h"
        #include
        #include
        #include
        extern const uchar qct[];
        uint16_t data0,data1;
        uint8_t bitcnt;
        uint8_t CaptureOK;
        uint16_t ms,Sec;
        uint32_t MsCnt; //ms count
        void Shift(uint da)
        {
        uchar i;
        for(i=0;i<16;i++)
        {
        CLR_SCK;
        if(da&0x8000)
        SET_BLU;
        else
        CLR_BLU;
        SET_SCK;
        da<=1;
        }
        }
        void Scan(void)
        {
        uchar i,j;
        uint m;
        const char * n;
        const uchar Mask[]={1,2,4,8,16,128,32,64,128,128,64,128,32,64,128,128,64,128,128};
        const uchar OETAB[]={PIX,PIX/16,PIX/8,PIX/4,PIX/2,PIX,PIX,PIX,PIX,PIX,PIX,PIX,PIX,PIX,PIX,PIX,PIX,PIX,PIX,PIX,PIX};
        for(m=0;m<4596;m+=3)
        {
        //for(k=0;k<20;k++)
        for(i=0;i<18;i++)
        {
        n=qct+m;
        for(j=0;j
        {
        if(j>=OETAB[i])
        SET_OE;
        else
        CLR_OE;
        CLR_SCK;
        if(pgm_read_byte(48*(j/3)+n++) & Mask[i])
        SET_BLU;
        else
        CLR_BLU;
        SET_SCK;
        }
        SET_LAT;
        CLR_LAT;
        }
        }
        }
        void Delay(void)
        {
        uint i,j;
        for(i=0;i<400;i++)
        for(j=0;j<1000;j++);
        }
        void timer0_init(void)
        {
        TCCR0 = 0x00; //stop
        TCNT0 = 0xfe; //set count
        TCCR0 = 0x02; //無分頻
        TIMSK = 0x01;
        }
        void int0_ini(void)
        {
        MCUCR=(1<
        GICR=0x40; //允許int0中斷
        }
        SIGNAL(SIG_OVERFLOW0)
        {
        TCNT0 = 0xfe;//0xe1;; //重裝初值
        ms++;
        MsCnt++;
        if(MsCnt>100000)
        {
        MsCnt=0;
        Sec++;
        if(Sec>300)Sec=0;
        }
        }
        SIGNAL (SIG_INTERRUPT0)
        {
        static uint oldFall;
        uint temp,newFall;
        newFall=ms;
        if(newFall>oldFall)
        temp=newFall-oldFall; //計算脈沖加間隔的時間
        else
        temp=65535-oldFall+newFall;
        oldFall=newFall;
        if(temp>80&& temp<130) // "0"信號1.125ms
        {
        temp=0;
        }
        else if(temp>170 && temp<220) //“1”信號2.25ms
        {
        temp=1;
        }
        else if(temp>800 && temp<1090) //重復(fù)”信號11.25ms
        {
        CaptureOK=1;
        CLR_LED1;
        return;
        }
        else if(temp>1100 && temp<1300) //header信號 13.5ms
        {
        bitcnt=0;
        data0=0;
        data1=0;
        CLR_LED1;
        return; //返回,等待下次開始接收
        }
        else ///干擾信號
        {
        return;
        }
        bitcnt++;
        if(bitcnt<16) //開始接收前16位
        {
        data0=data0|(uint)temp;
        data0=data0<<1;
        }
        else if(bitcnt==16)
        {
        data0=data0|(uint)temp;
        }
        else if(bitcnt<32) //開始接收后16位
        {
        data1=data1|(uint)temp;
        data1=data1<<1;
        }
        else if(bitcnt==32) //接收完最后一位
        {
        data1=data1|(uint)temp;
        CaptureOK=1;
        }
        }
        void IO_ini(void)
        {
        PORTB=0xff;
        PORTC=0Xff;
        PORTD=0Xff;
        DDRD=(1<
        DDRC=(1<
        }
        int main(void)
        {
        IO_ini();
        int0_ini();
        timer0_init();
        sei();
        CLR_LED2;
        CLR_OE;
        while(1)
        {
        if(Sec>60)
        {
        Shift(0xffff);
        Shift(0xffff);
        Shift(0xffff);
        }
        else
        {
        Shift(0);
        Shift(0);
        Shift(0);
        }
        SET_LAT;
        CLR_LAT;
        //Scan();
        }
        return 0;
        }


        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 揭西县| 凤凰县| 太仆寺旗| 登封市| 汝城县| 赤城县| 太和县| 色达县| 腾冲县| 马龙县| 贵阳市| 象州县| 云霄县| 青田县| 顺平县| 凭祥市| 淮阳县| 丹江口市| 苏尼特右旗| 邵东县| 平定县| 阳新县| 陇南市| 扎赉特旗| 渭源县| 克东县| 宁明县| 米脂县| 饶阳县| 常熟市| 平阳县| 武穴市| 东莞市| 新化县| 高陵县| 汉源县| 罗田县| 海阳市| 霍州市| 汉阴县| 阳信县|