概述
AD模拟按键
在设计板子时,经常遇到IO口不够用的情况,除了用译码器和锁存器之外,还可以在按键上下功夫。
本篇文章在
STC12自带的AD转换模块上介绍如何利用
AD就使用一个IO口控制多个按键,比传统的矩阵键盘扫描更加灵活使用,而且理论上支持
无限制按键的控制。
原理
AD转化就是将电压转化为数字,在每个按键串联(并联)相对应的电阻,利用计算可以得出相对应按键按下的电压,通过AD转化就可以得到数字,并进行判断,就可以知道哪个按键被按下了。
延时程序(STC12)(12MHZ)
//延时1ms
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z; x>0; x--)
for(y=920; y>0; y--);
}
//延时10us
void delay10us( unsigned int n)
{
n=8*n;
while(n--);
}
延时程序根据实际情况修改
STC12相关寄存器
sfr P1ASF = 0x9d;
sfr ADC_CONTR = 0xbc;
sfr ADC_RES = 0xbd;
sfr ADC_RESL = 0xbe;
AD读值程序
void AD_initialize() //初始化AD
{
P1ASF=0x42; //P16和P11作为ad
ADC_RES=0x00;
ADC_RESL=0x00;
AUXR1=0x00;
ADC_CONTR=ADC_POWER;
_nop_(); // 在 intrins.h 头文件中
_nop_();
_nop_();
_nop_();
//delay(1);
}
unsigned int AD_start(unsigned char chs) // 1 6
{
ADC_CONTR=0xa8+chs;
_nop_();
_nop_();
_nop_();
_nop_();
while(ADC_CONTR!=0xb0+chs);
ADC_CONTR=0xa0+chs;
return(ADC_RES*4+ADC_RESL);
}
float AD_dat(unsigned char chs)
{
float AD_value;
unsigned char i;
for(i=0;i<10;i++)
AD_value+=AD_start(chs);
AD_value/=10;
AD_value=(AD_value*5)/1024;
return(AD_value) ;
}
其中的P1ASF为开启AD转换的P1的端口
如果开启P10、P13 则赋值 00001001(B),即0x0a;
float AD_dat(unsigned char chs)
得到的值是浮点类型,chs是检测的端口,输入6就是检测P16的AD值
按键判断程序
//键盘扫描
// 0.015 0.3 1 1.3 1.7 2.15 2.8 3.9 4.5
// 电阻值 0 510 2k 3k3 4k7 6k8 10k 31k 68k
void keyscan()
{
if(AD_dat(1)>=0&&AD_dat(1)<0.015)
{
delay(1);
if(AD_dat(1)>=0&&AD_dat(1)<0.015)
{
}
}
else if(AD_dat(1)>0.015&&AD_dat(1)<=0.3)
{
delay(1);
if(AD_dat(1)>0.015&&AD_dat(1)<=0.3)
{
}
}
else if(AD_dat(1)>0.3&&AD_dat(1)<=1)
{
delay(1);
if(AD_dat(1)>0.3&&AD_dat(1)<=1)
{
}
}
else if(AD_dat(1)>1&&AD_dat(1)<=1.3)
{
delay(1);
if(AD_dat(1)>1&&AD_dat(1)<=1.3)
{
}
}
else if(AD_dat(1)>1.3&&AD_dat(1)<=1.8)
{
delay(1);
if(AD_dat(1)>1.3&&AD_dat(1)<=1.8)
{
}
}
else if(AD_dat(1)>1.8&&AD_dat(1)<=2.3)
{
delay(1);
if(AD_dat(1)>1.8&&AD_dat(1)<=2.3)
{
}
}
else if(AD_dat(1)>2.3&&AD_dat(1)<=2.9)
{
delay(1);
if(AD_dat(1)>2.3&&AD_dat(1)<=2.9)
{
}
}
else if(AD_dat(1)>=2.9&&AD_dat(1)<=4.3)
{
delay(1);
if(AD_dat(1)>=2.9&&AD_dat(1)<=4.3)
{
}
}
else if(AD_dat(1)>4.3&&AD_dat(1)<=4.6)
{
delay(1);
if(AD_dat(1)>4.3&&AD_dat(1)<=4.6)
{
}
}
}
其中默认P11为按键的端口,delay(1)为延时,否则键值会乱漂,造成读值不准的情况;
注意的是AD取值我是取5次的平均值,若是多次取会造成读取的键值误差反而误差更大,有兴趣的可以尝试。
具体的电阻值也根据具体的计算
接线图
![](https://file2.kaopuke.com:8081/files_image/20230520/202305201704399555989.png)
电阻计算公式
V=5*R/(10000+R)
其中5v为单片机工作电压、10000为原本的限流电阻
最后
以上就是等待口红为你收集整理的AD按键模拟程序(STC12)(初学者)的全部内容,希望文章能够帮你解决AD按键模拟程序(STC12)(初学者)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复