📄 adc_key.c
字号:
#include "includes.h"
extern OS_EVENT * msgq_key;
/******************************************************
* P2.1为ADC模拟输入端口
******************************************************/
void PORT2_Init(void)
{
P2MDIN &=0xFD; //模拟输入
P2SKIP |=0x02; //交叉开关跳过
}
void Delay(unsigned int i)
{
unsigned char j;
for(;i>0;i--)
{
for(j = 0;j<100;j++);
}
}
void ADC0_Init(void)
{
AMX0P =0x01; //P2.1为ADC0的模拟输入
AMX0N =0x1F; //单端方式
ADC0CF =0x78; //右对齐,16分频 CLK(SAR)=SYSCLK/(AD0SC+1)=3MHz
ADC0CN =0x80; //ADC0允许,工作于正常方式,向AD0BUSY写1时启动ADC0转换
REF0CN =0x0A; //VDD为参考电压,关温度传感器,关偏压和电压基准
EIE1 |=0x08; //使能ADC0中断
Delay(2000); //延时等候ADC0初始化稳定
}
void ADC0_isr(void) interrupt INTERRUPT_ADC0_EOC //ADC0转换结束中断函数
{
unsigned int ADCNum;
static char key,flag=0;
char key_value;
AD0INT =0; //清ADC0转换结束中断标志
AD0WINT =0; //清ADC0窗口比较匹配中断标志,即未发生匹配,不会发生中断
ADCNum =(ADC0H<<8)+ADC0L;
if((ADCNum < 496) || (ADCNum > 528)) //有按键处在按下的状态
{
if(!flag)
{
flag =1;
key =(ADCNum+16)>>5; //首次取键值
}
else
{
if(key == ((ADCNum+16)>>5)) //两次采样结果是否相等
key =(ADCNum+16)>>5; //取第二次键值为最终键值
}
}
switch(key)
{
case 0:
key_value ='*';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 1:
key_value ='0';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 2:
key_value ='#';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 3:
key_value ='9';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 4:
key_value ='8';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 5:
key_value ='7';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 6:
key_value ='4';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 7:
key_value ='5';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 8:
key_value ='6';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 9:
key_value ='3';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 10:
key_value ='2';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 11:
key_value ='1';
OSQPost(msgq_key, (void *)(& key_value));
break;
case 12:
key_value =HANG_UP;
OSQPost(msgq_key, (void *)(& key_value));
break;
case 13:
key_value =KEY_DOWN;
OSQPost(msgq_key, (void *)(& key_value));
break;
case 14:
key_value =KEY_LEFT;
OSQPost(msgq_key, (void *)(& key_value));
break;
case 15:
key_value =OK_ENTER;
OSQPost(msgq_key, (void *)(& key_value));
break;
case 17:
key_value =KEY_RIGHT;
OSQPost(msgq_key, (void *)(& key_value));
break;
case 18:
key_value =KEY_UP;
OSQPost(msgq_key, (void *)(& key_value));
break;
case 19:
key_value =OUT_MENU;
OSQPost(msgq_key, (void *)(& key_value));
break;
case 20:
key_value =IN_MENU;
OSQPost(msgq_key, (void *)(& key_value));
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -