只能说之前用了双路ADC是真香,光敏电阻和ADC按键都不用改引脚配置,只需改跳线帽
目录
一. 原理
扩展板上的按键是通过ADC来判断是哪个按键按下
下图是我实际读到的值,通过这些值就可以确定是哪个按键按下
二. 代码编写
其他配置全和双路ADC一致,只有main.c有些许不同,放部分关键代码
#include "main.h"
#include "stdio.h"
#include "lcd.h"
#include "tim.h"
#include "adc.h"
//模块计时
__IO uint32_t Lcd_uwTick=0;
// 扩展板ADC
float AO1;
float AO2;
/*------------------------------------------------------------------------------*/
/*函数声明------------------------------------------------------------------------------*/
void lcd(void);
uint8_t Akey(void);
/*主函数------------------------------------------------------------------------------*/
int main(void)
{
HAL_Init();
SystemClock_Config();//系统时钟设置
TIM2_Init();//定时器2初始化 100ms
HAL_TIM_Base_Start_IT(&htim2);//启动定时器2中断工作模式
MX_ADC2_Init();
LCD_Init();//LCD初始化
LCD_Clear(Black);//清屏
LCD_SetBackColor(Black);//背景颜色
LCD_SetTextColor(White);//文本颜色
while (1)
{
}
}
/*常用函数------------------------------------------------------------------------------*/
void lcd()//LCD显示模块
{
if (uwTick - Lcd_uwTick < 200) return;
Lcd_uwTick = uwTick;
//扩展板ADC电压值显示
AO1=get_adc2(); //读IN17
AO2=get_adc2(); //读IN13
sprintf(a," KEY:S%d ",Akey());
LCD_DisplayStringLine(Line0,(unsigned char *)a);
}
uint8_t Akey()
{
if(AO2<200) return 1;
if(AO2<800) return 2;
if(AO2<1400) return 3;
if(AO2<2000) return 4;
if(AO2<2600) return 5;
if(AO2<3200) return 6;
if(AO2<3700) return 7;
if(AO2<3970) return 8;
else return 0;
}
//定时器中断处理
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
lcd();//屏幕显示
led();//LED显示
}
}
三. 注意事项
(1)PA5-AKEY
(2)按自己实际读到的ADC值来编写按键判断程序最好
结语
有必要说一下我遇到的问题,把AO1、AO2赋值的语句放在200ms的定时器里会让程序卡住,放在200ms的lcd里倒是可以,但问题是lcd不也在定时器里吗,应该就是采集时间问题