单片机C语言程序设计:数码管显示4X4矩阵键盘按键号

合集下载

数码管显示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());//检测并显示}}}。

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```。

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。

(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。

在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

操作方完成矩阵式键盘实验。

具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。

完成思考题。

三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。

2.在keil上进行编译后生成“xxx.hex”文件。

3.编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。

单片机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拨上去。

单片机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 000BH. RETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100HSTART: LCALL CHUSHIHUALCALL PANDUANLCALL XIANSHILJMP START;;;;;;;;;;初始化程序;;;;;;;;;;CHUSHIHUA: MOV COUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;; PANDUAN: MOV P3,#0FFHCLR P3.4. MOV 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,K3MOV COUNT,#8LJMP DKK3: CJNE A,#07H,K4MOV COUNT,#12K4: NOPLJMP DK. SW1: MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW2LCALL DELAY10MSJZ SW2MOV A,P3ANL A,#0FHCJNE A,#0EH,K5MOV COUNT,#1LJMP DKK5: CJNE A,#0DH,K6MOV COUNT,#5LJMP DKK6: CJNE A,#0BH,K7MOV COUNT,#9LJMP DKK7: CJNE A,#07H,K8MOV COUNT,#13. K8: NOPLJMP DKSW2: MOV P3,#0FFHCLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW3LCALL DELAY10MSJZ SW3MOV A,P3ANL A,#0FHCJNE A,#0EH,K9MOV COUNT,#2LJMP DKK9: CJNE A,#0DH,KAMOV COUNT,#6LJMP DKKA: CJNE A,#0BH,KBMOV COUNT,#10LJMP DK. KB: CJNE A,#07H,KCMOV COUNT,#14KC: NOPLJMP DKSW3: MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW4LCALL DELAY10MSJZ SW4MOV A,P3ANL A,#0FHCJNE A,#0EH,KDMOV COUNT,#3LJMP DKKD: CJNE A,#0DH,KEMOV COUNT,#7LJMP DKKE: CJNE A,#0BH,KF. MOV COUNT,#11LJMP DKKF: CJNE A,#07H,KGMOV COUNT,#15KG: NOPLJMP DKSW4: LJMP PANDUANDK: 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,#20.D1: 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: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: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;{ 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;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拨上去。

单片机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,#0FHXRL A,#0FHJZ SW1LCALL DELAY10MSJZ SW1MOV A,P3ANL A,#0FHCJNE A,#0EH,K1 MOV COUNT,#0LJMP DKK1: CJNE A,#0DH,K2 MOV COUNT,#4LJMP DKK2: CJNE A,#0BH,K3 MOV COUNT,#8LJMP DKK3: CJNE A,#07H,K4 MOV COUNT,#12K4: NOPLJMP DKSW1: MOV P3,#0FFH CLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW2LCALL DELAY10MSJZ SW2MOV A,P3ANL A,#0FHCJNE A,#0EH,K5 MOV COUNT,#1LJMP DKK5: CJNE A,#0DH,K6 MOV COUNT,#5LJMP DKK6: CJNE A,#0BH,K7 MOV COUNT,#9LJMP DKK7: CJNE A,#07H,K8 MOV COUNT,#13K8: NOPLJMP DKSW2: MOV P3,#0FFH CLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW3LCALL DELAY10MSJZ SW3MOV A,P3ANL A,#0FHCJNE A,#0EH,K9 MOV COUNT,#2LJMP DKK9: CJNE A,#0DH,KA MOV COUNT,#6LJMP 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,KD MOV COUNT,#3LJMP DKKD: CJNE A,#0DH,KE MOV COUNT,#7LJMP DKKE: CJNE A,#0BH,KFLJMP DKKF: CJNE A,#07H,KGMOV COUNT,#15KG: NOPLJMP DKSW4: LJMP PANDUANDK: 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,#20DJNZ R7,$DJNZ R6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5,#20LOOP: LCALL DELAY10MSDJNZ R5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 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: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: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;{ 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;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拨上去。

数码管显示4×4矩阵键盘

数码管显示4×4矩阵键盘

《单片机原理及应用课程设计》报告——数码管显示4×4矩阵键盘的键盘号专业:自动化班级: 1106姓名:王佳俊学号: 110240171指导教师:卜旭芳2014年 10月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());//检测并显示}}}5、调试运行电路图依次按下开关k1-k16,数码管会对应显示出0—f的16个数字K=5的数码管显示4.K=16时的数码管显示F:6、设计心得体会硬件设计方面,此课题所需的硬件并不负责,只许少量的导线、简单的电路便可以完成。

单片机-数码管显示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);}}。

机电单片机课程设计--4乘4矩阵键盘-汇编语言

机电单片机课程设计--4乘4矩阵键盘-汇编语言

目录1 引言 (2)2 4×4矩阵键盘控制LED工作原理及软硬件设计、仿真调试 (2)2.1 4×4矩阵式键盘识别显示系统概述 (2)2.2 4×4矩阵式键盘原理 (4)2.3 4×4矩阵式键盘控制LED显示方法 (4)2.4 电路设计及电路图 (5)2.5 4×4矩阵式键盘软件编程 (7)2.6 4×4矩阵式键盘软件仿真调试分析 (13)3 结论 (13)4参考文献 (13)1 引言随着现代科技日新月异的发展,作为新兴产业,单片机的应用越来越广。

单片机以其体积小、重量轻、功能强大、功耗低等特点而备受青睐。

键盘作为一种最为普遍的输入工具在单片机项目应用上显得尤为重要。

用MCS51系列的单片机并行口P1接4×4矩阵键盘,以P1.0-P1.3 作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的0-F序号。

2 4×4矩阵键盘控制LED工作原理及软硬件设计、仿真调试2.1 4×4矩阵式键盘识别显示系统概述矩阵式键盘模式以4个端口连接控制4*4个按键,实时在LED数码管上显示按键信息。

显示按键信息,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。

矩阵式键盘简介:矩阵式键盘又称行列键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。

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

这样键盘上按键的个数就为4*4个。

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

最常见的键盘布局如图1所示。

一般由16个按键组成,在单片机中正好可以用一个P 口实现16个按键功能,这也是在单片机系统中最常用的形式,本设计就采用这个键盘模式。

2.2 4×4矩阵式键盘原理在占用相同的I/O端口的情况下,行列式键盘的接法会比独立式接法允许的按键数量多。

单片机-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系列处理器,并持续增加其他系列处理器模型。

4×4矩阵按键模拟编程及控制仿真(汇编+C语言)

4×4矩阵按键模拟编程及控制仿真(汇编+C语言)

4×4矩阵按键模拟编程及控制仿真(汇编+C语言)4×4矩阵按键模拟编程及控制仿真(中级实验)实验介绍:利用单片机控制一组矩阵按键(4×4)以及一个数码管,当按键按下后,数码管会显示按下按键的序号。

共16个按键,序号从0开始,一直到F。

(矩阵按键较独立按键更节省I/O口,例如在本例中,共有16个按键,仅仅需要8个I/O 口,而采用独立按键则需要16个I/O 口。

在I/O口使用较多,且按键较多的情况下可以采用。

但是矩阵按键的程序要比独立按键复杂。

)实验目的:通过本次实验,理解矩阵按键的结构以及工作原理。

能够根据使用需求,独立设计矩阵按键的电路图,能够编程实现对矩阵按键的控制。

通过与独立按键的对比,理解矩阵按键与独立按键的硬件及软件的区别。

通过对比的方式,理解各自的优缺点。

仿真原理图:使用Proteus仿真软件搭建仿真原理图如下图所示。

图1图2使用仿真软件Proteus搭建的原理图参考如图1所示。

(注意事项:一般情况下,采用矩阵按键的形式来控制单片机时,按键数量较多,所以在摆放按键的时候要成行成列的防止,一方面是比较美观,另外一方面是便于编程控制。

另外矩阵按键电路比较复杂,电路连线往往比较多,为了让电路看起来更加简洁,可以采用“Terminal Label”的方式进行连线。

如图2所示,电路连接简化很多。

)编程思路:对于独立按键,编程过程较为简单,按照顺序逐个编写就行。

主要分为两种编程控制方法:按键扫描的方式以及中断的方式。

按键扫描的方式需要实时扫描每个按键是否按下。

编程时,首先通过单片机实时判断第一个按键是否按下,如果按下就执行相应的程序。

只要编制出来第一个按键的程序,其他按键的程序基本相同,只要稍作修改即可。

也可以使用中断的方式实现,这种方式一般需要配合外部的电路来实现。

掌握外部中断控制的读者,可以使用。

矩阵按键的编程思路一般为:实时判断按键的按下情况,首先将连接每一行按键的单片机引脚设置为低电平(每一列按键的单片机引脚设置为输入状态即高电平),判断哪一列按键有按下。

单片机课程设计4X4矩阵键盘显示

单片机课程设计4X4矩阵键盘显示

长沙学院?《单片机原理及应用》课程设计说明书题目】液晶显示4*4矩阵键盘按键号程序设计系(部)电子与通信工程系专业(班级)电气1班姓名龙程学号【09指导教师刘辉、谢明华、王新辉、马凌云起止日期—长沙学院课程设计鉴定表《单片机技术及应用》课程设计任务书系(部):电子与电气工程系专业:11级电子一班指导教师:谢明华、刘辉—目录'前言 (5)一、课程设计目的 (6)二、设计内容及原理 (6)单片机控制系统原理 (6)阵键盘识别显示系统概述 (6)键盘电路 (7)12864显示器 (8)整体电路图 (9)!仿真结果 (9)三、实验心得与体会 (10)四、实验程序 (10)参考文献 (18)…。

,】前言单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。

与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。

它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。

由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。

现代人类生活中所用的几乎每件有电子器件的产品中都会集成有单片机。

手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电子产品中都含有单片机。

汽车上一般配备40多片单片机,复杂的工业控制系统上甚至可能有数百片单片机在同时工作!单片机的数量不仅远超过PC机和其他计算机的总和,甚至比人类的数量还要多。

液晶显示器(英语:Liquid Crystal Display,缩写:LCD)为平面薄型的显示设备。

它的主要原理是以电流刺激液晶分子产生点、线、面配合背部灯管构成画面。

数码管显示4×4矩阵键盘的键盘号--万意要点

数码管显示4×4矩阵键盘的键盘号--万意要点

数码管显示4X4矩阵键盘的键盘号学院:物理与电子工程学院专业:自动化班级:13级7班学号:姓名:万意指导教师:马世榜日期:2013年12月31日目录1引言 (1)2设计方案 (2)3硬件设计 (3)3.1AT89S51 (3)3.24*4矩阵式键盘 (6)3.2.1 矩阵式键盘介绍 (6)3.2.2 键盘扫描原理 (7)3.3硬件电路连接 (9)3.4.1 单片机时钟电路 (9)3.4.2单片机复位电路 (10)3.4.3 矩阵式键盘电路 (10)3.4.4 LED数码管显示电路 (10)4软件设计 (12)4.1所用软件简介 (12)4.1.1 Keil (12)4.1.2 Proteus (12)4.2程序流程图 (14)4.3源程序 (15)5电路原理图 (17)参考文献 (18)1引言矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,即时在LED数码管上。

单片机控制的据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。

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

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

该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。

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

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

本论文主要研究单片机控制的键盘识别显示系统,分别对按键信息和显示电路以及软、硬件各个部分进行研究。

主要内容如下:①根据矩阵式键盘的特点,进行键盘控制系统的整体研究与设计;② LED实时显示按键信息;③采用软件编程的方法实现按键信息的提取和显示。

单片机课程设计——数码管显示4×4矩阵键盘

单片机课程设计——数码管显示4×4矩阵键盘

《单片机原理及应用课程设计》报告——数码管显示4*4矩阵键盘的键盘号设计专业:班级:姓名:学号:2013年1月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矩阵键盘中的某一按键按下时,数码管上显示对应的键盘号。

则本系统主要由以下几大模块构成:显示模块,共阴极LED数码管;输入模块,4*4矩阵键盘;3.2主要元器件介绍矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。

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

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

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

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

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

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

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

4.1 设计思想按键采用线反转法先把列线置成低电平,行线置成输入状态,读行线;再把行线置成低电平,列线输入状态,读列线。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机 C 语言程序设计:数码管显示 4X4 矩阵键盘
按键号
/* 名称:数码管显示 4X4 矩阵 键盘按键号 说明:按下任意键时,数码 管都会显示其键的序号,扫描程 序首先判断按键发生在哪一列, 然后根据所发生的行附加不同的 值,从而得到按键的序号。 */ #include #defineucharunsignedchar
BEEP=0; while(1) { P1=0xf0; if(P1!=0xf0)Keys_Scan(); //获取键序号 if(Pre_KeyNo!=KeyNo) { P0=~DSY_CODE[KeyNo]; Beep(); Pre_KeyNo=KeyNo; } Del KeyNo=1;break; case4:KeyNo=2;break; case8: KeyNo=3;break; default:KeyNo=16;//无键按下 } P1=0xf0;//低 4 位置 0,放入 4 列 DelayMS(1); Tmp=P1>>4x0f;//按键后 f0 变成 XXXX0000,X 中有 1 个为 0,三个仍为 1;高 4 位转移到低 4 位并 异或得到改变的值 switch(Tmp)//对 0~3 行分别附加起始值 0,4,8,12 { case1: KeyNo+=0;break;
} 扩展阅读:4X4 矩阵键盘控制条形 LED 显示程序
case2: KeyNo+=4;break; case4: KeyNo+=8;break; case8: KeyNo+=12; } } //蜂鸣器 voidBeep() { uchari; for(i=0;i {
DelayMS(1); BEEP=~BEEP; } BEEP=0; } //主程序 voidmain() { P0=0x00;
#defineuintunsignedint //段码 ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00}; sbitBEEP=P3; //上次按键和当前按键的序号,该矩阵中序号范围 0~15,16 表示无按键 ucharPre_KeyNo=16,KeyNo=16; //延时 voidDelayMS(uintx) { uchari; while(x--)for(i=0;i
} //矩阵键盘扫描 voidKeys_Scan() { ucharTmp; P1=0x0f;//高 4 位置 0,放入 4 行 DelayMS(1); Tmp=P1x0f;//按键后 0f 变成 0000XXXX,X 中一个为 0,3 个仍为 1,通过 异或把 3 个 1 变为 0,唯 一的 0 变为 1 switch(Tmp)//判断按键发生于 0~3 列的哪一列 { case1: KeyNo=0;break;
相关文档
最新文档