实验一--键盘显示实验
8255扫描键盘、显示实验
实验九8255扫描键盘、显示实验一.实验要求利用8255可编程并行口做一个扫描键盘实验,把按键输入的键码,显示在由8279控制的七段数码管上。
8255PA口做键盘输入线,PB口作扫描线。
二.实验目的1.掌握8255编程方法。
2.掌握扫描键盘和显示的编程方法。
三.实验电路及连线CS8255接8500H,则命令字地址为8506H,PA口地址为8500H,PB口地址为8502H,PC口地址为8504H。
CS8279接8700H,则8279的状态口地址为8701H; 8279的数据口地址为8700H;模块中的十个短路套都套在8255侧。
四.实验说明在PA口与PB口组成的64点阵列上,把按键接在不同的点上,将得到不同的键码,本实验采用8×2的阵列,共可按16个键。
显示部分由8279控制,由7407驱动8位数码管显示。
五.实验程序框图主程序框图读键显示部分框图六.实验程序:D8255 EQU 8506H ;8255状态/数据口地址D8255A EQU 8500H ;8255 PA口地址D8255B EQU 8502H ;8255 PB口地址Z8279 EQU 8701H ;8279状态口地址D8279 EQU 8700H ;8279数据口地址DISPTR EQU 08H ;当前显示位置KEYVAL EQU 09H ;读到的键码ORG 0000HLJMP STARTORG 0040HSTART:MOV SP,#60HLCALL DELAY ;延时MOV DISPTR,#30H ;显示缓冲区头指针MOV DPTR,#D8255MOV A,#90H ;置8255状态;方式0,PB,PC口输出,PA口输入MOVX @DPTR,AMOV DPTR,#Z8279 ;置8279命令字MOV A,#0D3HMOVX @DPTR,A ;清LED显示MOV A,#00HMOVX @DPTR,AMOV A,#38HMOVX @DPTR,AMOV A,#0D1HKB_DIS:LCALL RD_KB ;读键盘MOV A,#0FFHCJNE A,KEYVAL,DISBUF ;判读到键SJMP KB_DIS ;没有则继续读键DISBUF:LCALL DISP ;把键移入显存LCALL DELAY ;延时消抖LCALL DELAYSJMP KB_DISDISP: ;显存依次前移MOV R1,#31H ;在最后加入新键值MOVE:MOV A,@R1DEC R1MOV @R1,AINC R1INC R1CJNE R1,#38H,MOVEMOV 37H,KEYVALMOV KEYVAL,#0FFHMOV DPTR,#Z8279MOV A,#90HMOVX @DPTR,AMOV R0,#08HMOV R1,#30HMOV DPTR,#D8279LP: MOV A,@R1MOVX @DPTR,AINC R1DJNZ R0,LPRETRD_KB: ;键盘扫描MOV A,#02H ;扫描第一行MOV DPTR,#D8255BMOVX @DPTR,AMOV DPTR,#D8255AMOVX A,@DPTRMOV R1,#00HCJNE A,#0FFH,KEYCAL ;判键是否按下MOV A,#01H ;扫描第二行MOV DPTR,#D8255BMOVX @DPTR,AMOV DPTR,#D8255AMOVX A,@DPTRMOV R1,#08HCJNE A,#0FFH,KEYCALSJMP NOKEY ;无键按下KEYCAL: ;计算键码MOV R0,#08HSHIFT:RRC AJNC CALCINC R1DJNZ R0,SHIFTCALC: ;换算显示码MOV DPTR,#DL_DATMOV A,R1MOVC A,@A+DPTRMOV KEYVAL,ARETNOKEY: MOV KEYVAL,#0FFH ;返回无键标志RETDELAY: MOV R0,#0H ;延时子程序DELAY1: MOV R1,#0HDJNZ R1,$DJNZ R0,DELAY1RETDL_DAT: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0,1,2,3,4,5,6,7DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8,9,A,B,C,D,E,FEND实验十8279显示实验一.实验要求编制程序,利用8279及键盘显示接口电路,编程实现按键的读取,并将按键值显示在数码管上。
实验六键盘显示控制实验
实验六键盘显示控制实验一、实验目的1.掌握8279键盘显示电路的基本功能及编程方法。
2 •掌握一般键盘和显示电路的工作原理。
3.进一步掌握定时器的使用和中断处理程序的编程方法。
二、实验内容1. 8237键盘显示电路的基本原理本实验系统中把键盘显示电路设计在一块扩展电路板上,用一根20芯的扁平电缆与实验台上扩展插头J7相连。
小键盘上每按一个键,6位数码管上显示出相应字符,其对应关系如下表6-1。
2.设计电子时钟利用实验台上提供的定时器8253和扩展板上提供的8279以及键盘和数码管显示电路,设计一个电子钟。
由8253中断定时,小键盘控制电子钟的启停及初始值的预置。
电子钟显示格式如下:7407 74073fe2feITfe3B i BKb_6B B/B HEJRR QcCRRnorJ R --CDV44K ccvfLT OBTkK TUQEO -LIUO_HEEZM —ZuB4U2U2U lu B CCVCCVCDD CDDXX . XX . XX 由左向右分别为时、分、秒 并具有如下功能:① C 键:清除,显示00. 00. 00。
② G 键:启动,电子钟计时。
③ D 键:停止,电子钟停止计时④ P 键:设置时、分、秒值。
输入时依次为时、分、秒,同时应有判断输入 错误的能力,若有错,则显示:E ----------- 。
此时按P 键重新输入预置值。
⑤ E 键:程序退出,返回DOS 。
3.硬件电路图硬件电路图如图6-1。
图6-1键盘显示控制电路图4. 硬件连线100x87545275452754526 722864H11做电子钟实验时,实验台上8253的CLK0接1MHz,GATE0和GATE1接入口清显示+5V , OUTO 接 CLK1 , OUT1 接 IRQ 。
CS 接 280H~287H 。
5 •编程提示(1)显示按键程序框图显示铵键程序框图如图 6-2 (a )主程序 框图,(b )键盘显示子程序框图,(c )显示子 程序框图。
06 12864LCD显示计算器键盘按键实验
目录1 课程设计概述和要求 (1)1.1 课程设计要求与任务 (2)1.2 课程设计思路 (2)1.3 课程设计需要配置的环境 (3)2 系统设计 (3)2.1 设计框图 (3)2.2 元件解析 (3)2.2.1 LCD12864芯片……………………………………………………………42.2.2 AT89C51芯片 (5)2.2.3 其他部件 (6)2.2.4 电路分析 (7)3 软件设计 (12)3.1 程序流程图 (12)3.2 程序代码 (12)4 系统的仿真与调试 (13)4.1 硬件调试 (13)4.2 软件调试 (14)4.3 软硬件调试 (14)5 总结 (14)附录1:程序代码附录2:12864LCD显示计算器键盘按键实验Proteus仿真图1 课程设计概述和要求1.1 课程设计任务与要求设计任务:利用AT89C51单片机结合12864LCD显示器设计计算器键盘按键。
设计要求1:本设计实现一个12864LCD显示12864LCD显示器设计计算器键盘按键2.利用AT89C51控制整个电路来实现. 显示12864LCD显示器设计计算器键盘按键,系统主要包括硬件和软件两部分。
重点就是各部分硬件的连接设计以及程序的编写。
本章讲述的就是系统硬件的设计,其中包括各模块的器件选择和电路设计。
将计算器按键上的信息传送至AT89C51主芯片之中,利用P2端口使之显示于12864LCD液晶显示屏上。
1.2 课程设计目的思路1、先把与题目有关的芯片资料找到,熟悉一下芯片资料2、把此程序的电路图看懂,了解一下它的实现原理,以及实现的功能。
3、分析一下此程序的各部分的功能,各零件的工作原理。
4、对程序进行调试,分析调试结果,观察并得出结论。
1.3 课程设计需要配置的环境1、一台主机,一台显示器2、Keil uVision3/Keil uVision4 应用程序软件3、ISIS 7 Professional 仿真软件4、老师交给的仿真电路图,及案例5、纸张,以及一些参考资料2 系统设计2.1.设计框图框图设计是为了能够从整体上把握系统的各个大的模块以及各个模块之间的联系。
基于C51单片机的键盘及LCD显示
}
}
}
1.实验报告格式:
一.实验名称
二.实验目的
三.实验内容
四.设计思想
五.硬件设计
六.程序代码
七.参考文献
2.硬件电路原理图用PROTEL等软件画出。
附录:程序源代码:
附录1
#include "reg51.h"
#include "intrins.h"
#define THCO 0xee
#define TLCO 0x0
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
}
void InitLCD() //液晶初始化
{
send_command(0x30); //功能设置:一次送8位数据,基本指令集
2)ST7920控制器系列中文图形液晶模块资料手册
三、设计指标
利用实验板上提供的键盘电路,LCD显示电路,设计一人机界面,能实现以下功能:
1.LCD上显示“重庆科技学院”
2.按键至少包括0-9的数字键
3.LCD显示按键值
4.电子钟显示:时,分,秒(选作)
四、实验要求
1.以单片机为核心,设计4*4非编码键盘及LCD的硬件电路,画出电路原理图。
{
unsigned char hi=0;//汉字显示
if(x==0) send_command(0x80+y);//
else if(x==1) send_command(0x90+y);
从键盘输入数据并显示实验报告
从键盘输入数据并显示实验报告一、实验目的与内容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. 转换。
键盘及LED显示实验
实验三键盘及LED显示实验一、实验内容利用8255可编程并行接口控制键盘及显示器,当有按键按下时向单片机发送外部中断请求(INT0,INT1),单片机扫描键盘,并把按键输入的键码一位LED 显示器显示出来。
二、实验目的及要求(一)实验目的通过该综合性实验,使学生掌握8255扩展键盘和显示器的接口方法及C51语言的编程方法,进一步掌握键盘扫描和LED显示器的工作原理;培养学生一定的动手能力。
(二)实验要求1.学生在实验课前必须认真预习教科书与指导书中的相关内容,绘制流程图,编写C51语言源程序,为实验做好充分准备。
2.该实验要求学生综合利用前期课程及本门课程中所学的相关知识点,充分发挥自己的个性及创造力,独立操作完成实验内容,并写出实验报告。
三、实验条件及要求计算机,C51语言编辑、调试仿真软件及实验箱50台套。
四、实验相关知识点1.C51编程、调试。
2.扩展8255芯片的原理及应用。
3.键盘扫描原理及应用。
4.LED显示器原理及应用。
5.外部中断的应用。
五、实验说明本实验仪提供了8位8段LED显示器,学生可选用任一位LED显示器,只要按地址输出相应的数据,就可以显示所需数码。
六、实验原理图P1口桥接。
八、实验参考流程图1.主程序流程图2.外中断服务程序流程图外部中断0 外部中断1定时器0中断程序,用于消抖动:3.LED显示程序流程图九、C51语言参考源程序#include "reg52.h"unsigned char KeyResult; //存放键值unsigned char buffer[8]; //显示缓冲区bit bKey; //是否有键按下xdata unsigned char P_8255 _at_ 0xf003; //8255的控制口xdata unsigned char PA_8255 _at_ 0xf000; //8255的PA口xdata unsigned char PB_8255 _at_ 0xf001; //8255的PB口xdata unsigned char PC_8255 _at_ 0xf002; //8255的PC口code unsigned char SEG_TAB[] = { //段码0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x0};sbit bLine0 = P3^2;sbit bLine1 = P3^3;//延时1msvoid Delay1ms(){unsigned char i;i = 0;while (--i);}//显示void Display(){unsigned char i = 0x7f;unsigned char j;for (j = 0; j < 8; j++){PA_8255 = i; //扫描PB_8255 = SEG_TAB[buffer[j]]; //段数据i = i / 2 + 0x80;Delay1ms();}}//更新显示缓冲区数据void RefurbishData(){char i;for (i = 7; i >0; i--)buffer[i] = buffer[i-1];buffer[0] = KeyResult;}void Int0Int() interrupt 0{unsigned char i = 0x80;unsigned char KeyResult0 = 0x0;EX0 = 0; //关外部中断0P_8255 = 0x89; //PC口输入bLine0 = 0; //P3.2作行输出while (i){if ((PC_8255 & i) == 0)break;KeyResult0++;i >>= 1;}P_8255 = 0x80; //8255的PA、PB、PC口全作输出口PC_8255 = 0;bLine0 = 1;if (i){TH0 = 60; //定时中断计数器初值TL0 = 176; //定时50msTR0 = 1;KeyResult = KeyResult0;}IE0 = 0; //清除中断EX0 = 1; //开外部中断0}void Int1Int() interrupt 2{unsigned char i = 0x80;unsigned char KeyResult0 = 8;EX1 = 0; //关外部中断0P_8255 = 0x89; //PC口输入bLine1 = 0; //P3.2作行输出while (i){if ((PC_8255 & i) == 0)break;KeyResult0++;i >>= 1;}P_8255 = 0x80; //8255的PA、PB、PC口全作输出口PC_8255 = 0;bLine1 = 1;if (i){TH0 = 60; //定时中断计数器初值TL0 = 176; //定时50msTR0 = 1;KeyResult = KeyResult0;}IE1 = 0; //清除中断EX1 = 1; //开外部中断0}//50ms中断服务程序void INT_Timer0(void) interrupt 1{if (((KeyResult < 8) && !bLine0) ||((KeyResult >= 8) && !bLine1)){bKey = 1; //有键按下,键值在KeyResult中}TR0 = 0;}void main(){char i;bKey = 0; //没有键按下TMOD = 1; //定时器0:方式一P_8255 = 0x80; //8255的PA、PB、PC口全作输出口PC_8255 = 0x0;ET0 = 1; //开定时器0中断EX0 = 1; //开外部中断0EX1 = 1; //开外部中断1IT0 = 1; //边沿触发IT1 = 1; //边沿触发EA = 1; //允许中断for (i = 0; i < 8; i++)buffer[i] = 0x10;// TR0 = 1; //开定时器T0// bRefurbish = 1;while (1){if (bKey){bKey = 0;RefurbishData();}Display(); //调用显示}}十、实验实施步骤1.仔细阅读实验内容及要求,编写C51源程序。
键盘与数码管显示实验
R72 10K
S14 SW-PB S18 SW-PB S22 SW-PB S26 SW-PB
R73 10K
S15 SW-PB S19 SW-PB S23 SW-PB S27 SW-PB
D2 Diode
D3 Diode
D4 Diode
D5 Diode
J33 1 2 3 4 5 6 7 8
Header 8
R94
R95
Res1
Res1
Res1
Res1
Res1
Res1
Res1
Res1
330R
330R
330R
330R
330R
330R
330R
330R
DS1
11 7 4 2 1 10 5 3
a b DIG1 c d e f g DP
HDSP-B09G
DIG2 DIG3
DP3
DP2
K1 DIG4 K2
K3 K4
9 GND COM D 10
ULN2803A GND
VCC
Pad_DS_K1 Pad_DS_K2 Pad_DS_K3 Pad_DS_K4
Pad_DS_K5
Pad_DS_K6
Pad_DS_K7
Pad_DS_K8 J37
S8550
R80 Res1 10K Q20
S8550
R81 Res1 10K Q21
键盘与数码管显示
一、4X4键盘 二、LED显示器的基本结构 三、实验箱原理图 四、STC15 I/O口 工作模式配置 五、实验要求
一、4X4键盘
5V
行线(输出)
•键特征值的判断
列线(输入)
•键盘控制方式:扫描、中断
单片机键盘显示实验报告
单片机的键盘和显示实验报告㈠实验目的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.通过实验掌握 TMS320F2812 通用输入 / 输出管脚直接控制外围设备的方法2.了解发光二极管的控制编程方法。
3.了解 SPI 的使用。
4.了解如何使用 GpioA 口进行数据的锁存5.通过实验掌握 TMS320F2812 的扩展端口接收外围设备信息的方法6.了解键盘的使用原理及编程方法【实验内容】1.按键显示程序,对按键记录次数,以二进制显示在16 个 LED 上。
2.定时器编程,并用按键控制各位时分秒,使其能完成加减操作【实验仪器】TMS320F2812数字信号处理器与学生用集成板。
【实验步骤】1.撰写代码2.调试代码3.实现功能【实验代码】一、定时器①宏定义和全局变量定义然后同时定义了全局变量,包括时、分、分析:这段代码是初始宏定义,用于定义按键对应的编码与地址,秒,按键编码, LED 编码和控制位。
②共阳字形码分析:由于这次实验要用到数码管,所以我们要定义一个数码管共阳端字形码,使每一个代码对应一种显示状态。
③SPI 初始化子程序分析:这一段是本次实验的重点,就是SPI 初始化。
1 )SPICCR :用于控制SPI 的状态,上下降沿发送,还有几位的数据。
其中第7 位,即 SPICCR.6 是控制SPI 在上下沿发送, 1 代表下降沿,2 代表上升沿;第8 位,即 SPICCR.7 是控制复位的,0 代表为复位状态;低 4 位控制数据长度,长度等于n+1 。
键盘 实验报告
键盘实验报告键盘实验报告引言:键盘是我们日常生活中不可或缺的工具之一。
无论是在办公室、学校还是家中,键盘都是我们与电脑进行交流的媒介。
然而,我们对键盘的了解却往往停留在表面,我们很少去思考它的设计原理、使用习惯以及对我们的影响。
为了更好地了解键盘,我们进行了一系列的实验。
实验一:键盘布局对打字速度的影响我们首先进行了一个实验,通过比较不同键盘布局对打字速度的影响,来探究键盘布局的优劣。
我们选取了QWERTY布局和DVORAK布局进行对比。
实验结果显示,使用DVORAK布局的参与者在相同时间内能够输入更多的文字,平均提高了15%的打字速度。
这是因为DVORAK布局在设计时考虑了人手的生理结构和打字时的频率,使得更多的常用字母位于中间行,避免了手指的过度运动,提高了打字的效率。
实验二:键盘声音对打字体验的影响我们接着进行了一个实验,研究键盘声音对打字体验的影响。
我们选取了机械键盘和薄膜键盘进行对比。
实验结果显示,使用机械键盘的参与者在打字时感受到更好的触感和反馈,打字的准确性和速度也有所提高。
而薄膜键盘则显得较为平淡,没有机械键盘的手感。
这是因为机械键盘采用了独立的开关和弹簧,使得按键的触发更为明显,给人一种实实在在的反馈。
而薄膜键盘则采用了薄膜电路,按键的触发感较为模糊。
实验三:键盘布局对人体健康的影响最后,我们进行了一个实验,探究键盘布局对人体健康的影响。
我们选取了常见的QWERTY布局和人体工学键盘进行对比。
实验结果显示,使用人体工学键盘的参与者在长时间使用键盘后,手部的疲劳感和不适感较低。
而使用QWERTY布局的参与者则普遍出现手腕疼痛和肩颈部不适的情况。
这是因为人体工学键盘在设计时考虑了手部的自然姿势和舒适度,使得手腕和手指的弯曲角度更为合理,减少了手部的压力。
总结:通过这一系列实验,我们对键盘有了更深入的了解。
键盘布局、声音和人体工学都对我们的打字体验和健康有着重要的影响。
选择合适的键盘布局、触感和人体工学设计,可以提高我们的打字效率,减少手部疲劳感,保护我们的健康。
键盘显示实验报告
键盘显示实验报告键盘显示实验报告一、引言键盘是我们日常生活中常用的输入设备之一,它通过按下不同的按键来输入字符和命令。
在计算机科学领域,键盘显示是一项重要的实验,它涉及到了计算机硬件和软件的相互配合。
本文将介绍一个键盘显示实验的设计和结果分析。
二、实验设计1. 实验目的本实验的目的是通过键盘输入字符,并在计算机屏幕上进行显示。
通过这个实验,我们可以深入了解键盘的工作原理和计算机输入输出的基本知识。
2. 实验材料本实验所需的材料包括:计算机、键盘、显示器和相应的连接线。
3. 实验步骤(1) 将键盘与计算机通过连接线连接好。
(2) 打开计算机,并启动相应的键盘显示程序。
(3) 在键盘上按下不同的按键,观察计算机屏幕上的显示效果。
(4) 分析和记录实验结果。
三、实验结果在本次实验中,我们按下了键盘上的不同按键,并观察了计算机屏幕上的显示效果。
实验结果表明,键盘输入的字符能够准确地显示在屏幕上,并且显示的速度非常快。
四、结果分析1. 键盘工作原理键盘是一种输入设备,它通过按下不同的按键来输入字符和命令。
当我们按下键盘上的某个按键时,键盘会发送一个信号给计算机,计算机通过解读这个信号来确定我们按下的是哪个按键,并将相应的字符显示在屏幕上。
2. 计算机输入输出键盘显示实验涉及到了计算机的输入输出过程。
输入是指将外部信息传递给计算机的过程,而输出是指将计算机处理后的信息传递给外部的过程。
在本实验中,键盘是输入设备,它将我们按下的按键信息传递给计算机;而显示器是输出设备,它将计算机处理后的字符信息显示在屏幕上。
3. 键盘显示的应用键盘显示技术在计算机领域有着广泛的应用。
无论是在日常办公还是在专业领域,键盘输入都是必不可少的。
通过键盘,我们可以输入文字、命令、密码等信息,实现与计算机的交互。
键盘显示技术的发展也为计算机的普及和应用提供了方便。
五、实验总结通过本次键盘显示实验,我们深入了解了键盘的工作原理和计算机输入输出的基本知识。
实验四 键盘及显示实验
实验四键盘及显示实验一、实验目的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++;}。
键盘扫描显示实验报告
一、实验目的1. 理解键盘扫描的基本原理,掌握键盘扫描的方法。
2. 掌握数码管显示的基本原理,实现键盘扫描信息的实时显示。
3. 熟悉8255并行接口芯片在键盘扫描和数码管显示中的应用。
二、实验原理1. 键盘扫描原理:键盘扫描是指通过硬件电路对键盘按键进行检测,并将按键信息转换为可识别的数字信号的过程。
本实验采用行列式键盘,通过扫描键盘的行线和列线,判断按键是否被按下。
2. 数码管显示原理:数码管是一种用来显示数字和字符的显示器,由多个发光二极管(LED)组成。
本实验采用七段数码管,通过控制各个段(A、B、C、D、E、F、G)的亮灭,显示相应的数字或字符。
3. 8255并行接口芯片:8255是一款通用的并行接口芯片,具有三个8位并行I/O口(PA、PB、PC),可用于键盘扫描和数码管显示的控制。
三、实验设备1. 实验平台:PC机、8255并行接口芯片、行列式键盘、七段数码管、面包板、导线等。
2. 软件环境:汇编语言编程软件、仿真软件等。
四、实验步骤1. 硬件连接:将8255并行接口芯片、行列式键盘、七段数码管连接到实验平台上,按照电路图进行连线。
2. 编写程序:使用汇编语言编写键盘扫描和数码管显示的程序。
(1)初始化8255并行接口芯片:设置PA口为输出端口,PB口为输出端口,PC口为输入端口。
(2)扫描键盘:通过PC口读取键盘的行线状态,判断是否有按键被按下。
若检测到按键被按下,读取对应的列线状态,确定按键的位置。
(3)数码管显示:根据按键的位置,控制数码管的段(A、B、C、D、E、F、G)的亮灭,显示相应的数字。
3. 仿真调试:使用仿真软件对程序进行调试,确保程序能够正确扫描键盘和显示数字。
五、实验结果与分析1. 实验结果:成功实现了键盘扫描和数码管显示的功能。
当按下键盘上的任意按键时,数码管上会显示对应的数字。
2. 分析:(1)键盘扫描部分:通过读取PC口的行线状态,判断是否有按键被按下。
当检测到按键被按下时,读取PB口的列线状态,确定按键的位置。
汇编数码显示及键盘实验实验报告
数码显示及键盘实验【实验内容】1、数码管显示0-72、独立按键识别【需要了解的知识】1、GPIO设定2、数码管动态扫描显示原理,键盘扫描工作原理,输入与输出及其处理【实验预习】仔细预读实验指导电子文档的实验六、七及其前面的实验流程【实验设备】Keil C51软件、ICE52 仿真驱动、MEFlash编程软件、USB驱动程序【实验过程】实验一数码管显示0-7实验任务:1)先将“0-7”数码管的段码值写入存储器中,使8位数码管从右至左显示0-7.实验步骤:1)首先在硬盘上建立一个文件夹;2)启动Keil C51软件;3)执行Keil C51软件的菜单“Project|New Project……”,弹出一个名为“Create New Project”的对话框。
输入工程文件名,选择保存路径uv2后缀,点击“保存”按钮;4)紧接着弹出“Options for Target‘Target 1’”,为刚才的项目选择ATMEL的AT89S52的CPU。
选择之后,点击“确定”按钮;5)接下来弹出一个对话框提示你是否要把标准8051的启动代码添加项目中去,此时,点击“否”按钮;6)执行菜单“File|New……”,出现一个名为“Text1”的文档。
接着执行菜单“File|Save”弹出一个名为“Save As”的对话框,将文件名改为“.asm”后缀,然后保存;7)添加源程序文件到工程中,一个空的源程序文件建成。
单击Keil C51软件左边项目工作窗口“Target1”上的“+”,将其展开。
然后右击“Source Group1”文件夹弹出下拉菜单,单击其中的“Add Files to Group‘Source Group1’”项;8)在弹出的对话框中先选择文件类型为“Asm Source file(*.s*;*.src;*.a*)”,这时对话框内创建的空的源程序文件已经出现在项目工作窗口的“Source Group1”文件夹中;输入源程序代码;9)点击工具栏“Options for target”按钮,弹出一个对话框,定义“Xtal”为11.0592.下面依序是存储模式、程序空间大小等设置,均用默认值即可。
微机原理键盘扫描及显示完整实验报
实验9键盘扫描及显示实验
实验时间2019年12月18日
实验类型■验证性□设计性□综合性
1.实验目的
了解键盘扫描及数码显示的基本原理,熟悉8255的编程。
2.实验内容及过程(主要内容、操作步骤)
将8255单元与键盘及数码管显示单元连接,编写实验程序,扫描键盘输入,并将扫描结果送数码管显示。
键盘采用4X4键盘,每个数码管显示值可为0~F 共16个数。
实验具体内容如下:将键盘进行编号,记作0~F,当按下其中-一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近4次按下的按键编号。
3.测试数据及实验结果
4.实验分析及总结(主要考察内容)
通过本次实验,我理解了键盘扫描及数码显示的基本原理,通过理解分析程序,自己对程序进行了一些总结和修改,并进行了验证,进一步掌握了微机接口的学习方法。
教师评阅
评价指标:实验目的、操作步骤、设计、算法、程序结构、实验结果、实验分析、实验总结
1/ 1。
键盘、LED发光实验报告
EDA设计课程实验报告实验题目:键盘、LED发光实验学院名称:专业:班级:姓名:高胜学号小组成员:指导教师:一、实验目的通过实验让同学们进一步了解、熟悉和掌握FPGA开发软件的使用方法及Verilog HDL 的编程方法,并熟悉以Verilog HDL文件为顶层模块的设计;学会和体会分支条件语句case 的使用方法及FPGA I/O口的输出控制。
二、设计任务及要求smartSOPC试验箱上有八个按键KEY1~KEY8和八个发光二极管LED1~LED8。
在smartSOPC试验箱上有KEY1~KEY8通过跳线JP6的KEY1~KEY8分别与芯片的121~124、143、141、158、和156引脚相连(QuickSOPC芯片板上的KEY1~KEY4与SmartSOPC试验箱上KEY1~KEY4是并接的)。
本试验的内容是要求在SmartSOPC试验箱上完成对8个键盘KEY1~KEY8进行监控,一旦有键输入则判断其键值,并点亮相应个发光二极管。
三、系统设计1、整体设计方案FPGA的所有I/O控制块允许每个I/O引脚单独配置为输入口,不过这种配置是系统自动完成的。
当这种I/O口被设置为输入口使用时(如定义key0为输入引脚:input key0;),该I/O控制模块将直接使三态缓冲区的控制端接地,使得该I/O引脚对外呈高阻态,这样该I/O引脚可作为专用输入引脚。
正确分配并锁定引脚后,一旦在KEY1~KEY8中有键输入,即可判断其键值并作出相应的处理。
2、功能模块电路设计(1)输入输出模块框图(见图1)图1(键盘led发光模块图)(2)模块逻辑表达(见表1)表1(按键led发光真值表)(3)算法流程图(见图2)(4)Verilog源代码module ledkey(key,led); //模块名ledkeyinput [7:0]key; //输入按键状态output [7:0]led; //输出led发光状态reg [7:0]k; //定义8位按键状态寄存器k reg [7:0]l; //定义8位led状态寄存器lassign led=l; //输出led发光状态选择always @(key) //定义按键信号变化触发begink=key; //按键状态选择case (k)8'b11111110:l=8'b11111110; //亮一盏led8'b11111101:l=8'b11111100; //亮二盏led8'b11111011:l=8'b11111000; //亮三盏led8'b11110111:l=8'b11110000; //亮四盏led8'b11101111:l=8'b11100000; //亮五盏led8'b11011111:l=8'b11000000; //亮六盏led8'b10111111:l=8'b10000000; //亮七盏led8'b01111111:l=8'b00000000; //亮八盏leddefault:l=8'b11111111; //不亮endcaseendendmodule四、系统调试1、仿真调试(1)仿真代码`timescale 1ns/1nsmodule ledkey_tp;reg [7:0]key;wire [7:0]led;ledkey u1(key,led);initialbegin#100 key=8'b11111110;#100 key=8'b11111101;#100 key=8'b11111011;#100 key=8'b11110111;#100 key=8'b11101111;#100 key=8'b11011111;#100 key=8'b10111111;#100 key=8'b01111111;#100 key=8'b00111111;#100 $finish;endinitial $monitor($time,,,"%b,%b",key,led);endmodulemodule ledkey(key,led);input [7:0]key;output [7:0]led;reg [7:0]k;reg [7:0]l;assign led=l;always @(key)begink=key;case (k)8'b11111110:l=8'b11111110;8'b11111101:l=8'b11111100;8'b11111011:l=8'b11111000;8'b11110111:l=8'b11110000;8'b11101111:l=8'b11100000;8'b11011111:l=8'b11000000;8'b10111111:l=8'b10000000;8'b01111111:l=8'b00000000;default:l=8'b11111111;endcaseendendmodule(2)仿真波形图(见图3)图3(3)波形分析# 0 xxxxxxxx,xxxxxxxx # 100 11111110,11111110 # 200 11111101,11111100# 300 11111011,11111000 # 400 11110111,11110000 # 500 11101111,11100000 # 600 11011111,11000000 # 700 10111111,10000000 # 800 01111111,00000000 # 900 00111111,11111111 (4)引脚图表2-1 引脚锁定方法五、实验感想。
单片机4种实验设计
万方科技学院单片机实验报告题目:单片机实验报告院(系):电气自动化专业班级:计算机15升学生姓名:学号:1516353004 指导教师:苏百顺实验一键盘扫描显示实验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为首地址的内存值发送到段码输出口8004H MOV 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,R1CPL AMOV 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,#6HMUL ABADD A,R5MOV DPTR,#KEYTAB ;取出键码所在位置MOVC A,@A+DPTRMOV 26H,A ;将取出键值暂时保存在内存中,以免数据丢失WAIT: MOV DPTR,#OUTBIG ;等键释放CLR AMOVX @DPTR,ALCALL DELAY LCALL 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,00HDB 00H,0FH,0EH,0DH,00H,00HEND实验二八段数码管显示实验一、实验目的:1、了解数码管动态显示的原理。
键盘扫描显示实验
实验二键盘扫描显示实验1、实验目的:(1)掌握键盘和显示器的接口方法和编程方法。
(2)掌握键盘扫描和LED八段码显示器的工作原理。
2、实验要求:在上一个实验的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。
实验程序可分成三个模块。
1、键盘输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。
2、显示模块:将显示单元的内容在LED显示器上动态显示。
3、主程序:调用键盘输入模块和显示模块。
3、实验电路图:LED1LED2LED3LED4LED5LED64、实验器材:(1)超想-3000TB综合实验仪 1 台(2)超想3000仿真器 1 台(3)计算机 1 台5、实验连线:无6、实验说明:本实验仪提供了一个6×4的小键盘,向列扫描码地址(0e101H)逐列输出低电平,然后从行码地址(0e103H)读回,如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。
这样就可以通过输出的列码和读取的行码来判断按下的是什么键.。
在判断有键按下后,要有一定的延时,防止键盘抖动。
列扫描码还可以分时用作LED的位选通信号。
7、程序框图8、实验程序CCON EQU 0E100H ;8155控制字地址OUTBIT EQU 0E101H ;LED显示位控制地址PACON EQU 0E101H ;PA口,键盘列输出CLK164 EQU 0E102H ;164时钟控制地址DAT164 EQU 0E102H ;164数据控制地址IN EQU 0E103H ;键盘读入口LED1 EQU 08H ;6个LED显示码的存放地址LED2 EQU 09H ;LED3 EQU 0AH ;LED4 EQU 0BH ;LED5 EQU 0CH ;LED6 EQU 0DH ;KEYLIST EQU 0EH ;按下键盘的列值KEYTEMP EQU 10H ;得到键盘的扫描值ORG 0000HLJMP STARWAIT: ;循环程序LCALL SHOW ; 调用LED显示子程序LCALL SCANKEY ;调用按键扫描程序...MOV A , KEYTEMPJZ WAIT ;判断是否有按键按下,有的话继续,否则;返回继续等待LCALL GETKEY ;SJMP WAIT ;循环RETSHOW: ;LED显示子程序MOV R2 , #00100000B ;从最左边的LED开始显示MOV B , #06H ; 6个LEDMOV R1 , #LED1 ;取得第一位LED显示码地址SHOWLED: ;显示6个LED的循环程序CLR A ;熄灭所有LED管MOV DPTR ,#OUTBITMOVX @DPTR , APUSH BMOV B , #8 ;B用来计数,8表示8段LEDMOV A , @R1 ;取得第一个显示码MOV R0, AINC R1 ;指向下一个显示码SHOWBIT: ;给8段LED赋值的循环程序MOV A , R0 ;取出显示码的每一位,从高位开始RLC AMOV R0 , A ;MOV ACC.0 , CCLR ACC.1 ;置0 做脉冲用MOV DPTR , #DAT164MOVX @DPTR , A ;将显示码的每一位送入164中MOV DPTR , #CLK164SETB ACC.1 ;置1 做脉冲用MOVX @DPTR , ACLR ACC.1 ;置0 做脉冲用MOVX @DPTR , ADJNZ B , SHOWBIT ;判断8位显示码是否都送入164中POP BMOV A , R2MOV DPTR ,#OUTBIT ;显示该位LEDMOVX @DPTR , A ;CALL DELAYRR A ;指向下一位LEDMOV R2 , ADJNZ B , SHOWLED ;判断6个LED是否都显示完毕RETSCANKEY: ;键盘扫描子程序,判断是否有按键按下MOV DPTR , #PACONCLR AMOVX @DPTR , AMOV DPTR , #INMOVX A , @DPTR ;获取扫描结果CPL AANL A , #0FHMOV KEYTEMP , A ;扫描结果放入KEYTEMP中,KEYTEMP;为0时候表示没有按键按下RETGETKEY: ;获取键盘显示码;思路:先获取按键的行值和列值,然后根据该按键的行和列的位置到KEYMAP 表中去查询该按键的字面值,最后根据该按键的字面值到LEDMAP表中得到该按键的显示码,然后将该显示码送到;LED6中...MOV KEYLIST , #0 ;保存按键的列值MOV B , #06H ;计数,6表示键盘有6列MOV R0 , #11111110B ;从键盘的最左边开始扫描GETKEY0:MOV DPTR , #PACON ;扫描键盘的每一列MOV A , R0MOVX @DPTR , AMOV DPTR , #IN ;获取键盘扫描结果MOVX A , @DPTRCPL AANL A , #0FHMOV KEYTEMP , AJNZ GETKEY1 ;判断该列是否有有按键按下MOV A ,R0;RL AMOV R0 , AINC KEYLIST ;列值+1DJNZ B , GETKEY0 ;判断键盘的6列是否都扫描完毕RETGETKEY1:MOV A , KEYTEMP ;获取扫描结果JB ACC.3 , LINE0 ;第0行JB ACC.2 , LINE1 ;第1行JB ACC.1 , LINE2 ;第2行JB ACC.0 , LINE3 ;第3行LINE0:MOV A , KEYLIST ;按键的列值ADD A ,#0 ;键盘为4*6格式,所以一行需要+6 ;因为这是第0行所以+0MOV DPTR , #KEYMAPMOVC A , @A+DPTR ;获取按键的字面值ANL A , #0FHMOV DPTR , #LEDMAPMOVC A , @A+DPTR ;获取按键的显示码MOV LED6 , A ;将显示码送入LED6中LJMP GETKEYENDLINE1: ;同上....MOV A , KEYLISTADD A , #6 ;MOV DPTR ,#KEYMAPMOVC A , @A+DPTRANL A , #0FHMOV DPTR , #LEDMAPMOVC A , @A+DPTRMOV LED6 , ALJMP GETKEYENDLINE2: ;同上....MOV A , KEYLISTADD A , #6ADD A , #6MOV DPTR , #KEYMAPMOVC A , @A+DPTRANL A , #0FHMOV DPTR , #LEDMAPMOVC A , @A+DPTRMOV LED6 , ALJMP GETKEYENDLINE3: ;同上....MOV A , KEYLISTADD A , #6ADD A , #6ADD A , #6MOV DPTR , #KEYMAPMOVC A , @A+DPTRANL A , #0FHMOV DPTR , #LEDMAPMOVC A , @A+DPTRMOV LED6 , ALJMP GETKEYENDGETKEYEND: ;结束LCALL SCANKEY ;调用键盘扫描子程序MOV A , KEYTEMPJNZ GETKEYEND ;等到按键松开RETLEDMAP: ; 八段管显示码DB 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hDB 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hKEYMAP: ; 键盘对应的数字DB 07H,08H,09H,0AH,10H,00HDB 04H,05H,06H,0BH,11H,12HDB 01H,02H,03H,0CH,13H,14HDB 00H,0FH,0EH,0DH,15H,16HDELAY: MOV 20H , #0FH ;延时子程序DELAY1:DJNZ 20H , DELAY1RETSTAR: ;程序开始MOV SP,#16HMOV DPTR , #CCON; 设计8155的工作方式PA和PB输出,PC输入MOV A , #03HMOVX @DPTR,AMOV LED1 , #0FFH ;给6个LED管赋初值8.8.8.8 (后两位为空)MOV LED2 , #0FFHMOV LED3 , #0FFHMOV LED4 , #0FFHMOV LED5 , #00HMOV LED6 , #00HLJMP WAIT ;转到等待循环子程序END9、思考问题1、如何能够让键盘输入两位数字。
微机原理键盘控制与显示实验报告
课程名称: __________ 微机原理(实验) _________________ 指导老师: _徐习东 _______________ 成绩: _______________________ 实验名称: _________ 键盘控制与显示 ___________ 实验类型: _______ 软件实验 __________ 同组学生姓名: _______________ 七、讨论、心得【实验目的】1. 通过实验掌握TMS320F2812 通用输入/输出管脚直接控制外围设备的方法2. 了解发光二极管的控制编程方法。
3. 了解SPI 的使用。
4. 了解如何使用GpioA 口进行数据的锁存5. 通过实验掌握TMS320F2812 的扩展端口接收外围设备信息的方法6.了解键盘的使用原理及编程方法【实验内容】1. 按键显示程序,对按键记录次数,以二进制显示在16个LED 上。
2.定时器编程,并用按键控制各位时分秒,使其能完成加减操作【实验仪器】TMS320F2812 数字信号处理器与学生用集成板。
【实验步骤】1. 撰写代码2. 调试代码3.实现功能別f 尹丿占实验报告专业: 姓名:学号: 日期: 地点:电气工程及其自动化 一、实验目的和要求(必填) 三、主要仪器设备(必填) 五、实验数据记录和处理 二、实验内容和原理(必填) 四、操作方法和实验步骤 六、实验结果与分析(必填)【实验代码】 、疋时器① 宏定义和全局变量定义R 犍蛊控制曲钟nclude "DSP281x_De (vic« .h" 卍枝键对应值Uint16 LEEReg;UintlS KeyReg 1:Uitit321 = 0;Uint16Ctrl ; int 16Sec=0;1 Tltl6M IL =0;int 16 Hor-Cl ; UintlSLight[3];秒,按键编码,LED 编码和控制位。
② 共阳字形码O K jOOO.Oxf 900, OxA4OO J .0iBDOO,0x9900,0x5200, OMfl^OD^OxFSOD, O K B000y0x9000.0zBBOO,Oz3300,OxcEDO,Oxa IDO,OxB&OD^OssEciOO , 0x5G (J0,Uxbf DU,Osa7UQ,OzffOa,0x4000,CK79Da,DM240D r Dx^ 000, 0 itl900, O K ISOQ, 0s DEOO,Oz 7000,030000,0x1000);分析:由于这次实验要用到数码管,所以我们要定义一个数码管共阳端字形码,使每一个代码对应一种显 示状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一键盘显示系统实验1.实验目的:(1)了解8155芯片的工作原理以及应用(2)了解键盘、LED显示器的接口原理以及硬件电路结构(3)掌握非编码键盘的编程方法以及程序设计2.实验内容:将程序输入实验系统后,在运行状态下,按下数字0~9之一,将在数码管上显示相应数字,按下A、B或C之一,将在数码管上显示“0”、“1”或“2”循环3.程序框图:4. 实验程序下面程序有四部分组成,程序的地址码、机器码、程序所在行号(中间)和源程序。
字型码表和关键字表需要同学们自己根据硬件连接填在相应位置。
地址码机器码 1 源程序0000 2 org 0000h0000 90FF20 3 mov dptr,#0ff20h0003 7403 4 mov a,#03h ;方式字0005 F0 5 movx @dptr,a ;A和B口为输出口,C口为输入口0006 753012 6 mov 30h,#12h ;LED共阴极,开始显示“H”,地址偏移量送30h0009 1155 7 dsp: acall disp1 ;调显示子程序000B 11FE 8 acall ds30ms000D 1179 9 acall scan ;调用键盘扫描子程序000F 60F8 10 jz dsp ;若无键按下,则dsp0011 11B7 11 acall kcode ;若有键按下,则kcode0013 B40A00 12 cjne a,#0ah,cont ;是否数字键,若是0-9则是,a-c则否0016 400F 13 cont: jc num ;若是,则num0018 90001F 14 mov dptr,#jtab ;若否,则命令转移表始址送dptr 001B 9409 15 subb a,#09h; 形成jtab表地址偏移量001D 23 16 rl a ;地址偏移量*2001E 73 17 jmp @a+dptr ;转入相应功能键分支程序001F 00 18 jtab: nop0020 00 19 nop0021 8008 20 sjmp k1 ;转入k1子程序0023 800B 21 sjmp k2 ; 转入k2子程序0025 800E 22 sjmp k3 ; 转入k3子程序0027 F530 23 num: mov 30h,a0029 80DE 24 sjmp dsp ; 返回dsp002B 7531C0 25 k1: mov 31h,#0c0h ; "0" 循环显示002E 800A 26 sjmp k40030 7531F9 27 k2: mov 31h,#0f9h ; "1" 循环显示0033 8005 28 sjmp k40035 7531A4 29 k3: mov 31h,#0a4h ; "2" 循环显示0038 8000 30 sjmp k4003A 7B01 31 k4: mov r3,#01h ;显示最末一位,注意共阴极003C EB 32 k5: mov a,r3003D 90FF21 33 mov dptr,#0ff21h0040 F0 34 movx @dptr,a ;字位送81550041 E531 35 mov a,31h0043 90FF22 36 mov dptr,#0ff22h; 字型口0046 F0 37 movx @dptr,a ;字型送8155的B口0047 11EC 38 acall delay ;延时1ms***0049 74FF 39 mov a,#0ffh004B F0 40 movx @dptr,a ;关显示,在此使LED各位显示块都灭004C EB 41 mov a,r3004D 23 42 rl a004E FB 43 mov r3,a004F BB40EA 44 cjne r3,#40h,k5 ;还没有循环玩一遍,则循环继续0052 80E6 45 sjmp k4 ;若循环完一遍则返回k4;又开始新一轮的循环0054 22 46 ret0055 90FF21 47 disp1: mov dptr,#0ff21h; 字位口A,注意led是共阴极接法0058 7401 48 mov a,#01h005A F0 49 movx @dptr,a005B 90FF22 50 mov dptr,#0ff22h;字型口005E E530 51 mov a,30h0060 2402 52 add a,#02h0062 83 53 movc a,@a+pc0063 F0 54 movx @dptr,a ;字型码输入,N1点亮0064 22 55 ret ;下面是0到c的字型码0065 ? 56 db ????0066 ?0067 ?0068 ?0069 ?006A ? 57 db ????006B ?006C ?006D ?006E ?006F ? 58 db ????0070 ?0071 ?0072 ?0073 ?0074 ? 59 db ????0075 ?0076 ?0077 ?0078 ?0079 74FF 60 scan: mov a,#0ffh; 关显示码a007B 90FF22 61 mov dptr,#0ff22h; B口地址送dptr007E F0 62 movx @dptr,a ;关led显示007F 7400 63 mov a,#00h0081 90FF21 64 mov dptr,#0ff21h ;A口地址,字位码0084 F0 65 movx @dptr,a0085 90FF23 66 mov dptr,#0ff23h ;C口地址0088 E0 67 movx a,@dptr0089 540F 68 anl a,#0fh; 取出列值送a008B B40F02 69 cjne a,#0fh,next1;若有键按下,则next1008E 8025 70 sjmp next40090 11F5 71 next1: acall ds10ms ;延时10ms0092 7A00 72 mov r2,#00h ;窜键标志位清零0094 79FE 73 mov r1,#0feh; 行扫描初值送a0096 90FF21 74 loop: mov dptr,#0ff21h ;dptr指向A口0099 E9 75 mov a,r1 ;行扫描值送a009A F0 76 movx @dptr,a009B 90FF23 77 mov dptr,#0ff23h009E E0 78 movx a,@dptr ;读c口009F 540F 79 anl a,#0fh ; 取出列值00A1 B40F02 80 cjne a,#0fh,next2 ;若被按键在本行,则next2 00A4 8007 81 sjmp next3;若不在本行,则next300A6 0A 82 next2: inc r2 ;窜键标志位加100A7 BA010B 83 cjne r2,#01h,next4 ;若为窜键,则返回监控00AA FC 84 mov r4,a ;列值送r400AB E9 85 mov a,r100AC FB 86 mov r3,a ; 行值送r300AD E9 87 next3: mov a,r1 ;行扫描值送a00AE 23 88 rl a ;左移一位00AF F9 89 mov r1,a ;送回r100B0 B47FE3 90 cjne a,#7fh,loop ;若未扫描完一遍,则loop 00B3 01B6 91 ajmp next5 ;若扫描完一遍,则next500B5 E4 92 next4: clr a00B6 22 93 next5: ret00B7 7900 94 kcode: mov r1,#00h00B9 EB 95 mov a,r300BA D3 96 setb c00BB 13 97 loop1: rrc a00BC B4FF02 98 cjne a,#0ffh, next6100BF 8003 99 sjmp next600C1 09 100 next61: inc r100C2 80F7 101 sjmp loop100C4 E9 102 next6: mov a,r100C5 C4 103 swap a00C6 F9 104 mov r1,a00C7 EC 105 mov a,r400C8 540F 106 anl a,#0fh00CA 49 107 orl a,r100CB F5F0 108 mov b,a00CD 9000DF 109 mov dptr,#ktab00D0 7800 110 mov r0,#00h00D2 E4 111 clr a00D3 93 112 pepe: movc a,@a+dptr00D4 B5F002 113 cjne a,b,next700D7 8004 114 sjmp resv00D9 08 115 next7: inc r000DA E8 116 mov a,r000DB 80F6 117 sjmp pepe00DD E8 118 resv: mov a,r000DE 22 119 ret;下面表格存放0到C的关键字00DF ? 120 ktab: db ????00E0 ?00E1 ?00E2 ?00E3 ?00E4 ?00E5 ? 121 db ????00E6 ?00E7 ?00E8 ?00E9 ?00EA ?00EB ? 122 db ?;;表示0到C的关键字00EC 7F02 123 delay: mov r7,#02h ;延时1ms00EE 7EFF 124 delay1: mov r6,#0ffh00F0 DEFE 125 delay2: djnz r6,delay200F2 DFFA 126 djnz r7,delay100F4 22 127 ret00F5 7F14 128 ds10ms: mov r7,#14h ;延时10ms00F7 7EFF 129 dely1: mov r6,#0ffh00F9 DEF5 130 dely2: djnz r6,delay200FB DFF1 131 djnz r7,delay100FD 22 132 ret00FE 7F3C 133 ds30ms: mov r7,#3ch ;延时30ms0100 7EFF 134 dely3: mov r6,#0ffh0102 DEEC 135 dely4: djnz r6,delay20104 DFE8 136 djnz r7,delay10106 22 137 ret138 end5. 实验步骤:(1) 输入程序,本实验系统有两种输入方法. a)可以直接通过系统上的小键盘输入机器码也可以采用b)把实验系统和PC机的串口直接相连,在PC机上通过专用软件编译程序,然后通过串行口把编译后的程序机器码下载到实验系统中.(2) 输入程序首地址,按运行键EX,程序运行,观察此时显示结果.(3) 按下0~9数字键,观察在数码管上显示的结果,按下A,B或C观察显示的结果.(4) 在循环显示程序段中,调不同的时间延时子程序,观察显示效果6. 习题每人应该认真读懂程序,在源程序的基础上根据硬件电路判断其他按键对应的关键字,要求每个人应该至少在原来程序基础上再加一个按键,来显示相应的循环或其他功能.7. 思考题?(1) 思考动态显示的原理.(2) 思考以上程序还有那些不完善的地方,如何改?。