程序的问题是:lcd1602显示部分不能动态更新,只能显示第一次按下按键后的转速,之后按下其他按键,显示速度不会再变化。而单独使用显示程序,把电机控制程序注释掉,可以动态更新,但是两个合在一块后,显示就不能动态更新了,为什么?
#include"stm32f10x.h"
u8 table1[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};//正转
u8 table2[]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};//反转
u8 s[]=" speed= r/min";
u8 s1[]="+30-30+50-10";
//u8 s1[]="speed=+30r/min";
u8 s2[]="speed=-30r/min";
u8 s3[]="speed=+60r/min";
u8 s4[]="speed=-20r/min";
GPIO_InitTypeDef GPIO_InitStructure;
int flag;
void xianshi(void);
/*
********************************************************************************
** 函数名称 : Delay(vu32 nCount)
** 函数功能 : 延时函数
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
//IO初始化
void GPIO_Configuture(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
// GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
//正转
void motor_turn_on_1(void)
{
int i;
for(i=0;i<8;i++)
{
GPIOA->ODR=table1;
Delay(0x888f);
}
}
//反转
void motor_turn_on_2(void)
{
int i;
for (i=0;i<8;i++)
{
GPIOA->ODR=table2;
Delay(0x888f);
}
}
//停止
void motor_turn_off(void)
{
GPIOA->ODR=0x00;
}
//加速
void motor_turn_on_3(void)
{
int i;
for(i=0;i<8;i++)
{
GPIOA->ODR=table1;
Delay(0x49ff);
}
}
//减速
void motor_turn_on_4(void)
{
int i;
for (i=0;i<8;i++)
{
GPIOA->ODR=table2;
Delay(0xffff);
}
}
//键盘程序
int keyscan(void)
{ u8 key_flag;
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13);
if (key_flag==0)
{
Delay(0x0f);
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13);
if (key_flag==0)
{
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13);
while(!key_flag)
{
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13);
}
flag=1;//正转
}
}
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15);
if (key_flag==0)
{
Delay(0x0f);
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15);
if (key_flag==0)
{
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15);
while(!key_flag)
{
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15);
}
flag=2;//反转
}
}
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11);
if (key_flag==0)
{
Delay(0x0f);
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11);
if (key_flag==0)
{
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11);
while(!key_flag)
{
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11);
}
flag=3;
}
}
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12);
if (key_flag==0)
{
Delay(0x0f);
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12);
if (key_flag==0)
{
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12);
while(!key_flag)
{
key_flag=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12);
}
flag=4;
}
}
return flag;
}
//1602
void write_com(u16 com)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIOC->ODR=com;
Delay(0xfff);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
Delay(0xfff);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}
void write_data(u16 data)
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIOC->ODR=data;
Delay(0xfff);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
Delay(0xfff);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}
void init()
{
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
// void motor_control()
// {
// switch(flag)
// {
// case 1:
// motor_turn_on_1();
// break;
// case 2:
// motor_turn_on_2();
// break;
// case 3:
// motor_turn_on_3();
// break;
// case 4:
// motor_turn_on_4();
// break;
// }
// }
void motor_control()
{
if(flag==1)
motor_turn_on_1();
if(flag==2)
motor_turn_on_2();
if(flag==3)
motor_turn_on_3();
if(flag==4)
motor_turn_on_4();
}
void xianshi()
{ int num;
write_com(0x80+0x06);
switch(flag)
{
case 1:
//motor_turn_on_1();
for(num=0;num<3;num++)
{
write_data(s1[num]);
Delay(0xf);
}
break;
case 2:
//motor_turn_on_2();
for(num=3;num<6;num++)
{write_data(s1[num]);
Delay(0xf);
}
break;
case 3:
// motor_turn_on_3();
for(num=6;num<9;num++)
{write_data(s1[num]);
Delay(0xf);
}
break;
case 4:
// motor_turn_on_4();
for(num=9;num<12;num++)
{write_data(s1[num]);
Delay(0xf);
}
break;
}
}
//主函数
int main(void)
{ int num;
GPIO_Configuture();
init();
write_com(0x80);
for(num=0;num<15;num++)
{
write_data(s[num]);
Delay(0xf);
}
while(1)
{
keyscan();
xianshi();
motor_control();
}
}
|