AVR基本输入:矩阵键盘
AVR矩阵键盘程序
AVR矩阵键盘程序搞了一顿竟然连矩阵键盘的程序都不会写do { i=(i>7); PORTD=i;DDRD=0X0F;// key=PIND;//不论如何配置DDxn,都可以通过读取PINxn 寄存器来获得引脚电平j=key&0xf0; }while(j==0xf0);//直到发现按键按下。
若没有找到按键按下的,继续循环i 的初值0x7f。
i=(i>7);之后。
i=1111 1110b第二次,i= 1111 1101b保证只有一位为0下面是程序,写得很巧妙#include #include #define uchar unsigned char#define uint unsigned int#pragma data:code //save to areas of programconst table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c ,0x39,0x5e,0x79,0x71,0}; void delay(uint ms){ uint i,j;for(i=0;i>7); PORTD=i; DDRD=0X0F; key=PIND; j=key&0xf0; }while(j==0xf0); while(key_press()); switch(key) { case 0x7e: code=0;break; case 0xbe: code=1;break; case 0xde: code=2;break; case 0xee: code=3;break; case 0x7d: code=4;break; case0xbd:code=5;break; case 0xdd: code=6;break; case 0xed: code=7;break; case 0x7b: code=8;break; case 0xbb: code=9;break; case 0xdb: code=10;break; case0xeb:code=11;break; case 0x77: code=12;break; case 0xb7: code=13;break; case0xd7:code=14;break; case 0xe7: code=15;break; } }return code;}void main(){ uchar s; show_init();while(1){ if(key_press()) { s=key_scan(); show(0,s); }}}tips:感谢大家的阅读,本文由我司收集整编。
矩阵键盘的工作原理和扫描确认方式
来源:《AVR 单片机嵌入式系统原理与应用实践》M16 华东师范大学电子系 马潮 当键盘中按键数量较多时,为了减少对 I/O 口的占用,通常将按键排列成
矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图 9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交 点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行 或列线上的电平变化可以确定哪个按键被按下。
图 9-7 为一个 4 x 3 的行列结构,可以构成 12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个 16 键的键盘。很明显,在按键数量多的场合,矩 阵键盘与独立式按键键盘相比可以节省很多的 I/O 口线。
矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式 按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和 线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态, 因此会大量占用 MCU 的时间,所以较好的方式也是采用状态机的方法来设计, 尽量减少键盘查询过程对 MCU 的占用时间。
key_return = K1_1; break; case 0b00001101: key_return = K1_2; break; case 0b00001011: key_return = K1_3; break; case 0b00010110: key_return = K2_1; break; case 0b00010101: key_return = K2_2; break; case 0b00010011: key_return = K2_3; break; case 0b00100110: key_return = K3_1; break; case 0b00100101: key_return = K3_2; break; case 0b00100011: key_return = K3_3; break;
AVR的示例
A VR的示例1、矩阵键盘扫描的应用如果按键多的话,为节省I/O口资源,我们一般采用矩阵方式接口。
矩阵键盘由行和列组成,每个按键都有行值和列值,行值和列值的组合就是识别每个按键的编码。
确定哪个按键的流程是:先在行和列的一个口中输出高电平,在另一个行和列口读取扫描码;然后在后一个行列口输出高电平,在前一个行列口,读取第二个扫描码,然后查表就可以确定哪个按键按下了。
下面为我们的编程示例:/*功能:矩阵键盘扫描的应用CPU: ATMEGA8晶振:8MHZ */#include <iom8v.h>#include "Delay.h"//按键扫描函数,返回按键的值unsigned char ScanKey(void){unsigned char temp,temp1,key;temp=PINC; //读C口temp &=0x07;switch(temp) //判断行中哪条线有低电平{case 0x06: //PC0口有低电平DDRC=0X07; //PC0~PC2设为输出,PC3~PC5设为输入PORTC=0x38; //PC0~PC2输出0,PC3~PC5为1delay_us(1;);temp1=PINC; //读C口temp1 &=0x38;switch(temp1) //判断行中哪条线有低电平{case 0x30:key=0x01; //得到键值break;case 0x28:key=0x02; //得到键值break;case 0x18;key=0x03; //得到键值break;default:key=0;break;}DDRC=0x38;PORTC=0x07;break;case 0x05: //PC1口有低电平DDRC=0X07; //PC0~PC2设为输出,PC3~PC5设为输入PORTC=0x38; //PC0~PC2输出0,PC3~PC5为1delay_us(1;);temp1=PINC; //读C口temp1 &=0x38;switch(temp1) //判断行中哪条线有低电平{case 0x30:key=0x04; //得到键值break;case 0x28:key=0x05; //得到键值break;case 0x18;key=0x06; //得到键值break;default:key=0;break;}DDRC=0x38;PORTC=0x07;break;case 0x03: //PC2口有低电平DDRC=0X07; //PC0~PC2设为输出,PC3~PC5设为输入PORTC=0x38; //PC0~PC2输出0,PC3~PC5为1delay_us(1;);temp1=PINC; //读C口temp1 &=0x38;switch(temp1) //判断行中哪条线有低电平{case 0x30:key=0x07; //得到键值break;case 0x28:key=0x08; //得到键值break;case 0x18;key=0x09; //得到键值break;default:key=0;break;}DDRC=0x38;PORTC=0x07;break;default:key=0;break;}return (key);}//主函数,扫描按键显示数据void main(){unsigned char temp,keynum;unsigned char num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //初始化端口DDRB=0xFF; //设置B口为输出口PORTB=oxFF; //置高电平DDRC=0x38;PORTC=0x07;while(1){PORTB=0x40; //按键放开后显示“一”temp=PINC;temp &=0x07;if(temp==0x07) //检测是否有按键按下contune;delay_us(10);temp=PINC;temp &=0x07;if(temp==0x07) //再次检测是否有按键按下,按键防抖contune;keynum=ScanKey();PORTB=num[keynum]; //通过查表在PORTB口显示按键值while(temp!==0x07 ) //等待按键放开{temp=PINC;temp &=0x07;}}}2、中断触发键盘扫描按下任何一个按键就会触发一个中断,然后在中断函数中调用键盘处理函数。
AVR单片机扫描4X4矩阵键盘并数码管显示程序
AVR单片机扫描4X4矩阵键盘并数码管显示程序/*programname : keyboard ; 功能描述: 扫描16 个按键(4X4),并把键值显示在数码管上(两位); 要点: 在扫描按键时运用了比较复杂的两个for()循环嵌套式扫描方案,大大减少了程序量,循环嵌套方案让我纠结了好久,键值有0~9,上,下,左,右,确认,清零; 体会: 又一个里程碑,泪奔啊...我似乎成了代码男神啊...;实验用时: 约等于14 小时(每天2 小时X7 天);完成时间: 2013-11-19 23:58:22*/#include #include#define uint8 unsigned char //宏定义8 位数据类型;#define uint16 unsigned int // 宏定义16 位数据类型;// 0 , 1 , 2 , 3 , 4 , 5 , 6 ,uint8 ak[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, // 7 , 8 , 9 , 上, 下左, 右; 0x07,0x7f,0x6f,0x62 ,0x54,0x21,0x0c};uint8 ge=8,shi=8 ,si=0;void bit(uint8 h) //数码管位选使能函数;{ PORTB|=0X02; //数码管位选置1(透明状态); if(h==0) {PORTB&=0XFD; //清零(锁存状态);}}void dat(uint8 u) //数码管数据使能函数;{ PORTB|=0X01; if(u==0) { PORTB&=0XFE; }}void buzz(uint8 k) //蜂鸣器函数;{ if(k==0) {PORTC&=~(0X80);} else PORTC|=0X80;}void delay(uint8 j) //1=1000 个计数周期;{ uint16 h=0; while(j--) {for(h=0;hvoid mega16() //初始化各个IO 口;{DDRA=0XFF; //PA 输出; DDRB=0XFF; //PB 输出; PORTA=0X00; //PA 输出全0; delay(1); //延时一下,1000 个计数周期; bit(0); //数码管共阴极全零;。
avr单片机基于ATmega16的4乘4矩阵按键驱动程序
4*4矩阵按键---控制数码管//ICC-AVR application builder : 2010-10-05 19:19:34 // Target : M16#include <iom16v.h>#include <macros.h>#define hang1 (PINA&BIT(PA0))#define hang2 (PINA&BIT(PA1))#define hang3 (PINA&BIT(PA2))#define hang4 (PINA&BIT(PA3))unsigned char key=16; //16 表示无效键值unsigned char xianshishuju[8];/*************CPU器件初始化***********************/ void port_init(void){PORTA = 0xFF;DDRA = 0xF0;PORTB = 0x00;DDRB = 0xFF;PORTC = 0x00; //m103 output onlyDDRC = 0xFF;PORTD = 0xFF;DDRD = 0xFF;}//call this routine to initialize all peripherals void init_devices(void){//stop errant interrupts until set upCLI(); //disable all interruptsport_init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x00; //timer interrupt sourcesSEI(); //re-enable interrupts//all peripherals are now initialized}/****************************************//***********延时模块******************/void delay(unsigned int m){unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<570;j++);}/************************************//***********显示模块*****************/unsigned char const duanma[]={0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/};void baweixianshi(void){unsigned char i;for(i=0;i<8;i++){PORTD=~(BIT(i));PORTC=duanma[xianshishuju[i]];delay(1);PORTC=0X00;}}/************************************//******键盘扫描模块****************************/void keyscan(void){PORTA=0XEF;//高四位1110 令第一列按键处于判断状态低四位1111 保持内部上拉电阻if(!hang1)key=0;if(!hang2)key=1;if(!hang3)key=2;if(!hang4)key=3;PORTB=~key;PORTA=0XDF;//高四位1101 令第二列按键处于判断状态低四位1111 保持内部上拉电阻if(!hang1)key=4;if(!hang2)key=5;if(!hang3)key=6;if(!hang4)key=7;PORTB=~key;PORTA=0XBF;//高四位1011 令第三列按键处于判断状态低四位1111 保持内部上拉电阻if(!hang1)key=8;if(!hang2)key=9;if(!hang3)key=10;if(!hang4)key=11;PORTB=~key;PORTA=0X7F;//高四位0111 令第四列按键处于判断状态低四位1111 保持内部上拉电阻if(!hang1)key=12;if(!hang2)key=13;if(!hang3)key=14;if(!hang4)key=15;}/**************************************************/void main(void){init_devices();//insert your functional code here...while(1){keyscan();if(key<10){xianshishuju[7]=key;}baweixianshi();}}。
AVR简单好用的4x4矩阵键盘
#include“key.h”
constunsignedcharkey_table[16]={1,2,3,12,4,5,6,13,7,8,9,14,10,0,11,15,
};
voiddelay_1ms(void)//1ms延时函数{unsignedinti;for(i=0;i//4x4矩阵键盘
扫描函数
unsignedchar keyboard_Scan(void){ unsigned chartemp,key,row,Column;
key_port_ddr=0b00001111;//高四位输入行线/低四位输出列线key_port=
#include #include
#include“key.h”
voidmain(void){unsignedcharKey;while(1){Key=keyboard_Scan();//键盘扫
描switch(Key) { case 0: break;
...... default: break;} }}
AVR简单好用的4x4矩阵键盘
// Target: ATMEGA16// Crystal: 8.0000Mhz
//key.h
#ifndef _4X4_H_#define_4X4_H_
#define No_key 255
#define key_portPORTB#define key_port_ddr DDRB#define key_port_pin PINB
主函数中的延时个人觉得最好还是用定时器
电路接法不同可修改key_table数组
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
【优】单片机矩阵键盘接口最全PPT资料
单片机控制技术
知识点:单片机矩阵键盘接口
单片机控制技术
单片机矩阵键盘接口
目录
1 认识单片机键盘 2 矩阵式键盘接口电路 3 矩阵键盘按键识别技术
单片机控制技术
单片机矩阵键盘接口
一、认识单片机键盘
单片机应用系统通常需要优秀的人机交互接口。键盘是与单片机进行人机
一般,交矩阵互式的键盘最的行基线本由单的片机途输径出口。控制按,键列线的连接输单入片机状的输态入本口。质上是一个开关量,通过按键来 第二步设:向置所控有的制列线功上能输出或高电输平入,行数线输据出,低电以平(控行制列反单转)片,机然后运读入行列。信号。
按结构原理分类
(1)触点式按键——机械式、导电橡胶式 (2)无触点按键——电气式、磁感应按键
(前者造价低,后者寿命长)
按接口原理类
(1)独立式键盘——每键各接一根输入线 (2)行列式(矩阵)键盘——按行列交叉连线 (3)屏幕式键盘——触摸屏
按译码方式分类
(1)编码键盘——通过硬件实现译码 (2)非编码键盘——通过扫描程序实现译码
单片机矩阵键盘接口
三、矩阵键盘按键识别技术
首先判断是否有键按下:向所 有列线上输出低电平,再读入所 有的行信号; 如有任何一个键被按下,则读 入的行电平则不全为高;如无键 按下,则全高电平。
其次,逐列扫描判断具体的按键:
就是向列线上逐列送低电平。如果 读入的行值为全高,则表示此列无 键按下,否则有键按下。
单片机控制技术
单片机矩阵键盘接口
一、认识单片机键盘
独立式按键编程
开始
有按键闭合否 Y
延时10ms,软件去抖动
图3 独立式按键编程流程图
N
AVR基本输入:矩阵键盘
矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。 矩阵键盘的检测方法有多种,常见的有:逐点扫描法、逐行扫描法、全局扫描法。 在本实例中我们采用逐行扫描法来实现按键检测,其中 PA0-PA3 作为列线,PA4-PA7 作为行线。识别 过程如下:
- 专业电子技术交流社区 电子工程师网上家园 - 电子园
PORTA = 0xdf;
DDRA = 0xf0;
temp = PINA;
temp &= 0x0f;
if(temp != 0x0f)
{
_delay_ms(20);
temp = PINA;
temp &= 0x0f;
if(temp != 0x0f)
{
temp = PINA;
switch(temp)
{
case 0xde: KEY = 4;break;
[基本输入:矩阵键盘]
电子园
第 9 课 独立按键
上两课已经学习了在单片机系统中检测独立式按键的接口电路和程序设计,独立式按键的每个 按键占用 1 位 I/O 口线,其状态是独立的,相互之间没有影响,只要单独测试链接案件的 I/O 口线电平的 高低就能判断键的状态。独立式按键电路简单、配置灵活,软件结构也相对简单。此种接口方式适用于 系统需要按键数目较少的场合。在按键数量较多的情况下,如系统需要 8 个以上按键的键盘时,采用独 立式接口方式就会占用太多的 I/O 口,这对于 I/O 口资源不太丰富的单片机系统来说显得相当浪费,那么 当按键数目相对较多的时候, 为了减少 I/O 口资源的占用, 应该采取什么样的方式才能够既满足多按键 识别,又减少 I/O 口的占用呢?
case 0xdd: KEY = 5;break;
AVR事无巨细系列四,矩阵键盘
事无巨细,矩阵键盘停笔好几天,今天复工。
今天要跟大家分享一下关于用AVR MEGA16扫描矩阵键盘的一些应用心得。
拙劣之见,经不起推敲。
权当抛砖引玉罢。
矩阵键盘,顾名思义,一些按键按一个矩阵的形状排列,就成了矩阵键盘。
CEPARK AVR 学习板的矩阵键盘长成下面这个样子(其实任何开发板的矩阵键盘也都是这个样的):也许新手们看这个键盘觉得不太眼熟哈,确实也只有开发板的矩阵键盘才长这个样。
但是我说几个你绝对眼熟的:电视遥控器上的键盘、银行ATM 的输入键盘、计算器上的键盘、还有你手机上的键盘ETC 。
对的,这些全部都是一些典型的矩阵键盘。
尽管也许他们的扫描方式各异,但是毕竟还是始于同一种模型,出于同一种原理,从同一个基础成长起来的。
(好像这是我第二次说这句话了)此文的目的,就是把这个最初的矩阵键盘展现给读者。
在此需要读者有一点基础,即关于导线两端上的信号是经过“与”的关系再体现到导线上的。
这点在此系列的《事无巨细,独立键盘》一文里有详细描述。
如果没有任何按键基础的朋友还是建议先看独立键盘一文,学习也是要分步骤次序的。
至于为什么呢,这里给大家一句话作为线索去追寻:”当引脚是开漏或集电极开路输出B b s .C e p a rk .c o m的时候,便具有了“线与”的功能。
”(来自马潮的《AVR 单片机嵌入式系统原理与应用实践》)。
这需要你有一定的模拟电子基础才有办法找出个所以然来。
但是如果你没有,就暂时记住结论好了,即:导线两端上的信号是经过“与”的关系再体现到导线上的。
短时间内这句话还不会是错的。
来看看CEPARK AVR 开发板的矩阵键盘原理图:上图是一个4X4的矩阵键盘,一共是16个按键。
我们照习惯称横为“行”,“竖”为列。
那么PA4、PA5、PA6、PA7我们称之为“行线”,则PA0、PA1、PA2、PA3称为“列线”。
要正确记住各个行列线各自对应的IO ,这里是PA 口。
注意看,每一个按键的两端,都分别接在某一个列线和行线上,即:“行线和列线是通过某个按键的按下和抬起实现联通和断开的”,和“导线两端上的信号是经过“与”的关系再体现到导线上的。
矩阵键盘使用说明
矩阵键盘使用说明矩阵键盘是一种特殊设计的键盘,其按键布局呈矩阵状,与传统的直排键盘有所不同。
矩阵键盘的按键分布更加紧凑,使得用户的手指在按键时的移动距离更小,可以提高打字的速度和准确性。
在本篇文章中,将介绍矩阵键盘的基本使用说明。
1.连接键盘:2.打字基本操作:和传统键盘相比,矩阵键盘的按键布局有所不同。
在开始打字之前,需要了解矩阵键盘的按键分布。
通常情况下,矩阵键盘的按键分布为4行,每行有10个按键,共40个按键。
每个按键上标有一个字母、数字或符号,用户通过按下相应的按键来输入字符。
由于按键的布局更加紧凑,用户在使用矩阵键盘时需要稍微调整手指的位置。
一般来说,用户应该将手指放置在键盘上,使得拇指位于空格键上,食指、中指和无名指分别位于第一行、第二行和第三行按键上,小指位于第四行按键上。
这样可以更加灵活地操作按键,并提高打字的速度和准确性。
当需要输入字符时,用户可以按下相应的按键,即可将字符输入到计算机中。
和传统键盘类似,用户可以通过长按Shift键来输入大写字母,并通过按下Caps Lock键来锁定大写输入模式。
此外,矩阵键盘通常还具备一些特殊功能按键,例如功能键、控制键等。
用户可以通过按下这些特殊按键来完成一些特定的操作,例如切换输入法、调节音量等。
3.高级功能:除了基本的打字功能外,矩阵键盘通常还具备一些高级功能。
例如,一些矩阵键盘支持多键触发功能,即用户可以同时按下多个按键,以实现一些复杂的操作。
例如,在游戏中,用户可以同时按下多个按键来触发组合技能。
此外,一些矩阵键盘还支持自定义按键功能。
用户可以通过软件设置,将一些按键映射为其他功能键或字符,以满足个性化的需求。
一些高端的矩阵键盘还具备背光功能。
用户可以通过调节键盘的背光亮度和颜色,以适应不同的环境需求。
4.清洁和维护:和其他键盘一样,矩阵键盘也需要定期进行清洁和维护。
由于矩阵键盘的按键间隙较小,容易积累灰尘和污垢。
用户可以使用软刷或气泡喷射器清洁键盘表面和按键间隙。
矩阵键盘介绍与使用程序
单片机外接键盘电路一、原理简介键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。
我们可以通过键盘输入数据或命令来实现简单的人机通信。
在设计键盘电路与程序前,我们需要了解键盘和组成键盘的按键的一些知识。
1. 按键的分类一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。
前者造价低,后者寿命长。
目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。
按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。
编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。
全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。
非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。
由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。
2. 按键的输入原理在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。
也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。
此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。
当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。
因此,键信息输入是与软件结构密切相关的过程。
对于一组键或一个键盘,通过接口电路与单片机相连。
单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。
3. 按键的特点与去抖机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。
AVR开发板--矩阵键盘按键C语言程序实例分析
AVR开发板--矩阵键盘按键C语言程序实例分析**************************************************** 芯片:AVR系列工作频率:内部1MHz ** 软件:ICCV7 FOR AVR ** 网站: ** 器材:开发板(m8/m16/m8515/m128) ** 测试:单片机工具之家 ****************************************************//矩阵按键数码管显示程序--PB口接矩阵按键,PA口接数码管的数据jp5 PD口接数码管的位控制jp8#include <iom8515v.h>#define _BV(k) (1<<k)#define uchar unsigned char#define uint unsigned intuchar consttable[17]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1,0xff};//数码管编码组uchar constkey_code[]={0xee,0x77,0xb7,0xd7,0x7b,0xbb,0xdb,0x7d,0xbd,0xdd,0xe7,0xeb,0xed,0x7e,0xbe,0xde,0xff}; //键编码数组uchar temp;uchar key; //键值/********************************************************* ** N*ms延时函数** *********************************************************/ void delayms(uint n){uint i=0,j ;for (i=0 ;i<n ;i++)for(j=0;j<250;j++) ;}/******************************************************** * ** y*us延时函数** *********************************************************/ void delayUS(uint y){delayms(2*y);}/********************************************************** 键盘扫描子函数**********************************************************/uchar keyscan(void){uchar scan1,scan2,keycode,j;DDRB=0x0F; //高四位输入,低四位输出。
任务三 矩阵式键盘键值识别_AVR单片机(C语言)项目开发实践教程_[共3页]
任务三 矩阵式键盘键值识别
一、任务要求
设计一个 4×4 的矩阵键盘识别显示系统,利用 ATmega16 单片机的 4 个数字 I/O 口作为行 线,4 个数字 I/O 端口作为列线,有按键按下数码管显示对应键值,并通过数码管显示按键的 键值。
二、硬件设计
将 16 个按键按照 4×4 的矩阵排列,按键两端按照图 6-8 所示分别接到 PD0~PD7,显示 部分采用了单个数码管。这里省略了 ATmega16 单片机外部应接的电源电路、复位电路等部分 外围电路。
74
}
switch(LED)
{
case 1:PORTC=0Xfe;break;
case 2:PORTC=0Xfd;break;
case 3:PORTC=0Xfb;break;
case 4:PORTC=0Xf7;break;
}
}
else PORTC=0XFF;
}
}
五、项目实施
1.根据元器件清单选择合适的元器件。 2.根据硬件设计原理图,在万能电路板进行元器件布局,并进行焊接工作。 3.焊接完成后,重复进行线路检查,防止短路、虚接现象。 4.在 AVR Studio 软件中创建项目,输入源代码并生成*.hex 文件。 5.在确认硬件电路正确的前提下,通过 JTAG 仿真器进行程序的下载与硬件在线调试。
AVR 单片机(C 语言)项目开发实践教程
if(LED_ON)
{ if(K1_ON())
//如果开关 K1ON())
LED++;
if(LED==5)
LED=1;
while(K1_ON());
do{_delay_ms(5);}while(K1_ON());
51单片机学习之5独立按键和矩阵键盘
51单片机学习之5独立按键和矩阵键盘51单片机学习之5-独立按键和矩阵键盘第14集键盘的原理键盘分编码键盘(例如电脑键盘)和非编码键盘(自己用程序去识别)。
非编码键盘分:独立式非编码键盘(独立按键)、行列式非编码键盘(4*4阵列键盘)独立键盘的电路图。
因为51单片机的IO口不是双向口而是准双向口,要让IO口具备输入功能,必须将IO口置1,置1之后当按键按下时IO口的电平会被拉低,即被置0。
当检测到IO 口为0时即可判断该按键已经按下。
按键按下时会有一个抖动的过程(弹片会抖动),由于单片机检测IO口速度非常快,超过弹片抖动的频率,所以当单片机检测到IO口为0时需延时一小段时间再检测IO是否为0,如果仍为0就确认该按钮被按下。
因为IO口里面有上拉电阻,所以当松开按钮时,IO口又被拉高。
例程:#include;#defineuintunsignedint#defineucharunsignedcharsbitKey=P3^4;//按键sbitLed=P1^0; //Led灯voiddelay(uintz);/********主函数********/voidmain(){while(1){if(!Key){delay(10);//消抖操作if(!Key)Led=0; //按下时Led亮elseLed=1;}}}voiddelay(uintz){uintx,y;for(x=z;x>;0;x--)for(y=110;y>;0;y--);}第15集4*4矩阵键盘上图中,1个按键占用一个IO口,如果有16个按键就占用了16个IO口。
为了减少IO口的使用,就需要用矩阵的方式连线。
如下图矩阵扫描原理从图可以看出P30、P31、P32、P33为行(低四位),P34、P35、P36、P37为列(高四位)。
假设我们按下的是S6按钮。
第一步,我们先确定列,给P3口赋值0xF0=11110000,那么P37、P36、P35、P34都被置1,P33、P32、P31、P30都被置0,当S6被按下时,由于S6按钮的一边P31为0,所以跟S6另一边相连的P35被拉低,即等于0。
第七讲 矩阵式键盘
主讲教师:肖迎春
Email: ShortNum: QQ: Office:
xiaoyc@ 635553 787522366 行政楼509,二工业中心418
课件原创 李正中
Slide 1
任务1 任务
Slide 10
……
任务2 任务
• 矩阵键盘接在 口,PA0~PA3对应 ~3行。 矩阵键盘接在PA口 对应0~ 行 对应 PA4~PA7对应 ~3列,编写程序,当key1~key16 对应0~ 列 编写程序, 对应 ~ 任意按键按下是在液晶上显示所按键代表的0-F数字 任意按键按下是在液晶上显示所按键代表的 数字 采用数组 数组和 语句。 。采用数组和switch语句。 语句
• 矩阵键盘接在 口,PA0~PA3对应 ~3行。 矩阵键盘接在PA口 对应0~ 行 对应 PA4~PA7对应 ~3列,编写程序,当key1~key16 对应0~ 列 编写程序, 对应 ~ 任意按键按下时在液晶上显示所按键的编号。 任意按键按下时在液晶上显示所按键的编号。采用 switch语句 switch语句。 语句。
Slide 11
Slide 12
Slide 9
PORTA=0xDF; delay_ms(2); in_a=PINA&0x0F; switch (in_a) { case 0x0E: lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("key2"); delay_ms(200); break; case 0x0D: lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("key6");delay_ms(200); break; case 0x0B: lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("key10"); delay_ms(200); break; case 0x07: lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("key14"); delay_ms(200); break; default: break; } PORTA=??;
AVR7_矩阵键盘
开课班级: 微电子 开课班级:08微电子 开课时间:星期五( 开课时间:星期五(567) ) 主讲教师: 主讲教师:王静霞
温馨提示 请穿上实训服 按照第一次课的座位入座 下课后请把电源拔掉, 下课后请把电源拔掉,把设备放 回原处
矩式按键
行 设置为输入 PA0~PA3
0
0
0
0
列 设置为输出 PA4~PA7
矩阵键盘硬件电路
工作过程分析
PA口连接矩阵键盘的行和列。 在PA口的PA4-PA7上输出低电平。 当没有按键按下,PA口的PA0--PA3是高电平。 当有键按下时, PA0--PA3变低电平,根据这 一特点来识别按键的按下或释放。 如果在PA口的PA4--PA7上输出高电平,结果 会怎样呢?
关键程序分析
unsigned char col[4]={0xef,0xdf,0xbf,0x7f}; unsigned char row[4]={0x07,0x0b,0x0d,0x0e}; unsigned char GetKeyVal() { unsigned char i,j,getSta,keyVal; for(i=0;i<4;i++) { PORTA= col[i]; delay_us(2); if(PINA!=col[i]) { getSta=PINA&0x0F; for(j=0;j<4;j++) if(getSta==row[j]) { keyVal=j+i*4; return keyVal; } } } return 0xFF; }
按键扫描
在键盘矩阵中,依次让PA4PA5PA6PA7信号线 为低; 读取PA口的低端口信号线,查看是哪一个信号 线变低; 结合输出信号和输入信号,从而确定是哪一个 键按下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
---基本输入:矩阵键盘
本文作者:Cepark 更新时间:2010/07/29 作者博客:
本文档由电子园()提供给广大电子工程师免费下载学习研究使用。在未获电子园书面授权之前, 不得将本资料全部或部分用于商业用途,包括但不限于期刊、杂志、书籍等。转载本资料请注明作者及来源。
2、判断被按下按键所在的位置。在确认有键按下后(进行按键消抖处理后),接下来就是确定具体 哪个案件被按下,方法是:依次将每根行线设置为输出口,并输出低电平(同时剩余行线输出高电平), 然后逐列检查每根列线的电平状态,若某列为低电平,则该列线与设置为输出低电平的行线交叉处的按 键就是被按下的按键。
3、按键位置确定后,接下来就要给矩阵键盘中的每个按键进行编号,也就是进行按键编码,程序 设计中常用计算法和查表法两种方式对按键进行编码,本实例采用计算法编码。
uint8_t const LedData[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管段选码
uint8_t const LedPos[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选端控制
uint8_t temp = 0;//定义局部变量
PORTA = 0xef; //第一行为低电平
DDRA = 0xf0;
//设置行线电平,注意先 PORTx 再 DDRx
temp = PINA;
//读取列线电平
temp &= 0x0f;
//屏蔽行线电平
if(temp != 0x0f)
//判断是否有按键按下
矩阵键盘工作原理:
矩阵式键盘接口见图 1 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时, 其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可 以确定哪个按键被按下。 图 1 为一个 4 x 4 的行列结构,可以构成 16 个键的键盘。很明显,在按键数 量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的 I/O 口线。
temp = PINA; temp &= 0x0f; } }
电子园
PORTA = 0xbf; DDRA = 0xf0; temp = PINA; temp &= 0x0f; if(temp != 0x0f) {
_delay_ms(20); temp = PINA; temp &= 0x0f; if(temp != 0x0f) {
PORTA = 0xdf;
DDRA = 0xf0;
temp = PINA;
temp &= 0x0f;
if(temp != 0x0f)
{
_delay_ms(20);
temp = PINA;
temp &= 0x0f;
if(temp != 0x0f)
{
temp = PINA;
switch(temp)
{
case 0xde: KEY = 4;break;
第 2页
[基本输入:矩阵键盘]
电子园
1、判断键盘中是否有键按下。设置所有行线为输出口,并输出低电平;设置列线为输入口,读取列 线上的电平状态,只要有一列的电平为低,就表示有按键按下,并且被按下的键位于电平为低的列线与 4 跟行线相交叉的 4 个按键中,若所有列线都为高电平,表示没有按键按下;
void Init(void)//初始化函数 {
DDRB = 0xff; //PB 口输出 PORTB = 0xff; }
- 专业电子技术交流社区 电子工程师网上家园 -
电子园
第 3页
[基本输入:矩阵键盘]
电子园
uint8_t KeyScan(void) //按键扫描函数 {
case 0x7e: KEY = 12;break; case 0x7d: KEY = 13;break;
- 专业电子技术交流社区 电子工程师网上家园 - 电子园
第 5页
[基本输入:矩阵键盘]
case 0x7b: KEY = 14;break; case 0x77: KEY = 15;break; } } while(temp != 0x0f) { temp = PINA; temp &= 0x0f; } } return KEY; }
{
_delay_ms(20);
//有按键按下,延时消抖
temp = PINA;
//消抖后再读列线电平
temp &= 0x0f;
//屏蔽行线电平
if(temp != 0x0f)
//判断是否抖动
{
temp = PINA;
//确定不是抖动,读取列线
switch(temp)
//根据列线电平给按键赋值
{
case 0xee: KEY = 0;break;
case 0xed: KEY = 1;break;
case 0xeb: KEY = 2;break;
case 0xe7: KEY = 3;break;
}
}
while(temp != 0x0f)
//松手检测
{
temp = PINA;
temp &= 0x0f;
}
}
//以下为第二到第四行扫描,只需要更改行线电平
/************* *HC595 发送子函数 *要发送的数据通过形参 x 传递。 —————————————— *HC595 的工作原理: 74HC595 是具有 8 位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。 数据在 SHcp 的上升沿输入,在 STcp 的上升沿进入的存储寄存器中去。 如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。 移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位。 存储寄存器有一个并行 8 位的,具备三态的总线输出,当使能 OE 时(为低电平),存储寄存器的数据输出到******************************************************************* * 文件名称: main.c/矩阵键盘 * 程序作者: Kevin Chin * 程序版本: V1.0 * 编制日期: 2010/07/29 * 功能描述: 4*4 的键盘,在数码管上分别显示 0~F. * 编译器:WinAVR-20090313 * 芯片:ATmega16,外部 11.0592MHZ 晶振 * 技术支持: **********************************************************************/ #include<avr/io.h> #include<util/delay.h> #include"hc595.h" //这里我们使用模块化设计的方法,写一个 HC595 的函数
temp = PINA; switch(temp) {
case 0xbe: KEY = 8;break; case 0xbd: KEY = 9;break; case 0xbb: KEY = 10;break; case 0xb7: KEY = 11;break; } } while(temp != 0x0f) { temp = PINA; temp &= 0x0f; } }
case 0xdd: KEY = 5;break;
case 0xdb: KEY = 6;break;
case 0xd7: KEY = 7;break;
}
- 专业电子技术交流社区 电子工程师网上家园 - 电子园
第 4页
[基本输入:矩阵键盘]
} while(temp != 0x0f) {
PORTA = 0x7f; DDRA = 0xf0; temp = PINA; temp &= 0x0f; if(temp != 0x0f) {
_delay_ms(20); temp = PINA; temp &= 0x0f; if(temp != 0x0f) {
temp = PINA; switch(temp) {
uint8_t KEY; //声明全局变量
void Init(void); //函数声明 void Display(uint8_t pos,uint8_t dat); uint8_t KeyScan(void);
int main(void) {
Init(); while(1) {
Display(0,KeyScan()); //让数码管第 0 位显示按键数值 } }
- 专业电子技术交流社区 电子工程师网上家园 - 电子园
第 6页
[基本输入:矩阵键盘]
电子园
RCK(STCP)(12 脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。 通常我将 RCK 置为低电平,当移位结束后,在 RCK 端产生一个正脉冲(5V 时,大于几十纳秒就行了。我通常都选微秒 级),更新显示数据。 *************/ void HC595Send(uint8_t x)//HC595 发送子函数 {
void Display(uint8_t pos,uint8_t dat)//数码管显示函数 {
HC595Send(LedPos[pos]); HC595Send(LedData[dat]); HC595Store(); }
电子园
Hc595.c #include <avr/io.h> #include <util/delay.h> #include "hc595.h"