单片机ATmega8读取165串入的拨码开关地址
晶振:内部1M//
//Author:wanghu//
//AVRGCC@2008.6.1//
#include
#include
/**********界说位操作的位移宏bywanghu********/
#definesetbit(val,bitn)(val|=(1《《(bitn)))//
#defineclrbit(val,bitn)(val&=~(1《《(bitn)))//
#definegetbit(val,bitn)(val&(1《《(bitn)))//
//使用方法:if(getbit(PINB,7))//
//setbit(PORTB,0);//
//elseclrbit(PORTB,0);//
unsignedcharreadaddress(void)
{
unsignedcharadd=0;
unsignedchari=0;
clrbit(PORTC,1);
setbit(PORTC,1);
for(i=0;i《7;i++)
{
add|=getbit(PINC,0);//上电后QH的值便是165的第8位值,能够直接赋值完后,给165上升沿读取下个数据
add《《=1;
clrbit(PORTC,2);
setbit(PORTC,2);
}
add|=getbit(PINC,0);
returnadd;
}
intmain(void)
{
unsignedchari,j,k;//界说变量
unsignedcharadd=0;
DDRB=0xFF;
PORTB=0;
PORTC=0x01;
DDRC=0xFE;
DDRD=0xFF;
i=1;
for(j=0;j《8;j++)//循环8次,即PA0~~PA7轮番闪亮,流水一遍自检
{
PORTB=i;//按位取反,反相输出,低电平有用
for(k=0;k《10;k++)_delay_ms(30);//延时30*10=300毫秒,可自行调理
i=i《《1;//左移一位
}
while(1)
{
add=readaddress();
PORTB=add;
PORTD=add;
}
}