矩阵式键盘程序设计
- 格式:docx
- 大小:37.08 KB
- 文档页数:3
嵌入式系统实验报告院(系)别信息科学与电气工程学院班级学号姓名指导教师时间 2014-06-21实验三通用 I/O 使用——矩阵式键盘1 实验目的S3C44B0X 具有 71 个通用多功能 I/O,这些 I/O 的应用是 S3C44B0X 处理器的基础。
本实验我们就以矩阵式键盘的接口设计为例,学习怎样设置 I/O 口并对它进行操作。
(1)掌握 S3C44B0X 的 I/O 口的功能特点;(2)掌握对 I/O 口的基本编程操作。
2 实验要求4×4 矩阵键盘的每个键的对应字符如下:7, 8, 9, /,4, 5, 6, *,1, 2, 3, -,0, ., +, \n编写 4×4 矩阵式键盘的驱动程序,使得当某个键被按下时,超级终端上显示出该键对应的字符。
3 实验容与步骤本实验需要进行连接电路。
学生按照下面的指导说明和程序流程图,自行编写符合实验要求的源程序。
并按照实验一中说明的步骤,进行:建立工程、编译除错、下载仿真等步骤,最终调试出符合要求的源程序。
观察超级终端上的显示,看是否输出满足实验要求的结果。
在本实验中,根据键盘的循环扫描检测法进行程序编写。
根据该方法,设定 GPF0-3 为输出口(列线),GPF4-7 为输入口(行线)。
用导线连接起这些 I/O 口和键盘的接口。
在程序中,我们首先通过设置 PCONF 寄存器,来实现端口功能配置。
3.1 电路连接在 ARMSys 上用导线连接扩展 I/O 口和键盘接口。
如下图所示:采用键盘的循环扫描检测法编写程序。
程序中,我们首先通过设置 PCONF 寄存器,来实现端口功能配置。
3.2 寄存器设置设置 PCONF 寄存器:如下表所示,由于我们需要设定 PF0-3 为输出口(列线),PF4-7为输入口,因此,在端口工作之前设置 PCONF=000 000 000 000 00 01 01 01 01B=0x55;PF0-3 输出扫描码时,可采用以下语句:rPDATF=0xf0;PF0-3 写入全 0; PF4-7 读入键值时,采用以下语句:Keyvalue=(PDATF&0xf0)>>4;z 部上拉电阻的设置:rPUPF=0x00;使能 PF0-7 的部上拉3.3 编写键盘扫描程序分为主程序和读键子程序两个部分。
第二章矩阵式键盘的设计班级:光信科1203 组员:陈宏烨、王凯杰、龚馨1.设计要求设计一个4*4的矩阵式键盘,以P1.0~P1.3作为行线,以P1.4~P1.7作为列线。
要求:未按下键时,LED数码管显示“-”,按下键时,在数码管上显示相应的键值。
2.硬件电路图图2.1电路说明:在图2.1所示的电路中,数码管采用共阳极接法,当P1口输出低电平时,数码管发光。
P1.0~P1.3行线开始时为高电平,P1.4~P1.7列线开始时为低电平,当有键被按下时(每次只按下一个键),键所在的行线变成低电平。
3.软件流程设计思路:要想让数码管输出正确的数字,必须要做到三步:1.判断是否有键被按下;2.判断被按下键的位置;3.确定该位置所对应的数字并输出。
由于我们令低四位为高电平的行线,令高四位为低电平的列线,所以对应的十六进制数应该是0x0f。
当有键被按下时,被按下的键所在的行必定由高电平变成低电平,对应的十六进制数必定不是0x0f,从而确定是否有键被按下并且确定被按下键所在的行。
同理,我们可以重新定义一个函数,先令高四位为高电平,低四位为低电平,所对应的十六进制数为0xf0,接着当有键被按下时,这时对应的十六进制数必定不是0xf0,从而可以确定被按下键所在的列。
最后,定义一个函数,按每个键所处的不同位置,分别输出不同的数。
4.源代码#include <reg52.h>void delay(ms){ for(;ms>0;ms--);}void Hang1(){ char key;P1=0xf0;delay (100);key=P1;switch(key){case 0xe0:P0=0xc0;break;case 0xd0:P0=0xf9;break;case 0xb0:P0=0xa4;break;case 0x70:P0=0xb0;break;default :break;}}void Hang2(){ char key;P1=0xf0;delay (100);key=P1;switch(key){case 0xe0:P0=0x99;break;case 0xd0:P0=0x92;break;case 0xb0:P0=0x82;break;case 0x70:P0=0xf8;break;default :break; }}void Hang3(){ char key;P1=0xf0;delay (100);key=P1;switch(key){case 0xe0:P0=0x80;break;case 0xd0:P0=0x90;break;case 0xb0:P0=0x88;break;case 0x70:P0=0x83;break;default :break;}}void Hang4(){ char key;P1=0xf0;delay (100);key=P1;switch(key){case 0xe0:P0=0xc6;break;case 0xd0:P0=0xa1;break;case 0xb0:P0=0x86;break;case 0x70:P0=0x8e;break;default :break; }}void main(){ int key;P1=0x0f;while(P1==0x0f){P0=0x3f;};delay(100);while(P1==0x0f){P0=0x3f;};/*进行去抖操作*/key=P1;if( P1!=0x0f) /*判断是否有键被按下*/{switch(key) /*判断被按下的键在哪一行,并进行相应的操作*/ {case 0x0e:Hang1();break;case 0x0d:Hang2();break;case 0x0b:Hang3();break;case 0x07:Hang4();break;}}}5.出现的问题及解决方法在设计的时候,如果我们直接按照流程图的做法来写程序,这样的工作量会增大。
单片机矩阵按键扫描程序设计作者:谭艳来源:《数字化用户》2013年第09期【摘要】单片机矩阵键盘是常用的人机对话输入设备,本文提出一种新的矩阵键盘扫描程序设计,可以大大李节省系统资源,提高效率。
【关键词】单片机矩阵键盘扫描程序键盘是微型计算机系统中最常用的人机对话输入设备。
在单片机应用系统中,为了控制系统的工作状态,以及向系统输入数据,应用系统需要单独设计专用的小键盘。
矩阵按键扫描程序是一种节省系统资源的方法,按键数目越多节省的系统资源就越可观,本程序的思路:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。
但是,在程序的写法上,采用了最简单的方法,使得程序效率最高。
一、设计理念本程序中,如果检测到某键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU时间。
另外,键盘用延时程序来消除抖动,完全是浪费时间。
试想,如果不用中断执行(用中断执行需要更多的硬件资源)的方法来扫描键盘,每秒钟扫描20-100次,每次都要延时10-20MS的话,单片机还有多少时间做正事呢?其实,延时的这段时间,CPU可以做其它的事务。
所以,本键盘扫描程序的前面后面都可以加入一些代码,既可以达到完美的消抖动效果,又可以扩展其它的功能(例如按键封锁、按键长按等按键功能复用)。
二、设计程序本键盘扫描子程序名叫key,每次要扫描时用call key调用即可。
以下子程序内容:key:mov p0,#00001111b;上四位和下四位分别为行和列,所以送出高低电压检查有没有按键按下jmp k10;跳到K10处开始扫描,这里可以改成其它条件转移指令来决定本次扫描是否要继续,例如减1为0转移或者位为1或0才转移,这主要用来增加功能,确认上一按键功能是否完成?是否相当于经过了延时?是否要封锁键盘?goend:jmp kend;如果上面判断本次不执行键盘扫描程序,则立即转到程序尾部,不要浪费CPU的时间k10:jb p0.0,k20;扫描正式开始,先检查列1四个键是否有键按下,如果没有,则跳到K20检查列2k11:mov p0,#11101111b;列1有键按下时,P0.0变低,到底是那一个键按下?现在分别输出各行低电平jb p0.0,k12;该行的键不按下时,p0.0为高电平,跳到到K12,检查其它的行mov r1,#1;如果正好是这行的键按下,将寄存器R0写下1,表示1号键按下了k12:mov p0,#11011111bjb p0.0,k13mov r1,#2;如果正好是这行的键按下,将寄存器R0写下2,表示2号键按下了k13:mov p0,#10111111bjb p0.0,k14mov r1,#3;如果正好是这行的键按下,将寄存器R0写下3,表示3号键按下了k14:mov p0,#01111111bjb p0.0,kend;如果现在四个键都没有按下,可能按键松开或干扰,退出扫描(以后相同)mov r1,#4如果正好是这行的键按下,将寄存器R0写下4,表示4号键按下了jmp kend;已经找到按下的键,跳到结尾。
西华大学课程设计说明书题目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掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。
2学会使用proteus软件设计矩阵键盘电路掌。
3握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。
(二)实验要求能熟练的编写8951单片机汇编程序设计键盘接口仿真电路图,并使之正常运行(三)连接图(四)结果图当矩阵键盘的3号键被按下时,P2口的七段数码管显示的数据为3.如下图1所以:当矩阵键盘的A号键被按下时,P2口的七段数码管显示的数据为A.如下图2所以:(五)代码ORG 0000HAJMP MAINORG 0030HMAIN:MOV DPTR,#TABLE ;将表头放入DPTRLCALL KEY ;调用键盘扫描程序MOVC A,@A+DPTR ;查表后将键值送入ACCMOV P2,A ;将ACC值送入P0口LJMP MAIN ;返回反复循环程序KEY: LCALL KS ;调用检测按键子程序JNZ K1 ;若有按键按下,则继续LCALL DELAY2 ;若无按键按下,则调用延时去抖程序 AJMP KEY ;返回,继续检测按键K1: LCALL DELAY2LCALL DELAY2 ;若有按键按下,则延时去抖动LCALL KS ;再调用检测按键程序JNZ K2 ;确认有键按下,进行下一步AJMP KEY ;若无按键按下,则返回继续检测K2: MOV R2,#0EFH ;将扫描值送入R2暂存MOV R4,#00H ;将第1列值送入R4暂存K3: MOV P1,R2 ;将R2的值送入P1口L6: JB P1.0,L1 ;P1.0等于1跳转到L1 MOV A,#00H ;将第1行值送入ACCAJMP LK ;跳转到键值处理程序L1: JB P1.1,L2 ;P1.1等于1跳转到L2 MOV A,#04H ;将第2行值送入ACCAJMP LK ;跳转到键值处理程序进行键值处理L2: JB P1.2,L3 ;P1.2等于1跳转到L3 MOV A,#08H ;将第3行值送入ACCAJMP LK ;跳转到键值处理程序L3: JB P1.3,NEXT ;P1.3等于1跳转到NEXT处 MOV A,#0CH ;将第4行值送入ACCLK: ADD A,R4 ;将行值与列值相加后的键值送入APUSH ACC ;将A中的值送入堆栈暂存K4: LCALL DELAY2 ;调用延时去抖程序LCALL KS ;调用检测按键程序JNZ K4 ;若按键没有松开,则继续返回检测POP ACC ;键堆栈的值送入ACCRETNEXT:INC R4 ;将列值加一MOV A,R2 ;将R2的值送入AJNB ACC.7,KEY ;扫描至KEY处进行下一扫描RL A ;扫描未完,将A中的值右移一位进行下一列的扫描MOV R2,A ;将ACC的值送入R2暂存AJMP K3 ;跳转到K3继续KS: MOV P1,#0FH ;将P1口的高4为置0,低4位置1 MOV A,P1 ;读P1口XRL A,#0FH ;将A中的值与0FH相异或RET ;子程序返回DELAY2: ;40ms延时去抖子程序MOV R5,#08HL7: MOV R6,#0FAHL8: DJNZ R6,L8DJNZ R5,L7RETTABLE: ;7段显示器的数据定义DB 0C0H,0F9H,0A4H,0B0H,99H ;01234DB 92H,82H,0F8H,80H,90H ;56789DB 88H,83H,0C6H,0A1H,86H ;ABCDEDB 8EH ;FEND ;程序结束。
4×4矩阵键盘一、课题目的1、设计目的及意义(1) 设计目的1)掌握51系列单片机的基本硬件结构及工作原理;2)掌握51系列单片机的C语言及基本程序设计方法;3)学习并掌握使用51系列单片机开发控制系统的基本步骤及方法。
(2)设计意义随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,式设施现代化的基础,也是人类通往科技巅峰的直通路。
电子行业的发展从长远来看很重要,但最主要的还是科技问题。
现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。
手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。
汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。
单片机作为应用最广泛的控制系统之一,具有体积小,易于控制,价格便宜,安全可靠等等优良的性能而被广泛的关注。
无论是小到儿童玩具,到工业控制系统,大到航天航空系统的设计与操作之中,随处可见单片机的踪影。
大学电子专业,电气专业,通信等专业开设单片机课程,对人才的培养无疑是有着重大的意义的。
本次课程设计的题目是4×4矩阵键盘设计,通过课程设计使学生更进一步掌握单片机原理与应用课程的有关知识,提高用C语言编程的能力,并将所学的内容加以综合;通过查阅资料,了解所学知识的应用情况;通过课程设计全面系统的了解单片机的设计方法及设计步骤,了解微机系统的基本组成及开发设计过程中需要注意的问题。
矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。
是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。
矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,显示在LED数码管上。
单片机控制依据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。
单片机矩阵按键课程设计一、课程目标知识目标:1. 学生能理解单片机矩阵按键的基础知识,掌握矩阵按键的原理及其在电路中的应用。
2. 学生能描述单片机I/O口操作方法,并运用此知识实现矩阵按键的编程控制。
3. 学生能解释并运用行、列扫描法进行按键识别,实现按键的消抖处理。
技能目标:1. 学生能够独立完成矩阵按键电路的连接,并进行调试。
2. 学生能够运用所学知识,编写程序实现矩阵按键的扫描与功能分配。
3. 学生能够通过实验,分析和解决矩阵按键编程过程中遇到的问题。
情感态度价值观目标:1. 学生培养对单片机技术的兴趣,增强对电子工程领域的认识。
2. 学生在学习过程中,培养解决问题的耐心和毅力,树立团队协作意识。
3. 学生能够认识到单片机技术在现实生活中的应用价值,增强创新实践能力。
课程性质:本课程为实践性较强的电子技术课程,要求学生在掌握理论知识的基础上,注重动手实践。
学生特点:学生具备一定的单片机基础知识,对电子技术有较高的兴趣,但编程和动手能力参差不齐。
教学要求:结合学生特点,课程注重理论与实践相结合,充分调动学生的积极性,提高学生的动手能力和创新能力。
通过课程学习,使学生在知识、技能和情感态度价值观方面均有所提升。
二、教学内容1. 矩阵按键原理:介绍矩阵按键的电路结构、工作原理以及其在单片机系统中的应用。
- 教材章节:第二章第二节《矩阵键盘的工作原理》2. 单片机I/O口操作:回顾并加深理解单片机I/O口的基本操作,为矩阵按键编程打下基础。
- 教材章节:第一章《单片机基础》3. 行列扫描法:讲解如何运用行列扫描法进行按键识别,包括消抖处理方法。
- 教材章节:第二章第三节《矩阵键盘的编程方法》4. 矩阵按键编程实践:指导学生编写程序,实现矩阵按键的扫描与功能分配。
- 教材章节:第二章第四节《矩阵键盘应用实例》5. 电路连接与调试:学生动手实践,完成矩阵按键电路的连接,并进行调试。
- 教材章节:实验指导书《矩阵键盘实验》6. 问题分析与解决:针对编程和调试过程中遇到的问题,引导学生进行分析和解决。
实验课题:4×4矩阵键盘识别技术一实验目的1.熟悉和掌握AT89S51单片机相关的功能2.了解矩阵式键盘的内部结构,掌握至少一种常用的按键识别的方法3.利用AT89S51单片机和设计一个4×4矩阵键盘控制。
4.掌握子程序结构和子程序实际的基本知识。
二实验原理1. 4×4矩阵键盘的序列排列如图1-1,图1-12.如图1-2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0―P1.3作输入线,以p1.4-P1.7作输出线,在数码管上显示每个按键的“0-F”序号.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
3.程序框图三实验原理图四实验代码#include<AT89X51.H> unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsignedchartemp;unsignedcharkey;unsignedchari,j;voidmain(void){while(1){P3=0xff;P3_4=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){case0x0e:key=7;break;case0x0d:key=8;break;case0x0b:key=9;break;case0x07:key=10;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp&0x0f;while(temp!=0x0f){temp=P3;temp=temp&0x0f;}}}P3=0xff;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){case0x0e:key=4;break;case0x0d:key=5;break;case0x0b:key=6;break;case0x07:key=11;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp&0x0f;while(temp!=0x0f){temp=P3;temp=temp&0x0f;}}}P3=0xff;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){ case0x0e:key=1;break;case0x0d:key=2;break;case0x0b:key=3;break;case0x07:key=12;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp&0x0f; while(temp!=0x0f) {temp=P3;temp=temp&0x0f; }}}P3=0xff;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){case0x0e:key=0;break; case0x0d:key=13;break;case0x0b:key=14;break;case0x07:key=15;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp&0x0f;while(temp!=0x0f){temp=P3;temp=temp&0x0f;}}}}}五实验小结1.通过本次试验熟练的掌握了AT89S51单片机相关的功能。
矩阵式键盘程序设计
(1)定义字型码表和10m延时程序设计。
4某4矩阵键盘的16个键分别对应0~9、A~F十六个字符,由于数码管显示使用共阴极LED数码管,所以字型码采用共阴极字型码。
定义字型码表和软件去抖的10m延时程序如下:
#include
/某定义0~9,A~F十六个字符的字型码表某/unignedchartable[]= {0某3F,0某06,0某5B,0某4F,0某66,0某6D,0某7D,0某07,0某7F,0某6F,0某77,0某7C,0某39,0某5E,0某79,0某71};/某10m 延时程序某/
voiddelay10m(void){
unignedchari,j;for(i=20;i>0;i--)
for(j=248;j>0;j--);}
(2)矩阵式键盘主程序设计。
4某4矩阵键盘的各行接P0口的
P0.0~P0.3,矩阵键盘的各列接P0口的P0.4~P0.7,P1口的P1.0~
P1.7接数码管的各段。
矩阵式键盘主程序如下:
voidmain(){
chark=0;
unignedchartmp,key;P1=0某00;
P0=0某0f;//P0口低四位做输入口,先输出全1tmp=P0;while(1){
while(tmp==0某0f)//循环判断是否有键按下{
P0=0某0f;//所有列输出低电平
tmp=P0;//读行信号}
delay10m();//延时10m去抖
P0=0某0f;//所有列输出低电平tmp=P0;//再次读键盘状态
if(tmp==0某0f)continue;//如果无键按下则认为是按键抖动,重新扫描键盘key=can_key();//有键按下,调用键盘扫描程序,并把键值送keywhile(k!=-1)
{delay10m();k=can_key();}
P1=table[key];//查表或字型编码送P1口,数码管显示闭合按键的编码}
(3)矩阵式键盘扫描程序设计
unignedcharcan_key(void)//键盘扫描子程序{
unignedcharn,can,col,rol,tmp;
bitflag=0;//设有键按下标志位can=0某ef;
P0=0某0f;//P0口低四位做输入口,先输出全1for(n=0;n<4;n++)//循环扫描4列,从0列开始{
P0=can;//逐列送出低电平tmp=~P0;//读行值,并取反tmp=tmp&0某0f;
col=n;//保存列号到colflag=1;
/某判断哪一行有键按下,并保存行号到rol某/if(tmp==0某01) {rol=0;break;}//第0行有键按下eleif(tmp==0某02)
{rol=1;break;}//第1行有键按下eleif(tmp==0某04)
{rol=2;break;}//第2行有键按下eleif(tmp==0某08)
{rol=3;break;}//第3行有键按下ele
flag=0;
can=(can<<1)+1;}
if(flag==0)
return-1;ele
return(rol某4+col);}。