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

发布者:朝霞暮雨最新更新时间:2016-07-18 来源: eefocus关键字:AVR  4x4  矩阵键盘 手机看文章 扫描二维码
随时随地手机看文章
// 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数组

关键字:AVR  4x4  矩阵键盘 引用地址:AVR简单好用的4x4矩阵键盘

上一篇:AVR六个IO口驱动液晶LCD1602
下一篇:AVR学习心得(四)

推荐阅读最新更新时间:2024-03-16 15:00

AVR 单个DS18B20温度读取程序(可测负温度)
使用方法: 把两个文件放入工程,需要温度时调用DS18B20_ReadTemperature,返回值就是温度. DS18B20.h /****** AVR 单个DS18B20温度读取程序 ****** * 版本.........: 1.0 * 目标.........: AVR * 文件名.......: DS18B20.h * 编译器.......: IAR for AVR V5.5 *****************************************/ #ifndef __DS18B20_H__ #define __DS18B20_H__ #include #include delay.h #define
[单片机]
mega8515的矩阵键盘与LED显示程序
ATmega8515是一种与51单片机引脚相容的avr单片机,下面的程序已经通过测试可以正常使用: /****************************************************************** //文件名称:Key4X4_Led //功 能:4X4矩阵键盘控制LED小灯 //作 者:懒猫爱飞 //日 期:2010.05.25 *******************************************************************/ #include iom8515v.h #include macros.h #define uchar unsigned
[单片机]
串行1602的四位数据线程序-avr单片机
1602的四位数据线程序,节省了IO。单片机用的是Atmega16,编译环境ICC6.31A,1602驱动头文件。 1602Driver.h /*********************LCD模块1602底层驱动库*********************** * LCD模块与单片机的硬件连接: * /端口名称 /端口符号 /MCU端口 / LCD引脚号/ * * RS数据/指令选择线 * RS PD3 4 * R/W读写选择线 * R/W GND 5 * EN写使能线 * EN PD2 6 * 三态双向数据总线 * D0-D3 N
[单片机]
AVR单片机介绍-特性说明
AVR 单片机 是 Atmel 公司 1997 年推出的 RISC 单片机。RISC(精简指令系统计算机)是相对于CISC(复杂指令系统计算机)而言的。RISC 并非只是简单地去减少指令,而是通过使计算机的结构更加简单合理而提高运算速度的。RISC 优先选取使用频率最高的简单指令,避免复杂指令:并固定指令宽度,减少指令格式和寻址方式的种类,从而缩短指令周期,提高运行速度。由于 AVR 采用了 RESC 的这种结构,使AVR系列单片机都具备了1MIPS/MHz(百万条指令每秒/兆赫兹)的高速处理能力。   AVR 单片机 吸收了 DSP 双总线的特点,采用 Harvard 总线结构,因此单片机的程序存储器和数据存储器是分离的,并且
[单片机]
AVR硬件设计
最小系统: 采用了在ATmega16引脚XTAL1和XTAL2上外接由石英晶体和电容组成的谐振回路,并配合片内的OSC(Oscillator)振荡电路构成的振荡源作为系统时钟源的。更简单的电路是直接使用片内的4M的RC振荡源,这样就可以将C1、C2、R2和4M晶体省掉,引脚XTAL1和XTAL2悬空,当然此时系统时钟频率精准度不如采用外部晶体的方式,而且也易受到温度变化的影响。 AVR的复位源和复位方式: 复位是单片机芯片本身的硬件初始化操作,例如,单片机在上电开机时都需要复位,以便CPU以及其它内部功能部件都处于一个确定的初始状态,并从这个初始状态开始工作。 AVR单片机的复位操作,其主要功能是把程序计数器PC初始化为$00
[单片机]
<font color='red'>AVR</font>硬件设计
基于AVR单片机的ATMEAG16L的定时/ 计数器设计
  ATMEAG16L有两个8位定时/计数器(T/CO、T/C2)和一个16位定时/计数器(T/C1)。每一个计数器都支持PWM(脉冲宽度调制)输出功能。PWM输出在电机控制、开关电源、信号发生等领域有着广泛的应用。   ATMEAG16L的定时/计数器时钟是可以选择的。它的时钟部分包括预分频器和一个多路选择器。预分频器可被认为是一个有多级输出的分频器。ATMEAG16L用一个10位的计数器把输入时钟分为4种可选择的分频输出。多路选择器可设置使用某一个分频输出,或者不使用分频输出和使用外部引脚输入时钟,下图为预分频器的基本结构。   ATMEAG16L定时/计数器的时钟选择   1.使用系统时钟 这种情况下使用系统时钟作为预
[单片机]
基于<font color='red'>AVR</font>单片机的ATMEAG16L的定时/ 计数器设计
AVR M16实验之九 LCD12864
/********************************************************************** * 文件名称: main.c * 程序作者: kidcao1987 * 程序版本: V1.0 * 功能描述: 接好LCD12864,用在LCD12864上显示,这里建议再外接上电源。 CEPARK-M16开发板 12864液晶测试 程序设计: 曹佃生!! www.cepark.com * 编译器:WinAVR-20090313 * 芯片:ATmega16,外部11.0592MHZ晶振 * 技术支持:http://bbs.cepark.com **********************
[单片机]
基于AVR单片机实现的LED彩灯控制器设计
如果你想改变LED接的管脚,请修改hardware.h文件。如果想修改LED的亮度,请修改globals.h 中的Timings 段定义。本设计外接了两个按钮,一个是选择工作模式,另一个是电源的开关。当你按下模式按钮1.5秒以上时,进入自动模式,会自动演示所有的预设模式。 8个LED灯直接连接到Vcc 上,不需要限流电阻。本制作利用到同步定时器,及使用睡眠的方式节省电力。 实物图: 电路图: PCB图:
[单片机]
基于<font color='red'>AVR</font>单片机实现的LED彩灯控制器设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved