您的位置 首页 IC

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

includeinchincludeincludeincludeexternconstucharqct[];uint16_tdata0,data1;uint8_tbitcnt;uint8_t

#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;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/255882.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部