標題: 紅外遙控制開關 [打印本頁]
作者: GUOPK 時間: 2015-6-23 09:47
標題: 紅外遙控制開關
/****************************************************************
程序名稱: 將遙控接收頭接收到的按鍵編碼通過數碼管顯示出來
說明:能解碼的遙控編碼必須是NEC 的6221/6121/6222編碼方式
同時也可以解9012 9018編碼方式
注明: 單片機使用12M晶體
*****************************************************************/
file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ksohtml\wpsCA.tmp.png
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define _Nop() _nop_()
#define TURE 1
#define FALSE 0
/*端口定義*/
sbit lcd_rs_port = P3^5; /*定義LCD控制端口*/
sbit lcd_rw_port = P3^6;
sbit lcd_en_port = P3^4;
#define lcd_data_port P0
///////////////////////////////////
sbit WELA=P2^7; //數碼管的位選信號
void delay1 (void)//關閉數碼管延時程序
{
int k;
for (k=0; k<1000; k++);
}
////////////////////////////////////
uchar code line0[16]={" user: "};
uchar code line1[16]={" data: "};
uchar code lcd_mun_to_char[16]={"0123456789ABCDEF"};
unsigned char irtime;//紅外用全局變量
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];
void ShowString (unsigned char line,char *ptr);
//////////////////////////////////////////////
void Delay(unsigned char mS);
void Ir_work(void);
void Ircordpro(void);
void tim0_isr (void) interrupt 1 using 1//定時器0中斷服務函數
{
irtime++;
}
void ex0_isr (void) interrupt 0 using 0//外部中斷0服務函數
{
static unsigned char i;
static bit startflag;
if(startflag){
if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼
i=0;
irdata[ i]=irtime;
irtime=0;
i++;
if(i==33){
irok=1;
i=0;
}
}
else{
irtime=0;
startflag=1;
}
}
void TIM0init(void)//定時器0初始化
{
TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
TH0=0x00;//reload value
TL0=0x00;//initial value
ET0=1;//開中斷
TR0=1;
}
void EX0init(void)
{
IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)
EX0 = 1; // Enable EX0 Interrupt
EA = 1;
}
void Ircordpro(void)//紅外碼值處理函數
{
unsigned char i, j, k=1;
unsigned char cord,value;
for(i=0;i<4;i++){//處理4個字節
for(j=1;j<=8;j++){ //處理1個字節8位
cord=irdata[k];
value=value>>1;
if(cord>7) value=value|0x80; //大于某值為1
k++;
}
IRcord[ i]=value;
value=0;
}
irpro_ok=1;//處理完畢標志位置1
}
///////////////////////////////////////////
void lcd_delay(uchar ms) /*LCD1602 延時*/
{
uchar j;
while(ms--){
for(j=0;j<250;j++)
{;}
}
}
//////////////////////////////////////////////
void lcd_busy_wait() /*LCD1602 忙等待*/
{
lcd_rs_port = 0;
lcd_rw_port = 1;
lcd_en_port = 1;
lcd_data_port = 0xff;
_Nop();
_Nop();
_Nop();
_Nop();
while (lcd_data_port&0x80);
lcd_en_port = 0;
}
///////////////////////////////////////////////
void lcd_command_write(uchar command) /*LCD1602 命令字寫入*/
{
lcd_busy_wait();
lcd_rs_port = 0;
lcd_rw_port = 0;
lcd_en_port = 0;
lcd_data_port = command;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
lcd_en_port = 1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
lcd_en_port = 0;
}
/////////////////////////////////////////
void lcd_system_reset() /*LCD1602 初始化*/
{
lcd_delay(20);
lcd_command_write(0x38);
lcd_delay(100);
lcd_command_write(0x38);
lcd_delay(50);
lcd_command_write(0x38);
lcd_delay(10);
lcd_command_write(0x08);
lcd_command_write(0x01);
lcd_command_write(0x06);
lcd_command_write(0x0c);
}
//////////////////////////////////////////////////
void lcd_char_write(uchar x_pos,y_pos,lcd_dat) /*LCD1602 字符寫入*/
{
x_pos &= 0x0f; /* X位置范圍 0~15 */
y_pos &= 0x01; /* Y位置范圍 0~ 1 */
if(y_pos==1) x_pos += 0x40;
x_pos += 0x80;
lcd_command_write(x_pos);
lcd_busy_wait();
lcd_rs_port = 1;
lcd_rw_port = 0;
lcd_en_port = 0;
lcd_data_port = lcd_dat;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
lcd_en_port = 1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
lcd_en_port = 0;
}
void Ir_work(void)//紅外鍵值散轉程序
{
switch(IRcord[3])//判斷第三個數碼值IRcord[4]
{
// case 0xDC:P1=0x16;break;//1 有的遙控是解IRcord[2]
//case 0x11:P1=0x00;break;//2 只要修改這些健值就可以實現
//case 0x00:P1=0xFF;break;//3
// case 0x13:P1=0x4b;break;//0
case 0x4B:P1=0xFF;break;// 云龍帶的遙控器是解第四個健碼。IRcord[3]
case 0x07:P1=0x00;break;//
case 0x0B:P1=0x16;break;//
case 0x13:P1=0x4b;break;//
}
irpro_ok=0;//處理完成標志
}
void main(void)
{
uchar i;
lcd_system_reset(); /* 初始化LCD1602 */
lcd_data_port = 0xff;
////////////////////////////////////////////////////////////////
P0=0XFF;//關掉數碼管的位選信號。阻止數碼管受到P0口信號的影響。
///P1=0xFF;
delay1();
WELA=1;
delay1();
WELA=0;
//////////////////////////////////////////////////////////////
for(i=0;i<16;i++) lcd_char_write(i,0,line0);
for(i=0;i<16;i++) lcd_char_write(i,1,line1);
EX0init(); // Enable Global Interrupt Flag
TIM0init();
while(1){//主循環
if(irok){
Ircordpro();
irok=0;
}
if(irpro_ok){ /*遙控成功接收*/
lcd_char_write(8,0,lcd_mun_to_char[IRcord[0]/0x10]);
lcd_char_write(9,0,lcd_mun_to_char[IRcord[0]%0x10]);
lcd_char_write(11,0,lcd_mun_to_char[IRcord[1]/0x10]);
lcd_char_write(12,0,lcd_mun_to_char[IRcord[1]%0x10]);
lcd_char_write(8,1,lcd_mun_to_char[IRcord[2]/0x10]);
lcd_char_write(9,1,lcd_mun_to_char[IRcord[2]%0x10]);
lcd_char_write(11,1,lcd_mun_to_char[IRcord[3]/0x10]);
lcd_char_write(12,1,lcd_mun_to_char[IRcord[3]%0x10]);
}
Ir_work() ;
}
}
作者: admin 時間: 2015-6-23 10:25
1602液晶顯示,程序結構清晰,便于修改,按鍵的功能。。非常不錯謝謝分享
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
www..com18午夜观看
|
国产精品亚洲一区二区三区在线
|
精品国产乱码久久久久久老虎
|
亚洲天堂精品久久
|
国产成人99久久亚洲综合精品
|
99精品视频免费观看
|
97精品国产
|
日本一区二区三区免费观看
|
希岛爱理在线
|
色婷婷精品久久二区二区蜜臂av
|
精品欧美一区免费观看α√
|
91免费观看在线
|
久久精品无码一区二区三区
|
国产综合精品
|
国产视频1
|
国产精品乱码一区二区三区
|
欧美一级免费
|
国产精品成人在线播放
|
久久国产精品色av免费观看
|
极品久久
|
狠狠色综合久久丁香婷婷
|
chinese中国真实乱对白
|
国产在线观看免费
|
久久久www
|
毛片网站免费观看
|
在线观看国产精品一区二区
|
精品欧美乱码久久久久久1区2区
|
99久久国产免费
|
亚洲在线一区
|
激情亚洲
|
玖玖视频网
|
热99视频|
岛国av免费观看
|
成人乱人乱一区二区三区软件
|
国产精品片|
欧美极品一区二区
|
欧美a在线
|
久久久久国产一区二区三区
|
天天干视频网
|
黄网在线观看
|
国产超碰人人爽人人做人人爱
|