您的位置 首页 国产IC

AVR简略好用的4×4矩阵键盘

//Target:ATMEGA16//Crystal:8.0000Mhz//key.h#ifndef_4X4_H_#define_4X4_H_#defineNo_key255#definekey_po

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

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

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”

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

……

default:
break;
}
}
}

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

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/275890.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部