如何用笙泉82系列MCU做按键扫描?下面我举两个常用的例子:
1.用82系列的ADC口来做按键,硬件电路设计如下:
当分别按下图中每个键时,送到ADC口的电压会有不同,不同电压会对应不同ADC值,因此MCU通过读取ADC值可判断出用户按下的是什么键!
理论上8位ADC可以做到256个键,考虑到主电压波动,按键抖动,建议最多做8个键,按键电压平均落到0~VDD范围之间。
下面是按键的处理函数:
void InitADC(void)
{
//设置 P1.0 做ADC 按键扫描脚
P1M0 = 0x01;
P1M1 = 0x00;
}
BYTE KeyScan(void)
{
BYTE bValue;
bValue = Get_ADC_Channel(0)
if(bValue < 0xE5)
{
if(bValue > 0xC6)
return(KEY_N1);
else if(bValue < 0xA8)
return(KEY_N2);
else if(bValue > 0x89)
return(KEY_N3);
else if(bValue > 0x6B)
return(KEY_N4);
else if(bValue > 0x4C)
return(KEY_N5);
else if(bValue > 0x2D)
return(KEY_N6);
else if(bValue > 0x0F)
return(KEY_N7);
else
return(KEY_N8);
}
return(NO_KEY);
}
///////////////////////////////////////////////////
//
// Function:Get_ADC_Channel(char channel)
// Get value from ADC converter
// channel must be 0 to 7 (PIN 1.0 to PIN 1.7)
// return value is 10bit (0x0000 to 0x03ff)
//
///////////////////////////////////////////////////
unsigned int Get_ADC_Channel(char channel)
{
channel &= 0x07; //make sure channel is 0-7
ADCTL = 0x88|channel; //start convert
while(!(ADCTL & 0x10)){} //check if convert done
return ((unsigned int)(ADCH<<2) | (ADCL & 3));
} |