匿名用户
1级
2011-08-01 回答
用AD转,16个电阻串联在一起,每个节点引出线与按键相连,按键另一端为公共端与P1^n相连。然后AD口采集到的电压也不同,就能判别按的是哪个按键,因此只要写AD采样程序就可以了
这是STC12C2052AD的例子
/**********************************************************
AD转换
**********************************************************/
void InitADC()
{
P1=0xff;
ADC_CONTR|=0x80;
delayNOP(200);
P1M0=0x01;//这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作
P1M1=0x01;//设置P1.0为开漏状态
delayNOP(200);
}
uint ADC()
{
ADC_DATA = 0; //清除结果
ADC_CONTR = 0x60; //转换速度设置 0x60 最快速度
ADC_CONTR = 0xE0; //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位
ADC_CONTR =0xe0;
delayNOP(200); //使输入电压达到稳定
ADC_CONTR = 0xe8; //1110,1000 令 ADCS = 1, 启动A/D转换,
while (1) //等待A/D转换结束
{
if (ADC_CONTR & 0x10) //0001,0000 测试A/D转换结束否
{ break; }
}
ADC_CONTR =0xe0; //1110,0111 清 ADC_FLAG 位, 关闭A/D转换,
delayNOP(400);
return ADC_DATA; //返回 A/D 10 位转换结果
}
void ADC_to_key() //ADC数据转换按键信号
{
V=ADC();
。。。
。。。
。。。你自己完成咯
}