实验目的:在熟练掌握按键与数码管原理,学会组合,设置三个按键,达到加一减一清零的目的.
流程图:
代码:
#define KEY0_PRES 1 //KEY0??
#define KEY1_PRES 2 //KEY1?? 定义按键返回值
#define KEY2_PRES 3 //KEY2??
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1) //定义 key值
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#include "stm32f10x.h"
void delay(u32 k)
{
for(;k>0;k--); // 定义延时函数
}
u8 KEY_Scan(u8 mode)
{ //按键扫描函数
u32 i;
static u8 key_up=1;//按键松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0))
{
for(i=0;i<1000;i++);//去抖
key_up=0;
if(KEY0==0) return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(KEY2==0)return KEY2_PRES;
}
else if(KEY0==1&&KEY1==1&&KEY2==1)key_up=1;
return 0;// 无按键按下
}
int main()
{
u32 j;
u8 key=0;
s32 i=0;
u32 a[10] = {0xc0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //编码表
GPIO_InitTypeDef GPIO_InitStructure; //结构体初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //打开时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//配置引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //打开时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //配置引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50m
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_All); //将输入端口置高电平
GPIO_SetBits(GPIOB,GPIO_Pin_All); //将位选端口置高电位
GPIO_ResetBits(GPIOB,GPIO_Pin_2); //开启第二管脚的位选
GPIO_Write(GPIOA,a[0]); //使第二管脚显示数字0
while(1)
{
key=KEY_Scan(0);
if(key)
{
switch(key)
{
case 1: i++;GPIO_Write(GPIOA,a[i]); for(j=0;j<10000;j++); break;
case 2: i--;GPIO_Write(GPIOA,a[i]); for(j=0;j<10000;j++); break; // 用扫描函数判断按键值并作出相应操作
case 3: i=0;GPIO_Write(GPIOA,a[i]); for(j=0;j<10000;j++); break;
}
}
else for(j=0;j<1000;j++); //延时
if(i>=10) //两位数情况
for(j=0;j<100;j++)
{
GPIO_SetBits(GPIOB,GPIO_Pin_All);
GPIO_ResetBits(GPIOB,GPIO_Pin_1); //关、开、写,延时,关
GPIO_Write(GPIOA,a[i/10]);
delay(5000);
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
GPIO_Write(GPIOA,a[i%10]); //开 写 延时 关
delay(5000);
GPIO_SetBits(GPIOB,GPIO_Pin_2);
}
if(i<10)
{
GPIO_Write(GPIOA,a[i]); //一位数选择开启一个位选
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
}
if(i==0)
{
GPIO_Write(GPIOA,a[0]);
GPIO_ResetBits(GPIOB,GPIO_Pin_2); //为0 则显示0
}
if(i<0)
{
{
GPIO_Write(GPIOA,a[0]); //若小于零 则显示0(此操作要求i为非无符号数值)
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
i=0;
}
}
}
}