📄 infrared.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 + -