数码管显示4×4矩阵键盘的键盘号(-程序解释好了-)大作业

合集下载

4-4键盘数码管显示程序解析

4-4键盘数码管显示程序解析

4*4键盘数码管显示程序解析这个例程也是开发板上面的一个经典例程,我对程序的框架进行了修改,更适合以后的调用。

具体的4*4键盘扫描原理较为基础这里不再赘述,这里我认为比较重要的是要养成一个良好的写程序的习惯,想4*4键盘扫描这样的函数可以写成一个固定的C 或者H文件,便于以后调用。

先看看主程序:/***********************************************程序功能:扫描4X4键盘并将键值在数码管上显示------------------------------------------------测试说明:按动K1~K16按键,观察数码管显示************************************************/#include 《msp430x14x.h》#include “Keypad.C”//数码管7位段码:0--funsigned char scandata[16]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//记录显示位数的全局变量unsigned char cnt = 0;//显示缓存unsigned char Dispbuf[2];//引用外部变量的声明extern unsigned char key_Pressed;extern unsigned char key_val;extern unsigned char key_Flag;/********************主函数********************/void main(void){/*下面六行程序关闭所有的IO口*/。

数码管显示4×4矩阵键盘的键盘号程序解释好了大作业.doc

数码管显示4×4矩阵键盘的键盘号程序解释好了大作业.doc

《单片机原理及应用课程设计》报告——数码管显示4×4矩阵键盘的键盘号专业:电子信息科学与技术班级:姓名:学号:指导教师:2012年5月15日1、课程设计目的1.1巩固和加深对单片机原理和接口技术知识的理解;1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。

2、课程设计要求单片机的P1口的P1.0~P1.7连接4×4矩阵键盘,P0口控制一只数码管,当4×4矩阵键盘中的某一按键按下时,数码管上显示对应的键号。

例如,1号键按下时,数码管显示“1”, 14号键按下时,数码管显示“E”等等。

3、硬件设计3.1 设计思想分析本任务的要求,在课程设计的基础上,添加要求,使设计能够完成当4×4矩阵键盘中的某一按键按下时,数码管上显示对应的键号。

3.2主要元器件介绍:AT89C51单片机 LED数码管 4X4矩阵键盘3.3 功能电路介绍AT89C51单片机:控制器。

程序中将单片机的引脚置高电平低电平,单片机通过读取IO引脚的电平,在根据读取的数据去查找数组中相应的按键值,然后在送到数码管也就是P0口去显示.(51单片机通过IO口来读取键盘的电平,再通过程序来查找对应的数值,在送到数码管去显示)LED数码管 :输出设备4X4矩阵键盘:输入设备4、软件设计4.1 设计思想通过对矩阵键盘的逐行扫描,来获得所按下键的键盘号,最终通过数码管显示出来。

4.2软件流程图4.3源程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//定义显示段码uchar num,temp;void delay(uchar k)//定义延时函数{uchar i,j;for(i=k;i>0;i--)for(j=110;j>0;j--);}void disp(char num1)//定义显示函数{P0=table[num1];//将段码值送入P0口显示}char keyscan()//定义键盘检测函数{P1=0xfe;//给P1口送检测信号11111110,即先检测第一列有无按键被按下(key1~key4)temp=P1;//将检测信号赋给变量temptemp=temp&0xf0;//与11110000相“与”去除低四位检测部分while(temp!=0xf0)//判断是否有按键被按下,即key1-key4有任意按键被按下temp便不等于0xff{delay(5);//按键防抖动延时(时间要求不严格)while(temp!=0xf0)//延时之后再次判断{temp=P1;//进入函数说明有按键被按下,再将p1值赋给temp进行判断是哪位被按下switch(temp)//利用switch函数判断temp值{case 0xee://若P0等于0xee,即11101110,则由判断为0的位被按下即第四位(最低位),则应赋值num为0;num=0;break;case 0xde://11011110同理判断其为第三位被按下(该行第二位)num=1num=1;break;case 0xbe://同上则num=2num=2;break;case 0x7e://同上num=3num=3;break;}while(temp!=0xf0)//判断按键是否松开,循环判断直至按键松开{temp=P1;temp=temp&0xf0;}}}P1=0xfd;//给P1口再次送检测信号11111101,来检测第二列有无按键被按下(key5~key8),以下几步同上temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);while(temp!=0xf0){temp=P1;switch(temp){case 0xed:num=4;break;case 0xdd:num=5;break;case 0xbd:num=6;break;case 0x7d:num=7;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfb;//给P1口再次送检测信号11111011,来检测第三列有无按键被按下(key9~key12),以下几步同上temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);while(temp!=0xf0){temp=P1;switch(temp){case 0xeb:num=8;break;case 0xdb:num=9;break;case 0xbb:num=10;break;case 0x7b:num=11;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xf7;//给P1口再次送检测信号11110111,来检测第四列有无按键被按下(key13~key16),以下几步同上temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);while(temp!=0xf0){temp=P1;switch(temp){case 0xe7:num=12;break;case 0xd7:num=13;break;case 0xb7:num=14;break;case 0x77:num=15;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}return num;//子函数最后返回num值}void main(){P0=0x00;//清屏delay(5);//延时while(1)//主循环{disp(keyscan());//检测并显示}}}。

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单片机键盘设计(二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。

4×4矩阵式键盘按键

4×4矩阵式键盘按键

一、实验目的1.掌握4×4矩阵式键盘程序识别原理2.掌握4×4矩阵式键盘按键的设计方法二、设计原理(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号(2)键盘中对应按键的序号排列如图14.1所示三、参考电路740)this.width=740" border=undefined>图14.2 4×4矩阵式键盘识别电路原理图740)this.width=740" border=undefined>图14.1 4×4键盘0-F显示740)this.width=740" border=undefined>图14.3 4×4矩阵式键盘识别程序流程图四、电路硬件说明(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五、程序设计内容(1)4×4矩阵键盘识别处理(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码矩阵的行线和列线分别通过两并行接口和CPU通信键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能六、程序流程图(如图14.3所示)七、汇编源程序;;;;;;;;;;定义单元;;;;;;;;;;COUNT EQU 30H;;;;;;;;;;入口地址;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100HSTART: LCALL CHUSHIHUA LCALL PANDUANLCALL XIANSHILJMP START ;;;;;;;;;;初始化程序;;;;;;;;;; CHUSHIHUA: MOV COUNT#00H RET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;; PANDUAN: MOV P3#0FFHCLR P3.4MOV A P3ANL A#0FHXRL A#0FHJZ SW1LCALL DELAY10MSJZ SW1MOV A P3ANL A#0FHCJNE A#0EH K1MOV COUNT#0LJMP DKK1: CJNE A#0DH K2MOV COUNT#4LJMP 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#0FHXRL 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#0FHXRL 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#0FHXRL 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#11LJMP DKKF: CJNE A#07H KG MOV COUNT#15KG: NOPLJMP DKSW4: LJMP PANDUAN DK: RET ;;;;;;;;;;显示程序;;;;;;;;;; XIANSHI: MOV A COUNT MOV DPTR#TABLE MOVC A@A+DPTRMOV P0 ALCALL DELAYSK: MOV A P3ANL A#0FHXRL A#0FHJNZ SKRET ;;;;;;;;;;10ms延时程序;;;;;;;;;;DELAY10MS: MOV R6#20D1: MOV R7#248DJNZ R7$DJNZ R6D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5#20LOOP: LCALL DELAY10MSDJNZ R5LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH06H5BH4FH66H6DH7DH07H DB 7FH6FH77H7CH39H5EH79H71H ;;;;;;;;;;结束标志;;;;;;;;;;END八、C语言源程序#include<AT89X51.H>unsigned char code table[]={0x3f0x660x7f0x390x060x6d0x6f0x5e0x5b0x7d0x770x790x4f0x070x7c0x71};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;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;key=14;break;case 0x07:key=15;break;}P0=table[key];}}}}九、注意事项在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。

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仿真作业时的屏幕截图如下:。

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矩阵式键盘识别源程序

C语言源程序#include <AT89X51.H>unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char temp;unsigned char key;unsigned char i,j;void main(void){while(1){P3=0xff; /*第1行;一开始数码管全亮即是8*/ P3_4=0; /*决定第1行的标志*/temp=P3;temp=temp & 0x0f;if (temp!=0x0f) /*当P3无改变时跳过*/{for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=3;break;case 0x0d:key=2;break;case 0x0b:key=1;break;case 0x07:key=0;break;}temp=P3;/* P1_0=~P1_0原文多了这句*/P0=table[key];temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}}}P3=0xff; /*第2行*/P3_5=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=7;break;case 0x0d:key=6;break;case 0x0b:key=5;break;case 0x07:key=4;break;}temp=P3;/* P1_0=~P1_0原文多了这句*/P0=table[key];temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}}}P3=0xff; /*第3行*/P3_6=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=10;break;case 0x0d:key=9;break;case 0x0b:key=8;break;case 0x07:key=7;break;}temp=P3;/* P1_0=~P1_0原文多了这句*/P0=table[key];temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}}}P3=0xff; /*第4行*/P3_7=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=16;break;case 0x0d:key=13;break;case 0x0b:key=12;break;case 0x07:key=11;break;}temp=P3;/* P1_0=~P1_0原文多了这句*/P0=table[key];temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}}}}}。

4乘4矩阵按键原理

4乘4矩阵按键原理

4乘4矩阵按键原理矩阵按键是一种常见的电子元器件,广泛应用于各种电子设备中,如计算机键盘、手机键盘、遥控器等。

在这些设备中,我们经常会见到由一个个小方块组成的按键,而这些按键背后的原理就是矩阵按键。

矩阵按键由一个由导电材料制成的薄膜组成,薄膜上有一定数量的排列成矩阵的小方块,每个小方块都代表一个按键。

这些小方块之间通过细小的导电线相连,形成一个矩阵结构。

当我们按下某个按键时,按键与其所在的小方块接触,导电线上的电流流过按键与小方块之间的接触点,从而实现按键的输入。

矩阵按键的原理是基于电流的传导和控制。

在未按下按键时,导电线上的电流无法通过按键与小方块之间的接触点,因此无法形成通路,电流无法流动。

而当我们按下某个按键时,按键与其所在的小方块接触,导电线上的电流可以通过按键与小方块之间的接触点,形成通路,电流开始流动。

通过探测导电线上电流变化的电路,我们可以判断出具体哪个按键被按下。

矩阵按键的矩阵结构使得它可以同时控制多个按键。

在一个4乘4的矩阵按键中,共有16个小方块,分为4行4列。

通过逐行或逐列扫描的方式,可以检测到同时按下多个按键的情况。

当扫描到某一行或某一列的电流发生变化时,我们就可以确定在该行或该列上被按下的按键。

通过这种方式,我们可以实现对多个按键的同时控制。

矩阵按键的原理使得它具有一些优势。

首先,它可以在有限的空间内实现多个按键的布局,节省了设备的空间。

其次,矩阵按键的结构简单,制造成本相对较低。

此外,矩阵按键还具有较好的耐用性和稳定性,使用寿命长。

然而,矩阵按键也存在一些不足之处。

首先,由于矩阵按键的原理是基于电流的传导,因此在使用过程中可能会受到外部干扰而产生误触。

其次,矩阵按键的布线复杂,需要精确的设计和制造,增加了生产的难度和成本。

此外,矩阵按键的触感相对较差,无法提供与机械按键相似的手感。

为了解决这些问题,现在也有一些新型的按键技术出现。

例如,采用电容感应技术的触摸按键,通过感应手指接近或触摸的电容变化来实现按键的输入。

单片机-数码管显示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个矩阵按键控制数码管显⽰数字程序1 #include "8051.h"2 typedef unsigned char u8;3 typedef unsigned int u16;4 u8 smgduan[]= {5/*0 1 2 3 4 5 6 7 */60x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,7/*8 9 A B C D E F */80x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};910// P0⼝为数码管的位选的8位输⼊引脚11// P0 = 0x00;121314void Delayms(u16 ms);15void shumaguan(u8 n);16void DigDisplay();17void KeyTest();18void smg(u8 n, u8 m);19void key_4x4();2021void main()22 {23while(1)24 {25 key_4x4();26 }27 }2829// 不精确的延时函数30void Delayms(u16 ms)31 {32 unsigned int i, j;33for(i = ms; i > 0; i--)34for(j = 110; j > 0; j--);35return;36 }3738// 数码管根据74HC138译码器选择对应的段(选择哪个数码管显⽰)39void shumaguan(u8 n)40 {41switch(n)42 {43case0:44 LSA = 0;LSB = 0;LSC = 0;break;45case1:46 LSA = 1;LSB = 0;LSC = 0;break;47case2:48 LSA = 0;LSB = 1;LSC = 0;break;49case3:50 LSA = 1;LSB = 1;LSC = 0;break;51case4:52 LSA = 0;LSB = 0;LSC = 1;break;53case5:54 LSA = 1;LSB = 0;LSC = 1;break;55case6:56 LSA = 0;LSB = 1;LSC = 1;break;57case7:58 LSA = 1;LSB = 1;LSC = 1;break;59 }60 }6162// 数码管显⽰数字,并以⼗进制递增63void DigDisplay()64 {65 u8 i1 = 0;66 u8 i2 = 0;67 u8 i3 = 0;68 u8 i4 = 0;69 u8 i5 = 0;70 u8 i6 = 0;71 u8 i7 = 0;72 u8 i8 = 0;7374757677for (i8 = 0; i8 < 10; i8++)78for (i7 = 0; i7 < 10; i7++)79for (i6 = 0; i6 < 10; i7++)80for (i5 = 0; i5 < 10; i5++)81for (i4 = 0; i4 < 10; i4++)82for (i3 = 0; i3 < 10; i3++)83for (i2 = 0; i2 < 10; i2++)84for (i1 = 0; i1 < 10; i1++)85 {86 u16 cnt = 10;87while (cnt--)88 {89 shumaguan(0); //选中第⼀个数码管90 P0 = smgduan[i1]; //给他送⼀个数字91 Delayms(1); //稍微延时⼀下下92 shumaguan(1); //然后切换到第⼆个数码管。

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键盘(任意同时按键按下有效)扫程序-数码管显示键值
case 16:if(col3==0) key=15;n=1;break;
}
}
void main()
{
unsigned char i, key_key[16];
while(1)
{
for(i=0;i<16;i++)
{
key_4x4();
duan_xuan();_xuan();
}
}
for(i=x;i>0;--i)
for(j=114;j>0;--j);
}
void duan_xuan()
{
wr=0; //时钟输入端WR置低电平
cs1=0;//cs1为低电平选通段码锁存IC
wr=1; //时钟输入端WR置高电平,WR得到上升沿
cs1=1;//cs1为高电平,段码锁存IC锁存输出保持不变
case 4:if(col3==0) key=3;n=5;break;
case 5:row1=0;row0=1;if(col0==0) key=4;n=6;break;
case 6:if(col1==0) key=5;n=7;break;
case 7:if(col2==0) key=6;n=8;break;
{
static unsigned char n=1;
// P2=0XFF;
switch(n)
{
case 1:row0=0;row3=1;if(col0==0) key=0;n=2;break;
case 2:if(col1==0) key=1;n=3;break;
case 3:if(col2==0) key=2;n=4;break;

数码管显示4×4矩阵键盘的键盘号(程序解释好了)大作业

数码管显示4×4矩阵键盘的键盘号(程序解释好了)大作业

数码管显⽰4×4矩阵键盘的键盘号(程序解释好了)⼤作业《单⽚机原理及应⽤课程设计》报告——数码管显⽰4×4矩阵键盘的键盘号专业:电⼦信息科学与技术班级:姓名:学号:指导教师:2012年5⽉15⽇1、课程设计⽬的1.1巩固和加深对单⽚机原理和接⼝技术知识的理解;1.2培养根据课题需要选学参考书籍、查阅⼿册和⽂献资料的能⼒;1.3学会⽅案论证的⽐较⽅法,拓宽知识,初步掌握⼯程设计的基本⽅法;1.4掌握常⽤仪器、仪表的正确使⽤⽅法,学会软、硬件的设计和调试⽅法;1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能⽤计算机绘制电路图和流程图。

2、课程设计要求单⽚机的P1⼝的P1.0~P1.7连接4×4矩阵键盘,P0⼝控制⼀只数码管,当4×4矩阵键盘中的某⼀按键按下时,数码管上显⽰对应的键号。

例如,1号键按下时,数码管显⽰“1”, 14号键按下时,数码管显⽰“E”等等。

3、硬件设计3.1 设计思想分析本任务的要求,在课程设计的基础上,添加要求,使设计能够完成当4×4矩阵键盘中的某⼀按键按下时,数码管上显⽰对应的键号。

3.2主要元器件介绍:AT89C51单⽚机 LED数码管 4X4矩阵键盘3.3 功能电路介绍AT89C51单⽚机:控制器。

程序中将单⽚机的引脚置⾼电平低电平,单⽚机通过读取IO引脚的电平,在根据读取的数据去查找数组中相应的按键值,然后在送到数码管也就是P0⼝去显⽰.(51单⽚机通过IO⼝来读取键盘的电平,再通过程序来查找对应的数值,在送到数码管去显⽰)LED数码管 :输出设备4X4矩阵键盘:输⼊设备4、软件设计4.1 设计思想4.3源程序#include#define uchar unsigned char 开始初始化扫描键盘第⼀⾏若有按键按下,显⽰键盘号结束,返回若⽆按键按下扫描键盘第⼆⾏扫描键盘第三⾏扫描键盘第四⾏结束,返回若⽆按键按下若⽆按键按下若⽆按键按下#define uint unsigned intuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//定义显⽰段码uchar num,temp;void delay(uchar k)//定义延时函数{uchar i,j;for(i=k;i>0;i--)for(j=110;j>0;j--);}void disp(char num1)//定义显⽰函数{P0=table[num1];//将段码值送⼊P0⼝显⽰}char keyscan()//定义键盘检测函数{P1=0xfe;//给P1⼝送检测信号11111110,即先检测第⼀列有⽆按键被按下(key1~key4)temp=P1;//将检测信号赋给变量temptemp=temp&0xf0;//与11110000相“与”去除低四位检测部分while(temp!=0xf0)//判断是否有按键被按下,即key1-key4有任意按键被按下temp便不等于0xff{delay(5);//按键防抖动延时(时间要求不严格)while(temp!=0xf0)//延时之后再次判断{temp=P1;//进⼊函数说明有按键被按下,再将p1值赋给temp进⾏判断是哪位被按下switch(temp)//利⽤switch函数判断temp值{case 0xee://若P0等于0xee,即11101110,则由判断为0的位被按下即第四位(最低位),则应赋值num为0;num=0;break;break;case 0xbe://同上则num=2num=2;break;case 0x7e://同上num=3num=3;break;}while(temp!=0xf0)//判断按键是否松开,循环判断直⾄按键松开{temp=P1;temp=temp&0xf0;}}}P1=0xfd;//给P1⼝再次送检测信号11111101,来检测第⼆列有⽆按键被按下(key5~key8),以下⼏步同上temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);while(temp!=0xf0){temp=P1;switch(temp){case 0xed:num=4;break;case 0xdd:num=5;break;case 0xbd:case 0x7d:num=7;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfb;//给P1⼝再次送检测信号11111011,来检测第三列有⽆按键被按下(key9~key12),以下⼏步同上temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);while(temp!=0xf0){temp=P1;switch(temp){case 0xeb:num=8;break;case 0xdb:num=9;break;case 0xbb:num=10;break;case 0x7b:}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xf7;//给P1⼝再次送检测信号11110111,来检测第四列有⽆按键被按下(key13~key16),以下⼏步同上temp=P1;temp=temp&0xf0;while(temp!=0xf0){delay(5);while(temp!=0xf0){temp=P1;switch(temp){case 0xe7:num=12;break;case 0xd7:num=13;break;case 0xb7:num=14;break;case 0x77:num=15;break;}while(temp!=0xf0)temp=temp&0xf0;}}}return num;//⼦函数最后返回num值} void main(){P0=0x00;//清屏delay(5);//延时while(1)//主循环{disp(keyscan());//检测并显⽰}}}5、调试运⾏电路图K=15时的数码管显⽰:6、设计⼼得体会硬件设计⽅⾯,此课题所需的硬件并不负责,只许少量的导线、简单的电路便可以完成。

数字系统设计大作业--4×4阵列键盘键信号检测电路设计

数字系统设计大作业--4×4阵列键盘键信号检测电路设计

2014 ~ 2015学年第1 学期《数字系统设计》大作业题目:4×4阵列键盘键信号检测电路设计专业:电子信息工程班级:姓名:指导教师:电气工程学院2015 年12月摘要人类文明已进入到高度发达的信息化社会。

信息化社会的发展离不开电子信息产品开发技术、产品品质的提高和进步。

电子信息产品随着科学技术的进步,其电子器件和设计方法更新换代的速度日新月异。

实现这种进步的主要原因就是电子设计技术和电子制造技术的发展,其核心就是电子设计自动化(EDA,Electronic Design Automation)技术,EDA技术的发展和推广应用又极大地推动了电子信息产业的发展。

为保证电子系统设计的速度和质量,适应“第一时间推出产品”的设计要求,EDA技术正逐渐成为不可缺少的一项先进技术和重要工具。

目前,在国内电子技术教学和产业界的技术推广中已形成“EDA热”,完全可以说,掌握EDA技术是电子信息类专业学生、工程技术人员所必备的基本能力和技能。

本设计主要利用VHDL硬件描述语言在EDA平台xilinx.ise.7.1i上设计一个4×4阵列键盘扫描电路,将行扫描信号输入阵列键盘,读取列信号的值,输出按键编码,从而判断出按键按下的位置。

并且使用Modelsim软件进行模拟仿真,下载到EDA实验箱进行硬件验证。

关键词:EDA VHDL语言 4×4阵列键盘扫描目录《数字系统设计》 (1)数字系统设计.............................................................................. 错误!未定义书签。

摘要 (2)关键词:EDA VHDL语言 4×4阵列键盘扫描 (2)1、实验目的 (4)2、实验要求 (4)3、实验原理 (4)4、总体框图 (5)4.1.1方案一 (5)4.1.2方案二 (5)4.2设计思路 (6)5、功能模块介绍 (8)5.1键盘消抖模块 (8)5.2键盘模块 (8)5.3VHDL部分程序 (8)6、实验结果 (10)6.1综合电路图 (10)6.2时序仿真 (11)1、实验目的(1)通过常见基本组合逻辑电路的设计,熟悉EDA设计流程;(2)熟悉文本输入及仿真步骤;(3)掌握VHDL设计实体的基本结构及文字规则;(4)理解硬件描述语言和具体电路的映射关系;(5)用VHDL设计一个能识别4×4阵列键盘的实用电路。

4乘4矩阵键盘扫描加数码管显示代码

4乘4矩阵键盘扫描加数码管显示代码

4*4矩阵键盘扫描加数码管显示遵义师范学院(工学院)电气工程及其自动化黎卫星/********************************************************** *****///º¯ÊýÍ·Îļþ/********************************************************** *****/#include<reg51.h>#include<delay.h>#include<ciodziku.h>#include<keyjiance.h>#include<displychushihua.h>/********************************************************** *****///Ö÷º¯Êý/********************************************************** *****/void main(){displaychushihua();while(1){num=keyjiance();dula=1;P0=~table[num-1];dula=0;}}/***************************************************///ÑÓʱº¯Êý/***************************************************/void delay(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/********************************************************** *****///Êý×Ö¿â/********************************************************** *****/sbit dula = P2^6;sbit wela = P2^7;/***************************************************************//********************************************************** *****/unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00//0x00Ϊ¹Ø±ÕËùÊýÂë¹ÜÏÔʾ};/********************************************************** *****///¼üÅÌɨÃè/********************************************************** *****/unsigned int temp,num;/********************************************************** *****//********************************************************** *****/unsigned int keyjiance()// unsigned int º¯Êý·µ»ØÖµÀàÐÍʹÓÃvoidΪÎÞ·µ»ØÖµ»á³ö´í{P3=0XFE; //µÚÒ»Ðмì²âtemp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){ case 0xee:num=1;break;case 0xde:num=2;.break;case 0xbe:num=3;break;case 0x7e:num=4;break;} while(temp!=0xf0)//°´¼üËÉÊÖ¼ì²â{temp=P3;temp=temp&0xf0;.}//dula=1;//P0=~table[num-1];// dula=0;}}P3=0XFD; //µÚ¶þÐмì²âtemp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){ case 0xed:num=5;.break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;} while(temp!=0xf0)//°´¼üËÉÊÖ¼ì²â{temp=P3;.temp=temp&0xf0;}//dula=1;//P0=~table[num-1];// dula=0;}}P3=0XFB; //µÚÈýÐмì²âtemp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;.switch(temp){ case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}. while(temp!=0xf0)//°´¼üËÉÊÖ¼ì²â{temp=P3;temp=temp&0xf0;}// dula=1;// P0=~table[num-1];// dula=0;}}P3=0XF7; //µÚËÄÐпªÊ¼¼ì²âtemp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){ case 0xe7:num=13;break;case 0xd7:num=14;break;case 0xb7:num=15;break;case 0x77:num=16;break;} while(temp!=0xf0)//°´¼üËÉÊÖ¼ì²â{temp=P3;temp=temp&0xf0;}//dula=1;//P0=~table[num-1];//dula=0;}}return (num); //º¯Êý·µ»ØÖµ// dula=1;// P0=~table[num-1];// dula=0;}/********************************************************** *****//********************************************************** *****/void displaychushihua(){num=17;//µÚ17¸öÊýΪ¹Ø±ÕËùÓÐÊýÂë¹Ü0x00// dula=1;//P0=0xff;//³õʼ»¯ÇåÁã ²»¸ø¶ÏÑ¡ËÍÊý ÊýÂë¹Ü²»ÁÁ// dula=0;wela=1;P0=~0xc0;wela=0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《单片机原理及应用课程设计》报告
——数码管显示4×4矩
阵键盘的键盘号
专业:电子信息科学与技术
班级:
姓名:
学号:
指导教师:
2012年 5月15日
1、课程设计目的
1.1巩固和加深对单片机原理和接口技术知识的理解;
1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;
1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;
1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;
1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。

2、课程设计要求
单片机的P1口的P1.0~P1.7连接4×4矩阵键盘,P0口控制一只数码管,当4×4矩阵键盘中的某一按键按下时,数码管上显示对应的键号。

例如,1号键按下时,数码管显示“1”, 14号键按下时,数码管显示“E”等等。

3、硬件设计
3.1 设计思想
分析本任务的要求,在课程设计的基础上,添加要求,使设计能够完成当4×4矩阵键盘中的某一按键按下时,数码管上显示对应的键号。

3.2主要元器件介绍:
AT89C51单片机 LED数码管 4X4矩阵键盘
3.3 功能电路介绍
AT89C51单片机:控制器。

程序中将单片机的引脚置高电平低电平,单片机通过读取IO引脚的电平,在根据读取的数据去查找数组中相应的按键值,然后在送到数码管也就是P0口去显示.(51单片机通过IO口来读取键盘的电平,再通过程序来查找对应的数值,在送到数码管去显示)
LED数码管 :输出设备
4X4矩阵键盘:输入设备
4、软件设计
4.1 设计思想
通过对矩阵键盘的逐行扫描,来获得所按下键的键盘号,最终通过数码管显示出来。

4.2软件流程图
4.3源程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//定义显示段码
uchar num,temp;
void delay(uchar k)//定义延时函数
{
uchar i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
void disp(char num1)//定义显示函数
{
P0=table[num1];//将段码值送入P0口显示
}
char keyscan()//定义键盘检测函数
{
P1=0xfe;//给P1口送检测信号11111110,即先检测第一列有无按键被按下(key1~key4)
temp=P1;//将检测信号赋给变量temp
temp=temp&0xf0;//与11110000相“与”去除低四位检测部分
while(temp!=0xf0)//判断是否有按键被按下,即key1-key4有任意按键被按下temp便不等于0xff
{
delay(5);//按键防抖动延时(时间要求不严格)
while(temp!=0xf0)//延时之后再次判断
{
temp=P1;//进入函数说明有按键被按下,再将p1值赋给temp进行判断是哪位被按下
switch(temp)//利用switch函数判断temp值
{
case 0xee://若P0等于0xee,即11101110,则由判断为0的位被按下即第四位(最低位),则应赋值num为0;
num=0;
break;
case 0xde://11011110同理判断其为第三位被按下(该行第二位)num=1
num=1;
break;
case 0xbe://同上则num=2
num=2;
break;
case 0x7e://同上num=3
num=3;
break;
}
while(temp!=0xf0)//判断按键是否松开,循环判断直至按键松开
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;//给P1口再次送检测信号11111101,来检测第二列有无按键被按下(key5~key8),以下几步同上
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:
num=4;
break;
case 0xdd:
num=5;
break;
case 0xbd:
num=6;
break;
case 0x7d:
num=7;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;//给P1口再次送检测信号11111011,来检测第三列有无按键被按
下(key9~key12),以下几步同上
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:
num=8;
break;
case 0xdb:
num=9;
break;
case 0xbb:
num=10;
break;
case 0x7b:
num=11;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;//给P1口再次送检测信号11110111,来检测第四列有无按键被按下(key13~key16),以下几步同上
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:
num=12;
break;
case 0xd7:
num=13;
break;
case 0xb7:
num=14;
break;
case 0x77:
num=15;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
return num;//子函数最后返回num值}
void main()
{
P0=0x00;//清屏
delay(5);//延时
while(1)//主循环
{
disp(keyscan());//检测并显示
}
}
}
5、调试运行
电路图
依次按下开关k1-k16,数码管会对应显示出0—f的16个数字K=2的数码管显示2.
K=15时的数码管显示

6、设计心得体会
硬件设计方面,此课题所需的硬件并不负责,只许少量的导线、简单的电路便可以完成。

软件设计方面,我感觉到在编写循环嵌套程序时非常容易出错,需要反复的查错和耐心的调试。

我虽然能够编写出程序,其可读性却有待于提高。

经过这次课程设计,我对51系统的单片机内部构造的了解认识有了一定程度的提高。

我体会到做设计是一项细致的工作,必须要投入时间及精力,要有耐心有韧性。

我相信这次的课程设计为我以后的发展打下一定的基础,我会更加努力,争取自己在单片机的开发上有更深层次的提高。

参考书目:
[1] 肖金球. 单片机原理与接口技术.[M].北京:清华大学出版社,2004.12。

相关文档
最新文档