单片机4X4键盘扫描和显示课程设计
- 格式:doc
- 大小:783.50 KB
- 文档页数:14
4X4键盘扫描程序,采用查表方式,适用于AVR单片机。
此处为4X4键盘软件部分,硬件部分设计请参照:4X4键盘扫描电路分析。
此程序对应的键盘电路为:键盘状态扫描函数/*键盘扫描函数读取当前键盘的状态有按键按下返回相应按键值无按键按下返回"0x00"*/unsigned char key_read(void){unsigned char i;DDRA = 0x00;/*获取列地址*/PORTA = 0x0F;DDRA = 0xF0;此处应加入几uS延时;i = PINA;DDRA = 0x00;/*获取行地址*/PORTA = 0xF0;DDRA = 0x0F;此处应加入几uS延时;i |= PINA;DDRA = 0x00;/*输出复位*/PORTA = 0xFF;switch (i) {/*将按键码转换成键值*/ case 0x00: return 0x00;case 0xEE: return '1';case 0xDE: return '2';case 0xBE: return '3';case 0x7E: return 'A';case 0xED: return '4';case 0xDD: return '5';case 0xBD: return '6';case 0x7D: return 'B';case 0xEB: return '7';case 0xDB: return '8';case 0xBB: return '9';case 0x7B: return 'C';case 0xE7: return '*';case 0xD7: return '0';case 0xB7: return '#';case 0x77: return 'D';default : return 0x00;}}键盘读取函数/*按键获取函数获取按键信号,其中包含有状态记录及按键去颤抖。
《单片机原理及应用》课程设计题目:4×4矩阵式键盘与单片机连接与编程专业:测控技术与仪器班级:机电082-1 姓名:学号:指导老师:组员:( 2011.7 .13)目录第1节引言 (2)1.1 4*4矩阵式键盘系统概述 (2)1.2 本设计任务和主要内容 (3)第2节系统主要硬件电路设计 (4)2.1 单片机控制系统原理 (4)2.2 单片机主机系统电路 (5)2.2.1 时钟电路 (8)2.2.2 复位电路 (8)2.2.3 矩阵式键盘电路 (8)2.3 译码显示电路 (9)第3节系统软件设计 (13)3.1 软件流程图 (13)3.2 系统程序设计 (14)第4节结束语 (17)参考文献 (18)第一节引言矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,即时在LED数码管上。
单片机控制的据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。
1.1 4*4矩阵式键盘识别显示系统概述矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。
显示按键信息,既降低了成本,又提高了精确度,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。
并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键,在这种情况下如果用独立式按键的话,显然太浪费I/O端口资源,为了解决这一问题,我们使用矩阵式键盘。
矩阵式键盘简介:矩阵式键盘又称行列键盘,它是用N条I/O线作为行线,N条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为N*N个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
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); //数码管共阴极全零;。
单片机及DSP课程设计报告专业:班级:姓名:学号:指导教师:时间:一、设计目的为了进一步巩固学习的理论知识,增强学生对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,开始为期两周的课程设计。
通过设计使学生在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。
1、通过本设计,使学生综合运用《单片机技术原理与应用》、《DSP原理与应用》《C语言程序设计》以及《数字电路》、《模拟电路》等课程的内容,为以后从事电子产品设计、软件编程、系统控制等工作奠定一定的基础。
2、学会使用KEIL C和PROTEUS等软件,用C语言或汇编语言编写一个较完整的实用程序,并仿真运行,保证设计的正确性。
3、了解单片机接口应用开发的全过程:分析需求、设计原理图、选用元器件、布线、编程、调试、撰写报告等。
二、硬件电路方案设计1、4X4键盘设计4x4键盘工作原理:每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
2、数码管显示电路设计数码管显示原理:动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。
这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。
选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
课程设计报告书设计名称:单片机原理与应用题目:数码管显示4X4矩阵键盘按键号专业:计算机科学与技术日期:2012 年6月 11日一.设计目的:1) 了解单片机系统实现LED动态显示的原理及方法;2) 较为详细了解8051芯片的性能;3) 能够了解到单片机系统的基本原理,了解单片机控制原理;4) 掌握AT89C51程序控制方法;5) 掌握AT89C51 C语言中的设计和学会分析程序,进而能够根据自己的需要编写代码;6) 掌握4X4矩阵式键盘程序识别原理;7) 掌握4X4矩阵式键盘的设计方法;8) 学习键盘的扫描方式和应用程序设计;9) 培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;10) 能够按课程设计的要求编写课程设计报告,能够正确反映设计和实验成果。
二.设计要求与主要内容:设计要求:单片机的P1口P1.0~P1.7连接4X4矩阵键盘,P0口控制一只P0口控制一只数码管,当4×4矩阵键盘中的某一按键按下时,数码管上显示对应的键号。
例如,1号键按下时,数码管显示“1”,二号按下的时候,数码管显示“2”,14号键按下时,数码管显示“E”等等。
主要内容:1)4×4矩阵键盘程序识别原理。
2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线都连接到AT89C51中,通过按键K0~K16,来在数码管显示不同的值。
实验步骤:1) 启动keiuvision3 2)新建工程命名为单片机的C语言设计与应用3)新建文件并另存为C51c.c 4)在SourceGroop1导入文件 5)编写代码,并生成C语言设计与应用.hex文件。
6)在Proteus中设计电路图7) 将keil与Proteus联机调试,记下实验记录,得出实验结果。
三.设计程序原理:(包含仿真图和流程图)1)主程序流程图2)程序流程图 若无按键按下若无按键按下若无按键按下若无按键按下结束,返回3)仿真图四.程序代码#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 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变为1switch(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);} }五.实验结果:当按键按下k0,显示管显示0,当按键按下k1时显示1,显示管可以显示1,2,3,4,5,6,7,8,9,A,B,C,D,F.六.实验体会:这次的实验提高了我的设计能力与对电路的分析能力。
西华大学课程设计说明书题目4×4 矩阵键盘计算器设计系(部) 电气信息学院专业(班级) 自动化3班姓名学号指导教师胡红平起止日期2012.6.10-2012.6.30计算机接口及应用课程设计任务书系(部):电气信息学院专业:09自动化指导教师:日期:2012-6-20西华大学课程设计鉴定表摘要近几年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面的知识是不够的,还应根据具体硬件结合,加以完善。
本任务是个简易得三位数的减法运算,用4×4 矩阵键盘及计算器设计,利用数码管实现255内的减法运算。
程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不完善,限制也较多。
本任务重在设计构思与团队合作,使得我们用专业知识,专业技能分析和解决问题全面系统的锻炼。
关键词:单片机,AT89C51,矩阵键盘,数码管ABSTRACTIn recent years, along with the rapid development of science and technology, the application of SCM is unceasingly thorough, it causes the traditional control test technology increasingly updates. In real-time detection and automatic control of single-chip microcomputer application system, often as a core component to use, only microcontroller aspects of knowledge is not enough, should according to specific hardware combined, and perfects.This task is a simple three digits, subtract with 4 * 4 matrix keyboard and a calculator design, use digital tube realization within the 255 subtract. Program is according to the teaching material and within the network reference and compiled program, on the function is not perfect, restrictions also more. This task focuses on design conception and team cooperation, make us with professional knowledge, professional skills to analyze and solve problems of full system exercise.Keywords:Single-chip,AT89C51,Matrix keyboard,digital tube目录摘要 (I)ABSTRACT (II)第1章课题概述 (1)1.1 课题概述 (1)1.2 课题要求 (2)第2章系统设计 (3)2.1 设计思路 (3)2.2 框图设计 (3)2.3 知识点 (3)2.4 硬件设计 (4)2.4.1 电路原理图 (4)2.4.2 元件选择 (5)2.4.3 PCB制版及效果 (9)2.5 软件设计 (10)2.5.1 程序流程图 (10)2.6 系统仿真及调试 (11)2.6.1 硬件调试 (11)2.6.2 软件调试 (11)2.6.3 软硬件调试 (11)结论 (11)参考文献 (14)附录 (15)第1章课题概述1.1 课题概述随着当今时代的电子领域的发展,尤其是自动化的控制领域,传统的分立元件或数字逻辑电路构成的控制系统正被智能化的单片机所取代。
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拨上去。
二、设计内容1、本设计利用各种器件设计,并利用原理图将8255单元与键盘及数码管显示单元连接,扫描键盘输入,最后将扫描结果送入数码管显示。
键盘采用4*4键盘,每个数码管可以显示0-F共16个数。
将键盘编号,记作0-F,当没按下其中一个键时,将该按键对应的编号在一个数码管上显示出来,当在按下一个键时,便将这个按键的编号在下一个数码管上显示,数码管上可以显示最近6次按下的按键编号。
设计并实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。
三、问题分析及方案的提出4×4键盘的每个按键均和单片机的P1口的两条相连。
若没有按键按下时,单片机P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。
单片机定时对P1口进行程序查询,即可发现键盘上是否有按键按下以及哪个按键被按下。
实现4×4键盘的接口需要用到单片机并编写相应的程序来识别键盘的十六个按键中哪个按键被按下。
因为此题目还要求将被按下的按键显示出来,因此可以用两个数码管来分别显示被按下的按键的行与列表示任意一个十六进制数)分别表示键盘的第二行、第三行、第四行;0xXE、0xXD、0xXB、0xX7(X表示任意一个十六进制数)则分别表示键盘的第一列、第二列、第三列和第四列。
例如0xD7是键盘的第二行第四列的按键对于数码管的连接,采用了共阳极的接法,其下拉电阻应保证芯片不会因为电流过大而烧坏。
五、电路设计及功能说明4×4键盘的十六个按键分成四行四列分别于P1端口的八条I/O数据线相连;两个七段数码管分别与单片机的P0口和P2口的低七位I/O数据线相连。
数码管采用共阳极的接法,所以需要下拉电阻来分流。
结合软件程序,即可实现4×4键盘的接口及显示的设计。
当按下键盘其中的一个按键时,数码管上会显示出该按键在4×4键盘上的行值和列值。
所以实现了数码管显示按键位置的功能四、设计思路及原因对于4×4键盘,共有十六个按键。
如果每个按键与单片机的一个引脚相连,就会占用16个引脚,这样会使的单片机的接口不够用(即使够用,也是对单片机端口的极大浪费)。
因此我们应该行列式的接法。
行列式非编码键盘是一种把所有按键排列成行列矩阵的键盘。
在这种键若没有按键按下时,单片机从P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。
因此0xEX(X表示任意4×4键盘的第一行中的某个按键被按下,相应的0xDX、0xBX、0x7X(X二、实验内容设计并实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。
即将8255单元与键盘及数码管显示单元连接,编写实验程序扫描键盘输入,并将扫描结果送数码显示,键盘采用4×4键盘,每个数码管值可以为0到F,16个数。
将键盘进行编号记作0—F当按下其中一个按键时将该按键对应的编号在一个数码管上显示出来,当按下下一个按键时便将这个按键的编号在下一个数码管上显示出来,且数码管上可以显示最近6次按下按键的编号。
基本原理1.电路设计及功能说明2.硬件原理框图及电路图(包括接口芯片简介)电路图:六、实验步骤(1).把实验平台与PC机串行口连起来,根据实验连线提示在实验台上连线,之后打开电源。
(2).在PC机上用鼠标点击“Wave”图标,进入WINDOWS调试环境,而后进行初始化设置。
点击[仿真器\仿真器设置]出现“仿真器设置”窗,进行仿真器的设置。
(3).用鼠标点一下[文件\打开文件],输入文件名*.asm,创建新文件,在该窗口中输入事先编好的程序。
(4).用鼠标点[项目\全部编译]窗,对当前源文件进行编译,反复修改好程序,直到编译通过为止。
(5).全速运行程序,通过在键盘按键,观察八段管的显示结果,理解键盘扫描原理及程序编写方法。
接口芯片简介AT89C51简介AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
主要管脚说明:VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH 编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口同时为闪烁编程和编程校验接收一些控制信号。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
数码管简介数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
七、软件部分的程序流程图,算法和使用的编程技巧 1.编程技巧1.在按键扫描程序中,通过for 循环语句实现被按下的按键的行值的确定,用switch 语句实现列值的确定。
0xEX(X 表示任意一个十六进制数)表示4×4键盘的第一行中的某个按键被按下,相应的0xDX、0xBX、0x7X(X表示任意一个十六进制数)分别表示键盘的第二行、第三行、第四行;0xXE、0xXD、0xXB、0xX7(X 表示任意一个十六进制数)则分别表示键盘的第一列、第二列、第三列和第四列;2. ucRow+ucLine+1即为被按下的按键的行列值;3.用十六个switch语句实现对单片机P0端口和P2口的I/O数据线的控制,来控制数码管显示被按下按键的行值和列值;2.程序流程图主流程图子流程图否是是否开始显示缓冲区初始化LED显示读取键值键值转换为显示数据开始输出列扫描信号列扫描信号移位该列有键输入?读入行信号返回6列扫描完?有键输入?初始化地址参数按照行列计算键值查表得键码等待按键释放返回八、程序编程OUTBIG EQU 8002H ; 位控制口OUTSEG EQU 8004H ; 段控制口KEYIN EQU 8001H ; 键盘读入口READY: MOV 20H,#3FH ;缓冲器设初值,赋值到6个数码管MOV 21H,#3FHMOV 22H,#3FHMOV 23H,#3FHMOV 24H,#3FHMOV 25H,#3FHMAIN: LCALL DISPLAY ;无键码输入,调用显示模块LCALL TESTJZ MAIN ;累加器为0即说明无按键,则转移继续显示LCALL SEARCH ;有键值输入,寻找输入键值所在的行和列MOV 20H,21H ;数码管显示出输入的键值MOV 21H,22HMOV 22H,23HMOV 23H,204MOV 24H,25HMOV DPTR,#LEDTABMOVC A,@A+DPTRMOV 25H,ASJMP MAINDISPLAY: ;显示模块MOV R0,#20H ;缓冲区从20H处开始MOV R1, #6 ;共6个八段管MOV R2, #00100000B ;从左边开始显示灯亮为1,灭为0, LOOP: MOV DPTR, #OUTBIGMOV A, #0MOVX @DPTR, A ; 位选码初值设为0,即关闭所有八段管MOV A, @R0 ;将以20H为首地址的内存值发送到段码输出口8004HMOV DPTR, #OUTSEGMOVX @DPTR,AMOV DPTR, #OUTBIG ;输出位选通信号,使每次只显示一位八段管MOV A, R2MOVX @DPTR, ALCALL DELAY ;延时MOV A, R2RR A ;位选信号右移一位,即动态显示下一个数码管MOV R2, AINC R0 ;内存地址加一,提供段码输出DJNZ R1, LOOPRETDELAY: MOV R7,#01H ; 延时子程序DEL1: MOV R6,#00HDEL2: DJNZ R6, DEL2DJNZ R7, DEL1RETTEST: MOV DPTR,#OUTBIG ;检测有无键值输入MOV A,#00HMOVX @DPTR,A ;输出线置为0MOV DPTR,#KEYINMOVX A,@DPTR ;读入键状态CPL A ;累加器求反ANL A,#0FH ;高四位不用RETSEARCH: ;找出键值所在的的位置(行和列)MOV R1,#00100000BMOV R2,#06HMOV R5,#00HMOV R4,#03HLSEARCH: ;找出列所在位置后MOV A,R1MOV DPTR,#OUTBIGMOVX @DPTR,ACPL ARR A ;通过判断循环几次进位为1来实现计数的功能,从而得知行所在位置MOV R1,AMOV DPTR,#KEYINMOVX A,@DPTRCPL AANL A,#0FHJNZ HSEARCH ;找到所在列,继续寻找行所在位置INC R5DJNZ R2,LSEARCHHSEARCH:MOV R7,#04HLOOP2: RRC AJC GETDEC R4DJNZ R7, LOOP2GET: ;确定输入的键码值MOV A,R4 ;键值=行*6+列,R4*6+R5->AMOV B,#6HADD A,R5MOV DPTR,#KEYTAB ;取出键码所在位置MOVC A,@A+DPTRMOV 26H,A ;将取出键值暂时保存在内存中,以免数据丢失WAIT: MOV DPTR,#OUTBIG ;等键释放CLR AMOVX @DPTR,ALCALL DELAYLCALL TESTJNZ WAITMOV A,26H ;释放出键盘输入值RETLEDTAB: ; 八段管显示码DB 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hDB 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hKEYTAB: ;键盘码DB 07H,08H,09H,0AH,00H,00HDB 04H,05H,06H,0BH,00H,00HDB 01H,02H,03H,0CH,00H,00HEND九、仿真过程综述1.按照设计思路在PROTEUS软件中找到相应元器件,按照正确的连线方法将各个元器件连起来。