打印

浅谈笙泉82系列按键扫描硬件软件设计

[复制链接]
2749|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
megawin|  楼主 | 2009-9-29 11:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
如何用笙泉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));  
}
沙发
Finnyip| | 2009-9-29 12:55 | 只看该作者
呵呵,学习了

使用特权

评论回复
板凳
suoma| | 2009-9-30 21:32 | 只看该作者
有图的好啊,顶了

使用特权

评论回复
地板
huamunv| | 2009-9-30 21:51 | 只看该作者
好东西,顶了!

使用特权

评论回复
5
laslison| | 2009-9-30 22:27 | 只看该作者
学习,共享!

使用特权

评论回复
6
hhtseng| | 2009-10-1 09:57 | 只看该作者
呵呵,听过电视机的鬼故事没!!!!!

自动开机,或是有些台特别爱跳转,乱选台等等.............那就是早期的ADC按键扫描搞的鬼,ADC精度以及电阻精度不好所致。

现在的工艺都有大幅的改善了!!

使用特权

评论回复
7
suoma| | 2009-10-1 22:49 | 只看该作者
6#的对上面的ADC按键精度如何评价?

使用特权

评论回复
8
huamunv| | 2009-10-1 23:20 | 只看该作者
6#的好幽默!

使用特权

评论回复
9
hhtseng| | 2009-10-2 08:16 | 只看该作者
7楼的,这个ADC按键 LZ已经考虑过精度与按键扫描搭配了,所以是不错的东西!!

如何用笙泉82系列MCU做按键扫描?下面我举两个常用的例子:
    1.用82系列的ADC口来做按键,硬件电路设计如下:
6702
      当分别按下图中每个键时,送到ADC口的电压会有不同,不同电压会对应不同ADC值,因此MCU通 ...

当分别按下图中每个键时,送到ADC口的电压会有不同,不同电压会对应不同ADC值,因此MCU通过读取ADC值可判断出用户按下的是什么键!
      理论上8位ADC可以做到256个键,考虑到主电压波动,按键抖动,建议最多做8个键,按键电压平均落到0~VDD范围之间。

megawin 发表于 2009-9-29 11:52

使用特权

评论回复
10
suoma| | 2009-10-2 13:10 | 只看该作者
谢谢9#

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

74

帖子

1

粉丝