实验四 键盘及显示实验
输入输出实验报告

一、实验目的1. 熟悉计算机输入输出设备的基本概念和作用。
2. 掌握常用输入输出设备的使用方法。
3. 了解输入输出设备的性能指标及其对计算机系统的影响。
二、实验环境1. 实验室:计算机实验室2. 硬件设备:计算机、键盘、鼠标、显示器、打印机、U盘等3. 软件:Windows操作系统三、实验内容1. 输入设备实验(1)键盘输入实验1)实验步骤:① 打开计算机,进入Windows操作系统;② 连接键盘,确保键盘正常工作;③ 打开记事本,输入一段文字;2)实验结果:成功输入文字,观察键盘布局,了解各个键位的含义;3)实验总结:熟练掌握键盘布局,提高输入速度。
(2)鼠标输入实验1)实验步骤:① 打开计算机,进入Windows操作系统;② 连接鼠标,确保鼠标正常工作;③ 使用鼠标在桌面进行拖动、点击等操作;2)实验结果:成功进行鼠标操作,熟悉鼠标的使用方法;3)实验总结:熟练掌握鼠标操作,提高操作效率。
2. 输出设备实验(1)显示器输出实验1)实验步骤:① 打开计算机,进入Windows操作系统;② 观察显示器显示的桌面背景、图标等信息;2)实验结果:显示器正常工作,显示计算机信息;3)实验总结:了解显示器的作用,熟悉显示器的性能指标。
(2)打印机输出实验1)实验步骤:① 打开计算机,进入Windows操作系统;② 将打印机连接到计算机;③ 打开文档,进行打印设置;④ 点击打印按钮,将文档打印到纸上;2)实验结果:成功将文档打印到纸上;3)实验总结:了解打印机的工作原理,熟悉打印机的性能指标。
3. 存储设备实验(1)U盘存储实验1)实验步骤:① 打开计算机,进入Windows操作系统;② 将U盘插入USB接口;③ 在文件资源管理器中找到U盘,进行文件读写操作;2)实验结果:成功将文件存入U盘,从U盘中读取文件;3)实验总结:了解U盘的工作原理,熟悉U盘的容量、读写速度等性能指标。
四、实验结果与分析1. 输入设备实验通过键盘输入实验,掌握了键盘布局和输入方法,提高了输入速度。
嵌入式实验报告数码管显示实验

实验报告课程名称嵌入式系统编程实践实验仪器清华同方辰源嵌入式系统实验箱实验名称实验四:数码管显示实验系别__计算机学院_专业 _班级/学号学生姓名实验日期 2013年10月11日成绩___________________指导教师实验四:数码管显示实验一、实验问题回答(1)如何设置功能3,4中的循环速度?答:利用系统SysTick Handler中断,控制循环速度void SysTick_Handler (void){Event = 1;}(2)若是想实现类似实验(三)通过键盘动态控制循环速度,考虑一下应该如何设计?答:SysTickPeriodSet(SysCtlClockGet() / X)//设置x的大小就可以控制循环的速度。
void Reset_Counter_Speed(int x){SysTickIntDisable();SysTickDisable();SysTickPeriodSet(SysCtlClockGet() / x);// 设置x,控制计数频率,值与频率成正比SysTickEnable();SysTickIntEnable();},达到预期的效果。
二、实验目的和效果(效果即是否达到实验目的,达到的程度如何)学习、了解和掌握数码管工作原理和使用方法实验结果及检查(1)默认在在OLED屏幕上分行显示自己的学号、姓名、项目序号、时间,如“2010011001”、“zhangsan”、“work4”、“2012-11-”(2)首先在屏幕上显示四个功能选单,通过键盘A-F键选择不同功能,选择后屏幕显示相关功能提示,接受键盘输入的数字键0-9并在数码管上显示。
如:开始显示:“please choose the function:”“A: …”“B: …”“C: …”“D: …”按下“A”键后,显示”now you choose function A”(3)按下键盘后,根据不同功能在数码管上显示按键字符。
行列式键盘及8位七段数码管的显示拓展

一、实验目的1、掌握矩阵式键盘的原理及编程方法,掌握数码管动态扫描显示的原理及编程方法二、实验原理在实验2的基础上改进程序,当按下数字键0~9时在数码管上显示,要求每按下一个新的数字时,在最低位(最右边)显示,之前按下的数字一次向左移动一个位置,当按下的数字键超过8个时,不再显示新内容。
当按下非数字键即剩下的6个键(A~F)中任意一个时,清除当前显示的内容。
注意这里需要判断按键是否弹起(避免重复显示,有关重复显示参考书第4章例5的重复计数问题,比较相似),否则多个数码管可能会显示同一按键对应的数值三、实验内容⑴掌握行列式键盘和8位七段数码管显示原理;⑵掌握实验3的C51语言编程;四、实验步骤⑴阅读与实验3有关的阅读材料;⑵参考上图,在ISIS中完成电路原理图的绘制;⑶在Keil μvision3中编写和编译C51程序,并生成可执行文件;⑷在μvision3中启动ISIS的仿真运行,并进行联机调试。
五、实验要求提交实验报告并包括如下内容:电路原理图、软件调试分析、C51源程序、仿真运行截图及实验小结。
①源程序:#include<reg51.h>sbit P3_2=P3^2;unsigned char segcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};unsigned char bitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsignedcharkey_buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x 77};unsigned int number=0;unsigned int buf[8]={10,10,10,10,10,10,10,10};void delay(unsigned int time){unsigned int j=0;for(;time>0;time--)for(j=0;j<125;j++);}void getkey() interrupt 0{ delay(10);if(P3_2==0){char key_scan[]={0xef,0xdf,0xbf,0x7f};char i=0,j=0;int m=0,n=0;for(i=0;i<4;i++){P1=key_scan[i];for(j=0;j<16;j++){if(key_buf[j]==P1){number=j;break;}}}for(i=0;i<4;i++){P1=key_scan[i];for(j=0;j<16;j++){while(key_buf[j]==P1);}}if(number<8){for(m=7;m>0;m--){buf[m]=buf[m-1];}buf[0]=number;}else if(number>9){for(n=0;n<8;n++)buf[n]=10;}}}void main(){int k;IT0=1;EX0=1;EA=1;while(1){P1=0x0f;for(k=0;k<8;k++){P0=segcode[10];P2=bitcode[k];P0=segcode[buf[k]];}}}。
从键盘输入数据并显示实验报告

从键盘输入数据并显示实验报告一、实验目的与内容1、实验目的掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII码的原理,并在程序中设置错误出口。
2、实验内容编写程序,将键盘接收到的四位十六进制数按“Enter”回车键转化为二进制数,再显示在屏幕上, 按“空格键”结束!。
若输入的不是0-F间的数字,则显示出错信息,并要求重新输入。
二、实验设备(环境)1、实验设备(含芯片名称、功能简介)微型计算机一台2、实验环境TPC-ZK-II集成环境3、使用语言汇编语言三、实验原理(实验所用到的知识点及相关内容)1.在TPC-ZK-II集成环境下输入汇编程序,编译、连接,生成.exe文件。
2.按提示输入数据,在屏幕显示的运行结果中查看结果是否正确。
3.输入不同的数据,可得到不同的结果。
4、参考流程图四、实验步骤(包括步骤、代码、实验截图及其必要说明)编写程序,将键盘接收到的 4 位 16 进制数转换为等值的二进制数,再显示在荧光屏上。
分析:整个程序分为 3 个部分:键盘输入、转换、显示,可以分别用子程序来完成。
1. 输入。
输入可以利用字符串输入。
这时需要在主程序中先开辟一段输入缓冲区。
字符串输入 ( 0AH 功能 ),入口参数 DS : DX = 缓冲区的首地址,( DS :DX ) = 限制最多输入的字符数,功能号 AH = 0AH,类型号 21H。
出口参数 ( DS : DX+1 ) =实际键入的字符 ( 不含回车符 ),从( DS : DX+2 ) 开始顺序存放键入的字符串,回车符 0DH为串尾最后一字符。
实现功能:等待从键盘输入字符串,并存入设定的缓冲区内,同时回显字符串,光标随着移动,回车符使光标回到行首。
注意事项:应按要求先定义缓冲区,再调用。
数据缓冲区的设置如下:DATA SEGMENT ; 定义缓冲区MARK DB ?MESS DB 'input:$' ;输入字符串提示ERROR DB 0DH,0AH,'input error!',0DH,0AH,'$' ;输入错误提示DATA ENDS从键盘输入‘ ABCD ’, 回车,内存的存放结果 :子程序如下:INPUT PROCLEA DX, striMOV AH, 09H ; 调显示功能INT 21HLEA DX , maxMOV AH , 0AHINT 21H ; 调 0A输入功能RETINPUT ENDP2. 转换。
单片机键盘显示实验报告

单片机的键盘和显示实验报告㈠实验目的1.掌握单片机I/O的工作方式;2.掌握单片机以串行口方式0工作的LED显示;3.掌握键盘和LED显示的编程方法。
㈡实验器材1.G6W仿真器一台2.MCS—51实验板一台3.PC机一台4.电源一台㈢实验内容及要求实验硬件线路图见附图从线路图可见,8051单片机的P1口作为8个按键的输入端,构成独立式键盘。
四个LED显示器通过四个串/并移位寄存器74LS164接口至8051的串行口,该串行口应工作在方式0发送状态下,RXD端送出要显示的段码数据,TXD则作为发送时钟来对显示数据进行移位操作。
编写一个计算器程序,当某一键按下时可执行相应的加、减、乘、除运算方式,在四个显示器上显示数学算式和最终计算结果。
注:①通过按键来选择加、减、乘、除四种运算方式。
②输入两个数字均为一位十进制数,可预先放在内存中。
㈣实验框图(见下页)㈤思考题1.当键盘采用中断方式时,硬件电路应怎样连接?P1.4~P1.7是键输出线,P1.0~P1.3是扫描输入线。
输入与门用于产生按键中断,其输入端与各列线相连,再通过上拉电阻接至+5 V电源,输出端接至8051的外部中断输入端。
2.74LS164移位寄存器的移位速率是多少?实验中要求计算的式子和结果之间相差一秒,移位寄存器的移位速率应该是每秒一位吧。
其实这个问题确实不知道怎么回答。
LED 显示用的段码与教科书所提供的不同,本实验采用如下段码:显示数符段码显示数符段码0BBH A DBH109H B F1H2EAH C B2H36BH D E9H459H E F2H573H F D2H否有否P1口置输入读P1口开 始显示“0000”是否有键按下?延迟消抖是否有键按下?是读键码加法运算减法运算除运算6F3H—40H70BH.04H8FBH┗┛A1H97BH┗┛1AH灭00H P DAH实验代码:ORG 0000HAJMP MAINORG 0030HMAIN:MOV 41H,#0BBH ;对几个存放地址进行初始化MOV 42H,#0BBHMOV 43H,#0BBHMOV 44H,#0BBHMOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0 LCALL DISPLAY ;初始化显示KEY:MOV R3,#08H;用来存放两个数据MOV R4,#02HMOV P1,#0FFH ;初始化P1口MOV A,P1 ;读取按键状态CPL A ;取正逻辑,高电平表示有键按下JZ KEY ;A=0时无键按下,重新扫描键盘LCALL DELAY1;消抖MOV A,P1 ;再次读取按键状态CPL AJZ KEY ;再次判别是否有键按下PUSH AKEY1:MOV A,P1CPL AANL A,#0FH ;判别按键释放JNZ KEY1 ;按键未释放,等待LCALL DELAY1;释放,延时去抖动POP AJB ACC.0,ADD1 ;K1按下转去ADD1JB ACC.1,SUB1 ;K1按下转去SUB1JB ACC.2,MUL1 ;K1按下转去MUL1JB ACC.3,DIV1 ;K1按下转去DIV1LJMP KEYADD1:LCALL BUFFER ;显示加数和被加数MOV 43H,#049HLCALL DISPLAY ;显示加号MOV A,R3ADD A,R4DA AMOV R3,A ;相加结果放入R6ANL A,#0FHMOV R4,A ;结果个位放入R7MOV A,R3SWAP A ;半字节交换,高四位放入低四位ANL A,#0FHMOV R3,A ;结果的高位放入R6LCALL L;显示缓存区设置LCALL DELAY2;延时一秒后显示LCALL DISPLAYLJMP KEYSUB1:LCALL BUFFER ;显示减数和被减数MOV 43H,#40HLCALL DISPLAY ;显示减号MOV A,R3CLR CY ;CY清零SUBB A,R4 ;做减法PUSH ARLC A ;带进位循环左移,最高位放入CYJC F ;判断最高位,若为1则跳转到负数ZHENG: POP AMOV R4,AMOV R3,#00H ;高位清零SJMP OUTFU:POP ACPL A ;取绝对值INC AMOV R4,AMOV R3,#11H ;显示负号OUT: LCALL L ;显示缓存区设置LCALL DELAY2 ;延时1s后显示LCALL DISPLAYLJMP KEYMUL1:LCALL BUFFER ;显示两位乘数MOV 43H,#99HLCALL DISPLAY ;显示乘号MOV A,R3MOV B,R4MUL AB ;结果放入AB,A中是低8位,B中是高8位MOV B,#0AHDIV AB ;十进制转换MOV R4,B ;结果个位放入R7MOV R3,A ;结果的十位放入R6LCALL LLCALL DELAY2LCALL DISPLAY ;延时1s后显示LJMP KEYDIV1:LCALL BUFFER ;显示除数和被除数MOV 43H,#62HLCALL DISPLAY ;显示除号MOV A,R3MOV B,R4DIV AB ;A除以BMOV R4,B ;余数放在R4中MOV R3,A ;商放在R3中MOV A,R4MOVC A,@A+DPTR ;调用段选号MOV 41H,A ;显示余数MOV A,R3MOVC A,@A+DPTRMOV 43H,A ;显示商MOV 42H,#00HMOV 44H,#00HLCALL DELAY2 ;延时1S后显示LCALL DISPLAYLJMP KEYBUFFER: MOV 41H,#22H ;显示初始化,在做计算之前显示两个操作数,显示等号MOV DPTR,#TABLMOV A,R4MOVC A,@A+DPTRMOV 42H,AMOV A,R3MOVC A,@A+DPTRMOV 44H,ARETDISPLAY:MOV R5,#04H;共四位需要显示MOV R0,#41HDISPLAY1:MOV A,@R0MOV SBUF,ADISPLAY2:JNB TI,DISPLAY2;是否传完了CLR TIINC R0DJNZ R5,DISPLAY1RETL:MOV A,R4MOVC A,@A+DPTRMOV 41H,A ;R4对应的段码MOV A,R3MOVC A,@A+DPTRMOV 42H,A ;R3对应的段码MOV 43H,#00HMOV 44H,#00HRETDELAY1: ;普通延时MOV R1,#20HDS1:MOV R2,#0FFHDS2:DJNZ R2,DS2DJNZ R1,DS1RETDELAY2:MOV R6,#14H ;定时1SMOV TMOD,#01HDS3:MOV TH0,#3CHMOV TL0,#0B0H ;50msSETB TR0LOOP:JNB TF0,LOOPCLR TF0CLR TR0DJNZ R6,DS3 ;1s到,中断返回RETTABL:DB 0BBH 09H 0EAH 6BH ;段码表DB 59H 73H 0F3H 0BHDB 0FBH 7BH 00H 0DBHDB 0F1H 0B2H 0E9H 0F2HDB 0D2H 40H实验结果及分析按键1:8+2= 结果:10按键2:8-2= 结果: 6按键3:8*2= 结果:16按键4:8/2= 结果:4从上面的结果可以看出,本次实验基本完成了实验要求。
键盘显示实验报告

键盘显示实验报告键盘显示实验报告一、引言键盘是我们日常生活中常用的输入设备之一,它通过按下不同的按键来输入字符和命令。
在计算机科学领域,键盘显示是一项重要的实验,它涉及到了计算机硬件和软件的相互配合。
本文将介绍一个键盘显示实验的设计和结果分析。
二、实验设计1. 实验目的本实验的目的是通过键盘输入字符,并在计算机屏幕上进行显示。
通过这个实验,我们可以深入了解键盘的工作原理和计算机输入输出的基本知识。
2. 实验材料本实验所需的材料包括:计算机、键盘、显示器和相应的连接线。
3. 实验步骤(1) 将键盘与计算机通过连接线连接好。
(2) 打开计算机,并启动相应的键盘显示程序。
(3) 在键盘上按下不同的按键,观察计算机屏幕上的显示效果。
(4) 分析和记录实验结果。
三、实验结果在本次实验中,我们按下了键盘上的不同按键,并观察了计算机屏幕上的显示效果。
实验结果表明,键盘输入的字符能够准确地显示在屏幕上,并且显示的速度非常快。
四、结果分析1. 键盘工作原理键盘是一种输入设备,它通过按下不同的按键来输入字符和命令。
当我们按下键盘上的某个按键时,键盘会发送一个信号给计算机,计算机通过解读这个信号来确定我们按下的是哪个按键,并将相应的字符显示在屏幕上。
2. 计算机输入输出键盘显示实验涉及到了计算机的输入输出过程。
输入是指将外部信息传递给计算机的过程,而输出是指将计算机处理后的信息传递给外部的过程。
在本实验中,键盘是输入设备,它将我们按下的按键信息传递给计算机;而显示器是输出设备,它将计算机处理后的字符信息显示在屏幕上。
3. 键盘显示的应用键盘显示技术在计算机领域有着广泛的应用。
无论是在日常办公还是在专业领域,键盘输入都是必不可少的。
通过键盘,我们可以输入文字、命令、密码等信息,实现与计算机的交互。
键盘显示技术的发展也为计算机的普及和应用提供了方便。
五、实验总结通过本次键盘显示实验,我们深入了解了键盘的工作原理和计算机输入输出的基本知识。
实验四行列式键盘实验

2. 程序设计按照实验要求,实验参考程序如下:#include <reg51.h>#include <stdio.h>#define OSC 11059200#define BAUDRATE 9600sbit BUZ_CON= P3^7; // 定义蜂鸣器控制位void Delay1ms(int ms){ int i;while(ms--)for(i=0;i<100;i++); // 可根据晶振频率调整循环次数,使延时约1ms } main(void){ unsigned char Mask,ScanCode,Line,Col,i;TMOD = 0x20;PCON |= 0x80;SCON = 0x50;TH1 = 256 - (OSC/12/16/BAUDRATE);TL1 = 256 - (OSC/12/16/BAUDRATE); // 设置串行口工作模式及波特率发生器初值TR1 = 1; // 启动定时器,产生波特率时钟TI = 1; // 使用printf 函数的要求printf("\r\nKey pad 4X4 test running..."); //输出提示信息printf("\r\nKey pad 4X4 test running...");while(1){ P1 = 0xff; // P1 全部置高,准备扫描Line = 1; // 从第一行开始扫描Mask = 0x01; // 行位置掩码,初始值为指向最低位(第1 行for(i=0;i<4;i++){Col = 0; // 置某行输出为0P1 = ~Mask; // 输入4 列(P1 的高4 位)的状态ScanCode = P1 & 0xf0; // 输入的4 列不全为1 则表示有键按下if(ScanCode != 0xf0){BUZ_CON = 0; // 蜂鸣器鸣响Delay1ms(20); // 按键去抖BUZ_CON = 1; // 蜂鸣器停止鸣响}ScanCode = P1 & 0xf0;switch(ScanCode) //再次读入各列状态{case 0xe0: Col = 1; // P1=11100000b,第1 列有键按下break;1case 0xd0:Col = 2; // P1=11010000b,第2 列有键按下break;case 0xb0:Col = 3; // P1=10110000b,第3 列有键按下break;case 0x70:Col = 4; // P1=01110000b,第4 列有键按下break;default:Col = 0; // 其余情况均不识别break;}if(Col > 0) // 识别到有效按键Col 才能大于0{printf("\r\nKey pressed: Line=%bd,Column=%bd",Line,Col); // 输出按键所在的行、列号while(1) // 等所有按键都释放后再返回{ScanCode = P1 & 0xf0;if(ScanCode == 0xf0) break;}}Mask <<= 1; // 扫描下一行Line ++; // 4 行扫描完成后,退到上层while 循环,重新扫描} }}六、实验体会本次实验让我了解矩阵键盘的工作原理。
(实验四)单片机矩阵键盘检测和液晶仿真实验

实验四单片机矩阵键盘检测和液晶仿真实验(4学时)一、实验任务利用51单片机实现4X4矩阵键盘和LCD1602液晶显示人机交互系统,编程实现:(1)按键扫描(1、2、……9、A、B、C、D、E、F)和LCD1602显示按键的键号,格式为:KEYNUM+按键号;(2)LCD1602的第一行显示加1功能,初始数字为980,显示位置自己确定,每次按下某一个按键,数字加1,范围为15---20;二、实验目的1、掌握仿真软件Proteus和单片机联调的方法;2、掌握矩阵键盘扫描检测的原理,并且编程实现键盘按键的检测;3、掌握LCD1602液晶显示的原理,并且编程实现LCD1602的显示功能;4、掌握利用单片机实现键盘检测和液晶显示的功能组合,并掌握独立编程控制的能力。
三、实验设备电脑、Proteus软件、Keil软件四、实验原理(一)矩阵键盘扫描检测原理按照按键结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点开关按键,如电气式按键、磁感应按键等。
在单片机应用系统中,通过按键实现控制功能和数据输入是非常普遍的。
在所需按键数量不多时,系统常采用独立式按键。
独立式按键是指每个按键单独占有一根I/O口线,且其工作状态不会影响其他I/O口线的工作状态。
这种按键的电路配置灵活,软件结构简单。
不过在实际应用中,由于不同的系统对按键的要求不同,因此,对按键程序的设计要考虑全面,以便更好地完成按键所设定的功能。
在按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图4.1所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样一个端口(如P1口)就可以构成4×4=16个按键,比直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出1键(共9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四键盘及显示实验一、实验目的1、学习自制键盘与单片机的接口及程序处理方法;2、掌握数码管显示电路的构成及程序编制方法。
二、实验仪器设备THGZ—1型单片机·CPLD/FPGA开发综合实验装置1台。
三、实验内容与要求通过键盘输入数据和操作指令,并由LED显示器显示相关数据。
1、独立式键盘与动态LED显示起初显示器全黑,当按KEY1~KEY8任意键后,显示器显示与键号对应的字符(“1”~“8”),每次按键对应字符显示在最右边,前一次的左移一位。
图2-4.1 独立式键盘与动态LED显示实验电路2、矩阵式键盘与动态LED显示①单字符的循环显示起初显示器显示“In ”,按键盘上的“0”~“9”任意键后再按“开始”键,6位LED 显示器马上左循环显示(左移速度0.5s/字符)键入的字符,按“停止”键可以重复以上过程。
图2-4.2 单字符的循环显示实验电路②延时函数的时间测量用定时器/计数器0测量如下延时函数的延时时间。
delaytest(unsigned int time){ unsigned int i,j;for (i=0;i<time;i++)for (j=0;j<65535;j++);}开机显示“good”;按“测量”键后显示“InPArA”表明要通过键盘输入延时函数的实参值,输入实参值并显示该值;按“测量”键后以ms为单位显示测量结果;再按“测量”键将重复以上过程。
图2-4.3 延时函数的时间测量实验电路四、思考题1、比较独立式键盘与矩阵式键盘的异同。
2、键盘处理程序包括哪些过程?2、如何识别键盘上的各键?键值有何意义?3、何为消抖?有何意义?如何实现?实验四源程序清单TEST4-1.C#include <reg51.h>#define KeyISegCodeO P1 /*定义键盘输入口/动态LED显示器段码输出口*/#define BitCtrO P2 /*定义动态LED显示器位控码输出口*/unsigned char DispBuf[6]={10,10,10,10,10,10}; /*显示数组,初始化为不显示*/void delay(unsigned char time) /*延时函数*/{ unsigned char i,j;for (i=0;i<time;i++)for (j=0;j<255;j++);}unsigned char KeyBoardScan() /*键盘扫描函数*/{ unsigned char KeyV alue=0; /*键值,无键按下为0*/BitCtrO=0; /*关闭显示*/KeyISegCodeO=0xff; /*由输出转为输入*/if (KeyISegCodeO!=0xff){ delay(12); /*消抖延时约10ms(fosc=12MHz)*/if (KeyISegCodeO!=0xff){ switch (KeyISegCodeO){ case 0xfe: KeyV alue=1;break; /*KEY1按下,键值为1*/case 0xfd: KeyV alue=2;break; /*KEY2按下,键值为2*/case 0xfb: KeyV alue=3;break; /*KEY3按下,键值为3*/case 0xf7: KeyV alue=4;break; /*KEY4按下,键值为4*/case 0xef: KeyV alue=5;break; /*KEY5按下,键值为5*/case 0xdf: KeyV alue=6;break; /*KEY6按下,键值为6*/case 0xbf: KeyV alue=7;break; /*KEY7按下,键值为7*/case 0x7f: KeyV alue=8;break; /*KEY8按下,键值为8*/}while (KeyISegCodeO!=0xff); /*等待键释放*/}}return(KeyV alue); /*返回键值*/}void display(unsigned char NumLED) /*显示函数*/{ unsigned char code SegCode[16]={63,6,91,79,102,109,125,7,127,111,0}; /*0~9、显黑共阴极段码*/ unsigned char i;BitCtrO=1; /*指向显示器末位*/for (i=0;i<NumLED;i++){ KeyISegCodeO=SegCode[DispBuf[i]]; /*显示当前位*/delay(5); /*延时约4ms(fosc=12MHz)*/BitCtrO=BitCtrO<<1; /*指向前一位*/}}main(){ unsigned char KeyV alue,i;while(1){ KeyV alue=KeyBoardScan(); /*扫描键盘获得键值*/if (KeyV alue!=0){ /*显示缓冲区刷新*/for (i=5;i>0;i--)DispBuf[i]=DispBuf[i-1];DispBuf[0]=KeyV alue;}display(6); /*显示(6位)*/}}TEST4-2.1.C#include <reg51.h>#include <intrins.h>#define KeyROCISegCodeO P1 /*定义键盘行输出列输入/段码输出口*/#define BitCtrO P2 /*定义动态LED显示器位控码输出口*/#define NumRow 3 /*定义键盘行数为3*/#define NumColumn 4 /*定义键盘列数为4*/unsigned char DispBuf[6]={10,10,10,10,11,1}; /*显示数组,初始化为显示"In "*/unsigned char c_50ms=1; /*50毫秒计数*/void delay(unsigned char time) /*延时函数*/{ unsigned char i,j;for (i=0;i<time;i++)for (j=0;j<255;j++);}unsigned char KeyBoardScan() /*键盘扫描函数*/{ unsigned char row=NumRow,RowCode,column=NumColumn,ColumnState; /*行循环、行码、列循环、列状态*/BitCtrO=0; /*关闭显示*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*有键按下*/delay(12); /*消抖延时约10ms(fosc=12MHz)*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*确实有键按下,寻找是哪个键*/RowCode=0xfe; /*指向第1行*/for(row=0;row<NumRow;row++) /*扫描共NumRow行*/{ KeyROCISegCodeO=RowCode; /*当前行*/ColumnState=KeyROCISegCodeO|0x0f; /*获取列状态*/for(column=0;column<NumColumn;column++) /*查询共NumColumn列的状态*/if ((ColumnState|0x7f)==0x7f){ while ((KeyROCISegCodeO|0x0f)!=0xff); /*等待键释放*/return(row*NumColumn+column); /*返回键值*/}elseColumnState=_crol_(ColumnState,1); /*指向下一列*/RowCode=_crol_(RowCode,1); /*指向下一行*/}}}return(NumRow*NumColumn); /*返回无键值*/}void display(unsigned char NumLED) /*显示函数*/{ unsigned char code SegCode[12]={63,6,91,79,102,109,125,7,127,111,0,84}; /*0~9、黑、n共阴极段码*/ unsigned char i;BitCtrO=1; /*指向显示器末位*/for (i=0;i<NumLED;i++){ KeyROCISegCodeO=SegCode[DispBuf[i]]; /*显示当前位*/delay(6); /*延时约5ms(fosc=12MHz)*/BitCtrO=BitCtrO<<1; /*指向前一位*/}}main(){ unsigned char i,KeyV alue,lock=0; /*循环,键值,键联锁:0:"停止"键有效、1:数字键有效、2:"开始"键有效*/TMOD=1; /*定时计数器0定时、方式1*/TH0=(65536-50000)/256; /*定时计数器0定时50ms*/TL0=(65536-50000)%256;ET0=1; /*开定时计数器0中断*/EA=1; /*开总中断*/while(1){ KeyV alue=KeyBoardScan(); /*扫描键盘获得键值*/switch (KeyV alue) /*键处理*/{ case 12: break; /*无键按下不处理*/case 11: { if (lock==0){ /*"停止键"有效及处理*/TR0=0; /*关闭T0*/DispBuf[5]=1; /*左边第1个数码管显"I"*/DispBuf[4]=11; /*左边第2个数码管显"n"*/for (i=0;i<4;i++) DispBuf[i]=10; /*后面4个数码管显黑*/lock=1; /*数字键有效*/}} break;case 10: { if (lock==2){ /*"开始"键有效及处理*/TR0=1; /*启动T0*/lock=0; /*"停止"键有效*/}} break;default: { if (lock==1){ /*数字键有效及处理*/DispBuf[0]=KeyV alue; /*右边第1个数码管显键入的字符*/for (i=5;i>0;i--) DispBuf[i]=10; /*其余5个显黑*/lock=2; /*"开始"键有效*/}}}display(6); /*数码管(6个)显示*/}}/**********定时计数器0中断处理程序*********/TC0() interrupt 1 using 1{ unsigned char temp,i;TH0=(65536-50000)/256; /*定时计数器0重新定时50ms*/TL0=(65536-50000)%256;if (c_50ms++>10){ /*0.5s后使键入字符左环移1位*/c_50ms=1;temp=DispBuf[5];for (i=5;i>0;i--) DispBuf[i]=DispBuf[i-1];DispBuf[0]=temp;}}TEST4-2.2.C#include <reg51.h>#include <intrins.h>#define KeyROCISegCodeO P1 /*定义键盘行输出列输入/段码输出口*/#define BitCtrO P2 /*定义动态LED显示器位控码输出口*/#define NumRow 3 /*定义键盘行数为3*/#define NumColumn 4 /*定义键盘列数为4*/unsigned char DispBuf[6]={10,10,13,12,12,9}; /*显示数组,初始化为显示"good "*/unsigned long total; /*T0溢出计数*/void delay(unsigned char time) /*延时函数*/{ unsigned char i,j;for (i=0;i<time;i++)for (j=0;j<255;j++);}void delaytest(unsigned int time) /*延时函数*/{ unsigned int i,j;for (i=0;i<time;i++)for (j=0;j<65535;j++);}unsigned char KeyBoardScan() /*键盘扫描函数*/{ unsigned char row=NumRow,RowCode,column=NumColumn,ColumnState; /*行循环、行码、列循环、列状态*/BitCtrO=0; /*关闭显示*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*有键按下*/delay(12); /*消抖延时约10ms(fosc=12MHz)*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*确实有键按下,寻找是哪个键*/RowCode=0xfe; /*指向第1行*/for(row=0;row<NumRow;row++) /*扫描共NumRow行*/{ KeyROCISegCodeO=RowCode; /*当前行*/ColumnState=KeyROCISegCodeO|0x0f; /*获取列状态*/for(column=0;column<NumColumn;column++) /*查询共NumColumn列的状态*/if ((ColumnState|0x7f)==0x7f){ while ((KeyROCISegCodeO|0x0f)!=0xff); /*等待键释放*/return(row*NumColumn+column); /*返回键值*/ }elseColumnState=_crol_(ColumnState,1); /*指向下一列*/RowCode=_crol_(RowCode,1); /*指向下一行*/ }}}return(NumRow*NumColumn); /*返回无键值*/}void display(unsigned char NumLED) /*显示函数*/{ unsigned char code SegCode[18]={63,6,91,79,102,109,125,7,127,111,0,84,92,94,115,119,80,121}; /*0~9、黑、n、o、d、P、A、r、E共阴极段码*/unsigned char i;BitCtrO=1; /*指向显示器末位*/for (i=0;i<NumLED;i++){ KeyROCISegCodeO=SegCode[DispBuf[i]]; /*显示当前位*/delay(6); /*延时约5ms(fosc=12MHz)*/BitCtrO=BitCtrO<<1; /*指向前一位*/ }}void error(){ DispBuf[5]=17; /*显"E"*/DispBuf[4]=16; /*显"r"*/DispBuf[3]=16; /*显"r"*/DispBuf[2]=12; /*显"o"*/DispBuf[1]=16; /*显"r"*/DispBuf[0]=10; /*显黑*/}main(){ unsigned char temp,NumBit,i,KeyV alue; /*临时、数字位数,循环,键值*/ unsigned long result; /*实参值/测量结果*/bit lock=0 ; /*键联锁:0:"测量"键有效、1:数字键/"确认"键有效*/ TMOD=1; /*定时T0定时方式1*/TH0=0;TL0=0;ET0=1; /*开T0中断*/EA=1; /*开总中断*/while(1){ KeyV alue=KeyBoardScan(); /*扫描键盘获得键值*/switch (KeyV alue) /*键处理*/{ case 12: break; /*无键按下不处理*/case 11: { if (lock==0){ /*"测量键"有效及处理*/DispBuf[5]=1; /*显"I"*/DispBuf[4]=11; /*显"n"*/DispBuf[3]=14; /*显"P"*/DispBuf[2]=15; /*显"A"*/DispBuf[1]=16; /*显"r"*/DispBuf[0]=15; /*显"A"*/NumBit=0; /*无数字输入*/lock=1; /*数字/"确认"键有效*/}} break;case 10: { if (lock){ /*"确认"键有效及处理*/if (NumBit>0) /*限定必须输入至少1位实参值*/{ /*获得有效数字位*/for (i=4;i>0;i--)if (DispBuf[i]==10) DispBuf[i]=0;else break;result=10000*DispBuf[4]+1000*DispBuf[3]+100*DispBuf[2]+10*DispBuf[1]+DispBuf[0]; /*获得实参值*/if (result<65536&&result!=0){ total=0; /*T0溢出计数初值0*/TR0=1; /*启动T0*/delaytest((unsigned int)result);TR0=0; /*关闭T0*/result=(total*65536+TH0+TL0)/1000; /*获得ms为单位的测量结果*/if (result<1000000){ /*显示测量结果*/for (i=0;i<6;i++) /*获得测量结果数字位*/{ DispBuf[i]=result%10;result/=10;}for (i=5;i>0;i--) /*去掉测量结果数字位无效0*/if (DispBuf[i]==0)DispBuf[i]=10 ;else break;}elseerror(); /*结果超出显示范围,提示出错*/}elseerror(); /*实参为0或超出65535,提示出错*/}elseerror(); /*实参为0,提示出错*/lock=0; /*"测量"键有效*/}} break;default: { if (lock){ /*数字键有效及处理*/if (NumBit++<5) /*限定只能输入1~5位实参值*/{ if(NumBit!=1){ /*数字位左移*/temp=DispBuf[5];for (i=5;i>0;i--) DispBuf[i]=DispBuf[i-1];DispBuf[0]=temp;DispBuf[0]=KeyV alue;}else{ if (KeyV alue==0){ /*第1位数字为0,提示出错*/error();lock=0; /*"测量"键有效*/}else{ for (i=5;i>0;i--) DispBuf[i]=10;DispBuf[0]=KeyV alue;}}}else{ error();lock=0; /*"测量"键有效*/}}}}display(6); /*数码管(6个)显示*/}}/*******T0中断处理程序*******/TC0() interrupt 1 using 1{ total++;}。