广东海洋大学单片机实验四五
- 格式:pdf
- 大小:223.93 KB
- 文档页数:6
GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称实验六综合测试课程名称软件测试课程号学院(系) 信息(软件)学院专业软件工程班级学生姓名学号实验地点实验日期实验六综合测试实验目的:能够综合运用多种测试方法对某个应用程序进行测试;实验内容:阅读关于StudentInfoSystem系统的相关文件,系统运行直接点击:“StudentInfoSystem最终版本”->release-> buildlog。
(正确的用户名:admin 密码:dzxsz)1.静态测试:分析StudentInfoSystem系统涉及的类及方法。
确定哪个方法是重要的方法,需要进行重点测试。
分析这些方法存在的不足之处。
下图是VS2008 sp1生成的类图:比较重要的方法都涉及都目录名字的检查和验证。
从“校验并导出”按钮函数CStudentInfoSystemDlg::OnBnClickedExportBtn()开始,先检查目录是否为空,若符合则可以自动导出到相应文件夹;CStudentInfoSystemDlg::BeginCheck(LPVOID Lpvoid),检查目录下是否有对应文件;CheckManager::DoCheck(vector<ErrorInfo *> &errorInfoArray)检查是否有excel文件,对应班照片目录;ExcelReader::isExcelLegal(vector< ErrorInfo*> & errorInfoArray,CString picDir)检查Excel文件内容是否符合规则,以及照片文件名字的正确性;不足:个人认为,ExcelReader::isExcelLegal(vector< ErrorInfo*> & errorInfoArray,CString picDir)函数中功能比较复杂,函数命名意义就是检查Excel文件是否符合规定,但该函数还实现了检查照片名字格式和照片名字是否和Excel文件相对应。
班级:计科1141 学号:201411621110 姓名:邓超荣实验二进程间通信(信号量)实验目的了解信号量在进程控制中所起的重要作用。
实验内容父子两个进程共同完成递增正整数序列(1\2\3\4\5\6\7\8\9\10\11\12\13\14\15\16……100)的显示。
其中一个进程负责显示奇数,另一个进程显示偶数。
请分别编写“不带有信号量不能完成上述任务”和“使用信号量正确完成上述任务”的程序,观察实验结果,进行细致分析。
(1)不带有信号量不能完成上述任务1:#include <stdio.h>2:#include <stdlib.h>:3:#include <sys/types.h>:4:#include <sys/ipc.h>5:#include <sys/sem.h>:6:#include <unistd.h>7:union semun://使用union开辟空间,把定义的数据放到统一个足够大的空间8:{9: int val;//定义val,当执行SETVAL命令时使用10: struct semid_ds *buf;//定义buf,在IPC_STAT/IPC_SET命令时使用11: unsigned short *array;//在使用GETALL/SETALL命令时使用的指针12: struct seminfo *__buf;//在IPC_INFO命令时使用13:};14:int init_semvalue (int id, int v)15;{16: union semun sem_union;//调用union semun 对象17: sem_union.val = v;18: semctl (id, 0, SETVAL, sem_union);//系统调用senmctl用来执行在信号量及上的控制操作;获取关键字值id,设置信号量的数目为0;SETVAL设置信号量集中的一个单独的信号量的值。
单片机复习提纲(上)一.单项选择题:(10分)1.MC-51单片机复位后,程序计数器PC的内容是 C 。
A.00H B.FFH C.0000H D.FFFFH2.8031单片机芯片要使用时应把EA信号引脚 B 。
A.接高电平B.接地C.悬空D.接地址锁存器选通端3.MCS-51的程序计数器PC为16位计数器,因此其寻址范围是 D 。
A.8K B.16K C.32K D.64K4.在MCS-51单片机中,唯一一个可供用户使用的16位寄存器是 B 。
A.PSW B.DPTR C.IP D.PC5.在MCS-51单片机中,唯一一个用户不能直接使用的寄存器是 D 。
A.PSW B.DPTR C.IE D.PC6.在单片机中,用作标志寄存器的一个特殊功能寄存器是 A 。
A.PSW B.DPTR C.TCON D.PC7.单片机的指令地址存放在 D 中。
A.PSW B.DPTR C.SP D.PC8.提高单片机的晶振频率,则机器周期信号 C 。
A.不变B.变长C.变短D.变长变短不定9.8031不具有第二功能的I/O口是:( B )A、P0 口B、P1口C、P2口D、P3口10.在M C S-51单片机的中断中,如果出现同级中断申请时,就按硬件查询序列来处理响应次序,其优先级别中第三个为:( D )A、定时/计数器中断0B、定时/计数器中断1C、外部中断0D、外部中断1E、串行口中断11.MSC-51在响应中断时,必须由用户清除的标志为( B )A、TF0B、RIC、IE0D、TF112.设(A)=F0H,若执行4次指令RL A ,则执行完后,A 中的内容为:(C )A、FFHB、00HC、0FHD、F0H13.乘法指令是MCS-51单片机中执行时间最长的指令之一,当执行完MUL AB 后,积的高8位在:( B )A、在寄存器A中B、在寄存器B中C、在Cy中D、在PSW中14.设执行ADD 指令后,A 中的内容为10011010B ,再执行DA A 指令后,A 的内容应为( D )A、10100000B、10010000C、00010000D、0000000015.设A=56H,R0=20H,(20H)=7AH,若执行XCHD A,@R0, 则A 中的内容为:( C )A、76HB、A6HC、5AHD、50H16.执行PUSH direct 指令时,SP 将进行何种操作?( B )A、SP + 0B、SP + 1C、SP + 2D、SP - 117.定时器T1中断的入口地址为:( C )A、0023HB、000BHC、001BHD、0013H18.下列哪一个指令助记符是非法字符?( D )A、RLCB、CLRC、RRCD、ORC19.MCS-51响应中断时,下面哪一个条件不是必须的( C )。
实验一DEBUG的使用一、实验目的:1. 熟悉DEBUG的功能,掌握其常用命令格式并能熟练使用。
2. 使用DEBUG,观察PC机执行汇编指令的过程,掌握寄存器的名称与内存单元地址的形成。
二、实验要求:1. 遵守规章制度,爱护实验室设备。
2、熟悉Debug各个命令的用法。
3、熟悉寄存器的名称以及物理地址的形成。
4、写出实验报告。
三、实验内容:实验1、 DEBUG常用指令操作进入Debug环境,完成下列步骤。
1、用R命令查看寄存器的值,将AX的值修改为100H,BX的值修改为100 (十进制)。
2、用D命令查看内存FFF00H-FFFFFH的内容,找出PC机主板上的ROM中写有的一个生产日期。
3、用E命令将”I am a student!!”写入内存00200H处。
用D命令查看是否写入成功。
4、用A 命令向内存00210H处写入汇编指令,再使用U命令反汇编,并用T命令执行上述指令,查看执行后的结果,3条指令执行后AX的值为多少?MOV AX,1234MOV BX,0158ADD AX, BX实验2、理解逻辑地址与物理地址的关系使用Debug命令设置下列寄存器及存储器的内容(DS)=2000H, (BX)=0100H, (SI)=0002H, (20100)=12H, (20101)=34H, (20102)=56H, (20103)=78H, (21200)=2AH, (21201)=4CH, (21202)=B7H, (21203)=65H.,并用命令查看设置是否成功。
然后从内存30000H处依次写入下列指令,并用t命令单步执行每一条指令,验证指令执行完后AX寄存器的内容,并分析结果。
MOV AX,1200HMOV AX,BXMOV AX,[1200H]MOV AX,[BX]MOV AX,1100H[BX] MOV AX,[BX][SI] MOV AX,1100H[BX][SI]实验3、 理解指令的执行过程将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的3次方 mov ax, 1add ax, axjmp 2000:003分析jmp 指令的功能和执行过程。
一光二极管流水灯一、目的:1.通 AT89C51 片机控制 8 个光二极管,八个光二极管分接在片机的P0.0 -P0.7 接口上,出“ 0 ” ,光二极管亮。
开始P0.0 →P0.1 ⋯.→P0.7 ,亮点以 1HZ 率循移。
2.用 PROTEUS ,仿真以 AT89C51 核心的光二极管流水灯装置。
3.掌握光二极管的控制方法。
二、 PROTEUS 路:三、器和PC 机、 PROTEUS 件或 W-A-51合开学板四、源程序:根据路自行写并。
ORG0000HAJMP STARTORG0030HSTART:MOV P0,#0FFHMOV A,#0FEHAAA:MOV P0,ALCALL DELAYJNB P0.7,BBBRL AAJMP AAABBB:MOV A,#7FHCCC:MOV P0,ALCALL DELAYJNB P0.0,STARTRR AAJMP CCCDELAY:MOV R2,#123DL3:MOV R1,#200DL2:MOV R0,#20DL1:DJNZ R0,DL1DJNZ R1,DL2DJNZ R2,DL3RETEND实验二开关控制 LED 数码管实验一、实验目的:1.通过 AT89C51 读入 4 位开关 K1 、K2 、K3 、K4 的输入状态,并按照二进制编码关系0-F 输出到数码管显示。
(如K4K3K2K1 全部按下,则显示F ;若只有 K2 按下,则显示 2 。
)2.掌握 LED 数码管的静态显示。
3.掌握 I/O 口的控制方法。
二、 PROTEUS 电路设计:三、实验仪器和设备PC 机、 PROTEUS 软件或 W-A-51综合开发学习板四、源程序设计:根据电路图自行编写并调试。
CLR P1.0MOV DPTR,#TABLESTART:CLR AJNB P2.0,D1INC AD1:JNB P2.1,D2ADD A,#2D2:JNB P2.2,D3ADD A,#4D3:JNB P2.3,D4ADD A,#8D4:MOVC A,@A+DPTRMOV P0,AAJMP STARTTABLE: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH END实验三外中断优先级实验一、实验目的:1. 理解单片机中断优先级和优先权。
实验名称带返工的产品制造模型课程名称课程号学院(系) 专业班级学生姓名学号实验地点实验日期实验名称:带返工的产品制造模型实验目的:通过这个模型学习基本的排队系统建模的方法,同时练习和熟悉Flexsim的基本操作和基本概念。
实验步骤:1创建对象:从Flexsim的基本界面的对象库中用鼠标拖动一个Source、两个Queue、四个Processor和一个Sink对象到模型窗口并布置好位置和重新命名各对象名字。
2连接对象:按照产品流动的路径,从Suorce开始两两连接对象,产品将沿着连接在对象间流动。
(1)连接Source到Queue1;(2)连接Queue1分别到Processor1、Processor2和Processor3;(3)连接Processor1、Processor2、Processor3到Queue2;(4)连接Tester到Sink;(5)连接Tester到Queue1;3设置产品到达间隔时间:在Source对象的属性窗体里设置产品的到达时间间隔,它服从5秒的指数分布,在弹出的属性窗体中设置产品到达时间为exponential(0,5,1).4设置产品类型和颜色:在Suorce的属性窗体中,选择触发器Triggers页,选择在创建产品是的类型和颜色。
5设置Queue1的最大容量和输出路径:设置Queue1的最大容量为10000,在Flow页,在发送到端口Send To Port字段的下拉列表选择By Expression,并设置输出路径。
6设置加工时间:设置三台机器的加工时间服从均值为10秒的指数分布。
在Processor1的属性窗体,在Process time字段的下拉列表中选择Statictical Distribution,在出现的代码模板中编制Statistical Distribution:exponential(0,10,1)。
对Processor2和Processor3做出同样的设置。
2015——2016学年第一学期《单片机原理及应用》课程设计报告题目基于单片机的电子琴设计班级姓名学号指导老师成绩日期题目:计一个电子琴。
利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出8个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键则发另一音调的声音目录1.课题设计目的及其意义 (1)2.课题设计的任务及要求 (1)3.系统总体方案及单元设计 (1)3.1总体设计 (1)3.2 单片机的最小工作系统 (3)3.2.1 时钟电路 (3)3.2.2复位电路 (3)3.2.3 音频放大电路 (4)3.3 按键部分设计 (5)3.3.1操作键设计 (5)3.3.2键盘设计 (5)3.3.3 消除按键抖动 (6)4.系统软件设计 (7)4.1 系统的软件程序(C语言): (7)4.2 系统的软件的调试仿真 (10)5.设计心得与体会 (12)1.课题设计目的及其意义单片机(单片微型计算机)是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠等特点。
单片机的应用相当广泛,从平常的家用电器到航空航天系统和国防军事、尖端武器都能找到它的身影。
因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
音乐随着人们的生活水平也逐步提高已经成为了我们生活中很重要的一部分,在工作和学习之余,欣赏音乐不仅使身心得到放松,同时也提高人们的精神品质和个人素养。
当代,爱好音乐的年轻人越来越多,也有不少人自己练习弹奏乐器,作为业余爱好和一种放松的手段,鉴于一些乐器学习难度大需花费太多精力,且其价格太过于高昂,使得一部分有这种想法的人不得不放弃这种想法,而电子琴又是一种新型的键盘乐器,它是现代电子科技与音乐结合的产物,价格相对便宜,能够满足一般爱好者的需求,因此,在现代音乐中扮演着重要的角色。
故简易电子琴的研制具有一定的社会意义。
2.课题设计的任务及要求我所选择的的任务题目是:设计一个电子琴。
GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称实验四功能测试工具QTP课程名称软件测试课程号学院(系) 信息(软件)学院专业软件工程班级学生姓名学号实验地点实验日期实验四功能测试工具QTP实验目的:1.熟悉QuickTest Professional(QTP)的安装过程2.熟悉并掌握QTP的基本原理及使用-对象的识别、检查点、参数化实验内容:1.安装QTP2.录制计算器加法运算,计算5+6,保存脚本为cal。
运行脚本,观察是否正确。
计算器对应的程序是:C:\WINDOWS\system32\calc.exe3.对脚本为cal修改,插入属性检查点检查预期结果是否为“11.”,保存脚本为checkcal。
观察运行后QTP是否能够正确判断结果对错。
4.以QTP自带的Windows应用程序flight为例。
对应的应用程序是:C:\Program Files\Mercury Interactive\QuickTestProfessional\samples\flight\app\flight4a.exe,其中AgEnt name至少为4位,password 为mercury.录制如下操作:登录并订购机票(此时不要选择航班)。
保存脚本为flight。
运行脚本,观察是否正确。
5.对登录名称进行参数化:对脚本flight修改,利用Data table数据(只用二个用户)进行参数化,保存脚本为para_name。
观察运行后QTP是否能够以相应的用户名进行登录。
1.1)先打开QTP软件,如下图操作,选择计算器进行测试图1-1-1选择Test-Record图1-1-2按Record后如下图操作,选择Windows的计算器图1-1-3 点击“确定”后,弹出以下页面图1-1-4 2)开始录放脚本(事先已将对象设置好)按照顺序输入“5+6=”,完成后按Stop图1-2-1完成后,按“Run”键,选择“确定”可以运行脚本。
广东海洋大学学生实验报告书(学生用表)实验名称实验四.类的基本编程课程名称Java程序设计与开发技术课程号学院(系) 数学与计算机学院专业计算机科学与技术班级计科1141学生姓名邓超荣学号201411621110 实验地点钟海楼04017实验日期2016.10.26一实验目的:掌握Java类的基本知识及应用二实验内容:定义一个名为Complex的类实现复数概念及运算,它的UML图如下,先实现该类的相关方法,再试编写主方法来测试该类这些的方法。
GDOU-B-11-112代码:public class ComplexDemo {public static void main(String[] args) {Complex c1 = new Complex(1,2);Complex c2 = new Complex(2,3);Complex c3 = new Complex(4,-2);double c = -2;Complex sum = new Complex();sum = plexAdd(c1,c2);System.out.println("(1+2i)+(2+3i)="+sum);sum = plexAdd(c1, c);System.out.println("(1+2i)+(-2)="+sum);sum = plexAdd(c1,c2,c3);System.out.println("(1+2i)+(2+3i)+(4-2i)="+sum);Complex mid = new Complex();mid = plexMinus(c1,c2);System.out.println("(1+2i)-(2+3i)="+mid);mid = plexMinus(c1, c);System.out.println("(1+2i)-(-2)="+mid);Complex mul = new Complex();mul = plexMul(c1,c2);System.out.println("(1+2i)*(2+3i)="+mul);mul = plexMul(c1, c);System.out.println("(1+2i)*(-2)="+mul);mul = plexMul(c1,c2,c3);System.out.println("(1+2i)*(2+3i)*(4-2i)="+mul);}}class Complex {double realPart;double imaginaryPart;Complex(){} //默认构造函数Complex(double r,double i) { //带参数的构造函数realPart = r;imaginaryPart = i;}double getRealPart() { //返回实部return realPart;}void setRealPart(double d) { //设置实部realPart = d;}double getImaginaryPart() { //返回虚部return imaginaryPart;}void setImaginaryPart(double d) { //设置虚部imaginaryPart = d;}Complex complexAdd(Complex c1,Complex c2) { //复数对象与复数对象相加Complex sum = new Complex();sum.realPart = c1.realPart + c2.realPart;sum.imaginaryPart = c1.imaginaryPart +c2.imaginaryPart;return sum;}Complex complexAdd(Complex c1,double c2) { //复数对象与实数相加Complex sum = new Complex();sum.realPart = c1.realPart + c2;sum.imaginaryPart = c1.imaginaryPart;return sum;}Complex complexAdd(Complex c1,Complex c2,Complex c3) { //三个复数相加Complex sum = new Complex();sum.realPart = c1.realPart + c2.realPart +c3.realPart;sum.imaginaryPart = c1.imaginaryPart +c2.imaginaryPart + c3.imaginaryPart;return sum;}Complex complexMinus(Complex c1,Complex c2) { //复数对象与复数对象相减Complex mid = new Complex();mid.realPart = c1.realPart - c2.realPart;mid.imaginaryPart = c1.imaginaryPart -c2.imaginaryPart;return mid;}Complex complexMinus(Complex c1,double c2) { //复数对象与实数相减Complex mid = new Complex();mid.realPart = c1.realPart - c2;mid.imaginaryPart = c1.imaginaryPart;return mid;}Complex complexMul(Complex c1,Complex c2) { //复数对象与复数对象相乘Complex mul = new Complex();mul.realPart = c1.realPart * c2.realPart -c1.imaginaryPart * c2.imaginaryPart;mul.imaginaryPart= c1.realPart* c2.imaginaryPart + c1.imaginaryPart * c2.realPart;return mul;}Complex complexMul(Complex c1,double c2) { //复数对象与实数相乘Complex mul = new Complex();mul.realPart = c1.realPart * c2;mul.imaginaryPart = c1.imaginaryPart * c2;return mul;}Complex complexMul(Complex c1,Complex c2,Complex c3) { //三个复数相乘Complex mul = new Complex();mul.realPart = c1.realPart * c2.realPart -c1.imaginaryPart * c2.imaginaryPart;mul.imaginaryPart= c1.realPart* c2.imaginaryPart + c1.imaginaryPart * c2.realPart;double r = mul.realPart;double i = mul.imaginaryPart;mul.realPart = r * c3.realPart - i *c3.imaginaryPart;mul.imaginaryPart = r * c3.imaginaryPart + i *c3.realPart;return mul;}public String toString() { //以a+bi的形式显示复数String s = new String();if(realPart!=0){if(imaginaryPart>0) {s = (int)realPart + "+" + (int)imaginaryPart + "i";}else if(imaginaryPart==0) {s = String.valueOf((int)realPart);}else{s= (int)realPart+ ""+ (int)imaginaryPart+ "i";}}else{if(imaginaryPart>0) {s = (int)imaginaryPart + "i";}else if(imaginaryPart==0) {s = String.valueOf(0);}else{s = (int)imaginaryPart + "i";}}return s;}}。
广东海洋大学学生实验报告书(学生用表)实验名称实验五自动化性能测试课程名称软件测试课程号学院(系) 信息(软件)学院专业软件工程班级学生姓名学号实验地点实验日期实验五自动化性能测试实验目的:1、掌握性能测试的基本原理和方法;2、了解LoadRunner包含的组件3、掌握LoadRunner工具使用方法—脚本录制、脚本增强、场景设定、测试结果分析实验内容:•录制前请注意:关闭杀毒软件;启动sample\web \start web service;启动LR agent precess•选择LoadRunner附带的应用程序做为测试程序,录制时的URL为:。
1)录制如下的操作:注册一个新用户,登录并退出。
保存脚本为register1。
运行脚本,并观察运行结果。
2)录制如下的操作:登录、预订机票并退出。
保存脚本为transaction1。
对该脚本修改,设定登录事务和集合点。
运行脚本,并观察运行结果。
3)修改脚本transaction1,对登录用户名、密码进行参数化。
保存脚本为parameter1。
运行脚本,并观察运行结果。
4)在Controller中进行场景设计—场景设计:10个并发用户,运行脚本parameter1关注的测试指标:事务的响应时间、吞吐量和资源的使用情况。
5)启动Analysis,查看测试结果文件。
1)录制脚本退出所有杀毒软件,在开始菜单栏寻找并打开LoadRunner Agent Process,打开Start Web Server,桌面右下角如图1-1所示图1-1打开LoadRunner(管理员模式)-选择创建脚本GDOU-B-11-112图1-2 弹出Virtual User Generator-选择新建脚本图1-3 选择Web(HTTP/HTML)-Create图1-4按F4配置浏览器,如图1-5所示。
图1-5按Ctrl+F7,选择URL录放模式(并不清楚为什么选择该模式,但是默认选择的HTML录放模式在回放时会出错)图1-6选择Record Application-Start Recording图1-7选择IE浏览器(32bit),填写需要测试的WEBTours网页,其他默认,点击OK。
实验四字符显示实验
实验目的:1.了解液晶显示的基本原理
2.掌握如何有单片机来控制液晶显示模块的内容实验内容:定义4个字符串,按键控制显示:
显示第一个字符组在lcd第一行,按P2.0
显示第二个字符组在lcd第二行,按P2.1
显示第三个字符在组lcd第一行,按P2.2
显示第四个字符组在lcd的第二行,按P2.3
代码:
#include<AT89X51.H>
#include<string.h>
#include<intrins.h>
#include<stdio.h>
extern void time(unsigned int ucMs);
void lcd_init(void);
void clear(void);//清屏
void enable_data(void);//写数据使能
void enable(void);//写指令使能
#define RS P2_5
#define RW P2_6
#define E P2_7
unsigned char code DAT1[]={"HELLO"};
unsigned char code DAT2[]={"WORLD"};
unsigned char code DAT3[]={"HELLO KEIL"};
unsigned char code DAT4[]={"HELLO WORD"};
void main(void)
{
unsigned char i;
lcd_init();
clear();
while(1)
{
if(P2_0==0)
{
P0=0x80;//写第一行
enable();
for(i=0;i<strlen(DAT1);i++)
{
P0=DAT1[i];
enable_data();
}
}
if(P2_1==0)
{
P0=0xC0;//写第二行
enable();
for(i=0;i<strlen(DAT2);i++)
{
P0=DAT2[i];
enable_data();
}
}
if(P2_2==0)
{
P0=0x80;//写第三行
enable();
for(i=0;i<strlen(DAT3);i++)
{
P0=DAT2[i];
enable_data();
}
}
if(P2_3==0)
{
P0=0xC0;//写第四行
enable();
for(i=0;i<strlen(DAT4);i++)
{
P0=DAT4[i];
enable_data();
}
}
}
}
/*********初始化函数************/ void lcd_init(void)
{
time(10);
P0=0x01;//清屏
enable();
P0=0x38;//2*16显示
enable();
P0=0x0F;//开显示
enable();
P0=0x06;//文字右移
enable();
P0=0x80;//第一行
enable();
}
/*********清屏函数************/ void clear(void)
{
P0=0x01;//清屏
enable();
}
/*********指令使能函数************/ void enable(void)//写指令使能
{
RS=0;
RW=0;
E=1;
time(100);
E=0;
}
/********写数据使能函数************/ void enable_data(void)//写数据使能
{
RS=1;
RW=0;
E=1;
time(100);
E=0;
}
实验五键盘扫描实验
实验目的:1.掌握逐行扫描和线反转法键盘扫描的原理以及十/十六进制的转换
2.了解单片机输入和输出的过程,以及如何对数据进行采集的
实验内容:键盘上对应有16个按键,从0到F,按下相应的键会在数码管上显示相应的数字,其中K0到K15是采用4*4的方式连接的
代码:
ORG0000h
LJMP MAIN
ORG0030h
MAIN:
MOV DPTR,#TAB;将表头放入DPTR
LCALL KEY;调用键盘扫描程序
MOVC A,@A+DPTR;查表后将键值送入ACC
MOV P0,A;将Acc值送入P0口
CLR P1.3;开显示
LJMP MAIN;返回调用子程序反复循环显示
KS:MOV P2,#0FH;将P2口高四位置0低四位值1 MOV A,P2;读P2口
XRL A,#0FH;将A中的值与A中的值相异或
RET;子程序返回
KEY:LCALL KS;调用检测按键子程序
JNZ K1;有键按下继续
LCALL DELAY2;无键按下调用延时去抖动程序
AJMP KEY;返回继续检测有无按键按下
K1:LCALL DELAY2
LCALL DELAY2;有键按下继续延时去抖动
LCALL KS;再一次调用检测按键程序
JNZ K2;确认有按下进行下一步
AJMP KEY;无键按下返回继续检测
K2:MOV R2,#0EFH;将扫描值送入R2暂存
MOV R4,#00H;将第一列的列值00H送入R4暂存,R4用于存放列值。
K3:MOV P2,R2;将R2的值送入P2口
L6:JB P2.0,L1;P2.0等于1跳转到L1
MOV A,#00H;将第一行的行值00H送入ACC
AJMP LK;跳转到键值处理程序
L1:JB P2.1,L2;P2.1等于1跳转到L2
MOV A,#04H;将第二行的行值送入ACC
AJMP LK;跳转到键值理程序进行键值处理
L2:JB P2.2,L3;P1.2等于1跳转到L3
MOV A,#08H;将第三行的行值送入ACC
AJMP LK;跳转到键值处理程序
L3:JB P2.3,NEXT;P2.3等于1跳转到NEXT处
MOV A,#0CH;将第四行的行值送入ACC
LK:ADD A,R4;行值与列值相加后的键值送入A PUSH ACC;将A中的值送入堆栈暂存
K4:LCALL DELAY2;调用延时去抖动程序
LCALL KS;调用按键检测程序
JNZ K4;按键没有松开继续返回检测
POP ACC;将堆栈的值送入ACC
RET
NEXT:
INC R4;将列值加一
MOV A,R2;将R2的值送入A
JNB ACC.7,KEY;扫描完成跳至KEY处进行下一回合的扫描RL A;扫描未完成将A中的值右移一位进行下一列的扫描
MOV R2,A;将ACC的值送入R2暂存
LCALL DELAY2
AJMP K3
DELAY2:;40ms延时去抖动子程序8*FA*2=40ms MOV R5,#08H
L7:MOV R6,#0FAH
L8:DJNZ R6,L8NEXT:
INC R4;将列值加一
MOV A,R2;将R2的值送入A
JNB ACC.7,KEY;扫描完成跳至KEY处进行下一回合的扫描RL A;扫描未完成将A中的值右移一位进行下一列
的扫描
MOV R2,A;将ACC的值送入R2暂存
LCALL DELAY2
AJMP K3
DELAY2:;40ms延时去抖动子程序8*FA*2=40ms MOV R5,#08H
L7:MOV R6,#0FAH
L8:DJNZ R6,L8
DJNZ R5,L7
RET
TAB:DB…
DJNZ R5,L7
RET
TAB:DB…。