搜索
bottom↓
回复: 35

刚刚学习AVR,第一次写程序,晒一下自己的矩阵键盘扫描.....

[复制链接]

出0入0汤圆

发表于 2013-4-13 11:35:11 | 显示全部楼层 |阅读模式
#include "keyboard.h"
//extern unsigned char flag_eprom;

void keyboard_init(void)
{
     DDRA=0xf0;          //PA.0-PA.3为输入,PD.4-PD.7为输出
     PORTA=0xf0;                         //PA.4-PA.7输出高电平  
}

/*按键扫描函数*/
unsigned char read_keyboard(void)
{
    unsigned char key_value=0;
    unsigned char key_row=0x01;//用于行扫描
    unsigned char key_col=0x10;//用于列扫描
    unsigned char i,j=0;
   
    for(i=1;i<=4;i++)
    {
        PORTA=0xf0;
        PORTA=~key_col;
        key_col<<=1;
        if((PINA&0x0f)<0x0f)
        {
            delay_ms(10);
            if((PINA&0x0f)<0x0f)
            {
                for(j=0;j<4;j++)
                {
                    if((PINA&key_row)==0)
                      {
                        key_value=(i+j*4);                        
                        while((PINA&0x0f)<0x0f);
                        switch(key_value)
                            {
                                case 1: return 4; break;
                                case 2: return 1; break;
                                case 3: return 2; break;
                                case 4: return 3; break;
                                case 5: return 5; break;
                                case 6: return 6; break;
                                case 7: return 7; break;
                                case 8: return 8; break;
                                case 9: return 12;break;
                                case 10:return 9; break;
                                case 11:return 10;break;
                                case 12:return 11;break;
                                case 13:return 13;break;
                                case 14:return 14;break;
                                case 15:return 15;break;
                                case 16:return 16;break;
                                default:return 0; break;
                            }
                      }
                    key_row<<=1;                  
                }
            }
        }
        
    }
    return 0;
        
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-4-20 16:12:53 | 显示全部楼层

出0入0汤圆

发表于 2013-4-29 18:21:16 | 显示全部楼层
不错的啊,平时没怎以用AVR,STM32用得多

出0入0汤圆

发表于 2013-6-10 23:40:46 | 显示全部楼层
不错的啊

出0入0汤圆

发表于 2013-6-12 11:37:50 | 显示全部楼层
我也是新人,关注一下

出0入0汤圆

发表于 2013-6-21 21:43:36 | 显示全部楼层
我也是新人

出0入0汤圆

发表于 2013-7-13 15:13:06 | 显示全部楼层
还行支持下

出0入0汤圆

发表于 2013-7-16 18:47:15 | 显示全部楼层
我也是新手,多多交流

出0入0汤圆

发表于 2013-7-16 18:59:00 | 显示全部楼层
我发现坛子里好多人的例程都有空转的delay

出0入0汤圆

发表于 2013-7-23 13:14:06 | 显示全部楼层
longfeix86 发表于 2013-7-16 18:59
我发现坛子里好多人的例程都有空转的delay

我也觉得这样不好,有什么好的办法呢,比如这个时候让cpu干其他事

出0入0汤圆

发表于 2013-7-23 17:54:02 | 显示全部楼层
杨大侠 发表于 2013-7-23 13:14
我也觉得这样不好,有什么好的办法呢,比如这个时候让cpu干其他事  ...

UCOSii,简单实用

出0入0汤圆

发表于 2013-7-23 21:21:25 | 显示全部楼层
longfeix86 发表于 2013-7-23 17:54
UCOSii,简单实用

嗯,那是跑操作系统了,如果不跑操作系统呢

出0入0汤圆

发表于 2013-7-23 21:54:11 | 显示全部楼层
杨大侠 发表于 2013-7-23 21:21
嗯,那是跑操作系统了,如果不跑操作系统呢

用定时器产生时间片嘛

出0入0汤圆

发表于 2013-8-4 08:43:55 | 显示全部楼层
好好看马老师的帖子

出0入0汤圆

发表于 2013-8-4 18:26:10 | 显示全部楼层
longfeix86 发表于 2013-7-16 18:59
我发现坛子里好多人的例程都有空转的delay

求不空转的DELAY

出0入0汤圆

发表于 2013-8-4 18:30:08 | 显示全部楼层
清雨影 发表于 2013-8-4 18:26
求不空转的DELAY

坛子里有,用定时器产生一个时间片信号

出0入0汤圆

发表于 2013-8-5 12:36:01 | 显示全部楼层
longfeix86 发表于 2013-8-4 18:30
坛子里有,用定时器产生一个时间片信号

真心求地址或标题,找不到啊

出0入0汤圆

发表于 2013-8-12 17:49:31 | 显示全部楼层
这也太烂了.做产品,通常不能这样写程序的.

出0入0汤圆

发表于 2014-3-21 02:15:51 | 显示全部楼层
楼主,我学过51单片机,现在想学avr。请问用什么编程软件,要能够结合protue用的

出0入0汤圆

发表于 2014-3-21 11:02:21 | 显示全部楼层
按键检测有很多思路,去抖动时尽量不要用delay,因为它会浪费系统时间,程序写大了,程序效率太低

出0入0汤圆

发表于 2014-3-21 11:02:59 | 显示全部楼层
我给你个单按键检测程序,供参考,

出0入0汤圆

发表于 2014-3-21 11:03:56 | 显示全部楼层

uchar get_key(void)
{   
        uchar     temp;
        //temp_1 = PINB & 0xe0;
        temp   = ((PINC & 0x30) | (PINE & 0x48));               
    switch(key_cnt)
        {
            case 0:                    
                        if(temp == 0x78)
                        {                            
                                return 0xff;
                        }
                        else if(temp == 0x68)//扳机
                        {                                                                                                              
                                key_cnt = 1;                               
                        }
                        else if(temp == 0x58)//上弹
                        {
                                key_cnt = 2;
                        }               
                        else if(temp == 0x70)//消音
                        {                                                                                               
                                key_cnt = 3;                               
                        }
                        else if(temp == 0x38)//枪型切换
                        {
                                key_cnt = 4;
                        }            
                       
                break;               
                case 1://抖动
                    if(temp != 0x68)
                        {
                           key_cnt = 0;
                           return 0xff;
                        }
                        else
                        {
                            key_cnt = 5;
                                return 1;       
                        }               
                break;               
                case 2://抖动
                    if(temp != 0x58)
                        {
                           key_cnt = 0;
                           return 0xff;
                        }
                        else
                        {
                            key_cnt = 6;
                                return 2;       
                        }               
                break;       
                case 3://抖动
                    if(temp != 0x70)
                        {
                           key_cnt = 0;
                           return 0xff;
                        }
                        else
                        {
                            key_cnt = 7;
                                return 3;       
                        }               
                break;               
                case 4://抖动
                    if(temp != 0x38)
                        {
                           key_cnt = 0;
                           return 0xff;
                        }
                        else
                        {
                            key_cnt = 8;
                                return 4;       
                        }               
                break;       
               
                case 5://有效后是否抬起                    
                        if(temp == 0x68)
                        {
                            return 5;   
                        }
                        else
                        {
                            key_cnt = 0;                               
                        }
                break;       
                case 6://2按键是否抬起                    
                        if(temp == 0x58)
                        {
                            return 6;   
                        }
                        else
                        {
                            key_cnt = 0;                               
                        }
                break;
                case 7://有效后是否抬起                    
                        if(temp == 0x70)
                        {
                            return 7;   
                        }
                        else
                        {
                            key_cnt = 0;                               
                        }
                break;       
                case 8://2按键是否抬起                    
                        if(temp == 0x38)
                        {
                            return 8;   
                        }
                        else
                        {
                            key_cnt = 0;                               
                        }   
                        break;               
        }       
        return 0xff;
}

出0入0汤圆

发表于 2014-3-25 10:59:45 | 显示全部楼层
平时基本上都是STM32,顶一下吧

出0入0汤圆

发表于 2014-4-3 23:05:04 | 显示全部楼层
AVR慢慢改STM了

出0入0汤圆

发表于 2014-4-8 11:34:12 | 显示全部楼层
矩阵按键用行列扫描效率低,可以用翻转检测,效率会高很多

出0入0汤圆

 楼主| 发表于 2014-4-9 22:29:23 | 显示全部楼层
waothom 发表于 2014-4-8 11:34
矩阵按键用行列扫描效率低,可以用翻转检测,效率会高很多

谢谢,收到。

出0入0汤圆

发表于 2014-4-11 20:07:10 | 显示全部楼层
不错啊,学习了,谢谢

出0入4汤圆

发表于 2014-4-11 22:17:11 | 显示全部楼层
定时器+状态机

出0入0汤圆

发表于 2014-4-21 22:58:29 | 显示全部楼层
看看。学习学习。

出0入0汤圆

 楼主| 发表于 2014-5-3 19:35:42 | 显示全部楼层
qq开始学单片机 发表于 2014-3-21 02:15
楼主,我学过51单片机,现在想学avr。请问用什么编程软件,要能够结合protue用的 ...

我用的是CVAVR,也是刚刚开始学习啊,加油!

出0入0汤圆

发表于 2014-5-11 11:27:01 | 显示全部楼层
这个键盘扫描程序,用起来应该会有不灵敏的情况。

出0入0汤圆

发表于 2014-6-3 09:31:22 | 显示全部楼层
学习学习。。。

出0入0汤圆

发表于 2014-6-3 12:18:09 | 显示全部楼层

出0入0汤圆

发表于 2014-6-12 12:02:36 | 显示全部楼层

不错,挺好的

出0入0汤圆

发表于 2014-11-4 16:01:55 | 显示全部楼层
把去抖动的 延时 改一下,用定时器中断扫描方式实现就更好了

出0入0汤圆

发表于 2014-11-6 08:32:30 | 显示全部楼层
学习了,总结帖:去抖不用延时,不用行列扫描效率低,用翻转检测提高效率。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 14:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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