⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 input.c

📁 单片机智能仪器仪表系统输入输出控制源代码
💻 C
字号:

#include <avr/io.h>
#include "input.h"

//设置IO口方向寄存器
void inputInit(void)
{
	//设置输入:165 串行数据输出 QH
 	sbi(INPUT_PORT, INPUT_DS);
	cbi(INPUT_DDR, INPUT_DS);

	//设置输出:165 串行时钟 CLK
	sbi(INPUT_DDR, INPUT_CLK);
	
	//设置输出:165 锁存信号 SH/LD# 
	sbi(INPUT_PORT, INPUT_LD);
	sbi(INPUT_DDR, INPUT_LD);

    //设置输出:595 串行数据输出 SER
    sbi(SER_DDR,SER_DAT);

	//设置输出:595 串行时钟 CLK
	sbi(SER_DDR,SER_SCLK);

	//设置输出:595 锁存信号 RCLK
	sbi(SER_DDR,SER_RCLK);

	//设置输入:温湿度
   

}

//得到门禁控制器地址
//由于硬件设计原因(考虑PCB布线等),拨码开关3-10和165输出值对应如下
//		拨码开关3->0x80	拨码开关2->0x40 ... 拨码开关10->0x01
//下面的程序对其进行转换,使其输出如下:
//		拨码开关3->0x01	拨码开关2->0x02 ... 拨码开关10->0x80
/*u16 getDevAddr(void)
{
	u08 data;
	u08 data_h;
	u16 temp;
	u08 i;
 
   	data=inputReadByte();

	temp=0;
	//拨码开关3-10
	for(i=0;i<8;i++)
   	{
      	((data&(1<<i))>0)?(temp|=(1<<(7-i))):(temp&=~(1<<(7-i)));
    }
		
	temp=data;
	temp<<=2;
	
	//拨码开关1和2
	data_h=(u08)((inputReadWord())&0xff);	
	temp+=data_h>>6;
	return(temp);
}*/


//读取165一个字节	
/*u08 inputReadByte(void)
{
	unsigned char val = 0;
	
	INPUT_PORT &= ~(1 << INPUT_LD);	//脉冲锁存74HC165并行数据开始
	_nop_();					//延时 
	INPUT_PORT |=  (1 << INPUT_LD);	//脉冲锁存74HC165并行数据结束
	for(int i = 8; i > 0; i --) 
	{ 
		val <<= 1; 
		INPUT_PORT &= ~(1 << INPUT_CLK);	//发送读脉冲 
		//if (!(INPUT_PIN & (1 << INPUT_DS)))//低电平++
		if ((INPUT_PIN & (1 << INPUT_DS)))
			val ++;
		INPUT_PORT |=  (1 << INPUT_CLK);	//发送读脉冲 
	} 
	return val;	
}*/
	
//读取165两个字节(级联)	
u16 inputReadWord(void)
{
	u16 val = 0;
	INPUT_PORT &= ~(1 << INPUT_LD);	//脉冲锁存74HC165并行数据开始
	_nop_();				    	//延时
	INPUT_PORT |=  (1 << INPUT_LD);	//脉冲锁存74HC165并行数据结束
	for(int i = 16; i > 0; i --) 
	{ 
		val <<= 1; 
        INPUT_PORT |=  (1 << INPUT_CLK);	//发送读脉冲
		INPUT_PORT &= ~(1 << INPUT_CLK);	//发送读脉冲 
//	if (!(INPUT_PIN & (1 << INPUT_DS)))     //低电平++
	if ((INPUT_PIN & (1 << INPUT_DS)))
			val ++;
//	INPUT_PORT |=  (1 << INPUT_CLK);	//发送读脉冲
	} 
	return val;	
}

//向595输出一个字节
void ser_out(u08 dat)
{
	u08 i=0;
	for(i=0; i<8;i++)
	{
	//	SER_PORT&=~BV(SER_SCLK);
	//	_nop_();
		if(dat & 0x80)
			SER_PORT|=BV(SER_DAT);//发送 1
		else
			SER_PORT&=~BV(SER_DAT);//发送 0
		SER_PORT|=BV(SER_SCLK);//发送写脉冲
		SER_PORT&=~BV(SER_SCLK);//发送写脉冲
		dat<<=1;
	}
}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -