上午
一大早跑去买家厂里测试程序;
改各种功能,修bug;
最后还是有个功能没做出来(事先也没说明)— 异常断电后按复位才能继续启动;
但板子上搭载的是机械复位,其功能也就相当于断电重启;
难搞;
按键功能的老化程序完成了(舍弃了有bug的KEY5);
先贴一下芯片管脚图:
头文件Key.h:
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
//定义KEY来读取各个按键值;
#define KEY1 PBin(7)
#define KEY2 PBin(6)
#define KEY3 PBin(5)
#define KEY4 PBin(4)
#define KEY5 PBin(3)
#define KEY6 PDin(2)
#define KEY7 PCin(12)
#define KEY8 PCin(11)
#define KEY9 PCin(10)
// #define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键0
// #define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键1
// #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键2
// 定义按键按压后的返回值;
#define KEY1_PRES 1
#define KEY2_PRES 2
#define KEY3_PRES 3
#define KEY4_PRES 4
#define KEY5_PRES 5
#define KEY6_PRES 6
#define KEY7_PRES 7
#define KEY8_PRES 8
#define KEY9_PRES 9
// 定义数码管的5个输入管脚;
#define WEI1 PCout(6)
#define WEI2 PCout(7) //正常速度
#define WEI3 PCout(8)
#define WEI4 PCout(9) //补偿速度
#define WEI5 PAout(8) //补偿时间
#define WEI6 PAout(12)
// 定义数码管的7个低电平管脚;
// 顺时针命名;
#define DATA1 PBout(8)
#define DATA2 PBout(9)
#define DATA3 PBout(10)
#define DATA4 PBout(11)
#define DATA5 PBout(12)
#define DATA6 PBout(13)
#define DATA7 PBout(14)
#define DATA8 PBout(15)
#define LED1 PAout(15) //正常
#define LED2 PAout(11) //异常
// 用到的函数声明;
void KEY_Init(void);//IO初始化
u8 KEY_Scan(u8 mode); //按键扫描函数
void Light_up(int num);
void Light_Error();
#endif
相应函数功能Key.c:
#include "key.h"
#include "delay.h"
//按键初始化函数
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE );//使能PORTB,PORTC, PORTD, PORTDA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_11 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_12|GPIO_Pin_15|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//KEYi_PRES,KEYi按下
u8 KEY_Scan(u8 mode)
{
static u8 key_up = 1;//按键按松开标志
if(mode) {
key_up = 1; //支持连按
}
if(key_up && (KEY1 == 0||KEY2 == 0 || KEY3 == 0 || KEY4 == 0 || KEY5 == 1 || KEY6 == 0 || KEY7 == 0 || KEY8 == 0 || KEY9 == 0))
{
delay_ms(10);//去抖动
key_up = 0;
if(KEY1 == 0)
return KEY1_PRES;
else if(KEY2 == 0)
return KEY2_PRES;
else if(KEY3 == 0)
return KEY3_PRES;
else if(KEY4 == 0)
return KEY4_PRES;
else if(KEY5 == 1)
return KEY5_PRES;
else if(KEY6 == 0)
return KEY6_PRES;
else if(KEY7 == 0)
return KEY7_PRES;
else if(KEY8 == 0)
return KEY8_PRES;
else if(KEY9 == 0)
return KEY9_PRES;
}
else if(KEY1 == 1 && KEY2 == 1 && KEY3 == 1 && KEY4 == 1 && KEY5 == 0 && KEY6 == 1 && KEY7 == 1 && KEY8 == 1 && KEY9 == 1)
key_up = 1;
return 0;// 无按键按下
}
void Light_up(int num)
{
switch (num)
{
case 1: {
DATA1 = 1; //1
DATA2 = 0; //2
DATA3 = 0; //3
DATA4 = 1; //4
DATA5 = 1; //5
DATA6 = 1; //6
DATA7 = 1; //7
}
break;
case 2: {
DATA1 = 0; //1
DATA2 = 0; //2
DATA3 = 1; //3
DATA4 = 0; //4
DATA5 = 0; //5
DATA6 = 1; //6
DATA7 = 0; //7
}
break;
case 3: {
DATA1 = 0; //1
DATA2 = 0; //2
DATA3 = 0; //3
DATA4 = 0; //4
DATA5 = 1; //5
DATA6 = 1; //6
DATA7 = 0; //7
}
break;
case 4: {
DATA1 = 1; //1
DATA2 = 0; //2
DATA3 = 0; //3
DATA4 = 1; //4
DATA5 = 1; //5
DATA6 = 0; //6
DATA7 = 0; //7
}
break;
case 5: {
DATA1 = 0; //1
DATA2 = 1; //2
DATA3 = 0; //3
DATA4 = 0; //4
DATA5 = 1; //5
DATA6 = 0; //6
DATA7 = 0; //7
}
break;
case 6: {
DATA1 = 0; //1
DATA2 = 1; //2
DATA3 = 0; //3
DATA4 = 0; //4
DATA5 = 0; //5
DATA6 = 0; //6
DATA7 = 0; //7
}
break;
case 7: {
DATA1 = 0; //1
DATA2 = 0; //2
DATA3 = 0; //3
DATA4 = 1; //4
DATA5 = 1; //5
DATA6 = 1; //6
DATA7 = 1; //7
}
break;
case 8: {
DATA1 = 0; //1
DATA2 = 0; //2
DATA3 = 0; //3
DATA4 = 0; //4
DATA5 = 0; //5
DATA6 = 0; //6
DATA7 = 0; //7
}
break;
case 9: {
DATA1 = 0; //1
DATA2 = 0; //2
DATA3 = 0; //3
DATA4 = 0; //4
DATA5 = 1; //5
DATA6 = 0; //6
DATA7 = 0; //7
}
break;
case 0: {
DATA1 = 0; //1
DATA2 = 0; //2
DATA3 = 0; //3
DATA4 = 0; //4
DATA5 = 0; //5
DATA6 = 0; //6
DATA7 = 1; //7
}
break;
}
}
void Light_E()
{
DATA1 = 0; //1
DATA2 = 1; //2
DATA3 = 1; //3
DATA4 = 0; //4
DATA5 = 0; //5
DATA6 = 0; //6
DATA7 = 0; //7
return;
}
void Light_R()
{
DATA1 = 0; //1
DATA2 = 0; //2
DATA3 = 0; //3
DATA4 = 1; //4
DATA5 = 0; //5
DATA6 = 0; //6
DATA7 = 0; //7
return;
}
void Light_O()
{
DATA1 = 0; //1
DATA2 = 0; //2
DATA3 = 0; //3
DATA4 = 0; //4
DATA5 = 0; //5
DATA6 = 0; //6
DATA7 = 1; //7
}
void Light_Error()
{
PCout(6) = 1;
Light_E();
delay_us(50);
PCout(6) = 0;
PCout(7) = 1;
Light_R();
delay_us(50);
PCout(7) = 0;
PCout(8) = 1;
Light_R(8);
delay_us(50);
PCout(8) = 0;
PCout(9) = 1;
Light_O();
delay_us(50);
PCout(9) = 0;
WEI5 = 1;
Light_R();
delay_us(50);
WEI5 = 0;
return;
}
主函数main.c代码如下:
#include "delay.h"
#include "sys.h"
#include "Key.h"
u8 t;
int main(void)
{
delay_init(); //延时函数初始化
//LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
while(1)
{
int i;
while(1) { // 循环读按键值;
t = KEY_Scan(0);
if(t != 0) {
break; // 读到键值则跳出;
}
else {
Light_Error();
}
}
for(i = 0; i < 10;) {
PCout(6) = 1;
Light_up(i);
delay_us(50);
PCout(6) = 0;
PCout(7) = 1;
Light_up(8);
delay_us(50);
PCout(7) = 0;
PCout(8) = 1;
Light_up(8);
delay_us(50);
PCout(8) = 0;
PCout(9) = 1;
Light_up(8);
delay_us(50);
PCout(9) = 0;
PAout(8) = 1;
Light_up(8);
delay_us(50);
PAout(8) = 0;
PAout(12) = 1;
Light_up(8);
delay_us(150);
PAout(12) = 0;
t = KEY_Scan(0);
if(t != 0) {
i++;
}
}
}
return 0;
}
OK,明天开始第二个老化程序;
"I can do all things"