/***********74HC165并入串出例子程序************/
// 单片机 ATmega8读取165串入的拨码开关地址 //
// 晶振:内部1M //
// Author:wanghu //
// AVRGCC @2008.6.1 //
/**********************************************/
#include
#include
/**********定义位操作的位移宏 by wanghu********/
#define setbit(val, bitn) (val |=(1<#define clrbit(val, bitn) (val&=~(1<#define getbit(val, bitn) (val & (1// setbit(PORTB,0); //
// else clrbit(PORTB,0); //
/**********************************************/
unsigned char readaddress(void)
{
unsigned char add=0;
unsigned char i=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);
return add;
}
int main(void)
{
unsigned char i,j,k; //定义变量
unsigned char add=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;
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』