|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学51已两个月了,以前都在看书,最近才开始焊电路,弄了好几天的AD键盘了。只用一个引脚就可以扫描很多的按键。今天晚上终于调试出来了。秀一下。
放了一张原理图。代码也放下吧,新手写的代码,请大家指点。单片机是用的STC15F602K 自带ADC转换器
uint8 ADCaction();
uint16 ADCResult(uint8 channel);
void initADC();
uint16 ADCResult(uint8 channel)//转换一次ADC结果,返回16位
{
uint16 adc;
if(channel>7) return 1024;
channel=channel|0x88;//标志清零开电源,设置通道,启动转换
ADC_CONTR=channel;
ADC_RES=0;ADC_RESL=0;//ADRJ=0;RES放高八位 RESL放低2位
NOP;NOP;NOP;NOP;NOP;NOP;
while((ADC_CONTR&0X10)==0);//1000 1100与0001 0000 ==0000 0000
ADC_CONTR&=0Xef;//清零标志位
adc=(uint16)ADC_RES;
adc=(adc<<2)|(ADC_RESL&3);//不用加 用或运算
return adc;
}
uint8 ADCaction()//根据ADC结果,转化为按键值,弹起来状态返回16
{
uint8 i,a;
uint16 j,adc;
uint8 Keybuf[3]={0,0,0};
for(a=0;a<3;a++)
{
adc=ADCResult(4);
if((adc<48)||(adc>=1024)) return 16;//弹起来时候的状态
j=64;
for(i=0;i<=15;i++)
{
if(adc>=(j-20)&&(adc<=(j+20))) break;
j+=64;
}
Keybuf[a]=i;
}
if((Keybuf[0]==Keybuf[1])&&(Keybuf[1]==Keybuf[2])) return i;
else return 16;
}
void initADC()//初始化AD转换器
{
unsigned char i, j, k;
P1ASF=0X10;//输入为P1.4
ADC_CONTR=0X80;//打开电源
_nop_();//以下代码软件延时15ms
_nop_();
i = 1;
j = 162;
k = 89;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
|
|