4×4矩阵键盘的键值计算及编程

合集下载

电子琴C程序代码,四乘四矩阵键盘输入

电子琴C程序代码,四乘四矩阵键盘输入

电子琴C程序代码,四乘四矩阵键盘输入#include <reg52.h>#define uchar unsigned char #define uint unsigned intsbit duan=P 2八6;sbit wei=P 2八7;sbit bee=P 2八3;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code tablewe[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uchar disp[16]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; // 在里面输入按下键值为0~15 对应要显示的第一位码值uchar disp1[16]={0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x3f}; // 在里面输入按下键值为0~15 对应要显示的第二位码值unsigned char temp;unsigned char key;unsigned char i,j;unsigned char STH0;unsigned char STL0;unsigned int code tab[]={//63625, 63833, 64019, 64104, 64260, 64400, 64524 ,// 低音区:1 2 3 464580, 64685, 64778, 64820, 64898, 64968, 65030 ,// 中音区:1 2 3 4 5 65058, 65110, 65157, 65178, 65217, 65252, 65283 ,// 高音区:1 2 3 4 565297 ,// 超高音:1 }; // 音调数据表可改void delay(uchar x)uchar y,z;for(y=x;y>0;y--)for(z=0;z<110;z++);void init()TMOD=0x01;ET0=1;EA=1;void display() {for(i=0;i<2;i++)P0=tablewe[i];wei=1;wei=0;if(i==0)P0=disp[key];elseP0=disp1[key]; duan=1;duan=0;delay(4);void main(void) { init();while(1)P3=0xef;temp=P3;temp=temp & 0x0f; if (temp!=0x0f)delay(5);temp=P3;temp=temp & 0x0f; if (temp!=0x0f)temp=P3;temp=temp & 0x0f; switch(temp)case 0x0e:key=0;break;case 0x0d:key=1;break;case 0x0b:key=2;break;case 0x07:key=3;break;temp=P3;STH0=tab[key]/256; STL0=tab[key]%256; TR0=1;temp=temp & 0x0f; while(temp!=0x0f)display();temp=P3;temp=temp & 0x0f;P3=0xdf;temp=P3;temp=temp & 0x0f; if (temp!=0x0f)delay(5);temp=P3;temp=temp & 0x0f; if (temp!=0x0f)temp=P3;temp=temp & 0x0f; switch(temp)key=4;case 0x0e:break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=7;break;temp=P3;STH0=tab[key]/256; STL0=tab[key]%256; TR0=1;temp=temp & 0x0f; while(temp!=0x0f)display();temp=P3;temp=temp & 0x0f;}P3=0xbf;temp=P3;temp=temp & 0x0f; if (temp!=0x0f)delay(5);temp=P3;temp=temp & 0x0f; if (temp!=0x0f)temp=P3;temp=temp & 0x0f; switch(temp)case 0x0e:key=8;break;case 0x0d:key=9;break;case 0x0b:key=10;break;case 0x07:key=11;break;temp=P3;STH0=tab[key]/256; STL0=tab[key]%256; TR0=1;temp=temp & 0x0f; while(temp!=0x0f)display();temp=P3;temp=temp & 0x0f;P3=0x7f;temp=P3;temp=temp & 0x0f; if (temp!=0x0f)delay(5);temp=P3;temp=temp & 0x0f; if (temp!=0x0f)temp=P3;temp=temp & 0x0f; switch(temp)case 0x0e:key=12;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;temp=P3;STH0=tab[key]/256; STL0=tab[key]%256;TR0=1;temp=temp & 0x0f;while(temp!=0x0f)display();temp=P3;temp=temp & 0x0f;bee=1;TR0=0;display();void t0(void) interrupt 1 using 0TH0=STH0;TL0=STL0;bee=~bee;}。

实验四4×4键盘输入

实验四4×4键盘输入

实验四: 4 × 4键盘输入实验一、实验目的:1.学习非编码键盘的工作原理和键盘的扫描方式。

2.学习键盘的去抖方法和键盘应用程序的设计。

二、实验原理:键盘是单片机应用系统接受用户命令的重要方式。

单片机应用系统一般采用非编码键4*4矩阵盘,需要由软件根据键扫描得到的信息产生键值编码,以识别不同的键。

本板采用键盘,行信号分别为P1.0-P1.3 ,列信号分别为P1.4-P1.7 。

具体电路连接见下图对于键的识别一般采用逐行(列)扫描查询法,判断键盘有无键按下,由单片机I/O口向键盘送全扫描字,然后读入列线状态来判断。

程序及流程图:ORG 0000HAJMP MAINORG 0000HAJMP MAINORG 0030HMAIN:MOV P2,#0F7HMOV P1,#0F0HMOV R7,#100DJNZ R7,$MOV A,P1ANL A,#0F0HXRL A,#0F0HJZ MAINLCALL D10MSMOV A,#00HMOV R0,AMOV R1,AMOV R2,#0FEH SKEY0:MOV A,R2MOVP1,AMOVR7,#10DJNZ R7,$MOVA,P1ANLA,#0F0HXRLA,#0F0HJNZ LKEYINC R0MOVA,R2RL AMOVR2,AMOVA,R0CJNE A,#04H,SKEY0AJMP MAIN LKEY:JNB ACC,4,NEXT1MOVA,#00HMOVR1,AAJMP DKEYNEXT1:JNB ACC.5,NEXT2MOVA,#01HMOVR1,AAJMP DKEYNEXT2:JNB ACC.6,NEXT3MOVA,#02HMOVR1,AAJMP DKEYNEXT3:JNB ACC.7,MAINMOVA,#03HMOVR1,AAJMP DKEY DKEY:MOV A,R0MOVB,#04HMULABADDA,R1AJMP SQRSQR:MOVDPTR,#TABMOVC A,@A+DPTRMOVP0,AAJMP MAINTAB:DB0C0H,0F9H,0A4H,0B0H,99H, 92H, 82H, 0F8H DB 80H, 90H, 88H, 83H, 0C6H,0A1H,86H, 8EH D10MS:MOV R6,#10L1:MOV R5,#248DJNZ R5,$DJNZ R6,L1RETEND流程图:结束三、思考题:总结 FPGA是如何识别按键的?与单片机读取键值有何不同?答:FPGA的所有 I/O 控制块允许每个 I/O 引脚单独配置为输入口 , 不过这种配置是系统自动完成的。

51单片机4×4矩阵键盘且在数码管最后一位显示汇编语言

51单片机4×4矩阵键盘且在数码管最后一位显示汇编语言

51下面是51单片机使用4×4矩阵键盘的汇编程序,并在数码管的最后一位显示一个字符:```ORG 0 ;程序从地址0开始MOV P1,#0FFH ;P1口设置为输入口MOV P0,#0FH ;P0口设置为输出口LOOP:MOV A,P1 ;读取P1口的值CJNE A,#0FFH,KEY_PRESSED ;判断是否有按键按下SJMP LOOP ;如果没有按键按下,继续循环KEY_PRESSED:MOV R0,A ;保存按键的值CLR P0.0 ;选定行0MOV A,P1ANL A,#0F0H ;按位与运算,保留列位的值CJNE A,#0F0H,COL0 ;判断是否有按键按下在第0列MOV A,#'0' ;如果在第0列按下按键,则A的值为0JMP DISP ;跳转到显示程序COL0:CLR P0.1 ;选定行1MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL1 ;判断是否有按键按下在第1列MOV A,#'1' ;如果在第1列按下按键,则A的值为1JMP DISP ;跳转到显示程序COL1:CLR P0.2 ;选定行2MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL2 ;判断是否有按键按下在第2列MOV A,#'2' ;如果在第2列按下按键,则A的值为2JMP DISP ;跳转到显示程序COL2:CLR P0.3 ;选定行3MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL3 ;判断是否有按键按下在第3列MOV A,#'3' ;如果在第3列按下按键,则A的值为3JMP DISP ;跳转到显示程序COL3:CLR P0.4 ;选定行4MOV A,P1ANL A,#0F0H4MOV A,#'4' ;如果在第4列按下按键,则A的值为4 JMP DISP ;跳转到显示程序COL4:CLR P0.5 ;选定行5MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL5 ;判断是否有按键按下在第5列 MOV A,#'5' ;如果在第5列按下按键,则A的值为5 JMP DISP ;跳转到显示程序COL5:CLR P0.6 ;选定行6MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL6 ;判断是否有按键按下在第6列 MOV A,#'6' ;如果在第6列按下按键,则A的值为6 JMP DISP ;跳转到显示程序COL6:CLR P0.7 ;选定行7MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL7 ;判断是否有按键按下在第7列 MOV A,#'7' ;如果在第7列按下按键,则A的值为7 JMP DISP ;跳转到显示程序COL7:MOV A,#00HJMP EXIT ;如果没有按下任何键,退出程序DISP: ;数码管显示程序MOV R1,#100B ;延时计数器初始化MOV P2,A ;把按键值存入P2口MOV A,#07HANL A,P0 ;从P0口读取选定的行值MOV P0,A ;根据选定的行值输出相应的值ACALL DELAY ;调用延时程序MOV P0,#0FH ;关闭所有行DJNZ R1,$ ;当延时计数器不为0时,继续延时MOV A,#0FHMOV P0,A ;清除所有显示JMP LOOP ;跳转回主程序EXIT:MOV P2.7,1 ;在数码管的最后一位显示字符1SJMP EXIT ;无限循环DELAY: ;延时程序MOV R2,#75DMOV R3,#200D DELAY3:DJNZ R3,$DJNZ R2,DELAY2 RET```。

4X4矩阵键盘控制数码管显示按键值

4X4矩阵键盘控制数码管显示按键值

4X4矩阵键盘控制数码管显示按键值4X4矩阵键盘控制数码管显示按键值一、设计内容与要求用80C51单片机控制系统显示按键值0~F。

二、设计目的意义2.1 设计目的1、了解单片机系统中实现LED动态显示的原理及方法;2、详细了解8051芯片的性能及编程方法;3、了解单片机系统基本原理,了解单片机控制原理;4、掌握AT89C51输入/输出接口电路设计方法;5、掌握AT89C51程序控制方法;6、掌握单片机汇编编程技术中的设计和分析方法;7、掌握使用PROTEUS软件进行仿真的方法。

8、学会使用并熟练掌握电路绘制软件Protel99SE;9、掌握电路图绘制及PCB图布线技巧。

2.2 设计意义1、在系统掌握单片机相应基础知识的前提下,熟悉单片机应用系统的设计方法及系统设计的基本步骤。

2、完成所需单片机应用系统原理图设计绘制的基础上完成系统的电路图设计。

3、完成系统所需的硬件设计制作,在提高实际动手能力的基础上进一步巩固所学知识。

4、进行题目要求功能基础上的软件程序编程,会用相应软件进行程序调试和测试工作。

5、用AT89C51设计出题目所要求的数码管动态循环显示,并针对实际设计过程中软、硬件设计方面出现的问题提出相应解决办法。

6、通过单片机应用系统的设计将所学的知识融会贯通,锻炼独立设计、制作和调试单片机应用系统的能力;领会单片机应用系统的软、硬件调试方法和系统的研制开发过程,为进一步的科研实践活动打下坚实的基础。

三、系统硬件电路图3.1 Proteus软件简介以及仿真电路图Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、1ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。

4X4矩阵式键盘输入程序

4X4矩阵式键盘输入程序

4*4 键盘程序readkeyboard: orl a,#0f0h mov a, r2begin: acall key_on mov r6,a swap a jnz delay cpl a add a,r3ajmp readkeyboard jz next retdelay:acall delay10ms ajmp key_c key_ccode:push a acall key_on next: mov a,r7 swap ajnz key_num jnb acc.7,error anl a,#0fhajmp begin rl a dec akey_num:acall key_p mov r7,a rl a ; 行号乘anl a,#0FFh ajmp l_loop 4jz begin error:mov a,#00h rl aacall key_ccode ret mov r7,apush a key_c:mov r2,#00h pop akey_off:acall key_on mov r3,#00h anl a,#0fh jnz key_off mov a,r6 dec apop a mov r5,#04h add a,r7ret again1:jnb acc.0,out1retkey_on: mov a,#00h rr a delay10ms: orl a,#0fh inc r2 anl tmod,#0f0h mov p1,a djnz r5, again1 orl tmod,#01h mov a,p1 out1: inc r2 mov th0,#0d8h orl a,#0f0h mov a,r7 mov tl0,#0f0h cpl a mov r5,#04h setb tr0ret again2:jnb acc.4,out2wait:jbc tf0,overkey_p: mov r7,#0efh rr a ajmp waitl_loop:mov a,r7 inc r3 clr tr0 mov p1,amov a,p1 djnz r5,again2out2: inc r3 单片机键盘设计over:ret二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。

4×4矩阵键盘数码管显现按键值程序

4×4矩阵键盘数码管显现按键值程序

4×4矩阵键盘数码管显现按键值程序4;x;4矩阵键盘数码管显现按键值程序//电路阐明如下。

//单片机:运用51系列兼容的即可;//4;x;4矩阵键盘:接在P1口;//两位数码显现器:P0口输出七段码,P2口输出位选码。

//===================================================== =========//C言语程序如下。

/****************************************************** ********文件名:KEY_LED.c*功用:对4;x;4矩阵键盘进行输出,在数码管后两位显现按键值。

******************************************************* *******/#includelt;reg51.h#includelt;intrins.h#defineuintunsignedint#defineucharunsignedchar//ucharcodetable[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x 01,0x09};ucharcodetable[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x8 0,0x90};/****************************************************** *********称谓:Delay_1ms()*功用:延时子程序,延时时刻为1ms*x*输入:x(延时一毫秒的个数)*输出:无******************************************************* ********/voidDelay_1ms(uintx){uinti;ucharj;for(i=0;ilt;x;i++)for(j=0;jlt;=148;j++);}/*******************************************************称谓:Keyscan()*功用:P1外接4;x;4按键,依照扫描法读出键值*输出:按键值0~15/如无键按下,回来16******************************************************* ********/ucharKeyscan(void){uchari,j,temp,Buffer[4]={0xef,0xdf,0xbf,0x7f};for(j=0;jlt;4;j++){//循环四次P1=Buffer[j];//在P1高四位别离输出一个低电平temp=0x01;//方案先判别P1.0位for(i=0;ilt;4;i++){//循环四次if(!(P1temp))//从P1低四位,截取1位return(i+j*4);//回来获得的按键值templt;lt;=1;//判别的位,左移一位}}return16;//判别完毕,没有键按下,回来16}//哈哈,实质性的句子不过8行,即是这么简练!/*******************************************************称谓:Display(uchark)*功用:将参数分红十位、个位别离显现*输入:k(键盘数值)*输出:P0口输出七段码,P2口输出位选码******************************************************* ********/voidDisplay(uchark){P2=0;//消隐P0=table[k/10];P2=0x02;Delay_1ms(5);//显现5ms十位P2=0;//消隐P0=table[k%10];P2=0x01;Delay_1ms(5);//显现5ms个位}/****************************************************** *********称谓:Main()*功用:主函数******************************************************* ********/voidMain(void){ucharKey_Value=16,Key_Temp1,Key_Temp2;//两次读出的键值while(1){//---------以下读入按键、消抖、等候按键开释P1=0xff;Key_Temp1=Keyscan();//先读入按键if(Key_Temp1!=16){//假如有键按下//Delay_1ms(10);//延时一下Display(Key_Value);//可用显现替代延时Key_Temp2=Keyscan();//再读一次按键if(Key_Temp1==Key_Temp2){//有必要是两次持平Key_Value=Key_Temp1;//才保留下来,这即是消除颤动while(Keyscan()lt;16)//等候按键开释Display(Key_Value);//等候时期显现键值//---------以下是对按键的处理Display(Key_Value);//显现键值}}Display(Key_Value);//没有按键按下,也显现键值}}//用PROTEUS仿真作业时的屏幕截图如下:。

4乘4矩阵式键盘使用

4乘4矩阵式键盘使用

4乘4矩阵式键盘在单片机中的应用--C语言下图为4*4键盘的结果图,用单片机的P1口接4×4矩阵键盘,接法如图所示,用数码管显示按键的值,按下键S1,数码管显示0,按下S2,数码管显示1,按下S16,显示F。

先看程序代码:#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//八段数码管对应0—F值。

void Delay_1ms(uint i)//1ms延时{uchar x, j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void delay()//消除按键抖动延时{int i,j;for(i=0; i<=10; i++)for(j=0; j<=2; j++);}uchar Keyscan(void){uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};for(j=0; j<4; j++){P1 = Buffer[j];delay();temp = 0x10;for(i=0; i<4; i++){if(!(P1 & temp)){return (i+j*4);}temp <<= 1;}}}void Main(void){uchar Key_V alue; //读出的键值while(1){P1 = 0xf0;if(P1 != 0xf0){Delay_1ms(15); //按键消抖if(P1 != 0xf0){Key_Value = Keyscan();}}P0 = table[Key_V alue];//P0口输出数据到数码管}}代码分析:程序从Main开始执行,Key_V alue用来存放Keyscan();的返回值,Key_V alue为1,则数码管会显示1。

4×4矩阵按键

4×4矩阵按键
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
DQ = 1; //释放总线
dat>>=1; //移入下一位
}
}
void temperature_read(void)
{
//unsigned int t;
ds18b20_init();
if(presence==0) //器件应答
{
ds18b20_write(0xCC); //跳过读序号列号的操作
ds18b20_write(0x44);//启动温度转换
lcden=1; //开使能
delayms(5); //读取数据
lcden=0;//关闭使能
}
//**********LCD初始化函数开始*********
void lcd_initialize()
{
lcden=0;
write_com(0x38); //设置16x2显示,5x7点阵显示,8位数据接口
{
unsigned char i=0,dat=0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1; //移入一位
DQ = 1; //释放总线
if(DQ)
dat|=0x80; //写入1

4×4矩阵键盘的工作原理与编程

4×4矩阵键盘的工作原理与编程

4×4矩阵键盘的工作原理与编程ME300B单片机学习开发系统应用之三---4×4矩阵键盘的工作原理与编程作者:山西太原贵国庆本文介绍如何在ME300B型51/AVR单片机学习开发系统上使用数码管显示4×4矩阵键盘的键值。

一、硬件工作原理的简单介绍该实验使用ME300B上的8位数码管显示电路和4×4矩阵键盘电路。

现将这二部分的电路工作原理进行简单的介绍:1、4×4矩阵键盘的工作原理矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。

在行线和列线的每一个交叉点上,设置一个按键。

这样键盘中按键的个数是4×4个。

这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。

图1为ME300B矩阵键盘电路图,行线接P1.4-P1.7,列线接P1.0-P1.3。

地显示。

图3 数码管电路数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。

数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。

若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。

所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮度,又要数码管显示时不产生闪烁现象。

在ME300B单片机开发系统中使用数码管来显示信息时,要将JP2的2、3端短接。

见图3二、演示程序的编程方法1、4×4矩阵键盘的编程方法:1.1、先读取键盘的状态,得到按键的特征编码。

先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。

再从P1口的低四位输出低电平,高四位输出高电平,从P1口的高四位读取键盘状态。

将两次读取结果组合起来就可以得到当前按键的特征编码。

使用上述方法我们得到16个键的特征编码。

举例说明如何得到按键的特征编码:假设“1”键被按下,找其按键的特征编码。

数码管显示4×4键盘矩阵按键实验

数码管显示4×4键盘矩阵按键实验

5、4×4键盘矩阵按键实验一、实验目的及要求键盘实质上是一组按键开关的集合。

通常,键盘开关利用了机械触点的合、断作用。

键的闭合与否,反映在行线输出电压上就是呈高电平或低电平,如果高电平表示键断开,低电平则表示键闭合,反之也可。

通过对行线电平高低状态的检测,便可确认按键按下与否。

为了确保CPU对一次按键动作只确认一次按键有效,还必须消除抖动。

当按键较多时会占用更多的控制器端口,为减少对端口的占用,可以使用行列式键盘接口,本实验中采用的4×4键盘矩阵可以大大减少对单片机的端口占用,但识别按键的代码比独立按键的代码要复杂一些。

在识别按键时使用了不同的扫描程序代码,程序运行时LED灯组会显示相应按键的键值0~15的二进制数。

本实验中P2端口低4位连接是列线,高4位连接的是行线。

二、实验原理(图)三、实验设备(环境):1、电脑一台2、STC-ISP(V6.85I)烧写应用程序3、Keil应用程序四、实验内容(算法、程序、步骤和方法):#include<STC15F2K60S2.h> //此文件中定义了STC15系列的一些特殊功能寄存器#include"intrins.h"#define uint unsigned int#define uchar unsigned charuchar code dsy_code[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0 F,0xff};uchar Pre_keyno=16,keyno=16;void delayMS(char x){uchar i;while(x--)for(i=0;i<120;i++) ;}void keys_scan(){uchar tmp;P2=0x0f;delayMS(5);tmp=P2^0x0f;switch(tmp){case 1:keyno=0;break;case 2:keyno=1;break;case 4:keyno=2;break;case 8:keyno=3;break;default:keyno=16;}P2=0xf0;delayMS(5);tmp=P2>>4^0x0f;switch(tmp){case 1:keyno+=0;break;case 2:keyno+=4;break;case 4:keyno+=8;break;case 8:keyno+=12;break;}}main(){P0=0x00;while(1){P2=0xf0;if(P2!=0xf0)keys_scan();if(Pre_keyno!=keyno){P0=~dsy_code[keyno];Pre_keyno=keyno;}delayMS(50);}}五、实验结论(结果):本实验实现了XXX功能,核心算法采用了XXX的方式,达到了预期目的。

4乘4的矩阵按键

4乘4的矩阵按键

//////////////////////////////////////////////程序编写人:小艾QQ:873808971//程序编写时间:2012-4-23//程序实现的功能:矩阵的显示//////////////////////////////////////////////#include"reg52.h"#define uchar unsigned char#define uint unsigned intvoid time(void);extern void display(unsigned char a,unsigned char b); extern void chuli();//////////////主程序///////////////////////////////void main(){time(); //定时器初始化子程序while(1){chuli();//处理子程序display(2,2);//显示子程序}}////////////定时器初始化///////////////////////////////////////void time(void){TMOD |=0X01;EA=1 ;ET0=1 ;TR0=1 ;}//////////////定时器处理//////////////////////////////////void timep0(void) interrupt 1 using 1{TH0=(65536-20000)/256;TL0=(65536-20000)%256;}#include"reg52.h"#define uchar unsigned char#define uint unsigned int#define key P3extern void delay(unsigned int x);///////////按键处理子程序/////////////////////////////unsigned char keyscan(void){char j,z;key=0x0f; //屏蔽高四位j=key&0x0f; //与if(j!=0x0f) //判断是否有按键按下{delay(400);//延时子程序if((key&0x0f)!=0x0f)//判断按键是否真正按下{j=key&0x0f; //把低四位的值给jkey=0xf0 ; //屏蔽低四位z=key&0xf0; //把高四位值给zif((key&0xf0)!=0xf0)//等待按键抬起switch(j|z) //散转查表{case 0x7e:return 0;break;case 0x7d:return 1;break;case 0x7b:return 2;break;case 0x77:return 3;break;case 0xbe:return 4;break;case 0xbd:return 5;break;case 0xbb:return 6;break;case 0xb7:return 7;break;case 0xde:return 8;break;case 0xdd:return 9;break;case 0xdb:return 10;break;case 0xd7:return 11;break;case 0xee:return 12;break;case 0xed:return 13;break;case 0xeb:return 14;break;case 0xe7:return 15;break;default:return 0xff;break;}}}return 0xff;}#include"reg52.h"#define uchar unsigned char#define uint unsigned int#define output P0unsigned char code we[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code du[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit du_la=P2^1;sbit we_la=P2^0;unsigned char du_l[8]; //寄存器extern void delay(unsigned int x);///////////////显示子程序////////////////////////////////////void display(unsigned int a,unsigned b){uint i; //定义局部变量for(i=0;i<b;i++){output=we[i+a];//位送数据we_la=1; //开位选we_la=0; //锁位选output=du_l[i];//段选送数据du_la=1; //开段选du_la=0; //锁段选delay(200); //延时子程序output=0xff; //清零we_la=1; //开段选we_la=0; //锁段选output=0; //清零du_la=1; //开段选du_la=0; //锁段选}}#include"reg52.h"#define uchar unsigned char#define uint unsigned intextern unsigned char code du[];extern unsigned char du_l[8]; //寄存器extern unsigned char keyscan(void);uchar mun;////////////////处理子程序///////////////////////////////////////void chuli(){mun=keyscan();//调用按键扫描子程序if(mun!=0xff)//判断是否不等于,是执行括号{du_l[0]=du[mun/10];//十位的寄存器du_l[1]=du[mun%10];//个位的寄存器}}#include"reg52.h"#define uchar unsigned char#define uint unsigned int//////////////延时子程序////////////////////////////void delay(unsigned int x){while(--x); }。

51单片机4×4矩阵按键程序汇编

51单片机4×4矩阵按键程序汇编

51单片机4×4矩阵按键程序(汇编)ORG 0000HLJMP MAIN ;跳转至主程序ORG 0100HMAIN: LCALL KEY_INMOV P0,ALCALL DELAJMP MAIN;======================;判断有无按键,无按键直接返回;KEY_IN: MOV P1,#0F0H ;置行线为低电平,读列线状态(在高4位,无按键则全为1); MOV A,P1; ANL A,#0F0H ;屏蔽低四位; MOV B,A; MOV P1,#0FH ;置列线为低电平,读行线状态(在低4位,无按键则全为1); MOV A,P1; ANL A,#0FH; ORL A,B ;高四位与低四位重新组合; CJNE A,#0FFH,KEYSCAN ;0FFH为末按键; RET;==========================================;//=============键盘扫描程序============================================== ;KEYSCAN:KEY_IN: MOV R1,#0 ;初始化列地址MOV R3,#11110111B ;初始化扫描码LOOP:MOV A,R3RL AMOV R3,A ;保留扫描码MOV P1,A ;送扫描码MOV A,P1 ;读键盘ORL A,#0F0H ;屏蔽高四位CJNE A,#0FFH,NEXT31 ;A不等于FFH,说明该列有按键动作INC R1 ;列地址加1,准备扫描下一列CJNE R1,#4,LOOP ;列地址不等于4,扫描下一列SJMP EXIT ;没有按键,退出;//=============按键判断对应位等于零,说明该行有按键按下==================NEXT31:JB ACC.0,NEXT32MOV R2,#0 ;第0行有按键SJMP NEXT5NEXT32:JB ACC.1,NEXT33MOV R2,#1 ;第1行有按键SJMP NEXT5NEXT33:JB ACC.2,NEXT34MOV R2,#2 ;第2行有按键SJMP NEXT5NEXT34:MOV R2,#3 ;第3行有按键NEXT5: ;计算按键地址MOV A,R1RL ARL A ;列地址乘4(每列对应4行) ADD A,R2 ;加行地址MOV DPTR,#KEYTABMOVC A,@A+DPTREXIT:; MOV P1,#0FFH ;置键盘接口高电平RET;延时子程序,1s延时DEL: MOV R7,#10DEL1: MOV R6,#200DEL2: MOV R5,#248HERE: DJNZ R5,HEREDJNZ R6,DEL2DJNZ R7,DEL1RET;//=============按键名称表================================================ KEYTAB:DB 3fH ;扫描码0*****************************************DB 06H ;扫描码1 **DB 5bH ;扫描码2 I/O口 P1.0 P1.1 P1.2 P1.3 ** DB 4fH ;扫描码3 **DB 66H ;扫描码4 P1.4 0 1 2 3 **DB 6dH ;扫描码5 **DB 7dH ;扫描码6 P1.5 4 5 6 7 **DB 07H ;扫描码7 **DB 7fH ;扫描码8 P1.6 8 9 A B **DB 6fH ;扫描码9 **DB 77H ;扫描码A P1.7 C D E F **DB 7cH ;扫描码B **DB 39H ;扫描码C***************************************** DB 5eH ;扫描码DDB 79H ;扫描码EDB 71H ;扫描码FDB 00HDB 00HEND。

4×4矩阵键盘的键值计算及编程

4×4矩阵键盘的键值计算及编程
}
.j
4 键盘扫描编程__线反转法流程分析
/************键盘扫子描函数*******************/
char keyscan(void) //键盘扫描函数,键盘使用P2口
开始
{ char value_h,value_l; //value_h行值变量,value_l列值变量 P2=0xf0; //将行线所处位置置高电平 if((P2&0xf0)!=0xf0) //判断是否有键按下 {
(4行,1列) 77 (4行,2列) 7b (4行,3列) 7d (4行,4列) 7e
.j
3 键盘的键值
总结
4×4矩阵键盘的键值 共有16个,计算键值时总是: 先找出行线值,再找出列线值,最后绘出矩阵键盘的键
值。
.j
4 键盘扫描编程__线反转法
/************键盘扫子描函数*******************/ char keyscan(void) //键盘扫描函数,键盘使用P2口 {
定义 Value_h 行值变量 Value_l 列值变量
特意置: 行线高电平,列线 低电平,去找行值
delay(10); //延时防抖 if((P2&0xf0)!=0xf0) //仍有键按下
{ value_h=P2&0xf0; //读出P2口值给变量value_h
NO 行线高电平有 变化吗?
YES 延时,防抖
P1口高四位是指:P1.7 P1.6 P1.5 P1.4 P1口低四位是指:P1.3 P1.2 P1.1 P1.0
.j
2 读取I/O口值的练习
❖ 用程序控制单片机P2口工作,让高四位全高电平,低四位 全低电平。 即:P2=0xf0;

矩阵键盘键值的计算方法

矩阵键盘键值的计算方法

矩阵键盘键值的计算方法
矩阵键盘键值的计算方法取决于键盘的布局和编码方式。

对于普通键盘,键值通常是通过行列交汇处的物理位置来确定的。

每个按键都与一个特定的行和列相对应。

当按下一个按键时,键盘会发送该按键对应的行列信息给计算机,计算机根据接收到的行列信息确定键值。

例如,对于一个4x4的矩阵键盘,按键的布局如下:
1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D
每个按键都与一个特定的行和列相对应。

当按下数字键5时,键盘会发送行2,列2的信号给计算机,计算机根据接收到的
信号确定键值为5。

不同的键盘可能有不同的编码方式,例如有些键盘可能使用二进制编码,在按下按键时发送一个二进制码给计算机,计算机根据接收到的二进制码来确定键值。

因此,矩阵键盘的键值计算方法主要根据键盘的布局和编码方式来确定。

对于不同的键盘,具体的计算方法可能会有所不同。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
低。
.j
2 读取I/O口值的练习
❖ 一般都是自高到低读出一个端口各脚电平 ,得到8位二进制 数,再将8位二进制转换成2位十六进数。
P1口值=P1.7 P1.6 P1.5 P1.4P1.3 P1.2 P1.1 P1.0 =1101 1111=0x df P3口值= P3.7 P3.6 P3.5 P3.4P3.3 P3.2 P3.1 P3.0 =1111 1010=0xfa
(4行,1列) 77 (4行,2列) 7b (4行,3列) 7d (4行,4列) 7e
.j
3 键盘的键值
总结
4×4矩阵键盘的键值 共有16个,计算键值时总是: 先找出行线值,再找出列线值,最后绘出矩阵键盘的键
值。
.j
4 键盘扫描编程__线反转法
/************键盘扫子描函数*******************/ char keyscan(void) //键盘扫描函数,键盘使用P2口 {
位置
(1行,1列) (1行,2列) (1行,3列) (1行,4列) (2行,1列) (2行,2列) (2行,3列) (2行,4列)
键值
e0+0e=ee d0+0e=de b0+0e=be 70+0e=7e
e0+0d=ed d0+0d=dd b0+0d=bd 70+0d=7d
(3行,1列) (3行,2列) (3行,3列) (3行,4列)
e0+0b=eb
d0+0b=db b0+0b=bb 70+0b=7b
(4行,1列) (4行,2列) (4行,3列) (4行,4列)
e0+07=e7
d0+07=d7 b0+07=b7 70+07=77
3 键盘的键值
注:行列线的排列不同,键值分布也不同
.j
计算键值一般方法
找出行线值
置行线所处端口位置高电平
P1口高四位是指:P1.7 P1.6 P1.5 P1.4 P1口低四位是指:P1.3 P1.2 P1.1 P1.0
.j
2 读取I/O口值的练习
❖ 用程序控制单片机P2口工作,让高四位全高电平,低四位 全低电平。 即:P2=0xf0;
具体实现见操作,结果如图。
.j
2 读取I/O口值的练习
❖ 当 P2=0xf0; 外接一个两脚开关到P2口只能让P2产生如 下四个新的值: 0xe0, 0xd0,0xb0,0x70
0xe0
0x70
.j
2 读取I/O口值的练习
❖ 当 程序使P2=0x0f; 外接一个两脚开关到P2口只能让P2 产生如下四个新的值: 0x0e, 0x0d,0x0b,0x07
0x0d
0x0b
.j
2 读取I/O口值的练习
总结
开关接通后,如果两引脚上电平不同时,会将高电平引脚电压变 低。
.j
3 键盘的键值
4×4矩阵键盘的键值计算及编程
51单片机C语言编程及Proteus仿真
的练习
3
键盘的键值计算
4
键盘扫描编程__线反转法
5
一个数码管显示矩阵键盘值的实验
.j
1 键值计算基本原理__“好人被带坏”
❖ 默认状态:单片机通电复位后P1 P2 P3口每个脚 都输出高电平,P0口要接上拉电阻才能输出高电平。
char value_h,value_l; //value_h行值变量,value_l列值变量 P2=0xf0; //将行线所处位置置高电平 if((P2&0xf0)!=0xf0) //判断是否有键按下
{ delay(10); //延时防抖 if((P2&0xf0)!=0xf0) //仍有键按下 { value_h=P2&0xf0; //读出P2口值给变量value_h P2=0x0f; //将列线所处位置置高电平 value_l=P2&0x0f; //读出P2口值给变量value_l return(value_l+value_h); //找到的键值返回给调用函数 } }
定义 Value_h 行值变量 Value_l 列值变量
特意置: 行线高电平,列线 低电平,去找行值
delay(10); //延时防抖 if((P2&0xf0)!=0xf0) //仍有键按下
{ value_h=P2&0xf0; //读出P2口值给变量value_h
NO 行线高电平有 变化吗?
YES 延时,防抖
a 各脚状态标记都是红色方块。 b 用电压测量都是5V。
.j
1 键值计算基本原理__“好人被带坏”
❖ 要使一个引脚变为低电平有如下方法:
a 接地。 b 用逻辑状态信号人为改变。 c 编写程序使其输出低电平。
.j
1 键值计算基本原理__“好人被带坏”
❖ 一个低电平引脚与高电平引脚相接,结果如何? 实验结果:“好人被带坏”,即高电平引脚电压被变
}
.j
4 键盘扫描编程__线反转法流程分析
/************键盘扫子描函数*******************/
char keyscan(void) //键盘扫描函数,键盘使用P2口
开始
{ char value_h,value_l; //value_h行值变量,value_l列值变量 P2=0xf0; //将行线所处位置置高电平 if((P2&0xf0)!=0xf0) //判断是否有键按下 {
找出列线值
置列线所处端口位置高电平
行线值+列线值=键值
3 键盘的键值
键盘的键值
位置
键值
(1行,1列) e7 (1行,2列) eb (1行,3列) ed (1行,4列) ee
(2行,1列) d7 (2行,2列) db (2行,3列) dd (2行,4列) de
(3行,1列) b7 (3行,2列) bb (3行,3列) bd (3行,4列) be
P2口接有4×4 键盘,低四位做行线,高四位做列线。
.j
3 键盘的键值
找行线值时,程序使P2=0x0f; P2.0行线上开关按下会使P2口值变为 0x0e, 其余同理。
.j
3 键盘的键值
找列线值时,程序使P2=0xf0; P2.7列线上开关按下会使P2口值变为 0x70, 其余同理。
.j
键盘的键值
P2=0x0f; //将列线所处位置置高电平 value_l=P2&0x0f; //读出P2口值给变量value_l
NO 行线高电平有 变化吗?
return(value_l+value_h); //找到的键值返回给调用函数
YES
相关文档
最新文档