#include <math.h>
#include <REG52.H>
#include <INTRINS.H>
#define GPIO_KEY P3
//电机IO
#define GPIO_MOTOR P1
//按:AB-BC-CD-DA-AB的次序通电就可正转
//按:AB-AD-DC-BC-AB的次序通电就可反转
unsigned char code FFF[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转顺序
unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转顺序
unsigned char Direction,Speed;
void Delay(unsigned int t);
void Motor();
char DispBuf[8];//键盘数据
char DispBuf2[8]; //有卵用?
unsigned char KeyValue; //用来存放读取到的键值
unsigned char KeyState; //用来存放按键状态
void Delay10ms(); //延时50us
void KeyDown(); //检测按键函数
/*
void Delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
*/
/*******************************************************************************
* 函 数 名 : Motor
* 函数功能 : 电机旋转函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Motor()
{
unsigned char i;
for(i=0;i<8;i++)
{
if(Direction==1)
GPIO_MOTOR = FFF[i]&0x1f; //取数据
if(Direction==2)
GPIO_MOTOR = FFZ[i]&0x1f;
Delay(Speed); //调节转速
}
}
/*******************************************************************************
* 函 数 名 : Delay
* 函数功能 : 延时
* 输 入 : t
* 输 出 : 无
*******************************************************************************/
void Delay(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<80; k++)
{ }
}
}
void main()
{
while(1){
char bbb;
/*
for(i=0;i<=127;i++){
lcdsetdot(i,16-(uchar)(16*sin(i/127.0*5*3.14)));
} */
KeyDown();
if(KeyState)
{
KeyState=0;
DispBuf[8]=KeyValue+48;
bbb=KeyValue+48;
//lcdwritestring(5,3,DispBuf2);
}
Speed=30;
if(bbb=='0') //检测按键K1是否按下
{
Direction=1;
//lcdwritestring(0,3,"反转!!");
}
if(bbb=='1') //检测按键K2是否按下
{
Direction=2;
//lcdwritestring(0,3,"正转!!");
}
if(bbb=='2') //检测按键K3是否按下
{
Speed=10;
//lcdwritestring(0,3,"速度10!");
}
if(bbb=='3') //检测按键K4是否按下
{
Speed=40;
//lcdwritestring(0,3,"速度40!");
}
Motor();
/////////////////////////////////////////////
}
}
/*******************************************************************************
* 函 数 名 : KeyDown
* 函数功能 : 检测有按键按下并读取键值
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void KeyDown(void)
{
char a;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
Delay10ms();
if(GPIO_KEY!=0x0f)
{
KeyState=1;
Delay10ms();
//测试行
GPIO_KEY=0XF0;
// Delay10ms();
switch(GPIO_KEY)
{
case(0X70): KeyValue=0;break;
case(0Xb0): KeyValue=1;break;
case(0Xd0): KeyValue=2;break;
case(0Xe0): KeyValue=3;break;
// default: KeyValue=17; //检测出错回复17意思是把数码管全灭掉。
}
//测试列
GPIO_KEY=0X0F;
Delay10ms();
switch(GPIO_KEY)
{
case(0X0e): KeyValue=KeyValue;break;
case(0X0d): KeyValue=KeyValue+4;break;
case(0X0b): KeyValue=KeyValue+8;break;
case(0X07): KeyValue=KeyValue+12;break;
// default: KeyValue=17;
}
while((a<50)&&(GPIO_KEY!=0x0f)) //检测按键松手检测
{
Delay10ms();
a++;
}
a=0;
}
}
}
/*******************************************************************************
* 函 数 名 : Delay10ms
* 函数功能 : 延时函数,延时10ms
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}