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