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

📄 pic_car.c

📁 用PIC单片机开发的自动小车控制源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		{
			CSA=1;		 		// 设置CSA=1,CSB=0,即片选1。
			CSB=0;
                       
		}
		else	
		{
			CSA=0;		 		// 设置CSA=0,CSB=1,即片选2。
			CSB=1;	
		}
	RW=0;           			//  RW=0,DI=0,设置为写状指令态 
  	DI=0;			    
	PORTD=TRANS;				
	EN=1;						//RE2-EN=1,让数据被读出
 	EN=0;						//RE2-EN=0,数据被锁存(写)入KS0108B及其兼容控制驱动器 

}


void WRITE1(char WRITE,int CLMADD,int E)
{   LCDSTA_BUSY(E);
	TRANS1(CLMADD,E);		   	//	 设置列地址 
	TRISD=0X00;					//   RD为输出 
    	if(E==1)
		{
			CSA=1;		 		// 设置CSA=1,CSB=0,即片选1。
			CSB=0;
                       
		}
		else	
		{
			CSA=0;		 		// 设置CSA=0,CSB=1,即片选2。
			CSB=1;	
		}
    RW=0;           			//  RW=0,DI=1,设置为写数据状态 
  	DI=1;
	PORTD=WRITE;				// 将要写入数据赋值									
	EN=1;						//RE2-EN=1,让数据被读出
	EN=0;						//RE2-EN=0,数据被锁存(写)入KS0108B及其兼容控制驱动器 
  	
}






void CLEAR(int	E)
{
	int PAGEADD,PAGENUM,CLMSUM;
	for(PAGENUM=0X08,PAGEADD=0X0B8;PAGENUM>0;PAGENUM--,PAGEADD++)
     	{											
			LCDSTA_BUSY(E);									
         	TRANS1(PAGEADD,E); 					
        	 for(CLMSUM=0x40;CLMSUM<=0X7F;CLMSUM++) 													
         		{
           			LCDSTA_BUSY(E);					
           			WRITE1(0X00,CLMSUM,E);			
          		}
        }
   TRANS1(0xc0,E);
}






void	DISP_ON(int	E)
{   
    int	E1FLAG;
	TRISD=0XFF;					
	while(1)
	{   LCDSTA_BUSY(E);	
        TRANS1(0X03F,E); 
        TRISD=0XFF;	
		if(E==1)
		{
			CSA=1;		 			// 设置CSA=1,CSB=0,即片选1。
			CSB=0;
                       
		}
		else	
		{
			CSA=0;		 			// 设置CSA=0,CSB=1,即片选2。
			CSB=1;	
		}
        RW=1;           			//  RW=1,DI=0,设置为读状态 
  		DI=0;
		EN=1;
		E1FLAG=PORTD&0X20;
        EN=0;	 
		if(E1FLAG==0X00)  break;
   }	   		
}


void	DISP_OFF(int E)
{   
    int	E1FLAG;
	TRISD=0XFF;					
	while(1)
	{   LCDSTA_BUSY(E);
		TRANS1(0X03E,E); 	
        TRISD=0XFF;	
		if(E==1)
		{
			CSA=1;		 			// 设置CSA=1,CSB=0,即片选1。
			CSB=0;
                       
		}
		else	
		{
			CSA=0;		 			// 设置CSA=0,CSB=1,即片选2。
			CSB=1;	
		}
        RW=1;           			//  RW=1,DI=0,设置为读状态 
  		DI=0;
		EN=1;
		E1FLAG=PORTD&0X20;
        EN=0;	 
		if(E1FLAG==0X20) break;	   		
    }
}



void START_LINE(int LINE,int E)
 { 
   LCDSTA_BUSY(E);
   TRANS1(LINE,E);
   
 }


void DISPLAY_CHINESE(int E,int PAGADD,int CLMADD)
{ 
	int K;
    char TEMP;					
    LCDSTA_BUSY(E);
	 TRANS1(PAGADD,E);			
    for(K=0;K<16;K++,CLMADD++,ARRAY++)
     {  LCDSTA_BUSY(E);	
		TEMP=*ARRAY;
        WRITE1(TEMP,CLMADD,E);        		
      }
 	CLMADD=CLMADD-16;				
    PAGADD=PAGADD+1;				
    TRANS1(PAGADD,E);
    for(;K<32;K++,CLMADD++,ARRAY++)
	{   
        LCDSTA_BUSY(E);	
 		TEMP=*ARRAY;
       	WRITE1(TEMP,CLMADD,E);
       	
    }
}



void DISPLAY_NUMBER(int E,int PAGADD,int CLMADD)
{ 
	int K;
    char TEMP;		
    TRANS1(PAGADD,E);
    LCDSTA_BUSY(E);							
    for(K=0;K<8;K++,CLMADD++,ARRAY++) 
    {	LCDSTA_BUSY(E);	
        TEMP=*ARRAY;
        WRITE1(TEMP,CLMADD,E);				
    }
	CLMADD=CLMADD-8;					
    PAGADD=PAGADD+1;				
    TRANS1(PAGADD,E);
    LCDSTA_BUSY(E);		
    for(;K<16;K++,CLMADD++,ARRAY++)
	{	LCDSTA_BUSY(E);	
       	TEMP=*ARRAY;
       	WRITE1(TEMP,CLMADD,E);				
    }
}



void LCD_INIT(int E)
{  DISP_OFF(E);		   				    
   CLEAR(E);
   DISP_ON(E);						// 开E边显示
} 

void delay(unsigned int number)
 {unsigned int jjj; 
  for(jjj=0;jjj<number;jjj++) 
          {}
 }

void show_tu(const char *p)
{char e=1,collum=0,page=0xb8;
 int da=0;
 int j=1;
 int jk=0;
 char add=0;
 for(j=1;j<1025;j++)
  { LCDSTA_BUSY(e);
    TRANS1(page,e);   	   
    if(j<jk)
       {
       WRITE1(da,collum,e);
       collum++;
       }	
    else
       { 
   		da=*p;
		WRITE1(da,collum,e);
        collum++;	
    	if((da==0)||(da==0xff))
      	 {jk=*(++p)+j;
 		  p++;
 		  }
   		else p++;    
       }
    if(j%128==0) page++; 
    if(j%64==0) 
             {add=add+2;
              e=e^1;
              collum=0;
              }
    delay(add); 
  }
}




char eeprom_read(char ADR)
{   char eeprom_data=0;
	EEADR=ADR;
	while(1)
      {
       if(EEPROM_RD==0) break;
      }
 	EEPROM_RD=1;
    eeprom_data=0;    //等待 
    eeprom_data=0;    //等待 
    eeprom_data=EEDATA;
    return(eeprom_data);
 }
 
void eeprom_write(char ADR,char eeprom_data)
 {
  	while(1)
      {
       if(EEPROM_WR==0) break;
      }	
   EEADR=ADR;
   EEDATA=eeprom_data;
   EEPROM_WREN=1;
   EECON2=0X55;
   EECON2=0XAA;
   EEPROM_WR=1;
   EECON1=0;
 }


int AD(void)
 {
  //char AD_flag;
  int AD_Data;
  TRISA0=1;
  ADCON1=0B10001110;
  ADCON0=0B01000000;
  AD_ADON=1;
  AD_GO=1;
  //ADCON0=0B01000101;
  while(1)
    {
     if(AD_GO==0) 
 	    break;	          
    }
  AD_Data=ADRESH;
  AD_Data=(AD_Data<<8); 
  AD_Data=AD_Data+ADRESL;
  AD_ADON=0;
  return(AD_Data);
 }




 //*******************************红外遥控处理函数 29按键***************//                    
void remotecontrol(void)    
{   
    switch(DataOut)
      {
	case  0b00011000 :  TXREG=MUSIC; key_switch_flag=1; break; 	//钟 
	case  0b01111000 :  TXREG=MUSIC; key_switch_flag=1; break;   	//亮度 
	case  0b11101000 :  deal_stop(); key_switch_flag=1; TXREG=MUSIC;   break;      
    case  0b01101000 :if((auto_manualcount_key%2)==0)  // tv/av
                            {  
                               manual_auto_flag=1;
                               wheelcircle=0; 
                               move_reset();
                               TXREG=AUTO_MODLE;
                               
                             }           
                      else  {  deal_stop();                 
                               TXREG=REMOTE_MODLE;
                               
                             }  
                      auto_manualcount_key++;  
					  key_switch_flag=1;        
                      break; 
                            
    case  0b00101000 :if((power_on_off_key%2)==0)       //电源
                      {                                                  
                        TXREG=POWER_OFF; 
                        deal_stop();                      
                       }  
                     else
                      {
                        TXREG=POWER_ON;
                       }
                      power_on_off_key++;
                      key_switch_flag=1; 
                      break; 
	case  0b10101000 :	if((sound_on_off_key%2)==0)            //喇叭关	                                
                          TXREG=SCILENT; 
                        else
                          TXREG=SCIENT_OFF;
                        sound_on_off_key++;
                        key_switch_flag=1; 
                        break;    
	case  0b10011000 : 	if(sys_init_on_off_key==0)             //屏幕 和 'set' 两个按钮 
                        {                               
                         TXREG=SYS_INIT_TIP;
                         sys_init_on_off_timer_key=RTC;
                         sys_init_on_off_key=1;
                         }  
                        else 
                          {if((RTC-sys_init_on_off_timer_key)<6144)
                                {
                                 TXREG=START_INIT;
                                 //deal_stop();
                                 sys_init_on_off_key=0;
                                 }
                           else {TXREG=SYS_INIT_TIP;
                                 sys_init_on_off_key=1;
                                 sys_init_on_off_timer_key=RTC;
                                 }
                           } 
                        key_switch_flag=1; 
                        break;                        
     }
     if(manual_auto_flag==0) 
        {
         switch(DataOut)
           { 
    		case  0b00000000 : status(speed1); 	TXREG=MUSIC;   	break;    	//1
    		case  0b10000000 : status(speed2); 	TXREG=MUSIC;   	break;    	//2
			case  0b01000000 : status(speed3); 	TXREG=MUSIC;	break; 	 	//3
			case  0b11000000 : status(speed4); 	TXREG=MUSIC;	break; 	 	//4
			case  0b00100000 : status(speed5); 	TXREG=MUSIC;    break;    	//5
			case  0b10100000 : status(speed6); 	TXREG=MUSIC;	break; 	  	//6
			case  0b01100000 : status(speed7); 	TXREG=MUSIC;	break; 	 	//7				
			case  0b11100000 : status(speed8); 	TXREG=MUSIC;	break; 		//8
			case  0b00010000 : status(speed9); 	TXREG=MUSIC;	break; 		//9
			case  0b10001000 : status(left);   	TXREG=MUSIC;    break; 		//P V   50
			case  0b00001000 : status(right);  	TXREG=MUSIC;	break; 		//P ^         
			case  0b01011000 : status(middle); 	TXREG=MUSIC;    break; 		//循环健
			case  0b01001000 : status(gohead); 	TXREG=MUSIC;	break; 		//声大
			case  0b11001000 : status(goback); 	TXREG=MUSIC;	break; 		//声小
			case  0b10111000 : status(speeddel);TXREG=MUSIC;    break;   	//MIN
			case  0b00111000 : status(speedadd);TXREG=MUSIC;    break;   	//hour  	   
			default : if(key_switch_flag==1)   key_switch_flag=0;
                      else   TXREG=MUSIC_ERROR;                 break;
           }
         }
     else{
		switch(DataOut)
           {
			case  0b10010000 :   TXREG=MUSIC;    break;   	    //0/1*
	  		case  0b01010000 :   TXREG=MUSIC;    break; 		//2*
			case  0b11010000 :   TXREG=MUSIC;    break; 		//3* 			                            
  			default : if(key_switch_flag==1)   key_switch_flag=0;
                      else   TXREG=MUSIC_ERROR;                 break;
            }
          }            
    DataOut=0xff; 
}



void status(int statusdata)                             // 状态控制 
 {
  switch(statusdata)
  { case stop :   PWM_MOTOR2=0;
      			  speed=0;
                  CCPR1L=0; 
                  now_goorback=stop;                
					                break;
    case gohead : speed=3;
				  PWM_MOTOR2=0;
                  now_goorback=gohead;
					                break;
    case goback : speed=2;
				  PWM_MOTOR2=1;
                  now_goorback=goback;
					  	            break;
    case speed1 : speed=2;          break;   //
	case speed2 : speed=3; 			break;
	case speed3 : speed=4; 			break;
	case speed4 : speed=5;  		break;
	case speed5 : speed=6;  		break;
    case speed6 : speed=8;  		break; 
	case speed7 : speed=10;  		break; 
	case speed8 : speed=12;   		break; 
	case speed9 : speed=15;   		break; 
	case left   : PWMontimeHelm=48;//  
			      helmcount=0;            
				  now_rightorleft=left;				
                                	break;
    
    case right  : PWMontimeHelm=28;   //              
			      helmcount=0;
				  now_rightorleft=right;
                 					break;       
    case middle : PWMontimeHelm=38;
                  helmcount=0;      
                  now_rightorleft=middle;
          					        break;

    case leftadd :  PWMontimeHelm=PWMontimeHelm+RateHelm;
				    if(PWMontimeHelm>=51) 	
                    PWMontimeHelm=52;
                    helmcount=0;
									break;
    case rightadd : PWMontimeHelm=PWMontimeHelm-RateHelm;
				    if(PWMontimeHelm<=29) 	PWMontimeHelm=29; 
                    helmcount=0;
									break;

    default : 						break;
  } 
}


void deal_stop(void)
 {  
		  auto_go_back=0;
		  manual_auto_flag=0; 
          status(stop);  
          status(middle);
          now_circle=0;
          auto_manualcount_key=0;
 }


       //end main


⌨️ 快捷键说明

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