原创 单片机ATmega8读取165串入的拨码开关程序

2009-8-4 08:32 2275 1 1 分类: MCU/ 嵌入式

来源 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";
}
 
}
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /3 下一条