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

📄 infrared.c

📁 PIC单片机C语言程序设计实例精粹
💻 C
字号:
#include "infrared.h"

int key_val;

unsigned char decode()
{
	unsigned char k,temp=0;
	for(k=0;k<8;k++)
	{
		while((PORTB&0x10)== 0x10);    //等到高电平,起始位
		Delay();           				//用900us的延时来判断
		if( (PORTB&0x10)== 0x10)     //若为高电平,则为1
		{
			temp |=0x1<<k;
			Delay();
		}
	}
	return temp;
}

void	 encode(unsigned char data)
{
	unsigned char k,temp=0;
	for(k=0;k<8;k++)
	{
		temp |= data << k;
		PORTB |= 0x20;    //置为高电平,起始位
		Delay(56);           //延时0.56ms
		PORTB &= 0xBF;    //置为低电平
		if ( temp == 0x1)		//根据"0"或"1",采用不同的延时
			Delay(565);           //延时0.565ms
		else
			Delay(1690);           //延时1.69ms
	}
}
}

void change_port();
void chk_busy (void);

void lcd1602_enable(void)
{ 
	uint n;
	nrs_1602
		nrw_1602;
	nen_1602;
	for(n=100;n>0;n--);
	en_1602;
}

void wr_1602(unsigned char dat_comm,unsigned char content)
{
	chk_busy ();
  		if(dat_comm)
		{
			rs_1602;   //data
			nrw_1602;   //write
		}
		else 
		{
			nrs_1602;   //command
			nrw_1602;   //write
		}
		PORTD=content;   //output data or comm
		en_1602;
		DelayMs(2);
		nen_1602;
}

void lcd1602_init(void)
{
	wr_1602(comm_1602,0x01);  //clear lcd
	wr_1602(comm_1602,0x38);
	wr_1602(comm_1602,0x0e);
	wr_1602(comm_1602,0x06);
	wr_1602(comm_1602,0x80);
}	

void show(char *content )
{ 
	uint n;
	while(1)
	{
		wr_1602(dat_1602,*content);
		content++;
		if(*content==0)
			break;
	}
}

void lcd_refresh(void)
{
	lcd1602_init();
	show(" RX: xxxx   key:2  ");         //显示第一行
	wr_1602(comm_1602,0xc0);
	show("Code:xxxxxxxx");     		 //显示第二行
	wr_1602(comm_1602,0xc2);
}


void Keyboard()
{
	unsigned int temp;
	PORTA = 0x01D;              //将第一行置为0
	temp = PORTB;               //读取列的值
	if(temp!=0x0f)
    {
		delayMs(10);
		temp= PORTB;
		temp=temp & 0x0f; 
		if (temp!=0x0f)
		{
			temp= keyboard_out;;
			temp=temp & 0x0f;
			switch(temp)                //判断键值
			{
			case 0x0e:
				key=1;
				break;
			case 0x0d:
				key=2;
				break;
			case 0x0b:
				key=3;
				break;
			case 0x07:
				key=4;
				break;
			}
			delayMs(10);
		}
	}
	PORTA = 0x1b;    //将第二行置为0
	temp= PORTB;     //读取列的值
	temp=temp & 0x0f;
	if(temp!=0x0f)
    {
		delayMs(10);
		temp= PORTB;
		temp=temp & 0x0f; 
		if (temp!=0x0f)
		{
			temp= PORTB;
			temp=temp & 0x0f;
			switch(temp)                 //判断键值
			{
			case 0x0e:
				key=5;
				break;
			case 0x0d:
				key=6;
				break;
			case 0x0b:
				key=7;
				break;
			case 0x07:
				key=8;
				break;
			}
			delayMs(10);
		}
    }
	PORTA = 0x017;           //将第三行置为0
    temp= PORTB;             //读取列的值
	temp=temp & 0x0f;
	if(temp!=0x0f)
    {
		delayMs(10);
		temp= PORTB;
		temp=temp & 0x0f; 
		if (temp!=0x0f)
		{
			temp= PORTB;
			temp=temp & 0x0f;
			switch(temp)              //判断键值
			{
			case 0x0e:
				key=9;
				break;
			case 0x0d:
				key=10;
				break;
			case 0x0b:
				key=11;
				break;
			case 0x07:
				key=12;
				break;
			}
			delayMs(10);
		}
    }
	PORTA = 0x0f;     //将第四行置为0
	temp= PORTB;       //读入列的值 
	temp=temp & 0x0f;
	if(temp!=0x0f)
    {
		delayMs(10);
		temp= PORTB;
		temp=temp & 0x0f; 
		if (temp!=0x0f)
		{
			temp= PORTB;
			temp=temp & 0x0f;
			switch(temp)                  //判断键值
			{
			case 0x0e:
				key=13;
				break;
			case 0x0d:
				key=14;
				break;
			case 0x0b:
				key=15;
				break;
			case 0x07:
				key=16;
				break;
			}
			delayMs(10);
		}
    } 
}


void main()
{
	init();
	while(1)
	{
		keyboard();
		if( key_val!=0 )
		{
			encode();           //编码	
			tx_code();		  //发送红外编码
		}
		lcd_refresh();
	}
}

/*
void main()
{
init();
while(1)     
{
if( (PORTB&0x10)== 0x10)
{
decode();
lcd_refresh();
}
}
}
*/

⌨️ 快捷键说明

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