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

合集下载

AVR单片机扫描4X4矩阵键盘并数码管显示程序

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); //数码管共阴极全零;。

4X4矩阵式键盘输入程序

4X4矩阵式键盘输入程序

4*4键盘程序readkeyboard:begin: acall key_onjnz delayajmp readkeyboarddelay:acall delay10msacall key_onjnz key_numajmp beginkey_num:acall key_panl a,#0FFhjz beginacall key_ccodepush akey_off:acall key_onjnz key_offpop aretkey_on: mov a,#00horl a,#0fhmov p1,amov a,p1orl a,#0f0hcpl aretkey_p: mov r7,#0efhl_loop:mov a,r7mov p1,amov a,p1orl a,#0f0hmov r6,acpl ajz nextajmp key_cnext: mov a,r7jnb acc.7,errorrl amov r7,aajmp l_looperror:mov a,#00hretkey_c:mov r2,#00hmov r3,#00hmov a,r6mov r5,#04hagain1:jnb acc.0,out1rr ainc r2djnz r5, again1out1: inc r2mov a,r7mov r5,#04hagain2:jnb acc.4,out2rr ainc r3djnz r5,again2out2: inc r3mov a, r2swap aadd a,r3retkey_ccode:push aswap aanl a,#0fhdec arl a ;行号乘4rl amov r7,apop aanl a,#0fhdec aadd a,r7retdelay10ms:anl tmod,#0f0horl tmod,#01hmov th0,#0d8hmov tl0,#0f0hsetb tr0wait:jbc tf0,overajmp waitclr tr0over:ret单片机键盘设计(二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。

AVR学习笔记十九、4X4矩阵键盘实验

AVR学习笔记十九、4X4矩阵键盘实验

A VR学习笔记十九、4X4矩阵键盘实验19.1 实例功能在前面的实例中我们已经学习了在单片机系统中检测独立式按键的接口电路和程序设计,独立式按键的每个按键占用1位I/O口线,其状态是独立的,相互之间没有影响,只要单独测试链接案件的I/O口线电平的高低就能判断键的状态。

独立式按键电路简单、配置灵活,软件结构也相对简单。

此种接口方式适用于系统需要按键数目较少的场合。

在按键数量较多的情况下,如系统需要8个以上按键的键盘时,采用独立式接口方式就会占用太多的I/O口,这对于I/O口资源不太丰富的单片机系统来说显得相当浪费,那么当按键数目相对较多的时候,为了减少I/O口资源的占用,应该采取什么样的方式才能够既满足多按键识别,又减少I/O口的占用呢?当然我们可以采用端口扩展器件比如串并转换芯片实现单片机I/O口的扩展,但是这种方式既增加了电路的复杂性,又增加了系统的成本开销。

有没有比较经济实惠的方法呢?事实上,在实际引用中我们经常采用矩阵式键盘的方式来节约I/O口资源和系统成本。

在这个实验中,我们采用4X4矩阵键盘来实现使用8个I/O口识别16个按键的实验,本实例分为三个功能模块,分别描述如下:●单片机系统:利用A Tmega16单片机与矩阵键盘电路实现多按键识别。

●外围电路:4X4矩阵键盘电路、LED数码管显示电路。

●软件程序:编写软件,实现4X4矩阵键盘识别16个按键的程序。

通过本实例的学习,掌握以下内容:●4X4矩阵键盘的电路设计和程序实现。

19.2 器件和原理19.2.1 矩阵键盘的工作原理和扫描确认方式当键盘中按键数量较多时,为了减少对I/O口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。

矩阵式键盘接口见图1所示,它由行线和列线组成,按键位于行、列的交叉点上。

当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU通过检测行或列线上的电平变化可以确定哪个按键被按下。

avr单片机基于ATmega16的4乘4矩阵按键驱动程序

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

单片机实现4X4矩阵键盘控制项目PPT课件

单片机实现4X4矩阵键盘控制项目PPT课件

-
5
• 在矩阵按键处理过程中,一旦检测到有按 键闭合与确认按键已经稳定闭合期间,通 过调用10-20ms延时子程序避开按键抖动问 题。由于按键是机械器件,按下或者松开 时有固定的机械抖动,抖动图如图所示。
-
6
• 按键去抖分为硬件去抖和软件去抖,硬件去抖最简单的是 按键两端并联电容,容量根据实验而定。软件去抖使用方 便不增加硬件成本,容易调试,所以现在处理按键抖动问 题大部分选择软件去抖。软件去抖操作步骤如下:
-
10
13.4 项目软件程序设计
• 矩阵键盘行线P20~P23为输出线,列线 P24~P27为输入线。单片机将行线(P20~P23) 全部输出低电平,此时读入列线数据,若列线 全为高电平则没有键按下,当列线有出现低电 平时调用延时程序以此来去除按键抖动。延时 完成后再判断是否有低电平,如果此时读入列 线数据还是有低电平,则说明确实有键按下, 再来进一步确定键值。
51单片机
VC C P0. 0 P0. 1 P0. 2 P0. 3 P0. 4 P0. 5 P0. 6 P0. 7 EA/VPP PROG/ ALE PSEN A15/P2. 7 A14/P2. 6 A13/P2. 5 A12/P2. 4 A11/P2. 3 A10/P2. 2 A9/P2. 1 A8/P2. 0

case 0xdd:P0=table[5];break; //显示按键码“5”

case 0xbd:P0=table[6];break; //显示按键码“6”

case 0x7d:P0=table[7];break; //显示按键码“7”

case 0xeb:P0=table[8];break; //显示按键码“8”

4X4矩阵式键盘输入程序

4X4矩阵式键盘输入程序

4*4键盘程序readkeyboard:begin: acall key_onjnz delayajmp readkeyboard delay:acall delay10msacall key_onjnz key_numajmp beginkey_num:acall key_panl a,#0FFhjz beginacall key_ccodepush akey_off:acall key_onjnz key_offpop aretkey_on: mov a,#00horl a,#0fhmov p1,amov a,p1orl a,#0f0hcpl aretkey_p: mov r7,#0efhl_loop:mov a,r7mov p1,amov a,p1orl a,#0f0hmov r6,acpl ajz nextajmp key_cnext: mov a,r7jnb acc.7,errorrl amov r7,aajmp l_looperror:mov a,#00hretkey_c:mov r2,#00hmov r3,#00hmov a,r6mov r5,#04hagain1:jnb acc.0,out1rr ainc r2djnz r5, again1out1: inc r2mov a,r7mov r5,#04hagain2:jnb acc.4,out2rr ainc r3djnz r5,again2out2: inc r3mov a, r2swap aadd a,r3retkey_ccode:push aswap aanl a,#0fhdec arl a ;行号乘4rl amov r7,apop aanl a,#0fhdec aadd a,r7retdelay10ms:anl tmod,#0f0horl tmod,#01hmov th0,#0d8hmov tl0,#0f0hsetb tr0wait:jbc tf0,overajmp waitclr tr0over:ret单片机键盘设计(二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。

单片机4×4矩阵键盘设计方案

单片机4×4矩阵键盘设计方案

1、设计原理(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。

(2)键盘中对应按键的序号排列如图14.1所示。

2、参考电路图14.2 4×4矩阵式键盘识别电路原理图3、电路硬件说明(1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。

(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。

4、程序设计内容(1)4×4矩阵键盘识别处理。

(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

5、程序流程图(如图14.3所示)6、汇编源程序;;;;;;;;;;定义单元;;;;;;;;;;COUNT EQU 30H;;;;;;;;;;入口地址;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100HSTART: LCALL CHUSHIHUALCALL PANDUANLCALL XIANSHILJMP START;;;;;;;;;;初始化程序;;;;;;;;;;CHUSHIHUA: MOV COUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;;PANDUAN: MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHJZ SW1LCALL DELAY10MS JZ SW1MOV A,P3ANL A,#0FHCJNE A,#0EH,K1 MOV COUNT,#0 LJMP DKK1: CJNE A,#0DH,K2 MOV COUNT,#4 LJMP DKK2: CJNE A,#0BH,K3 MOV COUNT,#8 LJMP DKK3: CJNE A,#07H,K4 MOV COUNT,#12K4: NOPLJMP DKSW1: MOV P3,#0FFH CLR P3.5MOV A,P3ANL A,#0FHJZ SW2LCALL DELAY10MS JZ SW2MOV A,P3ANL A,#0FHCJNE A,#0EH,K5 MOV COUNT,#1 LJMP DKK5: CJNE A,#0DH,K6 MOV COUNT,#5 LJMP DKK6: CJNE A,#0BH,K7 MOV COUNT,#9 LJMP DKK7: CJNE A,#07H,K8 MOV COUNT,#13K8: NOPLJMP DKSW2: MOV P3,#0FFH CLR P3.6MOV A,P3ANL A,#0FHJZ SW3LCALL DELAY10MS JZ SW3MOV A,P3ANL A,#0FHCJNE A,#0EH,K9 MOV COUNT,#2 LJMP DKK9: CJNE A,#0DH,KA MOV COUNT,#6 LJMP DKKA: CJNE A,#0BH,KB MOV COUNT,#10 LJMP DKKB: CJNE A,#07H,KC MOV COUNT,#14 KC: NOPLJMP DKSW3: MOV P3,#0FFH CLR P3.7MOV A,P3ANL A,#0FHJZ SW4LCALL DELAY10MSJZ SW4MOV A,P3ANL A,#0FHCJNE A,#0EH,KDMOV COUNT,#3LJMP DKKD: CJNE A,#0DH,KE MOV COUNT,#7LJMP DKKE: CJNE A,#0BH,KF MOV COUNT,#11 LJMP DKKF: CJNE A,#07H,KG MOV COUNT,#15KG: NOPLJMP DKSW4: LJMP PANDUAN DK: RET ;;;;;;;;;;显示程序;;;;;;;;;; XIANSHI: MOV A,COUNTMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ALCALL DELAYSK: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ SKRET;;;;;;;;;;10ms延时程序;;;;;;;;;;DELAY10MS: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5,#20LOOP: LCALL DELAY10MSDJNZ R5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H;;;;;;;;;;结束标志;;;;;;;;;;END7、C语言源程序#includeunsigned char code table[]={0x3f,0x66,0x7f,0x39,0x06,0x6d,0x6f,0x5e,0x5b,0x7d,0x77,0x79,0x4f,0x07,0x7c,0x71};void main(void){ unsigned char i,j,k,key;while(1){ P3=0xff; //给P3口置1//P3_4=0; //给P3.4这条线送入0//i=P3;i=i&0x0f; //屏蔽低四位//if(i!=0x0f) //看是否有按键按下//{ for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);if(i!=0x0f) //再次判断按键是否按下//{ switch(i) //看是和P3.4相连的四个按键中的哪个// { case 0x0e:key=0;break;case 0x0d:key=1;break;case 0x0b:key=2;break;case 0x07:key=3;break;}P0=table[key]; //送数到P0口显示//}}P3=0xff;P3_5=0; //读P3.5这条线//i=P3;i=i&0x0f; //屏蔽P3口的低四位//if(i!=0x0f) //读P3.5这条线上看是否有按键按下// { for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);i=P3; //再看是否有按键真的按下//i=i&0x0f;if(i!=0x0f){ switch(i) //如果有,显示相应的按键//{ case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=7;break;}P0=table[key]; //送入P0口显示//}}P3=0xff;P3_6=0; //读P3.6这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=8;break;case 0x0d:key=9;break;case 0x0b:key=10;break;case 0x07:key=11;break;}P0=table[key];}}P3=0xff;P3_7=0; //读P3.7这条线上是否有按键按下//i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--) for(k=200;k>0;k--); i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=12;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}P0=table[key];}}}}8、注意事项在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。

实验四4X4矩阵键盘实验

实验四4X4矩阵键盘实验


狀態S_2: 發出掃瞄column 1即col=4’b1101的狀態並讀回row值作比 較:
如果讀到row不等於f (4’b1111)就代表在column 1上的4個按鍵(3, 7, b, f)有其中一個被按下,於是跳至S_5做等待使用者放開按鍵的處 理。 如果讀到row等於f (4’b1111)就代表在column 1上的4個按鍵(3, 7, b, f)沒有被按下,於是跳至S_3做掃瞄column 2的按鍵。
按鍵掃瞄之狀態
狀態S_3: 發出掃瞄column 2即col=4’b1011的狀態並讀回
row值作比較:
如果讀到row不等於f (4’b1111)就代表在column 2上的4個按鍵(2, 6, a, e)有其中一個被按下,於是跳至S_5做等待使用者放開按 鍵的處理。 如果讀到row等於f (4’b1111)就代表在column 2上的4個按鍵(2, 6, a, e)沒有被按下,於是跳至S_4做掃瞄column 2的按鍵。 狀態S_4: 發出掃瞄column 3即col=4’b0111的狀態並讀回row值作比較: 如果讀到row不等於f (4’b1111)就代表在column 3上的4個按鍵(1, 5, g, d)有其中一個被按下,於是跳至S_5做等待使用者放開按 鍵的處理。 如果讀到row等於f (4’b1111)就代表在column 3上的4個按鍵(1, 5, g, d)沒有被按下,於是跳回至S_0,因此FSM跳回Idle state即掃 描完4個column 都沒有發現任何按鍵被按下。 狀態S_5: 等待使用者放開按鍵的狀態,如果使用者沒放開按鍵就一直停
實驗四 4X4矩陣鍵盤實驗
4X4矩陣鍵盤輸入並輸出至七段式顯示器
底板子4x4矩陣按鍵

4x4矩阵键盘工作原理

4x4矩阵键盘工作原理

4x4矩阵键盘工作原理
4x4矩阵键盘是一种常见的输入设备,它由16个按键组成,通
常用于嵌入式系统中。

其工作原理是利用矩阵的方式将16个按键映
射到单一的输入口上,从而减少了引脚的数量。

在4x4矩阵键盘中,按键排列成4行4列的矩阵形式。

每一行的按键都共用一根引脚,每一列的按键也共用一根引脚。

当按下某一个按键时,会在对应的行和列上形成短暂的电路通路,此时矩阵键盘会将这个按键的行和列位置保存下来,通过扫描算法得出该按键的编号,然后将其传输到处理器中进行处理。

具体来说,矩阵键盘的扫描算法通常采用轮询的方式进行。

处理器按照一定的时间间隔扫描矩阵键盘的每一行和每一列,从而得出哪个按键被按下了。

同时,为了防止按键的抖动影响输入的精度,还需要进行消抖处理。

总的来说,4x4矩阵键盘工作原理相对简单,但需要合理设计矩阵排布和扫描算法,以确保输入的准确性和稳定性。

- 1 -。

单片机4×4矩阵键盘设计方案

单片机4×4矩阵键盘设计方案

1、设计原理(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。

(2)键盘中对应按键的序号排列如图14.1所示。

2、参考电路图14.24×4矩阵式键盘识别电路原理图3、电路硬件说明(1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。

(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。

4、程序设计内容(1)4×4矩阵键盘识别处理。

(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

5、程序流程图(如图14.3所示)6、汇编源程序;;;;;;;;;;定义单元;;;;;;;;;;COUNTEQU30H;;;;;;;;;;入口地址;;;;;;;;;;ORG0000HLJMPSTARTORG0003HRETIORG000BHRETIORG0013HRETIORG001BHRETIORG0023HRETIORG002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG0100HSTART:LCALLCHUSHIHUALCALLPANDUANLCALLXIANSHILJMPSTART;;;;;;;;;;初始化程序;;;;;;;;;; CHUSHIHUA:MOVCOUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;; PANDUAN:MOVP3,#0FFHCLRP3.4MOVA,P3ANLA,#0FHXRLA,#0FHJZSW1LCALLDELAY10MSJZSW1MOVA,P3ANLA,#0FHCJNEA,#0EH,K1MOVCOUNT,#0LJMPDKK1:CJNEA,#0DH,K2MOVCOUNT,#4 LJMPDKK2:CJNEA,#0BH,K3 MOVCOUNT,#8 LJMPDKK3:CJNEA,#07H,K4 MOVCOUNT,#12K4:NOPLJMPDKSW1:MOVP3,#0FFH CLRP3.5MOVA,P3ANLA,#0FH XRLA,#0FHJZSW2 LCALLDELAY10MS JZSW2MOVA,P3ANLA,#0FH CJNEA,#0EH,K5 MOVCOUNT,#1LJMPDKK5:CJNEA,#0DH,K6 MOVCOUNT,#5 LJMPDKK6:CJNEA,#0BH,K7 MOVCOUNT,#9 LJMPDKK7:CJNEA,#07H,K8 MOVCOUNT,#13K8:NOPLJMPDKSW2:MOVP3,#0FFH CLRP3.6MOVA,P3ANLA,#0FH XRLA,#0FHJZSW3 LCALLDELAY10MS JZSW3MOVA,P3ANLA,#0FHCJNEA,#0EH,K9 MOVCOUNT,#2 LJMPDKK9:CJNEA,#0DH,KA MOVCOUNT,#6 LJMPDKKA:CJNEA,#0BH,KB MOVCOUNT,#10 LJMPDKKB:CJNEA,#07H,KC MOVCOUNT,#14 KC:NOPLJMPDKSW3:MOVP3,#0FFH CLRP3.7MOVA,P3ANLA,#0FH XRLA,#0FHJZSW4 LCALLDELAY10MS JZSW4ANLA,#0FHCJNEA,#0EH,KD MOVCOUNT,#3LJMPDKKD:CJNEA,#0DH,KE MOVCOUNT,#7LJMPDKKE:CJNEA,#0BH,KF MOVCOUNT,#11LJMPDKKF:CJNEA,#07H,KG MOVCOUNT,#15KG:NOPLJMPDKSW4:LJMPPANDUANDK:RET;;;;;;;;;;显示程序;;;;;;;;;; XIANSHI:MOVA,COUNT MOVDPTR,#TABLEMOVCA,@A+DPTRLCALLDELAYSK:MOVA,P3ANLA,#0FHXRLA,#0FHJNZSKRET;;;;;;;;;;10ms延时程序;;;;;;;;;; DELAY10MS:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;; DELAY:MOVR5,#20LOOP:LCALLDELAY10MSDJNZR5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB7FH,6FH,77H,7CH,39H,5EH,79H,71H7、C语言源程序#includeunsignedcharcodetable[]={0x3f,0x66,0x7f,0x39,0x06,0x6d,0x6f,0x5e,0x5b,0x7d,0x77,0x79,0x4f,0x07,0x7c,0x71};voidmain(void){unsignedchari,j,k,key;while(1){P3=0xff;//给P3口置1//P3_4=0;//给P3.4这条线送入0//i=P3;i=i&0x0f;//屏蔽低四位//if(i!=0x0f)//看是否有按键按下//{for(j=50;j>0;j--)//延时//for(k=200;k>0;k--);if(i!=0x0f)//再次判断按键是否按下//{switch(i)//看是和P3.4相连的四个按键中的哪个// {case0x0e:key=0;break;case0x0d:key=1;break;case0x0b:key=2;break;case0x07:key=3;break;}P0=table[key];//送数到P0口显示//}}P3=0xff;P3_5=0;//读P3.5这条线//i=P3;i=i&0x0f;//屏蔽P3口的低四位//if(i!=0x0f)//读P3.5这条线上看是否有按键按下// {for(j=50;j>0;j--)//延时//for(k=200;k>0;k--);i=P3;//再看是否有按键真的按下//i=i&0x0f;if(i!=0x0f){switch(i)//如果有,显示相应的按键// {case0x0e:key=4;break;case0x0d:key=5;break;case0x0b:key=6;break;case0x07:key=7;break;}P0=table[key];//送入P0口显示//}}P3=0xff;P3_6=0;//读P3.6这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){switch(i){case0x0e:key=8;break;case0x0d:key=9;break;case0x0b:key=10;break;case0x07:key=11;}P0=table[key];}}P3=0xff;P3_7=0;//读P3.7这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){switch(i){case0x0e:key=12;break;case0x0d:key=13;case0x0b:key=14;break;case0x07:key=15;break;}P0=table[key];}}}}8、注意事项在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。

简单的4×4行列式键盘控制电路设计(三款电路设计原理图详解)

简单的4×4行列式键盘控制电路设计(三款电路设计原理图详解)

简单的4×4行列式键盘控制电路设计(三款电路设计
原理图详解)
 4X4行列式键盘控制电路(一)
1.概述
 键盘是一组按压式开关的集合,是微机系统不可缺少的输入设备,用于输入数据和命令。

键盘的每一个按键都被赋予一个代码,称为键码。

键盘系统的主要工作包括及时发现有键闭合,求闭合键的键码。

根据这一过程的不同,键盘可以分为两种,即编码键盘和非编码键盘。

编码键盘是通过一个编码电路来识别闭合键的键码,非编码键盘是通过软件来识别键码。

由于非编码键盘的硬件电路简单,用户可以方便地增减键的数量,因此在单片机应用系统中,非编码键盘得到广泛的应用,有较好的应用价值。

2.设计原理
 首先应该了解本次设计的基本要求和目的,再通过查找资料了解80C51
单片机的工作原理、结构图,数码显示管的结构和工作原理。

根据设计要求可以将单片机P3口接4&TImes;4键盘,P0口接数码显示管,根据扫描原理进行行扫描,用CJNE指令判断P3口的状态。

采用软件延时去抖动,用MOVCA,@A+DPTR取键值。

4×4矩阵键盘在单片机中的应用(Proteus)

4×4矩阵键盘在单片机中的应用(Proteus)

4×4矩阵键盘原理及其在单片机中的简单应用基于Proteus仿真1、4×4矩阵键盘的工作原理如下图所示,4×4矩阵键盘由4条行线和4条列线组成,行线接P3.0-P3.3,列线接P3.4-P3.7,按键位于每条行线和列线的交叉点上。

按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。

第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。

当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。

第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。

第三步,将第一步得到的列码和第二步得到的行码拼合成被按键的位置码,即Y0Y1Y2Y3X0X1X2X3(因为行线和列线各有一条为低电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。

当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y0Y1Y2Y3X0X1X2X3为0111 0111,即0X77。

当5键按下时,行线X1和列线Y1为低电平,其余行列线为高电平,于是可得到5键的位置码Y0Y1Y2Y3X0X1X2X3为1011 1011,即0XBB。

全部矩阵键盘的位置码如下:2、4×4矩阵键盘在单片机的简单应用举例(一)如下图所示,运行程序时,按下任一按键,数码管会显示它在矩阵键盘上的序号0~F,并且蜂鸣器发出声音,模拟按键的声音。

此处采用线反转法识别按键。

C程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit buzzer=P1^0;uchar code dis[]= //0~9,A~F的共阳显示代码{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E};uchar code tab[]= //矩阵键盘按键位置码{0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};void delay(uint x) //延时函数{uchar i;while(x--)for(i=0;i<120;i++);}uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;P3=0XF0; //P3口输出11110000a=P3; //读取列码delay(10); //防抖延时10msP3=0X0F; //P3口输出00001111b=P3; //读取行码c=a+b; //得到位置码for(i=0;i<16;i++)if(c==tab[i])return i; //查表得到按键序号并返回return -1; //无按键,则返回-1}void beep() //蜂鸣器发出声音,模拟按键的声音{ uchar i;for(i=0;i<100;i++){buzzer=~buzzer;delay(1);}buzzer=0;}void main(){uchar key;buzzer=0; //关闭蜂鸣器while(1){key=scan(); //得到按键号if(key!=-1) //有按键则显示,并且蜂鸣器发出声音{P0=dis[key];beep();delay(100);}}}Proteus仿真运行结果如下:3、4×4矩阵键盘在单片机的简单应用举例(二)如下图所示,运行程序时,按下的按键键值越大,点亮的LED灯越多,例如,按下1号键时,点亮一只LED灯,按下2号键时,点亮两只LED灯,按下16号键时,点亮全部LED 灯。

单片机-数码管显示4X4矩阵键盘按键号

单片机-数码管显示4X4矩阵键盘按键号

单片机-数码管显示4X4矩阵键盘按键号#include<>#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};sbit BEEP=P3^7;//上次按键和当前按键的序号,该矩阵中序号范围0~15,16表示无按键uchar Pre_KeyNo=16,KeyNo=16;//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//矩阵键盘扫描void Keys_Scan(){uchar Tmp;P1=0x0f; //高4 位置0,放入 4 行DelayMS(1);Tmp=P1^0x0f;//按键后0f变成0000XXXX,X中一个为0,3 个仍为 1,通过异或把 3 个1 变为0,唯一的0变为1;switch(Tmp) //判断按键发生于 0~3 列的哪一列{case 1: KeyNo=0;break;case 2: KeyNo=1;break;case 4: KeyNo=2;break;case 8: KeyNo=3;break;default:KeyNo=16; //无键按下}P1=0xf0; //低 4 位置0,放入 4 列DelayMS(1);Tmp=P1>>4^0x0f;//按键后 f0 变成 XXXX0000,X中有 1 个为0,三个仍为 1;高4 位转移到低 4位并异或得到改变的值switch(Tmp) //对0~3 行分别附加起始值 0,4,8,12{case 1: KeyNo+=0;break;case 2: KeyNo+=4;break;case 4: KeyNo+=8;break;case 8: KeyNo+=12;}}//蜂鸣器void Beep(){uchar i;for(i=0;i<100;i++){DelayMS(1);BEEP=~BEEP;}BEEP=0;}//主程序void main(){P0=0x00;BEEP=0;while(1){P1=0xf0;if(P1!=0xf0) Keys_Scan(); //获取键序号 if(Pre_KeyNo!=KeyNo) {P0=~DSY_CODE[KeyNo];Beep();Pre_KeyNo=KeyNo;}DelayMS(100);}}。

4X4矩阵键盘及显示电路设计说明

4X4矩阵键盘及显示电路设计说明

4X4矩阵键盘及显示电路设计FPGA在数字系统设计中的广泛应用,影响到了生产生活的各个方面。

在FPGA 的设计开发中,VHDL语言作为一种主流的硬件描述语言,具有设计效率高,可靠性好,易读易懂等诸多优点。

作为一种功能强大的FPGA数字系统开发环境,Altera公司推出的Quar-tUSⅡ,为设计者提供了一种与结构无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件编程,为使用VHDL语言进行FPGA设计提供了极大的便利。

矩阵键盘作为一种常用的数据输入设备,在各种电子设备上有着广泛的应用,通过7段数码管将按键数值进行显示也是一种常用的数据显示方式。

在设计机械式矩阵键盘控制电路时,按键防抖和按键数据的译码显示是两个重要方面。

本文在QuartusⅡ开发环境下,采用VHDL语言设计了一种按键防抖并能连续记录并显示8次按键数值的矩阵键盘及显示电路。

一、矩阵键盘及显示电路设计思路矩阵键盘及显示电路能够将机械式4×4矩阵键盘的按键值依次显示到8个7段数码管上,每次新的按键值显示在最右端的第O号数码管上,原有第0~6号数码管显示的数值整体左移到第1~7号数码管上显示,见图1。

总体而言,矩阵键盘及显示电路的设计可分为4个部分:(1)矩阵键盘的行及列的扫描控制和译码。

该设计所使用的键盘是通过将列扫描信号作为输入信号,控制行扫描信号输出,然后根据行及列的扫描结果进行译码。

(2)机械式按键的防抖设计。

由于机械式按键在按下和弹起的过程中均有5~10 ms的信号抖动时间,在信号抖动时间无法有效判断按键值,因此按键的防抖设计是非常关键的,也是该设计的一个重点。

(3)按键数值的移位寄存。

由于该设计需要在8个数码管上依次显示前后共8次按键的数值,因此对已有数据的存储和调用也是该设计的重点所在。

(4)数码管的扫描和译码显示。

由于该设计使用了8个数码管,因此需要对每个数码管进行扫描控制,并根据按键值对每个数码管进行7段数码管的译码显示。

课程设计制作单片机的4X4矩阵键盘

课程设计制作单片机的4X4矩阵键盘

目录摘要 (2)第一章硬件部分 (3)第一节AT89C51 (3)第二节4*4矩阵式键盘 (6)第三节LED数码管 (8)第四节硬件电路连接 (10)第二章软件部分 (12)第一节所用软件简介 (12)第二节程序流程图 (14)第三节程序 (17)第三章仿真结果 (19)心得体会 (21)参考文献 (22)摘要电子信息行业将是人类社会的高科技行业之一,是设施现代化的基础,也是人类通往科技巅峰的直通车。

电子行业的发展很重要,而计算机技术是现代科技发展的重要组成部分。

矩阵式键盘控制系统可以提高效率,是进行按键操作管理的有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身的要求。

并能正确、实时、高效地显示按键信息,以提高工作效率和资源利用率。

矩阵式键盘是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,并通过单片机,显示在LED数码管上。

单片机控制键盘显示系统,可以对不同的按键进行实时显示,其核心是单片机、键盘矩阵电路和数码管显示电路。

4*4矩阵式键盘以AT89C51单片机为核心,主要由矩阵式键盘电路、显示电路等组成,软件选用C语言编程。

单片机将检测到的按键信号转换成数字量,显示于LED显示器上。

该系统灵活性强,易于操作,可靠性高,广泛应用于各种场合。

第一章硬件部分第一节AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

引脚如图所示AT89C51图1 AT89C51管脚图AT89C51其具有以下特性:与MCS-51 兼容4K字节可编程FLASH存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:0Hz-24MHz三级程序存储器锁定128×8位内部RAM32可编程I/O线两个16位定时器/计数器5个中断源可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路特性概述:AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 接口,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。

4x4矩阵键盘扫描原理

4x4矩阵键盘扫描原理

4x4矩阵键盘扫描原理
4x4矩阵键盘扫描原理是一种常用的键盘扫描方法,也称为矩阵键盘扫描。

它可以将多个按键连接在一起并使用较少的引脚来检测按键的状态。

4x4矩阵键盘由4行和4列组成,共有16个按键。

通常使用单片机或电路来进行扫描,以下是简要的原理:
1. 行扫描:首先,将行引脚设置为输出,同时将列引脚设置为输入,并将其上拉或下拉。

所有行引脚中只有一个为低电平,其余为高电平。

然后逐行检测按键状态。

2. 列检测:对于每一行,将对应的行引脚置为低电平后,检测列引脚的电平状态。

如果有按键按下,则相应的列引脚会变为低电平。

通过读取列引脚的状态,可以确定按键的位置。

3. 组合键:由于只能一次检测一行,因此当同时按下多个按键时,可能会导致误检。

为了解决这个问题,可以在检测到按键按下时,延迟一段时间,并再次检测按键的状态。

如果在第二次检测时仍然检测到按键按下,则确认按键有效。

4. 反向扫描:为了检测按键的释放状态,可以将行引脚设置为输入,列引脚设置为输出,并将其置为低电平。

然后逐列检测行引脚的电平状态,如果有按键释放,则相应的行引脚会变为高电平。

通过不断地循环扫描所有的行和列,可以实时检测按键的状态,并根据需要进行相应的处理。

4x4矩阵键盘工作原理

4x4矩阵键盘工作原理

4x4矩阵键盘工作原理
4x4矩阵键盘是一种常见的输入设备,常用于电脑、手机等设备上。

它由4行4列的按键组成,可以输入数字、字母、符号等字符。

它的工作原理是基于键盘按键的电路原理,通过行列扫描的方式来检测按键的状态。

当用户按下键盘上的某个按键时,按键会和矩阵中的某个交叉点相连通,此时该交叉点的电路就会发生变化。

为了检测到按键的状态,需要通过行列扫描的方式来扫描整个矩阵,以确定哪个按键被按下。

具体的工作过程如下:
1. 在未按下任何按键时,所有的行和列都会保持在高电平状态。

2. 当用户按下某个按键时,该按键所在的行和列就会短接,导致该行的电压降低,该列的电压升高。

3. 将行设置为低电平,列设置为高电平,然后逐行扫描矩阵,检测各行的状态。

4. 如果某行的电压降低,说明该行和某列短接,即某个按键被按下。

5. 此时可以通过查找该按键所在的行和列,确定按下的是哪个按键。

通过上述过程,就可以检测到用户输入的按键,并将其转换成对应的字符输出。

4x4矩阵键盘工作原理简单、可靠,是一种常用的输入设备。

- 1 -。

4×4矩阵键盘原理及其在单片机中的简单应用(基Proteus仿真)

4×4矩阵键盘原理及其在单片机中的简单应用(基Proteus仿真)

4×4矩阵键盘原理及其在单片机中的简单应用基于Proteus仿真1、4×4矩阵键盘的工作原理如下图所示,4×4矩阵键盘由4条行线和4条列线组成,行线接P3.0-P3.3,列线接P3.4-P3.7,按键位于每条行线和列线的交叉点上。

按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。

第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。

当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。

第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。

第三步,将第一步得到的列码和第二步得到的行码拼合成被按键的位置码,即Y0Y1Y2Y3X0X1X2X3(因为行线和列线各有一条为低电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。

也就是说,当某个键按下时,该键两端所对应的行线和列线为低电平,其余行线和列线为高电平。

比如,当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y0Y1Y2Y3X0X1X2X3为01110111,即0X77。

当5键按下时,行线X1和列线Y1为低电平,其余行列线为高电平,于是可得到5键的位置码Y0Y1Y2Y3X0X1X2X3为10111011,即0XBB。

全部矩阵键盘的位置码如下:2、4×4矩阵键盘在单片机的简单应用举例(一)如下图所示,运行程序时,按下任一按键,数码管会显示它在矩阵键盘上的序号0~F,并且蜂鸣器发出声音,模拟按键的声音。

此处采用线反转法识别按键。

C程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit buzzer=P1^0;uchar code dis[]= //0~9,A~F的共阳显示代码{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E};uchar code tab[]= //矩阵键盘按键位置码{0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};void delay(uint x) //延时函数{uchar i;while(x--)for(i=0;i<120;i++);}uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;P3=0XF0; //P3口输出11110000a=P3; //读取列码delay(10); //防抖延时10msP3=0X0F; //P3口输出00001111b=P3; //读取行码c=a+b; //得到位置码for(i=0;i<16;i++)if(c==tab[i])return i; //查表得到按键序号并返回return -1; //无按键,则返回-1}void beep() //蜂鸣器发出声音,模拟按键的声音{ uchar i;for(i=0;i<100;i++){buzzer=~buzzer;delay(1);}buzzer=0;}void main(){uchar key;buzzer=0; //关闭蜂鸣器while(1){key=scan(); //得到按键号if(key!=-1) //有按键则显示,并且蜂鸣器发出声音{P0=dis[key];beep();delay(100);}}}Proteus仿真运行结果如下:3、4×4矩阵键盘在单片机的简单应用举例(二)如下图所示,运行程序时,按下的按键键值越大,点亮的LED灯越多,例如,按下1号键时,点亮一只LED灯,按下2号键时,点亮两只LED灯,按下16号键时,点亮全部LED 灯。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsignedchar keyboard_Scan(volude #include
#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:感谢大家的阅读,本文由我司收集整编。仅供参阅!
0b11110000;//高四位打开上拉电阻/低四位输出低电平delay_nus(5);//延时5us
if((key_port_pin&0xF0)!=0xF0)//作初检查有否键按下,没有,就返回{//如果行
线不全为1,可能有键按下delay_nms(5);//延时去抖动
//设置列线初始值
3~0=1110for(Column=0,key_port=0b11111110;Column//main.c
相关文档
最新文档