初级会员

- 积分
- 131
- 金钱
- 131
- 注册时间
- 2016-3-27
- 在线时间
- 83 小时
|
10金钱
#include "stm32f10x.h"
#include "key.h"
#include "delay.h"
u8 KeyVal='0';
void Key_Init(void) //初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PC0-3设置推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PC8-10 设置下拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
int key(void) //实现矩阵键盘。返回值为各按键的键值,自己定义
{
// int KeyVal=0; //keyVal为最后返回的键值
//GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);//PC0到PC3全部输出为高
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff0 | 0x0)); //PC0到PC3全部输出为高
if((GPIOC->IDR & 0x0F00)==0x0000) //如果PC8到PC10全为0,则没有键按下,返回值为-1
return -1;
else
{
DelayMs(5); //延时5ms去抖
if((GPIOC->IDR & 0x0F00)==0x0000) //如果延时10ms后,PC8到PC10又全为0,则刚才引脚的电位变化是抖动产生的
return -1;
}
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff0 | 0x1)); //让PC0-3输出为二进制的0001
switch(GPIOC->IDR & 0x0F00) //对PC8到PC10进行判断,输出不同的键值
{
case 0x0100: KeyVal='#'; break;
case 0x0200: KeyVal='9'; break;
case 0x0400: KeyVal='6'; break;
case 0x0800: KeyVal='3'; break;
}
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff0 | 0x2)); //让PC0-3输出为二进制的0010
switch(GPIOC->IDR & 0x0F00) //对PC8到PC10进行判断,输出不同的键值
{
case 0x0100: KeyVal='0'; break;
case 0x0200: KeyVal='8'; break;
case 0x0400: KeyVal='5'; break;
case 0x0800: KeyVal='2'; break;
}
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff0 | 0x4)); //让PC0-3输出为二进制的0100
switch(GPIOC->IDR & 0x0F00) //对PC8到PC10进行判断,输出不同的键值
{
case 0x0100: KeyVal='*'; break;
case 0x0200: KeyVal='7'; break;
case 0x0400: KeyVal='4'; break;
case 0x0800: KeyVal='1'; break;
}
return KeyVal;
}
这样写有什么问题吗,为什么KeyVal没有值返回,我想通过KeyVal传递给OLED,
在OLED中我定义了这样一个函数void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize);
void OLED_ShowStr(unsigned char x,unsigned char y,unsigned char ch[],unsigned char TextSize)
{
unsigned char c = 0,i = 0,j = 0;
switch(TextSize)
{
/* case 1:
{
while(ch[j] != '\0')
{
c = ch[j] - 32;
if(x > 126)
{
x = 0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<6;i++)
WriteDat(F6x8[c][i]);
x += 6;
j++;
}
}break;*/
case 2:
{
while(ch[j] !='\0')
{
c = ch[j]-32;
if(x>120)
{
x = 0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<8;i++)
WriteDat(F8X16[c*16+i]);
OLED_SetPos(x,y+1);
for(i=0;i<8;i++)
WriteDat(F8X16[c*16+i+8]);
x +=8;
j++;
}
}break;
}
}
主函数中直接这样传递 OLED_ShowStr(70,3,&KeyVal,2);
最后结果是可以显示预先设定的0,但按键没反应,有时候还会自动跳变成1,不知道问题在哪,DEBUG运行看KeyVal值,运行几次就变成1了
求助,新人很多基础问题不会,提前感谢大家耐心回答
|
最佳答案
查看完整内容[请看2#楼]
那你显示一位数怎么显示的?依样画葫芦,多试,多看看资料,驱动函数
这个还是自己琢磨吧,总不能帮你看资料,帮你写程序吧,实践出真知
|