×
单片机 > 单片机程序设计 > 详情

AVR简单好用的4x4矩阵键盘

发布时间:2020-06-04 发布时间:
|
// Target : ATMEGA16 

// Crystal: 8.0000Mhz

//key.h

#ifndef _4X4_H_
#define _4X4_H_

#define No_key  255

#define key_port      PORTB 
#define key_port_ddr  DDRB 
#define key_port_pin  PINB


unsigned char keyboard_Scan(void);

#endif

//key.c

#include  
#include

#include "key.h"

const unsigned char key_table[16] =  
      { 
         1, 2, 3,12, 
         4, 5, 6,13, 
         7, 8, 9,14,                
         10,0,11,15, 
     };

void delay_1ms(void)                 //1ms延时函数
  {
    unsigned int i;
    for (i=0;i<1140;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
    unsigned int i=0;
    for (i=0;i    delay_1ms();
  }

//4x4矩阵键盘扫描函数

unsigned char keyboard_Scan(void) 

    unsigned char temp,key,row,Column;                         

    key_port_ddr  = 0b00001111;// 高四位输入行线/低四位输出列线 
    key_port        = 0b11110000;// 高四位打开上拉电阻/低四位输出低电平 
    delay_nus(5);// 延时5us 
    if((key_port_pin & 0xF0)!= 0xF0) // 作初检查有否键按下,没有,就返回 
   {                                                            // 如果行线不全为1,可能有键按下 
     delay_nms(5);// 延时去抖动 

      //设置列线初始值3~0=1110        
     for(Column=0,key_port=0b11111110;Column<4;Column++) 
     {                 
         for(row=0,temp=0b11101111;row<4;row++)// 设置行线初始值7~4=1110 
       {   
           while((key_port_pin & 0xF0)==(temp & 0xF0))// 输入行线,查看这行有否键按下 
           { 
           key=4*row+Column;// 键编码=4*行输入值+列扫描值 
           key=key_table[key];// 键盘编码转换键值 
            return (key); 
            } 
          temp<<=1;// 行线左移1位 
        } 
      key_port=((key_port<<1)|0x01);// 列线扫描值左移1位,扫描下一行 
     } 
   } 
   return (No_key); 
}

//main.c

#include  
#include

#include "key.h"

void main(void)
{
  unsigned char Key;
  while(1)
   {
     Key = keyboard_Scan();            // 键盘扫描 
     switch(Key)
      {
        case 0:
        break;

        ......
  
       default:
       break;
     }
   }
}

主函数中的延时个人觉得最好还是用定时器

电路接法不同可修改key_table数组



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址