原创
单片机ATmega8读取165串入的拨码开关程序
来源 CEPARK网站http://www.cepark.com/Index.html 作者: hnrain
/***********74HC165并入串出例子程序************/
// 单片机ATmega8读取165串入的拨码开关地址 //
// 晶振:内部1M //
// Author:wanghu //
// AVRGCC @2008.6.1 //
/**********************************************/
#include <avr/io.h>
#include <util/delay.h>
/**********定义位操作的位移宏 by wanghu********/
#define setbit(val, bitn) (val |=(1<<(bitn))) //
#define clrbit(val, bitn) (val&=~(1<<(bitn))) //
#define getbit(val, bitn) (val & (1<<(bitn))) //
//使用方法:if (getbit(PINB,7)) //
// 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";
}
}
文章评论(0条评论)
登录后参与讨论