ble学习笔记七----------------五向按键

-----------------------------------------五向按键 查看原理图从原理图可以看出JOY_CHK连接p-07,JOY_AD连接p0-6在按下不同按键时,JOY_CHK将会产生一个上升沿,JOY_AD口有不同的电压只要在JOY_CHK的外部中断中读取JOY_AD的电压查看芯片手册设p0-6为三态P0INP 输入模式 0x8f 1000 1111 或上0x40 0100 0000 1100 1111P0设为io功能P0SEL 0xf3 1111 0011 与上~0x80 1000 0000 取反为 0111 1111 0111 0011P0DIR设为输入功能P0DIR 0xFD 1111 1101 与上~0x80 1000 0000 取反为 0111 1111 0111 1101P0IEN P0-7设为中断方式P0IEN 0XAB 1010 1011 或上0x80 1000 0000 1010 1011PICTL 上升沿触发PICTL 0X8C 1000 1100与上~0x80 1000 0000 取反为 0111 1111 0000 1100允许p0口中断IEN1 0XB8 1011 1000或上0x20 0010 0000 1011 1000清除中断标志位P0IFG 复位为0x00 开总中断EA =1复制adc工程代码,添加如下:/****************************************************************************** 版权所有 (C), 2014-2020 ****************************************************************************** 文 件 名 : main.c 版 本 号 : V1.0 作 者 : retacn 生成日期 : 2014年9月21日 功能描述 : 中断方式处理按键 函数列表 : 修改历史 : 1.日 期 : 2014年9月21日 作 者 : retacn 修改内容 : 创建文件******************************************************************************//*----------------------------------------------* * 包含头文件 * *----------------------------------------------*/#include #include #include "Lcd12864.h"#include "common.h"#include "adc.h"/*----------------------------------------------* * 宏定义 * *----------------------------------------------*/#define KEY_UP 0X01#define KEY_DOWN 0X02#define KEY_LEFT 0X03#define KEY_RIGHT 0X04#define KEY_CENTER 0X05#define JOY_AD_CHANNEL 6 /*----------------------------------------------* * 内部函数原型说明 * *----------------------------------------------*/uint8 GetKeyValue(void);/*----------------------------------------------* * 模块级变量 * *----------------------------------------------*/volatile uint8 KeyStat = 0; // 是否有按键按下char LCDBuf[21]={0}; // 显存 int main(void){ uint8 KeyValue = 0; SysStartXOSC(); LCD12864_Init(); LCD12864_DisStr(1, " JoyStick Test"); P0INP |= 0X40; // P0.6 三态 P0SEL &= ~0X80; // 设置为IO功能 P0DIR &= ~0X80; // 设置为输入功能 P0IEN |= 0X80; // P0.7 设置为中断方式 PICTL &= ~0X80; // 上升沿触发 IEN1 |= 0X20; // 允许P0口中断 P0IFG = 0x00; // 清除中断标志位 EA = 1; // 开总中断 while(1) { if(KeyStat) // 按键按下 { KeyValue = GetKeyValue(); switch ( KeyValue ) { case KEY_UP : sprintf(LCDBuf, " UP"); break; case KEY_DOWN : sprintf(LCDBuf, " Down"); break; case KEY_LEFT : sprintf(LCDBuf, " Left"); break; case KEY_CENTER : sprintf(LCDBuf, " Center"); break; case KEY_RIGHT : sprintf(LCDBuf, " Right"); break; default: break; } KeyStat =0; LCD12864_DisStr(3, LCDBuf); } } return 0;}/***************************************************************************** 函 数 名 : P0_ISR 功能描述 : P0口中断处理 输入参数 : void 输出参数 : 无 返 回 值 : 修改历史 : 1.日 期 : 2014年9月21日 作 者 : retacn 修改内容 : 创建*****************************************************************************/#pragma vector = P0INT_VECTOR__interrupt void P0_ISR(void){ if(0x80&P0IFG) { KeyStat = 1; // 记录按键按下 } P0IFG = 0; //清中断标志 P0IF = 0; //清中断标志}/***************************************************************************** 函 数 名 : GetKeyValue 功能描述 : 获取按键值 输入参数 : void 输出参数 : 无 返 回 值 : 修改历史 : 1.日 期 : 2014年9月21日 作 者 : retacn 修改内容 : 创建*****************************************************************************/uint8 GetKeyValue(void){ uint16 adc; uint8 ksave0 = 0; adc = ADC_Read (JOY_AD_CHANNEL); if ((adc >= 800) && (adc <= 1100)) { ksave0 = KEY_RIGHT; } else if ((adc >= 1200) && (adc <= 2000)) { ksave0 = KEY_CENTER; } else if ((adc >= 2050) && (adc <= 2150)) { ksave0 = KEY_UP; } else if ((adc >= 2200) && (adc <= 2230)) { ksave0 = KEY_LEFT; } else if ((adc >= 2240) && (adc <= 2500)) { ksave0 = KEY_DOWN; } return ksave0;}----------------------------------蜂鸣器分为两种类型:有源和无源,无源蜂鸣器需要一定频率的方波驱动,使用pnp三级管来驱动查看原理图可知buzzer对应的引角为p2-0,IO作为定时器4 的匹配通道 查看用户手册外部输入输出控制器可以看到第四位有两种通道,此处选择通道二设置p2-0输出和功能复用设置p2.0为输出引角 设置p2-0复用设置定时器1 timer4 如果运行则停止,第四位设置为02 清除timer4计数 第二位设置为13 禁用timer4 溢出中断 第三位设04 设置timer4模式为up/down, 第0位和第一位为11禁用ch0中断 ,第六位为1Ch0对照输出模式选择为toggle output on compareCh0模式compare,第二位设1 代码内容如下:
原文地址:https://www.cnblogs.com/retacn-yue/p/6194248.html