独闷闷网

 找回密码
 立即注册
搜索
查看: 13008|回复: 8
打印 上一主题 下一主题
收起左侧

[原创] 终于弄出来了——AD键盘,好高兴

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-3 01:17:53 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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);
}

3C8F961200A1A2CF35FF324BCF834F5B.png (231.6 KB, 下载次数: 245)

3C8F961200A1A2CF35FF324BCF834F5B.png

27416E67A099DDFA8C5CAD2098B7246B.png (287.09 KB, 下载次数: 222)

27416E67A099DDFA8C5CAD2098B7246B.png
乐于分享,勇于质疑!
8#
发表于 2015-1-14 16:06:24 | 只看该作者
fzwwj95 发表于 2015-1-13 22:07
那一般AD键盘采用什么方法?

一般用不到那么多按键
乐于分享,勇于质疑!
7#
发表于 2015-1-13 22:07:14 | 只看该作者
xiao_yp2014 发表于 2015-1-4 16:05
嘿嘿,这样也可以,但是一般AD键盘不采用这种方法,你的程序没有上完吧?

那一般AD键盘采用什么方法?
乐于分享,勇于质疑!
6#
发表于 2015-1-8 16:10:17 | 只看该作者
做的不错,焊工有待提高,为了美观,线从地面飞吧,这只是书上的历程吧,何不进行自己的改造升级?
乐于分享,勇于质疑!
5#
发表于 2015-1-4 16:05:47 | 只看该作者
xiao_yp2014 发表于 2015-1-3 22:27
一次16个AD按键有点多,中间只有0.3V的区别,干扰大了,就容易出问题。。。。。。

嘿嘿,这样也可以,但是一般AD键盘不采用这种方法,你的程序没有上完吧?
乐于分享,勇于质疑!
地板
发表于 2015-1-4 09:40:31 | 只看该作者
难得的实战经验
乐于分享,勇于质疑!
板凳
发表于 2015-1-3 22:27:58 | 只看该作者
一次16个AD按键有点多,中间只有0.3V的区别,干扰大了,就容易出问题。。。。。。

点评

程序里面弄了一些去抖的,判断的时候加了一个误差值进去。  发表于 2015-1-4 01:37
乐于分享,勇于质疑!
沙发
发表于 2015-1-3 12:36:52 | 只看该作者
有代码,有原理图,有照片,而且还是16个按键,非常难得的实战经验,非常漂亮,果断加精。
乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-11-29 18:35 , Processed in 0.196079 second(s), 21 queries .

快速回复 返回顶部 返回列表