單片機(jī)ATmega8讀取165串入的撥碼開關(guān)程序
/***********74HC165并入串出例子程序************/
//單片機(jī)ATmega8讀取165串入的撥碼開關(guān)地址//
//晶振:內(nèi)部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上升沿讀取下個(gè)數(shù)據(jù)
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++)//循環(huán)8次,即PA0~~PA7輪流閃亮,流水一遍自檢
{
PORTB=i;//按位取反,反相輸出,低電平有效
for(k=0;k<10;k++)_delay_ms(30);//延時(shí)30*10=300毫秒,可自行調(diào)節(jié)
i=i<<1;//左移一位
}
while(1)
{
add=readaddress();
PORTB=add;
PORTD=add;
}
}