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

📄 car0108.c

📁 一款玩具车控制程序
💻 C
字号:
//Car.c
//Body: HT48R10A-1
//Mask option
//SysFreq: 2000KHz
//the others use the default value

#include <ht48R05A-1.h>

#define LeftP    _pb0
#define LeftN    _pb1
#define RightP   _pb2
#define RightN   _pa7

bit OK;
bit Cancel;
bit Forward;
bit Back;
bit Left;
bit Right;
bit Per30;
bit Per50;
bit Per70;
bit Per100;
bit control_key;
bit forward_bit;
bit back_bit;

unsigned char control_flag;
unsigned char general_flag;
unsigned char forward_flag[7];
unsigned char back_flag[7];
unsigned char left_flag[7];
unsigned char right_flag[7];

unsigned char row, col;

//extern unsigned char count;


#define _tmrc4 _0e_4  //timer4 enable bit 
#pragma vector isr_4 @ 0x4
#pragma vector isr_8 @ 0x8

bit delay1_flag,delay2_flag,delay3_flag,delay4_flag;
unsigned long int delay_num,delay1_num,delay2_num,delay3_num,delay4_num;
unsigned char count;
unsigned char row, col;
//extern unsigned char right_flag;

unsigned char vol_num;
unsigned char vol_intnum;

void delay_10();
unsigned char get_key();
void Check_OK();
void mDelay(unsigned char num);

//ISR for safequard
void isr_4(){} // external ISR

void isr_8() // timer/event
{
		if(delay1_num)
			delay1_num --;
		if(delay2_num)
			delay2_num --;
		if(delay3_num)
			delay3_num --;
		if(delay4_num)
			delay4_num --;
			
		if(!vol_num)
			vol_num = vol_intnum;
		else
			vol_num --;
}

//initialize registers for safeguard
/*
void safeguard_init(){
        _intc = 0;
        _tmrc = 0;
        _tmr = 0;
        _pac = 0xff;
        _pbc = 0xff;
        _pcc = 0xff;
}
*/

void Check_Cancel()
{
	unsigned char i;
	LeftP = 0;
	LeftN = 0;
	RightP = 0;
	RightN = 0;
	
	control_key = 0;
	control_flag = 1;
	general_flag = 0;
//	left_flag = 0;

	for(i = 0; i < 7; i ++)
	{
		left_flag[i] = 0;
		forward_flag[i] = 0;
		right_flag[i] = 0;
		back_flag[i] = 0;
	}
//	right_flag = 0;
//	forward_flag = 0;
//	back_flag = 0;

	OK = 0;
	
	delay1_flag = 1;
	delay3_flag = 1;
	delay2_flag = 1;
	delay4_flag = 1;
	delay1_num = 0;
	delay2_num = 0;
	delay3_num = 0;
	delay4_num = 0;
	
	vol_intnum = 0;
	vol_num = 0;
	
	forward_bit = 0;
	back_bit = 0;
	/*
	Cancel = 0;
	Forward = 0;
	Back = 0;
	Left = 0;
	Right = 0;
	Per30 = 0;
	Per50 = 0;
	Per70 = 0;
	Per100 = 0;
	*/
}	


void initial()
{
	unsigned char i;

	_pac = 0x7f;     // 0111 1000:PA7,PA2,PA1,PA0 OUTPUT PA6,5,4,3 INPUT
	_pbc = 0x00;    //PB:OUTPUT
	_pcc = 0x03;    //PC:INPUT
	
	_pa = 0x78;		//pb0:左马达正;PB1:左右马达负;PB2:右马达正;PA7:右马达负
	_pb = 0x00;		//PA6,5,4,3键盘行,PA2,1,0键盘列
	row = 0x08;
	col = 0x08;

	delay1_flag = 1;
	delay2_flag = 1;
	delay3_flag = 1;
	delay4_flag = 1;
	
	delay1_num = 0;
	delay2_num = 0;
	delay3_num = 0;
	delay4_num = 0;
	
	vol_intnum = 0;
	vol_num = 0;
	
	forward_bit = 0;
	back_bit = 0;
	
	control_key = 0;
	control_flag = 1;
	general_flag = 0;
//	left_flag = 0;

	for(i = 0; i < 7; i ++)
	{
		left_flag[i] = 0;
		forward_flag[i] = 0;
		right_flag[i] = 0;
		back_flag[i] = 0;
	}

//	right_flag = 0;
//	forward_flag = 0;
//	back_flag = 0;

	OK = 0;

/*
	Cancel = 0;
	Forward = 0;
	Back = 0;
	Left = 0;
	Right = 0;
	Per30 = 0;
	Per50 = 0;
	Per70 = 0;
	Per100 = 0;
*/
	_intc = 0x5;    //enable timer
	_tmrc = 0x87;   //timer mode (internal clock)
//	set_timer();
  _tmrc4 = 0;
  _tmr = 0xe1;
  _tmrc4 = 1;    //start timer1  
}

/******************************************/

main()
{
	unsigned char index;
	unsigned char i,j;
	unsigned char m,n;
	unsigned char key;
	unsigned char scan[3] = {0x7e, 0x7d, 0x7b};
	
//	safeguard_init();
	initial();
	
	LeftP = 0;
	LeftN = 0;
	RightP = 0;
	RightN = 0;
	
	while(1)
	{
//	index = get_key();	
/******************get_key*********************************/
		i=0;
		while(i < 3)
		{
			_pac = scan[i]; //output scan code to port A
			_pa = _pa & (scan[i] | 0x80);
			if ((~(_pa|0x80)) & 0xf8)		 	//key pressed
			{
				_delay(2000);
				if ((~(_pa|0x80)) & 0xf8)
				{
					row = i;
					break;
				}
			}
			i++;
		}
	///////////////////////////////////////
		key = _pa; //keep the pressed key
		while((~(_pa|0x80)) & 0xf8);
		for(j=0; j<4; j++)
		if ((~key) & (0x08<<j))
		{
			col = j;
			break; //column i, key pressed
		}
	//	return (row << 2) + col;
		index = (row << 2) + col;
		
/************************************************************/

/************main********************************************/

		switch(index)
		{
			case 0x00:
				//Check_OK();
				if((delay1_flag)&&(delay2_flag)&&(delay3_flag)&&(delay4_flag))
				{
					delay1_num = 0;
					delay2_num = 0;
					delay3_num = 0;
					delay4_num = 0;
					OK = 1;
				}
				break;
			case 0x03:
				//Cancel = 1;
				Check_Cancel();
				
				break;
			case 0x04:					//向左键
				if(general_flag < 7)
				{
					general_flag ++;
					left_flag[general_flag-1] = general_flag;
				}
				control_key = 1;
				//Left = 1;
				
				break;
			case 0x05:				//向前键
				if(general_flag < 7)
				{
					general_flag ++;
					forward_flag[general_flag-1] = general_flag;
				}
				//Forward = 1;
				control_key = 1;
				break;
			case 0x06:		//向后键
				if(general_flag < 7)
				{
					general_flag ++;
					back_flag[general_flag-1] = general_flag;
				}
				//Back = 1;
				control_key = 1;
				break;
			case 0x07:		//向右键
				if(general_flag < 7)
				{
					general_flag ++;
					right_flag[general_flag-1] = general_flag;
				}
				//Right = 1;
				control_key = 1;
				break;
			case 0x08:		//速度3
				Per30 = 1;
				vol_intnum = 3;
				break;
			case 0x09:		//速度2
				Per50 = 1;
				vol_intnum = 2;
				break;
			case 0x0a:		//速度1
				Per70 = 1;
				vol_intnum = 1;
				break;
			case 0x0b:		//速度0
				Per100 = 1;
				vol_intnum = 0;
				break;
			default:
				
				break;

		}
		
/************************************************************/

/**********Check_OK******************************************/

		if(OK) 
//	Check_OK();
		{

//			for(i = 1; i <= general_flag; i ++)
//			{
				if(control_key)
				{

					if(left_flag[control_flag-1] == control_flag)	//左转
					{
//						if(!forward_bit)
						{
							if((!delay1_num)&&(!delay2_num)&&(!delay3_num))
							{
								if(delay4_flag)
								{
									//-----------------------------
									forward_bit = 0;		//	转后需停
									back_bit = 0;
									//-----------------------------
									delay4_num = 300;
									delay4_flag = 0;
								}
								if(delay4_num)
								{
									LeftP = 0;
									LeftN = 0;
									RightP = 0;
									RightN = 0;	
								}
							}
						}
	//--------------------------------------------
						if((delay1_flag)&&(!delay4_num)&&(!delay2_num)&&(!delay3_num))
						{
							delay1_num = 450;
							delay1_flag = 0;
						}
						if(delay1_num)
						{
							LeftP = 1;
							LeftN = 0;
							RightP = 0;
							RightN = 1;
						}
	//-------------------------------------------------------------		//左转后继续前进
	/*
						if((!delay1_num)&&(!delay2_num)&&(!delay4_num))
						{
							if(delay3_flag)
							{
								delay3_num = 300;
								delay3_flag = 0;
							}
							if(delay3_num)
							{
								LeftP = 0;
								LeftN = 0;
								RightP = 0;
								RightN = 0;	
							}
						}
	//--------------------------------------------
						if((!delay1_num)&&(!delay3_num)&&(!delay4_num))
						{
							if(delay2_flag)
							{
								delay2_num = 2000;
								delay2_flag = 0;
								forward_bit = 1;
								back_bit = 0;
							}
							if(delay2_num)
							{
								if(!vol_num)
								{
									LeftP = 1;
									LeftN = 0;
									RightP = 1;
									RightN = 0;	
								}
								else
								{
									LeftP = 0;
									LeftN = 0;
									RightP = 0;
									RightN = 0;	
								}
							}
						}
				*/
	//--------------------------------------------


					}
	//==============================================================
					if(forward_flag[control_flag-1] == control_flag)	//前进
					{
						
						if(!forward_bit)
						{
							if((!delay1_num)&&(!delay2_num)&&(!delay3_num))
							{
								if(delay4_flag)
								{
									delay4_num = 300;
									delay4_flag = 0;
								}
								if(delay4_num)
								{
									LeftP = 0;
									LeftN = 0;
									RightP = 0;
									RightN = 0;	
								}
							}
						}
	//--------------------------------------------
						if((delay2_flag)&&(!delay1_num)&&(!delay4_num)&&(!delay3_num))
						{
							delay2_num = 900;
							delay2_flag = 0;
							forward_bit = 1;
							back_bit = 0;
						}
						if(delay2_num)
						{
							if(!vol_num)
							{
								LeftP = 1;
								LeftN = 0;
								RightP = 1;
								RightN = 0;	
							}
							else
							{
								LeftP = 0;
								LeftN = 0;
								RightP = 0;
								RightN = 0;	
							}
						}
	//--------------------------------------------


					}
	//==============================================================
					if(back_flag[control_flag-1] == control_flag)	//后退
					{
						if(!back_bit)
						{
							if((!delay1_num)&&(!delay2_num)&&(!delay3_num))
							{
								if(delay4_flag)
								{
									delay4_num = 300;
									delay4_flag = 0;
								}
								if(delay4_num)
								{
									LeftP = 0;
									LeftN = 0;
									RightP = 0;
									RightN = 0;	
								}
							}
						}
	//--------------------------------------------
						if((delay2_flag)&&(!delay1_num)&&(!delay4_num)&&(!delay3_num))
						{
							delay2_num = 900;
							delay2_flag = 0;
							forward_bit = 0;
							back_bit = 1;
						}
						if(delay2_num)
						{
								if(!vol_num)
								{
									LeftP = 0;
									LeftN = 1;
									RightP = 0;
									RightN = 1;	
								}
								else
								{
									LeftP = 0;
									LeftN = 0;
									RightP = 0;
									RightN = 0;	
								}
						}
	//--------------------------------------------


					}
	//==============================================================
					if(right_flag[control_flag-1] == control_flag)	//右转
					{
							//--------------------------------------------
//						if(!forward_bit)
						{
							if((!delay1_num)&&(!delay2_num)&&(!delay3_num))
							{
								if(delay4_flag)
								{
									//-----------------------------
									forward_bit = 0;		//转后需停
									back_bit = 0;
									//-----------------------------
									delay4_num = 300;
									delay4_flag = 0;
								}
								if(delay4_num)
								{
									LeftP = 0;
									LeftN = 0;
									RightP = 0;
									RightN = 0;	
								}
							}
						}
						
						if((delay1_flag)&&(!delay4_num)&&(!delay2_num)&&(!delay3_num))
						{
							delay1_num = 450;
							delay1_flag = 0;
						}
						if(delay1_num)
						{
							LeftP = 0;
							LeftN = 1;
							RightP = 1;
							RightN = 0;	
						}
	//-------------------------------------------------------------		//右转后继续前进
	/*
							if((!delay1_num)&&(!delay2_num)&&(!delay4_num))
						{
							if(delay3_flag)
							{
								delay3_num = 300;
								delay3_flag = 0;
							}
							if(delay3_num)
							{
								LeftP = 0;
								LeftN = 0;
								RightP = 0;
								RightN = 0;	
							}
						}
	//--------------------------------------------
	//--------------------------------------------
						if((!delay1_num)&&(!delay3_num)&&(!delay4_num))
						{
							if(delay2_flag)
							{
								delay2_num = 2000;
								delay2_flag = 0;
								forward_bit = 1;
								back_bit = 0;
							}
							if(delay2_num)
							{
								if(!vol_num)
								{
									LeftP = 1;
									LeftN = 0;
									RightP = 1;
									RightN = 0;	
								}
								else
								{
									LeftP = 0;
									LeftN = 0;
									RightP = 0;
									RightN = 0;	
								}
							}
						}
					*/
	//--------------------------------------------

					}
				}
//			}
//==============================================================
			if((!delay1_num)&&(!delay2_num)&&(!delay3_num)&&(!delay4_num))	//结束
			{
				delay1_flag = 1;
				delay2_flag = 1;
				delay3_flag = 1;
				delay4_flag = 1;
				LeftP = 0;
				LeftN = 0;
				RightP = 0;
				RightN = 0;
				if(control_flag <= general_flag)
				{
					control_flag ++;
				}
				else
				{
					control_flag = 1;
					control_key = 0;
					general_flag = 0;
					
					for(i = 0; i < 7; i ++)
					{
						left_flag[i] = 0;
						forward_flag[i] = 0;
						right_flag[i] = 0;
						back_flag[i] = 0;
					}
					
					//right_flag = 0;
					//forward_flag = 0;
					//back_flag = 0;
					OK = 0;
				}



/*
					if(control_flag < general_flag)
					{
						control_flag ++;
					}
					else
					{
						control_flag = 1;
						control_key = 0;
						general_flag = 0;
						
						for(i = 0; i < 10; i ++)
						{
							left_flag[i] = 0;
						}
						
						right_flag = 0;
						forward_flag = 0;
						back_flag = 0;
						OK = 0;
					}
					
				if(delay3_flag)
				{
					delay3_num = 300;
					delay3_flag = 0;
				}
				if(delay3_num)
				{
					LeftP = 0;
					LeftN = 0;
					RightP = 0;
					RightN = 0;
				}
				else
				{
					delay1_flag = 1;
					delay2_flag = 1;
					delay3_flag = 1;
						OK = 0;
				}
			*/
			}
		}

/**********Check_OK 结束****************************************/

/************************************************************/

		row = 0x08;
		col = 0x08;
		
	}
}
/***********结束**************************/

⌨️ 快捷键说明

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