微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR单片机M8控制256级七彩流水灯程序

AVR单片机M8控制256级七彩流水灯程序

时间:11-28 来源:互联网 点击:
#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) //重复”信号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;

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top