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

📄 hongwaiwws.c

📁 PIC单片机实现的红外解码程序!相应的信号动作是服务机械构建体
💻 C
字号:
#include<pic.h>
#include<math.h>
#include<stdio.h>
/******************************************************
**定义全局变量
*****************************************************/
unsigned char Position_X,Position_Y;
bank1 char String[32]="Hello,everyone!";
int x,y,k;
void Delay(int i);
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *str);
void LCD1602_cls();
void delay(int k);
//////////////////////////////////////
//---------------------全局变量定义-------------------/
static unsigned int data,redata,credata,xdata,qxdata,keydata;
static unsigned char i,time_long;
//用户临时寄存器1--4
#define  RMT   RB4 


/********************************************************************
中断程序程序:                                                    
功能:执行对RB0外部中断,读红外口
********************************************************************/

void interrupt INT()
{
	if(TMR1IF)
	 {
	  TMR1IF=0;	 
	  TMR1H=0xFF;      //T1时间高位赋值
      TMR1L+=0xc8;     //T1时间低位赋初值
      time_long++;
      }	
	
}
/*******************************************************
函数名称:void initial()
主要功能:初始化系统
***************************************************************/
void initial()
{ ADCON1=0X07;    //RA1位数字输入端口
  TRISB=0X10;
  TRISC=0X00;
  TRISD=0X00;
  TRISE=0X00;
  INTCON=0XC0;    //关闭中断
  //RBIE=1;
  //RBIF=0;
  //INTEDG=1;  //0下降沿,1上升沿
  //RBPU=1;

  T1CON=0x00;     //0000 0001做内部定时器
  TMR1ON=1;
  TMR1H=0xFF;      //T1时间高位赋值
  TMR1L+=0x5f;     //T1时间低位赋初值
  //PIE1=0x01;         //关闭外部中断1
  TMR1IE=1;
  TMR1IF=0;
  
 // PIE2=0;         //关闭外部中断2
}
/*****************************************
//函数名称:void initvar()
//函数功能:为系统调用值赋初值
//函数调用:主函数调用
*****************************************/
void initvar()
{

  data=0;
  redata=0;
  credata=0;
  i=0;
}
/*******************************************************************************
**函数名称:void LCD1602_Write_Command()
**功能描述:LCD写命令
******************************************************************************/
void LCD1602_Write_Command(unsigned char x)
{  RE0=0;
   RE1=0;
   RE2=1;           //RS=0;RW=0;E=1;
   PORTD=x;
   RE2=0;
}
/*******************************************************************************
**函数名称:char Locate_Position()
**函数描述:确定写入数据的位置
*******************************************************************************/
char Locate_Position(unsigned char x,unsigned char y)
{    unsigned char Position;                 //数据的位置
     Position_X=x;
     Position_Y=y;
     Position=Position_X&0x0f;         //第几个字符
     Position_Y=Position_Y&0x01;       //第几行
     switch(Position_Y)
     { case 0:break;
       case 1:Position=Position|0x40;     //计算出在第几个存储器
       default:;
     }
     Position=Position|0x80;
     return(Position);
}
/*******************************************************************************
**函数名称:void LCD1602_Write_Word(char x,char Position)
**功能描述:LCD写数据
********************************************************************************/
void LCD1602_Write_Word(unsigned char x)
{ RE0=1;
  RE1=0;
  RE2=1;
  PORTD=x;           //写入数据
  RE2=0;
}
/******************************************************************************
**函数名称:void Delay ()
**功能描述:延时一段时间
*******************************************************************************/
void Delay(int j)
{
	 while(j--);
}
void delay(int k)
{
	 while(k--);
}
/******************************************************************************
**函数名称:void LCD_Write_String()
**函数描述:写入一串字符
******************************************************************************/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *str)
{ unsigned char i,j=0;
  unsigned char Position;
  while(str[j]>31) {j++;}
  for(i=0;i<j;i++)
  {   Position=Locate_Position(x,y);      //确定显示的位置
      LCD1602_Write_Command(Position);   //写入显示的位置
      Delay(50);
      LCD1602_Write_Word(str[i]);         //写入字符
      Delay(50);
      x++;
      if(x==16)
      {x=0;y^=1;}                      //如果写到第16个则换行
  }
}
/*******************************************************************************
**函数名称:void LCD1602_cls()
**功能描述:显示屏清屏
********************************************************************************/
void LCD1602_cls()
{     
	LCD1602_Write_Command(0x01);           //显示清屏
}

/*******************************************************************************
**函数名称 :void LCD1602_Initial()
**功能描述:显示器初始化
********************************************************************************/
void LCD1602_Initial()
{    TRISD=TRISD&0x00;
     TRISE=TRISE&0xf8;
     LCD1602_Write_Command(0x38);
     Delay(25000);      
     LCD1602_Write_Command(0x38);
     Delay(25000);
     LCD1602_Write_Command(0x38);
     Delay(25000);
     LCD1602_Write_Command(0x38);
     Delay(1000);     //设置显示的方式
     LCD1602_Write_Command(0x08);;       //显示关闭
     Delay(1000);
     LCD1602_Write_Command(0x01);   //清除显示
     Delay(1000);
     LCD1602_Write_Command(0x06);      //显示光标移动设置
     Delay(1000);
    LCD1602_Write_Command(0x0c);      //显示开及光标设置
     Delay(1000);
}


/*
;注意6121的遥控器发射码依次为:同步头(引导码)+32位数据码(用户码低8位+用户码高8位+键码+键码的反码)
;引导码是由9MS的高电平加4.5MS的低电平构成,我们接收到的刚好反相为9MS的低电平加4.5MS的高电平.
;数据码'0'是由560US的高电平加560US的低电平构成,接收时反相为560US的低电平加560US的高电平构成.
;数据码'1'是由560US的高电平加1.69MS的高电平构成,接收时反相为560US的低电平加1.69MS的高电平构成.
*/
/********************************************************
-----------------主函数----------------------------------
********************************************************/
void main()
{
  initvar();
  initial();
  LCD1602_Initial();
  sprintf(String,"wws:2007-10-18");
  LCD_Write_String(0,1,String);
  while(1)
  {  
        RB5=1;RB6=1;RB7=1;
	  	if(RB4==0)
	    {
          time_long=0;
	      while(RB4==0);
	      while(RB4==1);
	      if(time_long>=183)  //183
	      {   xdata=0;
		      data=0;  
		      for(i=0;i<16;i++)
	  	       {
		  	         
		  	    while(RB4==0);
		  	    time_long=0; 
		  	    while(RB4==1);
		  	    if(time_long>=100)   
	                 xdata=xdata+1;
		            else
		  	         xdata=xdata<<1;
		        }
	         for(i=0;i<16;i++)
	  	       {   
		  	       while(RB4==0);
		  	       time_long=0;
		  	       while(RB4==1);
                    if(time_long>=100)   
	                 data=data+1;
		            else
		  	         data=data<<1; 
			   }
			}  
			if(qxdata==data)
			{ 
			   credata=qxdata;		
		     }
		    qxdata=data;	 	   
		    }
		  keydata=credata;  
         switch(keydata)
	             {
		           case 420:         //亮度按钮上  ^  右转ZZZZZZZZZZZZZ//EN3
                              RC7=0; RC6=1;
                              RC4=0; RC5=1;
                              break;  
                   case 840:         //亮度按钮上  ^  右转ZZZZZZZZZZZZZ//EN3
                              RC7=0; RC6=1;
                              RC4=0; RC5=1;
                              break;
                   case 834:        //图像按钮上  ^  转向停止ZZZZZZZZZ//
                              RC7=0; RC6=0;
                              RC4=0; RC5=0;
				              break;
				   case 1668:        //图像按钮上  ^  转向停止ZZZZZZZZZ//
                              RC7=0; RC6=0;
                              RC4=0; RC5=0;
				              break;
				   case 2116:       //7号键       7   小轮停止XXX//EN1
				              RB2=0;RB3=1;
				              break;
				   case 2118:       //6号键       6   小轮启动XXX
				              RB2=0;RB3=0;
				              break;
                   case 2130:       //音量按钮上  ^   左转ZZZZZZZZZZZZZ
                              RC7=1; RC6=0;
                              RC4=1; RC5=0;         
                              break;
				   case 2132:      //调频CH按钮下     拉1停   EN2
                              RC2=0;RC3=0;  
				              break;
				   case 2136:      //调频CH按钮上     拉1启动  
                              RC2=0;RC3=1;
				              break;
				   case 2148:      // 10+按钮         拉2停    EN2
				              RC0=0;RC1=0;
				              break;
                   case 2152:      // 0/30按钮        拉2启动 
                              RC0=0;RC1=1;
                              break;
                   case 3204:      //3号键            主动轮停止 EN1
                              RB0=0;RB1=0;
				              break;           
				   case 6408:      //3号键            主动轮停止 EN1
                              RB0=0;RB1=0;
				              break;
				   case 3208:      //2号键            主动轮启动 
				              RB0=0;RB1=1;
				              break;
				   case 6416:      //2号键            主动轮启动 
				              RB0=0;RB1=1;
				              break;
				   case 6464:      //红色关闭键       全部关闭
				              PORTB=PORTB&0XF0;
				              PORTC=0X00;
				              break;
				   case 3232:      //红色关闭键       全部关闭
				              PORTB=PORTB&0XF0;
				              PORTC=0X00;
				              break;
				   default :break;
	             }
	          keydata=0;
	     if(redata!=credata)
	      {     
			// RC5=0;   
		     sprintf(String,"%u   ",credata);
             LCD_Write_String(0,0,String);
             redata=credata;
             //Delay(1000);
             //RC5=1;
             //Delay(2000);      
          }
    } 
}

 //----------------------------------------------------------
 //----------------------end file----------------------------
 //----------------------------------------------------------

⌨️ 快捷键说明

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