实现特定功能的键盘及LED显示课程设计
实现特定功能的键盘及LED显示课程设计

页眉内容微机原理与接口技术课程设计题目:实现特定功能的键盘及LED显示页眉内容目录'、实验目的.................... 、实验内容、总体设计四、实验电路五、实验框图六、实验程序七、实验心得页眉内容1、课程设计目的课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。
它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。
2、实验设计内容:本次实验的主要内容是在了解键盘及LED 显示接口原理的基础上,设计出相应的实验电路,以实现特定功能的键盘及LED 显示。
需要完成以下功能:1. 按1 键显示年;2. 按2 键显示月日;3. 按3 键显示GOOD ;4. 按4 键数码管由左到右字符“0”循环显示。
5.自行设计特效显示功能。
实验主要涉及可编程的键盘、显示接口芯片8279 和可编程中断控制器8259A。
功能1至4是在可编程的键盘、显示接口芯片8279的基础上通过程序实现的。
在功能5中,加入了中断,通过边沿触发产生中断,执行中断服务子程序,以此来时现功能5的特效(在数码管上从左、从右依次显示0—9 的数字)。
3、试验设计原理及方案:(含电路原理图、硬件连接示意图、系统功能框图、程序流程图等)3.1 电路原理图3.2 系统功能框图3.3 程序流程图3.4 各功能实现方案3.4.1 功能一按1 键显示年当可编程的键盘、显示接口芯片8279扫描寄存器AL=02H 时,说明按键为1 号键。
关于显示年份,首先定义一个显示缓冲区,用于存储表示年份的数字。
然后依次读取其值,经过换码,再通过8279以左端入口方式显示与数码管上。
程序段如下:3MOV DX,D8279 ; 键值输入IN AL,DXCMP AL,02HJZ YEARYEAR: MOV CX,04HAA: MOV DX,D8279 ;其余四位,显示0MOV AL,3FHOUT DX,ALLOOP AAMOV BX,OFFSET TABMOV SI,OFFSET DISPBUFF1+3 ;设置要显示的初始位MOV CX,4DISP1: MOV AL,[SI]XLAT ;通过换码,再显示MOV DX,D8279OUT DX,ALDEC SILOOP DISP1 ;依次读取数值9,0,0,2。
独立按键控制led课程设计

独立按键控制led课程设计一、课程目标知识目标:1. 学生能理解独立按键的工作原理,掌握其电路连接方式。
2. 学生能掌握LED的基本特性,了解其在电路中的应用。
3. 学生能理解独立按键控制LED的原理,掌握相关编程方法。
技能目标:1. 学生能独立完成独立按键与LED的电路连接,并进行功能测试。
2. 学生能编写简单的程序,实现独立按键控制LED的亮灭、闪烁等功能。
3. 学生能运用所学知识解决实际问题,具备一定的创新意识和动手能力。
情感态度价值观目标:1. 学生通过课程学习,培养对电子技术的兴趣,提高学习积极性。
2. 学生在团队合作中,学会沟通、协作,培养团队精神。
3. 学生在实践过程中,树立正确的价值观,认识到科技对生活的影响。
课程性质:本课程为实践性课程,结合理论教学,注重培养学生的动手能力、创新意识和实际应用能力。
学生特点:学生处于初中阶段,具有一定的物理知识和动手能力,对电子技术有一定的好奇心和兴趣。
教学要求:教师应注重理论与实践相结合,引导学生主动参与实践,鼓励学生创新思维,提高解决问题的能力。
同时,关注学生的情感态度价值观培养,使学生在掌握知识技能的同时,形成良好的综合素质。
通过分解课程目标为具体的学习成果,为后续教学设计和评估提供依据。
二、教学内容1. 理论知识:- 介绍独立按键的原理、功能及其在电路中的应用。
- 讲解LED的基本结构、特性以及在电路中的作用。
- 分析独立按键控制LED的电路原理及编程方法。
2. 实践操作:- 指导学生进行独立按键与LED的电路连接,确保正确无误。
- 帮助学生编写程序,实现独立按键控制LED的亮灭、闪烁等功能。
- 引导学生进行功能测试,分析并解决可能出现的故障。
3. 教学大纲:- 第一课时:介绍独立按键和LED的基本概念、原理及应用。
- 第二课时:讲解独立按键控制LED的电路原理及编程方法。
- 第三课时:指导学生进行电路连接和程序编写,实现功能。
- 第四课时:进行功能测试,总结问题,提高实践能力。
dspled键盘按键显示课程设计

dspled键盘按键显示课程设计一、课程目标知识目标:1. 学生能理解dspled键盘按键显示的基本原理,掌握其与计算机硬件和软件的关联性。
2. 学生能掌握dspled键盘按键显示的相关术语和概念,如背光、扫描码、映射等。
3. 学生能了解dspled键盘按键显示在不同应用场景中的作用和重要性。
技能目标:1. 学生能够独立进行dspled键盘按键显示的组装和调试。
2. 学生能够运用dspled键盘按键显示进行基本的编程操作,实现简单的功能。
3. 学生能够运用dspled键盘按键显示解决实际问题,提高实际操作能力。
情感态度价值观目标:1. 培养学生对计算机硬件和软件的兴趣,激发学习热情。
2. 培养学生的团队合作意识,学会在小组合作中分享、交流和协作。
3. 培养学生勇于尝试、不断探索的精神,提高面对问题的解决能力。
课程性质:本课程属于实践性较强的学科,注重理论知识与实际操作的相结合。
学生特点:学生处于好奇心强、求知欲旺盛的年级,具备一定的计算机基础,但对硬件和软件的结合尚需深入了解。
教学要求:教师应注重启发式教学,引导学生主动探究,关注学生的个体差异,提供个性化的指导。
同时,注重理论与实践相结合,提高学生的实际操作能力。
通过本课程的学习,使学生达到课程目标,为后续相关课程打下坚实基础。
二、教学内容1. dspled键盘按键显示原理:介绍dspled的工作原理,包括背光技术、扫描码的生成与传输、映射过程等,对应教材第3章“键盘与显示技术”。
2. dspled键盘按键显示组件:讲解键盘按键显示的各个组件,如LED、电路板、驱动程序等,以及它们的组装方法,对应教材第4章“计算机硬件组成”。
3. dspled编程操作:介绍如何通过编程实现键盘按键显示的功能,包括编程语言的选择、编程技巧等,对应教材第6章“计算机编程基础”。
4. dspled应用案例:分析dspled在实际应用场景中的使用,如游戏开发、嵌入式系统等,对应教材第8章“计算机硬件应用实例”。
键盘及LED驱动设计方案

1.模块描述该模块能够直接驱动8个共阴式(或8个共阳式)数码管位(或64只独立的LED ),同时还可以扫描管理多达64只按键。
其中有8只按键还可以作为功能键使用,如同电脑键盘上的Ctrl 、Shift 、Alt 键一样。
2.模块总体设计2.1总体实现结构displayctrlkeyscantimedis tributeenendpram flashswh scannum flashfreqpresskey p_wr functionkeyrepeatcnt f _wrseldt kinchgkout_sel kout_data图1:键盘扫描及LED 驱动模块结构图2.2 总体实现描述timedistribute 模块为displayctrl 和keyscan 模块分配工作时间,并控制interface 模块双向端口的输入输出的转换。
displayctrl 模块根据dpram 提供的显示数据及要扫描的数码管的个数scannum 提供相应的显示控制信号及显示数据。
keyscan 模块完成对键盘的扫描及对功能键、普通键及连击次数、按键键值的判断。
2.3 接口信号定义序号信号名位宽 I/O 描述1 dpram0~dpram7 64 I 对应的8个数码管的数据。
2 scannum3 I 要显示的数码管的个数。
3 sel 8 O 数码管的位选信号。
4 dt 8 O 数码管的显示数据5 p_wr 1 O 寄存器PressKey 和RepeatCnt 的写信号。
6 presskey8O普通按键的键值。
当扫描到有普通按键按下时,输出按键键值,结果将存于键值寄存器PressKey 中。
7repeatcnt 8 O 普通键的连击次数。
当普通按键连续按下时,输出按键的连击次数,结果将存于连击次数计数器RepeatCnt中。
8functionkey 8 O 功能键的状态。
每一位对应一个功能键(F7~F0),第0位(LSB)对应F0,第1位对应F1,依次类推,第7位(MSB)对应F7。
实验十四 LED显示和键盘实验

实验14 LED显示和键盘实验1. 实验目的加深用户对I2C总线的理解,熟悉I2C器件的使用,掌握ZLG7290芯片显示和键盘的简单程序设计。
2. 实验设备及器件IBM PC机一台DP-51 PRO单片机综合仿真实验仪一台3. 实验内容ZLG7290芯片LED显示、键盘控制器驱动实验。
4. 实验要求熟练掌握I2C总线的控制,灵活运用I2C主控器软件包,深刻理解ZLG7290芯片LED显示、键盘控制的各种功能,编写驱动程序,读出用户按键值并依次显示在8个LED数码管上(保留显示最后8次按键值,显示内容从右向左移动,最后一次按键值显示在最右侧LED数码管上)。
5. 实验步骤①用导线连接D5区和A2区的P16→SCL,P17→SDA,P10→RST_L,INT_KEY→INT0,短接D5区的JP1跳线。
②模拟I2C软件包VI2C_ASM.INC文件,使用$INCLUDE (VI2C_ASM.INC) 命令加入到你的汇编源文件中。
在你的汇编源文件中定义SCL、SDA、ACK等信号。
③先编写显示的子程序(Display)和获取用户按键子程序(GetKey)。
④然后再进行整体编程。
如果还有一难,可以先画流程一,再编写程序。
⑤显示结果为:上电运行时,8位数码管显示01234567,用户按键时,键值在最右侧LED数码管显示,原显示内容左移一位,例如:显示由“01234567”变为“1234567x”,(x:用户按键值,1~16,显示为1~F,g)。
6. 实验预习要求认真阅读ZLG7290的数据手册(附件1)和模拟I2C软件包(附件2)使用手册,理解硬件结构;先把程序编好,然后在Keil 51环境下进行软件仿真。
7. 实验参考程序详见附近3:计算机硬件技术基础实验参考代码(DP-51ProC).doc 文件。
SDA BIT P1.7 ;I2C总线定义串行数据存取位SCL BIT P1.6 ;I2C总线定义串行时钟位RST BIT P1.0 ;MCU复位输出信号,低电平复位ZLG7290INT_KEY BIT P3.2 ;MCU中断信号输入,有效的按键动作使该引脚信号变为低电平MTD EQU 40H ;I2C总线发送数据缓冲区(8字节)MRD EQU 48H ;I2C总线接收数据缓冲区(8字节)DisBuf EQU 38H ;显示缓冲区(8字节,可对应8位数码管显示);定义ZLG7290器件地址及子地址ZLG7290 EQU 70H ;ZLG7290的器件地址ACK BIT 10H ;应答标志位SLA DATA 50H ;器件的从地址SUBA DATA 51H ;器件的子地址NUMBYTE DATA 52H ;读/写的字节数变量Key DATA 53H ;返回用户按键值SystemReg EQU 00H ;系统寄存器地址,保存ZLG7290系统状态KeyReg EQU 01H ;键值寄存器,表示被压按键的键值CmdBuf0 EQU 07H ;命令缓冲区0CmdBuf1 EQU 08H ;命令缓冲区1DpRam EQU 10H ;显示缓存寄存器ORG 8000HLJMP MAINORG 8100H;-------主程序如下:MAIN: MOV SP,#70H ;堆栈区从70H开始CLR R ST ;复位ZLG7290LCALL DELAY ;等待复位完成,ZLG7290复位周期比较长,必须等待SETB RST ;结束复位LCALL DELAYlcall ClsDisp ;清除显示MainLoop: mov DisBuf+0,#0 ;上电运行时,8位数码管显示01234567mov DisBuf+1,#1 ;给显示缓冲区赋值,01234567mov DisBuf+2,#2mov DisBuf+3,#3mov DisBuf+4,#4mov DisBuf+5,#5mov DisBuf+6,#6mov DisBuf+7,#7lcall Display ;调用显示子程序,显示内容WaitKey: JB INT_KEY,WaitKey ;查询按键lcall GetKey ;获取键值mov A,Keyjz WaitKey ;Key=0无键按下,继续查询mov DisBuf+7,DisBuf+6 ;显示内容左移mov DisBuf+6,DisBuf+5mov DisBuf+5,DisBuf+4mov DisBuf+4,DisBuf+3mov DisBuf+3,DisBuf+2mov DisBuf+2,DisBuf+1mov DisBuf+1,DisBuf+0mov DisBuf+0,Keylcall Displayljmp WaitKey;子程序名:ClsDisp;功能:清除显示内容;调用:VI2C_ASM.INC;入口参数:无;出口参数:无;占用资源: R0,R1,R2,R3(工作寄存器组1),ACC,Cy,R5(当前工作寄存器组)ClsDisp: mov R5,#8 ;循环计数器初值,8位数码管mov A,#01100000B ;按位下载数据且译码指令01100 A2A1A0;A2~A0:对应显示位置1~8位数码管Cls1: MOV SLA,#ZLG7290 ;指定器件地址MOV SUBA,#CmdBuf0 ;指定子地址MOV MTD,A ; 命令送I2C总线发送数据缓冲区mov MTD+1,#1FH ;命令参数,1FH:无显示MOV NUMBYTE,#02H ;待发送数据2字节push ACC ;保护ACCpush PSW ;保护PSWsetb RS0 ;切换工作寄存器,I2C通信软件使用工作寄存器组1clr RS1LCALL IWRNBYTE ;调用写2字节数据程序(VI2C_ASM.INC,I2C模拟软件包)pop PSW ;恢复PSWpop ACC ;恢复ACCinc A ;按位下载数据且译码指令地址部分+1LCALL DELAY ;延时,等待ZLG7290执行上述命令djnz R5,Cls1 ;没有达到8次,继续循环ret ;子程序返回;子程序名:Display;功能:在8段LED数码管显示;调用:VI2C_ASM.INC;入口参数: Disbuf+0~ Disbuf+7,8字节显示缓冲区;出口参数:无;占用资源: R0,R1,R2,R3(工作寄存器组1),ACC,Cy,R0,R5(当前工作寄存器组)Display: mov R5,#8 ;循环计数器初值,8位数码管mov A,#01100000B ;按位下载数据且译码指令01100 A2A1A0;A2~A0:对应显示位置1~8位数码管mov R0,# Disbuf ;R0-> DisbufDisp1: MOV SLA,#ZLG7290 ;指定器件地址MOV SUBA,#CmdBuf0 ;指定子地址MOV MTD,A ;命令送I2C总线发送数据缓冲区mov MTD+1,@R0 ;命令参数,待显示数据送I2C总线发送数据缓冲区MOV NUMBYTE,#02H ;待发送数据2字节push ACC ;保护ACCpush PSW ;保护PSWsetb RS0 ;切换工作寄存器,I2C通信软件使用工作寄存器组1clr RS1LCALL IWRNBYTE ;调用写2字节数据程序(VI2C_ASM.INC,I2C模拟软件包)pop PSW ;恢复PSWpop ACC ;恢复ACCinc A ;按位下载数据且译码指令地址部分+1inc R0 ;R0+1,指向下一个待显示数据LCALL DELAY ;延时,等待ZLG7290执行上述命令djnz R5,Disp1 ;没有达到8次,继续循环ret ;子程序返回;子程序名:GetKey;功能:获取用户按键值(Key);调用:VI2C_ASM.INC;入口参数:无;出口参数:Key;占用资源: R0,R1,R2,R3(工作寄存器组1),ACC,CyGetKey: MOV SLA,#ZLG7290 ;指定器件地址MOV SUBA,#01H ;指定子地址MOV NUMBYTE,#01H ;读1字节数据push ACC ;保护ACCpush PSW ;保护PSWsetb RS0 ;切换工作寄存器,I2C通信软件使用工作寄存器组1clr RS1LCALL IRDNBYTE ;调用读1字节数据程序pop PSW ;恢复PSWpop ACC ;恢复ACCmov Key,MRD ;读取的数据送Keyret ;子程序返回;子程序名: DELAY;功能:延时约36.5 ms(11.0592MHz时钟);调用:YS500US;入口参数:无;出口参数:无;占用资源: R7,R6DELAY: MOV R7,#80HMIN: LCALL YS500USDJNZ R7,MINRET;子程序名: YS500US;功能:延时约279us(11.0592MHz时钟);调用:无;入口参数:无;出口参数:无;占用资源: R6YS500US:MOV R6,#80HDJNZ R6,$ ;延时128×2T=256T (T=1/1159200)RET$INCLUDE(VI2C_ASM.INC) ;将VIIC软件包加入到本段代码后END8. 实验思考题①编写LED数码管闪烁控制子程序,实现对指定位进行闪烁控制。
(整理)接口课程设计实现特定功能的键盘及LED显示

实现特定功能的键盘及LED显示了解键盘及LED显示接口原理,设计实验电路图完成以下功能:1. 按1键显示年;2. 按2键显示月日;3. 按3键显示GOOD ;4. 按4键数码管由左到右字符“0”循环显示。
5.自行设计特效显示功能。
CODE SEGMENTASSUME CS:CODE,DS:CODESTART: MOV AX,CSMOV DS,AXINPUT: CALL KEYBOARDLEA SI,KEYBUFFER;取按键的值MOV AL,[SI]CMP AL,1JNZ L0JMP SHOW_YEAR ;显示年L0:CMP AL,2JNZ L1JMP SHOW_MD ;显示月日L1:CMP AL,3JNZ L2JMP SHOW_GOOD ;显示GOODL2:CMP AL,4JNZ L3JMP SHOW_0 ;由左到右字符“0”循环显示L3:CMP AL,7JNZ L4JMP SHOW_SUN ;显示SUNL4:JMP SHOW_HERO;显示HERO;----------------------------------结束---------------------------------------------;--------------------------------显示年开始----------------------------------------SHOW_YEAR:MOV CH,01111111B ;初始化位选码01111111BMOV BH,11110111B ;显示位选结束位LEA SI,YEARBUFFERCALL DISPLAYDEC COUNT ;重复显示COUNT次JNZ SHOW_YEARMOV COUNT,250JMP INPUT;--------------------------------------结束-------------------------------------------;-----------------------------------显示月开始---------------------------------------SHOW_MD:MOV CH,01111111B ;初始化位选码01111111BMOV BH,11110111B ;显示位选结束位LEA SI,MDBUFFERCALL DISPLAYDEC COUNT ;重复显示COUNT次JNZ SHOW_MDMOV COUNT,250JMP INPUT;---------------------------------结束--------------------------------------------------;---------------------------------显示GOOD-----------------------------------------------SHOW_GOOD:MOV CH,01111111B ;初始化位选码01111111BMOV BH,11110111B ;显示位选结束位LEA SI,GOODBUFFERCALL DISPLAYDEC COUNT ;重复显示COUNT次JNZ SHOW_GOODMOV COUNT,250JMP INPUT;----------------------------------结束--------------------------------------------------;---------------------------------显示HERO-----------------------------------------------SHOW_HERO:DE: MOV CH,01111111B ;初始化位选码01111111B LEA SI, HEROBUFFERMOV BH,11110111B ;显示位选结束位CALL DISPLAYDEC COUNT ;重复显示COUNT次JNZ SHOW_HEROMOV COUNT,10DEC XUNMOV COUNT,10CALL SHOWDELAY_HCMP XUN,00H ;闪光显示JNZ DEMOV XUN ,15MOV COUNT ,250JMP INPUT;----------------------------------结束-------------------------------------------------;---------------------------显示由左到右字符“0”循环------------------------------------SHOW_0: MOV BX,3LSHOW0:MOV CH,01111111B ;初始化位选码01111111LEA DI,LINBUFFERMOV AL,80HMOV DX,203HOUT DX,AL ;再次初始化8255DISPLAY_0:MOV AL,CHMOV DX,202HOUT DX,AL;位选码送PC口MOV AL,[DI]MOV DX,200H;MOV AL,5BHOUT DX,AL ;显示段码CALL SHOWDELAY0ROR CH,1 ;指向下一个数码管CMP CH,11110111BJNZ DISPLAY_0DEC BX ;重复显示3次JNZ LSHOW0JMP INPUT;----------------------------------结束-------------------------------------------------;-----------------------------显示SUN-------------------------------------------SHOW_SUN:MOV CH,01111111B ;初始化位选码01111111BMOV BH,11101111B ;显示位选结束位LEA SI,SUNBUFFERCALL DISPLAYDEC COUNT ;重复显示COUNT次JNZ SHOW_SUNMOV COUNT,250JMP INPUT;-----------------------------------结束------------------------------------------------;----------------------------------显示延时----------------------------------------------- SHOWDELAY PROC NEARPUSH BXPUSH CXMOV BX,10SHOWDEL1:MOV CX,100SHOWDEL2:LOOP SHOWDEL2DEC BXJNZ SHOWDEL1POP CXPOP BXRETSHOWDELAY ENDP;-----------------------------------结束-----------------------------------------------;----------------------------------显示延时0--------------------------------------------SHOWDELAY0 PROC NEARPUSH BXPUSH CXMOV BX,100SHOW0DEL1:MOV CX,2000SHOW0DEL2:LOOP SHOW0DEL2DEC BXJNZ SHOW0DEL1POP CXPOP BXRETSHOWDELAY0 ENDP;-----------------------------------结束---------------------------------------------SHOWDELAY_H PROC NEARPUSH BXPUSH CXMOV BX,10SHOW_HDEL1:MOV CX,2000SHOW_HDEL2:LOOP SHOW_HDEL2DEC BXJNZ SHOW_HDEL1POP CXPOP BXRETSHOWDELAY_H ENDP;---------------------------------显示程序------------------------------------------DISPLAY PROC NEARMOV AL,80HMOV DX,203HOUT DX,AL ;再次初始化8255DISPLAY1:MOV AL,CHMOV DX,202HOUT DX,AL ;位选码送PC口MOV AL,[SI]MOV DX,200HOUT DX,AL ;显示段码CALL SHOWDELAY ;延时INC SIROR CH,1 ;指向下一个数码管CMP CH,BHJNZ DISPLAY1RETDISPLAY ENDP;-----------------------------------结束---------------------------------------------;---------------------------------读取按键盘------------------------------------------KEYBOARD PROC NEARLEA SI,KEYBUFFERMOV AL,10000001B ;初始化8255控制字MOV DX,203HOUT DX,ALKS1:CALL KS ;读取按键CMP AL,0FH ;判断有无按键JZ KS1CALL DELAYCALL KSCMP AL,0FHJZ KS1MOV BL,0EFH ;初始化列码MOV BH,0 ;初始化列计数器AGAIN:MOV DX,202HMOV AL,BLOUT DX,AL ;输出列码IN AL,DX ;读取行码AND AL,0FHCMP AL,0FHJZ NEXT ;该列无键闭合,准备下一列扫描CMP AL,0DH ;判断列是否是第一个键闭合?JNZ TWOMOV AL,1JMP FREETWO: ;判断列是否是第二个键闭合?CMP AL,0BHJNZ THREEMOV AL,4JMP FREETHREE: ;判断列是否是第三个键闭合?CMP AL,07HJNZ NEXTMOV AL,7FREE:PUSH AXWAIT1:CALL KSCMP AL,0FHJNZ WAIT1POP AXADD AL,BHMOV [SI],AL ;保存键值,并返回JMP RETURNNEXT:INC BHROL BL,1CMP BL,0FEHJNZ AGAINJMP KS1KS PROC NEARMOV DX,202HMOV AL,0FHOUT DX,ALIN AL,DXAND AL,0FHRETKS ENDPDELAY PROC NEARPUSH BXPUSH CXMOV BX,2000 DEL1:MOV CX,10DEL2:LOOP DEL2DEC BXJNZ DEL1POP CXPOP BXRETDELAY ENDP RETURN:RET KEYBOARD ENDPEXIT:MOV AH,4CHINT 21HXUN DB 15YEARBUFFER DB 5BH,3FH,3FH,6FH ;存放年2009MDBUFFER DB 3FH,6FH,3FH,66H ;存放月日0904GOODBUFFER DB 6FH,5CH,5CH,5EH ;GOODKEYBUFFER DB 1LINBUFFER DB 3FHHEROBUFFER DB 76H,79H,77H,3FH ;HEROSUNBUFFER DB 6DH,3EH,37H ;SUNCOUNT DB 250 ;显示次数----------------------------------结束-----------------------------------------CODE ENDSEND START。
独立式键盘与LED数码管显示器与单片机控制相关的学习教案

KEY0:CJNE A, #01H, KEY1;不是KEYA键,转KEY1
LJMP KEYAA;
是KEYA键,转KEYAA执行
KEY1:CJNE A, #02H, KEY2;不是KEYB键,转KEY2
LJMP KEYBB;
是KEYB键,转KEYBB执行
KEY2:CJNE A, #04H, KEY3;不是KEYC键,转KEY3
于显示小数点。通过七段发光二极管亮暗的不同组合,可以显示多种数
字(0~9),字母(a~f、A~F)及其它符号。另外,在使用数码管 时必须增加限流电阻,以保护数码管。
第20页/共35页
第二十一页,编辑于星期二:八点 五十四分。
LED显示器中的发光二极管共有两种连接方法: (a)共阳极接法:
各发光二极管的阳极连接在一起,接到数码管的位控端(公共端),再
独立式键盘的按键相互独立,每个按键接一根I/O口线,一根 I/O口线上的按键工作状态不会影响其它I/O口线的工作状态。因此,
通过检测I/O口线的电平状态,即可判断键盘上哪个键被按下。
80C51
VCC
P1.0 P1.1 P1.2 P1.3
KEYA KEYB KEYC KEYD
第10页/共35页
第十一页,编辑于星期二:八点 五十四分。
(8)按键的编码
根据键盘结构的不同,采用不同的编码方式。
第7页/共35页
第八页,编辑于星期二:八点 五十四分。
(9)编制键盘程序
一个完善的键盘控制程序应具备以下功能:
(a)检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点
抖动的影响;
(b)有可靠的逻辑处理办法。每次只处理一个按键,其间对 任何按键的操作对系统不产生影响,且无论一次按键时间有多长 ,系统仅执行一次按键功能程序;
键盘控制显示课程设计

键盘控制显示课程设计一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握键盘控制显示的基本原理和编程方法;技能目标要求学生能够独立完成键盘控制显示的实验,并具备一定的创新能力;情感态度价值观目标要求学生在学习过程中培养团队合作意识,增强对计算机科学的兴趣和责任感。
通过分析课程性质、学生特点和教学要求,我们将目标分解为具体的学习成果。
首先,学生需要理解键盘控制显示的基本概念,包括键盘的工作原理和显示技术的演变。
其次,学生应掌握键盘控制显示的编程方法,包括键盘扫描、按键消抖和显示控制等。
最后,学生需要具备实际操作能力,能够通过编程实现键盘控制显示的功能,并在此基础上进行创新设计。
二、教学内容根据课程目标,我们选择和了以下教学内容。
首先,介绍键盘控制显示的基本原理,包括键盘的工作原理和显示技术的演变。
其次,讲解键盘控制显示的编程方法,包括键盘扫描、按键消抖和显示控制等。
接着,通过实例分析,让学生了解键盘控制显示在实际应用中的重要性。
最后,安排学生进行实验,让他们亲自动手实现键盘控制显示的功能,并鼓励他们进行创新设计。
三、教学方法为了实现课程目标,我们将采用多种教学方法。
首先,通过讲授法,向学生传授键盘控制显示的基本原理和编程方法。
其次,利用讨论法,引导学生思考键盘控制显示在实际应用中的价值和挑战。
接着,采用案例分析法,让学生通过分析实际案例,深入理解键盘控制显示的应用场景。
最后,运用实验法,让学生在动手实践中掌握键盘控制显示的编程技巧,并培养他们的创新能力。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源。
首先,选用合适的教材,为学生提供系统的学习材料。
其次,提供参考书籍,拓展学生的知识视野。
接着,收集多媒体资料,丰富学生的学习体验。
最后,准备实验设备,确保学生能够顺利进行实验操作。
同时,我们还将利用网络资源,为学生提供更多的学习资料和交流平台。
实验2 LED显示实验和键盘编程

实验二LED显示实验和键盘编程
实验目的
1.学习LED静态显示和动态显示方法;
2.学习键盘独立按键。
实验内容
1.LED 静态显示。
将J5中的1个PIN连接到GND,P1口J30连接至J31,J32
连接至J1,J19用短路冒短接;从P1口循环输出1-9的显示的段码,并观察显示亮度。
2.LED动态显示。
将J5连接到P2口J16,P1口J30连接至J31,J32连接至
J1,J19用短路冒短接;从P1口循环输出1-9的显示的段码,从P2口输出显示的位码,在6个LED上分别显示1-6 六个数字,且数字稳定显示。
3.安装2中连接电路方法,通过串口控制LED显示。
当串口发出命令后,LED
在指定的位置显示指定的数字,例如:发送“3,2”,则在第3个位置显示数字2。
4.独立按键扫描。
将J5中的PIN8连接到GND,将P1口J30连接至J8,编程
实现扫描按键程序,扫描S1、S5、S9和S13,并将扫描的按键显示到数码管上。
实验方法
做实验时请注意:PIN4和PIN8相当于空脚,因为只有6个数码管,所以做实验时控制这2个脚不起作用。
此外做实验前建议仔细检查电路连接!
图1 实验原理图。
微机原理与接口技术-键盘LED显示【课程设计报告】

微机原理与接口技术-键盘LED 显示【课程设计报告】重庆大学课程设计报告课程名称:微机原理与接口技术设计题目:键盘LED显示院系:电气信息学院班级:2007级设计时间:2009年12月第一章概述 (2)1.1学习目的 (2)1.2 计算机的应用 (3)1.3学习计算机的意义 (3)1.4课程设计目的 (4)第二章总体方案设计 (4)2.1 设计注意问题 (4)2.2 总体思路 (5)第三章硬件设计 (5)3.1 8255工作原理 (5)3.2 键盘工作原理 (7)3.3 键特征值的形成 (8)3.4段值的形成 (9)3.5 8255接线图 (11)第四章软件设计 (12)4.1 8255初始化 (12)4.2 键盘扫描的处理方法 (12)4.2.1. 判断是否有键被按下的方法 (12)4.2.2. 判断是否有键被按下的源程序 (13)4.2.3 防抖动 (13)4.2.4.防抖动的延时子程序 (14)4.3 程序核心部分 (14)4.3.1 逐行扫描 (14)4.3.2逐行扫描的源程序 (15)第五章源程序代码 (15)5.1 根据整体思路以及软件设计得到的代码. 155.2 以上代码存在问题分析 (19)第六章难点分析 (20)第七章体会感慨建议 (25)第八章参考文献 (26)第一章概述1.1学习目的“微机原理与接口技术”是电气工程及其自动化专业的一门重要的专业基础课程。
我们通过该门课的学习,知道了微机的工作原理,微型计算机的基本结构,接口技术及汇编语言程序设计,为后续的课程的学习和今后的工作打下坚实的基础。
通过实验可以培养学生利用计算机技术和编程手段分析,解决专业领域的各种问题的能力和意识,并进一步感受微机发展的微机发展的新技术和新方法。
1.2 计算机的应用目前计算机的应用已经遍布各个行业,如科学计算、数据处理、过程控制、人工智能、网络应用等。
科学和工程计算:科学和工程计算的特点是计算量大,而逻辑关系相对简单,它是计算机重要应用领域之一。
接口课程设计_实现特定功能的键盘及LED显示2

题目三实现特定功能的键盘及LED显示1.了解键盘及LED显示接口设计,绘制出原理图。
2.根据实验箱上提供的硬件资源完成:a、按1键显示年b、按2键显示月日c、按3键显示GOODd、按4键数码管由左到右8字循环显示。
3.设计电路并在实验台上连接线路。
OUTBIT EQU 08002H ; 位控制口OUTSEG EQU 08004H ; 段控制口IN_KEY EQU 08001H ; 键盘读入口DATA SEGMENTLEDBUF DB 6 DUP(?) ; 显示缓冲NUM DB 1 DUP(?) ; 显示的数据DELAYT DB 1 DUP(?)LEDMAP: ; 八段管显示码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,FKEYTABLE: ; 键码定义DB 16H, 15H, 14H, 0FFHDB 13H, 12H, 11H, 10HDB 0DH, 0CH, 0BH, 0AHDB 0EH, 03H, 06H, 09HDB 0FH, 02H, 05H, 08HDB 00H, 01H, 04H, 07HDATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATADELAY PROC NEAR ; 延时子程序PUSH AXPUSH CXMOV AL, 0MOV CX,AXLOOP $POP CXPOP AXRETDELAY ENDPDISPLAYLED PROC NEARMOV BX, OFFSET LEDBUFMOV CL, 6 ; 共6个八段管MOV AH, 00100000B ;从左边开始显示DLOOP:MOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管MOV AL, [BX]MOV DX, OUTSEGOUT DX,ALMOV DX, OUTBITMOV AL, AHOUT DX, AL ; 显示一位八段管PUSH AXMOV AH, 1CALL DELAYPOP AXSHR AH, 1INC BXDEC CLJNZ DLOOPMOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管RETDISPLAYLED ENDPDISPLAYLED1 PROC NEARMOV CL, 6 ; 共6个八段管;MOV AH, 00000001B ; 从左边开始显示MOV AH,00100000BDLOOP1:MOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管MOV AL,7FHMOV DX, OUTSEGOUT DX,ALMOV DX, OUTBITMOV AL, AHOUT DX, AL ; 显示一位八段管PUSH AXMOV AH, 120CALL DELAYPOP AXSHR AH, 1DEC CLJNZ DLOOP1MOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管R ETDISPLAYLED1 ENDPTESTKEY PROC NEARMOV DX, OUTBITMOV AL, 0OUT DX, AL ; 输出线置为0 关所有八段管MOV DX, IN_KEYIN AL, DX ; 读入键状态NOT ALAND AL, 0FH ; 高四位不用RETTESTKEY ENDPGETKEY PROC NEARMOV CH, 00100000BMOV CL, 6KLOOP:MOV DX, OUTBITMOV AL, CH ; 找出键所在列SHR CH, 1MOV DX, IN_KEYIN AL, DXNOT ALAND AL, 0FHJNE GOON_ ; 该列有键入DEC CLJNZ KLOOPMOV CL, 0FFH ; 没有键按下, 返回0FFHJMP EXIT1GOON_:DEC CLSHL CL, 2 ; 键值= 列X 4 + 行MOV CH, 4LOOPC:TEST AL, 1JNZ EXIT1SHR AL, 1INC CLDEC CHJNZ LOOPCEXIT1:MOV DX, OUTBITMOV AL, 0OUT DX, ALMOV CH, 0MOV BX, OFFSET KEYTABLEADD BX, CXMOV AL, [BX] ; 取出键码MOV BL, ALWAITRELEASE:MOV DX, OUTBITMOV AL, 0OUT DX, AL ; 等键释放MOV AH, 10JNE WAITRELEASEMOV AL, BLRETGETKEY ENDPSTART PROC NEARMOV AX, DATAMOV DS, AXB:MOV LEDBUF, 0 ;不显示MOV LEDBUF+1, 0MOV LEDBUF+2, 0MOV LEDBUF+3, 0MOV LEDBUF+4, 0MOV LEDBUF+5, 0MLOOP:CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE MLOOP ; 无键入, 继续显示T1:CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH, 0CMP AL,01HJZ P1CMP AL,02HJZ P2CMP AL,03HJZ P3CMP AL,04HJZ P4JMP BP1:MOV BX, OFFSET LEDMAPADD BX, AXMOV AL, [BX]MOV LEDBUF,5BHMOV LEDBUF+1,3FHMOV LEDBUF+2,06HMOV LEDBUF+3,5BHMOV LEDBUF+4,0MOV LEDBUF+5,0JMP MLOOPP2:MOV BX,OFFSET LEDMAPADD BX,AXMOV AL,[BX]MOV LEDBUF,3FHMOV LEDBUF+1,7DHMOV LEDBUF+2,3FHMOV LEDBUF+3,66HMOV LEDBUF+4,0MOV LEDBUF+5,0JMP MLOOPP3:MOV BX,OFFSET LEDMAPADD BX,AXMOV AL,[BX]MOV LEDBUF,6FHMOV LEDBUF+1,5CHMOV LEDBUF+2,5CHMOV LEDBUF+3,5EHMOV LEDBUF+4,0MOV LEDBUF+5,0JMP MLOOPP4:CALL DISPLAYLED1CALL TESTKEY ; 有键入?JE P4 ; 无键入, 继续显示JMP T1START ENDPCODE ENDSEND START。
实验四 小键盘+LED驱动实验

实验五、六小键盘+LED驱动实验一、实验目的学习小键盘驱动原理和LED显示原理,掌握轮询方式获取键值的原理,理解驱动程序采用轮询方式和中断方式的区别;学习将最近的按键值移位显示在LED 上的方法。
二、实验内容熟悉开发环境和工具,通过烧写程序,按下对应的小键盘,能都在LED上显示相对的数字循环右移。
三、实验步骤1.编写键盘驱动函数keybd.c,实现函数keybd_read,keybd_open,keybd_release和keybd_init。
其中代码主要是keybd_read,keybd_init函数。
注意keybd_read函数需要延时。
2.编写LED驱动函数led.c。
实现函数led_read,led_open,led_ioctl,led_write,led_release 和led_init。
其中代码主要是led_write,led_ioctl,led_init 函数。
3.在主程序key.c中编写代码,获取按键值。
并根据获得的按键值,点亮相应的LED灯。
6个LED将显示最近的6次按键值。
程序如下:int main(){char ret[7]; // ret[0]为本次读入的按键值。
ret[1..7]中保存最近6次的按键值,//ret [i]为向LED[i]写入的数据。
数组初始化为0xdf(对应数值8),//即使得6个LED的所有段都点亮,显示数值“8”。
打开键盘;打开LED;初始化ret数组;向LED[i]分别写入ret[i];//点亮6个LED,等待键盘输入。
While (1) //查询方式{读取键盘;if (有键按下){ret数组逻辑右移;向LED[i]分别写入ret[i];//LED显示最新的6次按键值}usleep(100000); //释放一下CPU}关闭LED;关闭键盘;return 0;}#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/socket.h>#include <syslog.h>#include <signal.h>#include <errno.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <syslog.h>#include <signal.h>#include <led_ioctl.h>#define NOKEY 0int main(){int keybd_fd,led_fd,count;char ret[7]; //ret[i] is the data send to LED[i]keybd_fd = open("/dev/keybd", O_RDONLY); //open keyboard if(keybd_fd<=0){printf("open keybd device error!\n");return 0;}led_fd = open("/dev/led",O_RDWR); //open led.if (led_fd <= 0){printf("open led device error\n");return 0;}ret[0] = NOKEY; //maintain the latest key value for (count=1; count<7; count++){ret[count] = 0xdf; //initiate to char '8'.}ioctl(led_fd,IOCTRL_LED_1); //light the first led:led[1] count = write(led_fd,ret+1,1);if (count != 1){printf("write device led error\n");return 0;}//light led[2]~led[6] with the init value '8'ioctl(led_fd,IOCTRL_LED_2);count = write(led_fd,ret+2,1);ioctl(led_fd,IOCTRL_LED_3);count = write(led_fd,ret+3,1);ioctl(led_fd,IOCTRL_LED_4);count = write(led_fd,ret+4,1);ioctl(led_fd,IOCTRL_LED_5);count = write(led_fd,ret+5,1);ioctl(led_fd,IOCTRL_LED_6);count = write(led_fd,ret+6,1);//poll endlesswhile(1){read(keybd_fd,ret,1);if (ret[0] != NOKEY) //when key pressed {// printf("key = %c\n",ret[0]);//keep ret[1~6] the latest 6 pressed key value.for( count=7; count>0; count--){ret[count] = ret[count-1]; //right rotate }//light led[1~6]ioctl(led_fd,IOCTRL_LED_1);count = write(led_fd,ret+6,1);ioctl(led_fd,IOCTRL_LED_2);count = write(led_fd,ret+5,1);ioctl(led_fd,IOCTRL_LED_3);count = write(led_fd,ret+4,1);ioctl(led_fd,IOCTRL_LED_4);count = write(led_fd,ret+3,1);ioctl(led_fd,IOCTRL_LED_5);count = write(led_fd,ret+2,1);ioctl(led_fd,IOCTRL_LED_6);count = write(led_fd,ret+1,1);}//end ifusleep(100000); //free cpu a while}//end whileclose(keybd_fd);close(led_fd);return 0;}四、遇到问题及解决方法在led中显示循环右移的数字时,会出现乱码的情况,后来发现是程序错误,经改正后,显示结果如下:。
键盘及LED显示实验

实验三键盘及LED显示实验一、实验内容利用8255可编程并行接口控制键盘及显示器,当有按键按下时向单片机发送外部中断请求(INTO, INT1),单片机扫描键盘,并把按键输入的键码一位LED 显示器显示出来。
二、实验目的及要求(一)实验目的通过该综合性实验,使学生掌握8255扩展键盘和显示器的接口方法及C51 语言的编程方法,进一步掌握键盘扫描和LED显示器的工作原理;培养学生一定的动手能力。
(二)实验要求1.学生在实验课前必须认真预习教科书与指导书中的相关内容,绘制流程图,编写C51语言源程序,为实验做好充分准备。
2.该实验要求学生综合利用前期课程及本门课程中所学的相关知识点,充分发挥自己的个性及创造力,独立操作完成实验内容,并写出实验报告。
三、实验条件及要求计算机,C51语言编辑、调试仿真软件及实验箱50台套。
四、实验相关知识点1. C51编程、调试。
2 .扩展8255芯片的原理及应用。
3.键盘扫描原理及应用。
4.LED显示器原理及应用。
5.外部中断的应用。
五、实验说明本实验仪提供了8位8段LED显示器,学生可选用任一位LED显示器,只要六、实验原理图8255七、连线说明F4 区: CS 、A0、A1A3 区: CS1、A0、A1 B6 区:JP56 (PA 口)F4 区:JP41(C)B6 区:JP53 (PB 口)F4 区:JP42(B) B6 区:JP52 (PC 口)F4 区:JP47(A)A3 区:JP51F4 区:JP92(D) A3 区:P1.6、P1.7A3 区:INT0、INT1注:F4的D 无法与INT0(P3.2)、INT1(P3.3)直接连接,所以使用P1 口桥接。
八、实验参考流程图 1 .主程序流程图DS30LG4041AH123 B 45 6 78SEGB (8255 PB6) / SEGC (8255 PB5)4 SEGD (8255 PB4) —2 SEGE (8255 PB3)—1 SEGA (8255 PB7) 11 SEGH (8255 PB0) JP42 ab ac 口:口gdpdPGND42af「g ]b 口dpGND3am p GND28 adpGND16DS29LG4041AHSEGH 3SEGA 11 SE( SEGC 4 SEGD 2 SEGE 1a b c d e f g dpadd c paGND3aGND2adpGND1GND46 JP41(PA7)(8255 PA6)(8255 PA5) (8255 PA4) (8255 PA3) (8255 PA2) (8255PA1)(8255 PA0)123 ;c6VCC R162 5.1KVCC |R1635.1KU36 DO 34D1 33 D2 32D3 31D4 30D5 29D6 28D7 27 RD 5WR 36 D0 PA0 D1 PA1 D2 PA2 D3 PA3 D4 PA4 D5 PA5 D6 PA6 D7 PA7 RD PB0 WR PB1 A0 PB2 A1 PB3 RESET PB4 CSPB5 PB6 PB7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC74 PA0 3PA1 2PA21PA3 40 ~PA4~ 39 PA5 38 PA6 37 PA7 18 PB019 PB1 20 PB2 21PB3PB4 23 PB5 24 PB6 25 PB714 严 PC015 PC1 16 PC2 '17 PC3 13 PC4 ' 12 PC5 ' 11 PC6 10PC71 2 3 4 5 6 7 8 1 2 3 4 5 6 7 81 2 34 5 6 7 8 JP56JP53JP526 —— 7A ■B ■C ■D —E ■(8255 PC7) (8255 PC6) (8255 PC5) (8255_PC4)_ (8255 PC3) (8255 PC2) (8255 PC1) (8255 PC0)-JP92 1 2 3 5D6 7 8-JP47 1 2 35A6 7 8开始■-0- >按键标志8255初始化(PA, PB, PC 口作输出)0- >8255PC 口定时器0:方式一允许定时器0中断允许外部中断0 (行线0)允许外部中断1 (行线1)外部中断0、1边沿触发允许中断按键标志=11Y /2 •外中断服务程序流程图夕卜部中断0外部中断1■:开始.:■v8255PC 口改为输入关外部中断10->P3.3 (键的行线1)读8255PC 口转化为8..F的键值-> 变量01 !8255的PC 口改为输出1->P3.30->8255PC 口------- N—〈有键按下〉设置定时器0初值(50ms定时)开定时器0键值变量=变量01清外部中断1允许外部中断13. LED 显示程序流程图九、C51语言参考源程序#in elude "reg52.h" un sig ned char KeyResult; un sig ned char buffer[8]; bit bKey;xdata un sig ned char P_8255 _at_ 0xf003; xdata un sig ned char PA_8255 _at_ OxfOOO; xdata un sig ned char PB_8255 _at_ OxfOOl; xdata un sig ned char PC_8255 _at_ 0xf002; code un sig ned char SEG_TAB[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x0};sbit bLi ne0 = P3A 2; sbit bLi ne1 =卩3人3; II 延时1ms void Delay1ms() {un sig ned char i;■'返回II8255 的控制口II8255 的 PA 口II8255 的 PB 口 II8255 的 PC 口 II 段码II 存放键值//显示缓冲区 II 是否有键按下i = 0;while (--i);}// 显示void Display(){unsigned char i = 0x7f; unsignedchar 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;P_8255 = 0x89; bLine0 = 0; // 关外部中断0 //PC 口输入//P3.2 作行输出while (i){if ((PC_8255 & i) == 0)break;KeyResult0++;i >>= 1;}P_8255 = 0x80;PC_8255 = 0;//8255 的PA、PC 口全作输出口IE1 = 0; EX1 = 1; }bLine0 = 1; if (i){TH0 = 60; TL0 = 176; TR0 = 1;KeyResult = KeyResult0;}// 定时中断计数器初值 // 定时 50msIE0 = 0; EX0 =1; } // 清除中断 // 开外部中断 0void Int1Int() interrupt 2 { unsigned char i = 0x80; unsigned char KeyResult0 = 8; EX1 = 0; P_8255 = 0x89; bLine1 = 0; // 关外部中断 0 //PC 口输入 //P3.2 作行输出while (i) { if ((PC_8255 & i) == 0) break;KeyResult0++; i >>= 1;}P_8255 = 0x80;PC_8255 = 0; bLine1 = 1;〃8255 的PA PB PC 口全作输出口if (i){TH0 60;TL0 = 176;TR0 1;}KeyResult = KeyResult0;// 定时中断计数器初值 // 定时 50ms// 清除中断 // 开外部中断 0//50ms 中断服务程序void INT_Timer0(void) interrupt 1{if (((KeyResult < 8) && !bLine0) || ((KeyResult >= 8) && !bLine1)){bKey = 1;}TR0 = 0;}void main(){char i;for (i = 0; i < 8; i++) buffer[i] = 0x10; // TR0 = 1; // bRefurbish = 1;while (1){if (bKey){bKey = 0;RefurbishData(); } Display();}}十、实验实施步骤1 .仔细阅读实验内容及要求,编写 C51 源程序。
单片机课程设计--键盘输入在LED数码管上的显示

东北石油大学课程设计年月日东北石油大学课程设计任务书课程单片机的控制系统课程设计题目键盘输入在LED数码管上的显示专业姓名学号主要内容、基本要求、主要参考资料等主要内容:完成键盘输入在LED数码管上的显示。
基本要求:1.了解 4×4 键盘的工作原理。
2.熟悉 SPCE061A 单片机控制数码管显示的方法。
3.掌握 4×4 键盘的使用方法。
4.掌握 4×4 键盘控制数码管显示的方法。
参考资料:[1]肖洪兵.跟我学用单片机[J].北京:北京航空航天大学出版社,2002.8[2]何立民.单片机高级教程第1版[M].北京:北京航空航天大学出版社,2001.6[3]赵晓安.MCS-51单片机原理及应用[M].天津:天津大学出版社,2001.3[4]李广第.单片机基础第1版[M].北京:北京航空航天大学出版社,1999.5[5]徐惠民.单片微型计算机原理与应用[M].北京:北京邮电大学出版社,1996.2[6] 袁勤勇.嵌入式系统构件[M].北京:北京机械工业出版社,2002.完成期限指导教师专业负责人年月日目录第1章设计的研究背景及目的要求 (1)1.1 研究背景 (1)1.2 设计目的 (1)1.3 硬件选择 (1)1.4 设计内容 (1)第2章设计的基本原理及硬件连接方案 (2)2.1 4X4键盘扫描原理图 (2)2.2 SPCE061A获取4×4键盘键值原理 (2)2.3 硬件连接 (3)第3章软件设计方案 (5)3.1 设计步骤 (5)3.2 设计程序 (6)第4章调试结果与分析 (7)4.1 调试结果 (7)4.2 结果分析 (7)结论与体会 (8)参考文献 (9)附录 (10)第1章设计的研究背景及目的要求1.1 研究背景用单片机驱动LED数码管有很多方法,按显示方式可分静态显示和动态(扫描)显示;按译码方式可分硬件译码和软件译码。
静态显示数据稳定,占用很少的CPU时间。
接口课程设计实现特定功能的键盘及LED显示

题目三实现特定功能的键盘及LED显示1.了解键盘及LED显示接口设计,绘制出原理图。
2.根据实验箱上提供的硬件资源完成:a、按1键显示年b、按2键显示月日c、按3键显示GOODd、按4键数码管由左到右8字循环显示。
3.设计电路并在实验台上连接线路。
OUTBIT EQU 08002H ; 位控制口OUTSEG EQU 08004H ; 段控制口IN_KEY EQU 08001H ; 键盘读入口DATA SEGMENTLEDBUF DB 6 DUP(?) ; 显示缓冲NUM DB 1 DUP(?) ; 显示的数据DELAYT DB 1 DUP(?)LEDMAP: ; 八段管显示码DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H ;0,1,2,3,4,5,6,7 DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H ;8,9,A,b,C,d,E,F KEYTABLE: ; 键码定义DB 16H, 15H, 14H, 0FFHDB 13H, 12H, 11H, 10HDB 0DH, 0CH, 0BH, 0AHDB 0EH, 03H, 06H, 09HDB 0FH, 02H, 05H, 08HDB 00H, 01H, 04H, 07HDATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATADELAY PROC NEAR ; 延时子程序PUSH AXPUSH CXMOV AL, 0MOV CX,AXLOOP $POP CXPOP AXRETDELAY ENDPDISPLAYLED PROC NEARMOV BX, OFFSET LEDBUFMOV CL, 6 ; 共6个八段管MOV AH, 00100000B ;从左边开始显示DLOOP:MOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管 MOV AL, [BX]MOV DX, OUTSEGOUT DX,ALMOV DX, OUTBITMOV AL, AHOUT DX, AL ; 显示一位八段管 PUSH AXMOV AH, 1CALL DELAYPOP AXSHR AH, 1INC BXDEC CLJNZ DLOOPMOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管 RETDISPLAYLED ENDPDISPLAYLED1 PROC NEARMOV CL, 6 ; 共6个八段管;MOV AH, 00000001B ; 从左边开始显示MOV AH,00100000BDLOOP1:MOVDX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管MOV AL,7FHMOV DX, OUTSEGOUT DX,ALMOV DX, OUTBITMOV AL, AHOUT DX, AL ; 显示一位八段管PUSH AXMOV AH, 120CALL DELAYPOP AXSHR AH, 1DEC CLJNZ DLOOP1MOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管R ETDISPLAYLED1 ENDPTESTKEY PROC NEARMOV DX, OUTBITMOV AL, 0OUT DX, AL ; 输出线置为0 关所有八段管 MOV DX, IN_KEYIN AL, DX ; 读入键状态NOT ALAND AL, 0FH ; 高四位不用RETTESTKEY ENDPGETKEY PROC NEARMOV CH, 00100000BMOV CL, 6KLOOP:MOV DX, OUTBITMOV AL, CH ; 找出键所在列NOT ALOUT DX, ALSHR CH, 1MOV DX, IN_KEYIN AL, DXNOT ALAND AL, 0FHJNE GOON_ ; 该列有键入DEC CLJNZ KLOOPMOV CL, 0FFH ; 没有键按下, 返回 0FFH JMP EXIT1GOON_:DEC CLSHL CL, 2 ; 键值 = 列 X 4 + 行 MOV CH, 4LOOPC:TEST AL, 1JNZ EXIT1SHR AL, 1INC CLDEC CHJNZ LOOPCEXIT1:MOV DX, OUTBITMOV AL, 0OUT DX, ALMOV CH, 0MOV BX, OFFSET KEYTABLEADD BX, CXMOV AL, [BX] ; 取出键码MOV BL, ALWAITRELEASE:MOV DX, OUTBITMOV AL, 0OUT DX, AL ; 等键释放 MOV AH, 10CALL DELAYCALL TESTKEYJNE WAITRELEASEMOV AL, BLRETGETKEY ENDPSTART PROC NEARMOV AX, DATAMOV DS, AXB:MOV LEDBUF, 0 ;不显示MOV LEDBUF+1, 0MOV LEDBUF+2, 0MOV LEDBUF+3, 0MOV LEDBUF+4, 0MOV LEDBUF+5, 0MLOOP:CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE MLOOP ; 无键入, 继续显示T1:CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH, 0CMP AL,01HJZ P1CMP AL,02HJZ P2CMP AL,03HJZ P3CMP AL,04HJZ P4JMP BP1:MOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF,5BHMOV LEDBUF+1,3FHMOV LEDBUF+2,06HMOV LEDBUF+3,5BHMOV LEDBUF+4,0MOV LEDBUF+5,0JMP MLOOPP2:MOV BX,OFFSET LEDMAPADD BX,AXMOV AL,[BX]MOV LEDBUF,3FHMOV LEDBUF+1,7DHMOV LEDBUF+2,3FHMOV LEDBUF+3,66HMOV LEDBUF+4,0MOV LEDBUF+5,0JMP MLOOPP3:MOV BX,OFFSET LEDMAPADD BX,AXMOV AL,[BX]MOV LEDBUF,6FHMOV LEDBUF+1,5CHMOV LEDBUF+2,5CHMOV LEDBUF+3,5EHMOV LEDBUF+4,0MOV LEDBUF+5,0JMP MLOOPP4:CALL DISPLAYLED1CALL TESTKEY ; 有键入?JE P4 ; 无键入, 继续显示JMP T1START ENDPCODE ENDSEND START(注:本资料素材和资料部分来自网络,仅供参考。
接口课程设计_实现特定功能的键盘及LED显示

实现特定功能的键盘及LED显示了解键盘及LED显示接口原理,设计实验电路图完成以下功能:1. 按1键显示年;2. 按2键显示月日;3. 按3键显示GOOD ;4. 按4键数码管由左到右字符“0”循环显示。
5.自行设计特效显示功能。
CODE SEGMENTASSUME CS:CODE,DS:CODESTART: MOV AX,CSMOV DS,AXINPUT: CALL KEYBOARDLEA SI,KEYBUFFER;取按键的值MOV AL,[SI]CMP AL,1JNZ L0JMP SHOW_YEAR ;显示年L0:CMP AL,2JNZ L1JMP SHOW_MD ;显示月日L1:CMP AL,3JNZ L2JMP SHOW_GOOD ;显示GOODL2:CMP AL,4JNZ L3JMP SHOW_0 ;由左到右字符“0”循环显示L3:CMP AL,7JNZ L4JMP SHOW_SUN ;显示SUNL4:JMP SHOW_HERO;显示HERO;----------------------------------结束---------------------------------------------;--------------------------------显示年开始----------------------------------------SHOW_YEAR:MOV CH,01111111B ;初始化位选码01111111BMOV BH,11110111B ;显示位选结束位LEA SI,YEARBUFFERCALL DISPLAYDEC COUNT ;重复显示COUNT次JNZ SHOW_YEARMOV COUNT,250JMP INPUT;--------------------------------------结束-------------------------------------------;-----------------------------------显示月开始---------------------------------------SHOW_MD:MOV CH,01111111B ;初始化位选码01111111BMOV BH,11110111B ;显示位选结束位LEA SI,MDBUFFERCALL DISPLAYDEC COUNT ;重复显示COUNT次JNZ SHOW_MDMOV COUNT,250JMP INPUT;---------------------------------结束--------------------------------------------------;---------------------------------显示GOOD-----------------------------------------------SHOW_GOOD:MOV CH,01111111B ;初始化位选码01111111BMOV BH,11110111B ;显示位选结束位LEA SI,GOODBUFFERCALL DISPLAYDEC COUNT ;重复显示COUNT次JNZ SHOW_GOODMOV COUNT,250JMP INPUT;----------------------------------结束--------------------------------------------------;---------------------------------显示HERO-----------------------------------------------SHOW_HERO:DE: MOV CH,01111111B ;初始化位选码01111111B LEA SI, HEROBUFFERMOV BH,11110111B ;显示位选结束位CALL DISPLAYDEC COUNT ;重复显示COUNT次JNZ SHOW_HEROMOV COUNT,10DEC XUNMOV COUNT,10CALL SHOWDELAY_HCMP XUN,00H ;闪光显示JNZ DEMOV XUN ,15MOV COUNT ,250JMP INPUT;----------------------------------结束-------------------------------------------------;---------------------------显示由左到右字符“0”循环------------------------------------SHOW_0: MOV BX,3LSHOW0:MOV CH,01111111B ;初始化位选码01111111LEA DI,LINBUFFERMOV AL,80HMOV DX,203HOUT DX,AL ;再次初始化8255DISPLAY_0:MOV AL,CHMOV DX,202HOUT DX,AL;位选码送PC口MOV AL,[DI]MOV DX,200H;MOV AL,5BHOUT DX,AL ;显示段码CALL SHOWDELAY0ROR CH,1 ;指向下一个数码管CMP CH,11110111BJNZ DISPLAY_0DEC BX ;重复显示3次JNZ LSHOW0JMP INPUT;----------------------------------结束-------------------------------------------------;-----------------------------显示SUN-------------------------------------------SHOW_SUN:MOV CH,01111111B ;初始化位选码01111111BMOV BH,11101111B ;显示位选结束位LEA SI,SUNBUFFERCALL DISPLAYDEC COUNT ;重复显示COUNT次JNZ SHOW_SUNMOV COUNT,250JMP INPUT;-----------------------------------结束------------------------------------------------;----------------------------------显示延时----------------------------------------------- SHOWDELAY PROC NEARPUSH BXPUSH CXMOV BX,10SHOWDEL1:MOV CX,100SHOWDEL2:LOOP SHOWDEL2DEC BXJNZ SHOWDEL1POP CXPOP BXRETSHOWDELAY ENDP;-----------------------------------结束-----------------------------------------------;----------------------------------显示延时0--------------------------------------------SHOWDELAY0 PROC NEARPUSH BXPUSH CXMOV BX,100SHOW0DEL1:MOV CX,2000SHOW0DEL2:LOOP SHOW0DEL2DEC BXJNZ SHOW0DEL1POP CXPOP BXRETSHOWDELAY0 ENDP;-----------------------------------结束---------------------------------------------SHOWDELAY_H PROC NEARPUSH BXPUSH CXMOV BX,10SHOW_HDEL1:MOV CX,2000SHOW_HDEL2:LOOP SHOW_HDEL2DEC BXJNZ SHOW_HDEL1POP CXPOP BXRETSHOWDELAY_H ENDP;---------------------------------显示程序------------------------------------------DISPLAY PROC NEARMOV AL,80HMOV DX,203HOUT DX,AL ;再次初始化8255DISPLAY1:MOV AL,CHMOV DX,202HOUT DX,AL ;位选码送PC口MOV AL,[SI]MOV DX,200HOUT DX,AL ;显示段码CALL SHOWDELAY ;延时INC SIROR CH,1 ;指向下一个数码管CMP CH,BHJNZ DISPLAY1RETDISPLAY ENDP;-----------------------------------结束---------------------------------------------;---------------------------------读取按键盘------------------------------------------KEYBOARD PROC NEARLEA SI,KEYBUFFERMOV AL,10000001B ;初始化8255控制字MOV DX,203HOUT DX,ALKS1:CALL KS ;读取按键CMP AL,0FH ;判断有无按键JZ KS1CALL DELAYCALL KSCMP AL,0FHJZ KS1MOV BL,0EFH ;初始化列码MOV BH,0 ;初始化列计数器AGAIN:MOV DX,202HMOV AL,BLOUT DX,AL ;输出列码IN AL,DX ;读取行码AND AL,0FHCMP AL,0FHJZ NEXT ;该列无键闭合,准备下一列扫描CMP AL,0DH ;判断列是否是第一个键闭合?JNZ TWOMOV AL,1JMP FREETWO: ;判断列是否是第二个键闭合?CMP AL,0BHJNZ THREEMOV AL,4JMP FREETHREE: ;判断列是否是第三个键闭合?CMP AL,07HJNZ NEXTMOV AL,7FREE:PUSH AXWAIT1:CALL KSCMP AL,0FHJNZ WAIT1POP AXADD AL,BHMOV [SI],AL ;保存键值,并返回JMP RETURNNEXT:INC BHROL BL,1CMP BL,0FEHJNZ AGAINJMP KS1KS PROC NEARMOV DX,202HMOV AL,0FHOUT DX,ALIN AL,DXAND AL,0FHRETKS ENDPDELAY PROC NEARPUSH BXPUSH CXMOV BX,2000 DEL1:MOV CX,10DEL2:LOOP DEL2DEC BXJNZ DEL1POP CXPOP BXRETDELAY ENDPRETURN:RETKEYBOARD ENDPEXIT:MOV AH,4CHINT 21HXUN DB 15YEARBUFFER DB 5BH,3FH,3FH,6FH ;存放年2009 MDBUFFER DB 3FH,6FH,3FH,66H ;存放月日0904 GOODBUFFER DB 6FH,5CH,5CH,5EH ;GOODKEYBUFFER DB 1LINBUFFER DB 3FHHEROBUFFER DB 76H,79H,77H,3FH ;HEROSUNBUFFER DB 6DH,3EH,37H ;SUNCOUNT DB 250 ;显示次数----------------------------------结束-----------------------------------------CODE ENDSEND START。
实现特定功能的键盘及LED显示

实现特定功能的键盘及LED显⽰⽬录⼀、实验⽬的 (2)⼆、实验内容 (2)三、总体设计 (2)四、实验电路 (2)五、实验框图 (4)六、实验程序 (5)七、实验⼼得 (10)实现特定功能的键盘及LED显⽰⼀、实验⽬的1、掌握键盘和显⽰器的接⼝⽅法和编程⽅法。
2、掌握键盘扫描和LED⼋段码显⽰器的⼯作原理。
⼆、实验内容1、了解键盘及LED显⽰接⼝设计,绘制出原理图。
2、根据实验箱上提供的硬件资源完成:a、按1键显⽰年b、按2键显⽰⽉⽇c、按3键显⽰GOODd、按4键数码管由左到右8字循环显⽰。
3、设计电路并在实验台上连接线路。
三、总体设计1、选通键盘以及LED数字显⽰控制区2、主要利⽤软件编程,实现实验要求中的各项四、实验电路使⽤PC机与伟福lab8000实验箱连接起来,安装好相应驱动,做好接线分析,由于lab8000实验箱已经将部分电路接线内置,所以接线仅需要将KEY/LED_CS选通端⼝与CS0相连即可,但作为学习过程,应更加详细的将实现电路了解,现已将实验箱所⽤实验器件的内部电路给出,详细电路见下页图1图1:键盘及LED 显⽰电路五、实验框图主程序框图读键输⼊⼦程序框图显⽰程序框图六、实验程序OUTBIT equ 08002h ; 位控制⼝OUTSEG equ 08004h ; 段控制⼝IN_KEY equ 08001h ; 键盘读⼊⼝data segmentLEDBuf db 6 dup(?) ; 显⽰缓冲Num db 1 dup(?) ; 显⽰的数据DelayT db 1 dup(?)LEDMAP: ; ⼋段管显⽰码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h KeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hdata endscode segmentassume cs:code, ds:dataDelay proc nearpush ax ; 延时⼦程序push cxmov al, 0mov cx,axloop $pop cxpop axretDelay endpDelay1 proc nearpush ax ; 延时⼦程序push cxmov cx,38000loop $pop cxpop axretDelay1 endpDisplayLED proc nearmov bx, offset LEDBufmov cl, 6 ; 共6个⼋段管mov ah, 00100000b ; 从左边开始显⽰DLoop: mov dx, OUTBITmov al, 0out dx,al ; 关所有⼋段管mov al, [bx]mov dx, OUTSEGout dx,almov dx, OUTBITmov al, ahout dx, al ; 显⽰⼀位⼋段管push axmov ah, 1call Delaypop axshr ah, 1inc bxdec cljnz DLoopmov dx, OUTBITmov al, 0out dx,al ; 关所有⼋段管retDisplayLED endpTestKey proc nearmov dx, OUTBITout dx, al ; 输出线置为0mov dx, IN_KEYin al, dx ; 读⼊键状态not aland al, 0fh ; ⾼四位不⽤retTestKey endpGetKey proc nearmov ch, 00100000bmov cl, 6KLoop:mov dx, OUTBITmov al, ch ; 找出键所在列not alout dx, alshr ch, 1mov dx, IN_KEYin al, dxnot aland al, 0fhjne Goon_ ; 该列有键⼊dec cljnz KLoopmov cl, 0ffh ; 没有键按下, 返回0ffh jmp Exit1Goon_:dec clshl cl, 2 ; 键值= 列X 4 + ⾏mov ch, 4LoopC:test al, 1jnz Exit1shr al, 1inc cljnz LoopCExit1:mov dx, OUTBITmov al, 0out dx, almov ch, 0mov bx, offset KeyTable add bx, cxmov al, [bx] ; 取出键码mov bl, al WaitRelease:mov dx, OUTBITmov al, 0out dx, al ; 等键释放mov ah, 10call Delaycall TestKeyjne WaitReleasemov al, blretGetKey endpStart proc nearmov ax, datamov ds, axmov di,offset LEDBufp1: mov di,offset LEDBuf mov [di], 05bh ; 显⽰2008. mov [di+1], 03fhmov [di+2], 03fhmov [di+3], 0ffhmov [di+4], 0mov [di+5], 06hjmp MLoopp2: mov di,offset LEDBufmov [di], 03fh ; 显⽰08.08. mov [di+1], 0ffhmov [di+2], 03fhmov [di+3], 0ffhmov [di+4], 0mov [di+5], 5bhjmp MLoopp3: mov di,offset LEDBuf mov [di],6fh ;显⽰good mov [di+1],5chmov [di+2],5chmov [di+3],0dehmov [di+4],0mov [di+5],4fhjmp MLoopp4: push cxmov cx,08hmov bx,offset LEDBufp4l: mov [bx],00inc bxloop p4lpop cxmov [di], 7fh ; 显⽰8inc dicmp di,offset LEDBuf + 06h jnz nextmov di,offset LEDBuf next: call delay1call DisplayLED ; 显⽰call TestKeyjne MLoopjmp p4MLoop:call DisplayLED ; 显⽰call TestKey ; 有键⼊?je MLoop ; ⽆键⼊, 继续显⽰call GetKey ; 读⼊键码and al, 0fh ; 显⽰键码cmp al,01hjz mmpp1cmp al,02hjz mmpp2cmp al,03hjz p3cmp al,04hjz p4mov ah, 0mov bx, offset LEDMAP add bx, axmov al, [bx]mov LEDBuf+5, aljmp MLoopmmpp1: jmp p1mmpp2: jmp p2Start endpcode endsend start。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理与接口技术课程设计题目:实现特定功能的键盘及LED显示目录一、实验目的……………………………………二、实验内容……………………………………三、总体设计……………………………………四、实验电路……………………………………五、实验框图……………………………………六、实验程序……………………………………七、实验心得……………………………………1、课程设计目的课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。
它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。
2、实验设计内容:本次实验的主要内容是在了解键盘及LED显示接口原理的基础上,设计出相应的实验电路,以实现特定功能的键盘及LED显示。
需要完成以下功能:1. 按1键显示年;2. 按2键显示月日;3. 按3键显示GOOD ;4. 按4键数码管由左到右字符“0”循环显示。
5.自行设计特效显示功能。
实验主要涉及可编程的键盘、显示接口芯片8279和可编程中断控制器8259A。
功能1至4是在可编程的键盘、显示接口芯片8279的基础上通过程序实现的。
在功能5中,加入了中断,通过边沿触发产生中断,执行中断服务子程序,以此来时现功能5的特效(在数码管上从左、从右依次显示0—9的数字)。
3、试验设计原理及方案:(含电路原理图、硬件连接示意图、系统功能框图、程序流程图等)3.1 电路原理图3.2 系统功能框图3.3 程序流程图3.4 各功能实现方案3.4.1 功能一按1键显示年当可编程的键盘、显示接口芯片8279扫描寄存器AL=02H时,说明按键为1号键。
关于显示年份,首先定义一个显示缓冲区,用于存储表示年份的数字。
然后依次读取其值,经过换码,再通过8279以左端入口方式显示与数码管上。
程序段如下:MOV DX,D8279 ;键值输入IN AL,DXCMP AL,02HJZ YEARYEAR: MOV CX,04HAA: MOV DX,D8279 ;其余四位,显示0 MOV AL,3FHOUT DX,ALLOOP AAMOV BX,OFFSET TABMOV SI,OFFSET DISPBUFF1+3 ;设置要显示的初始位MOV CX,4DISP1: MOV AL,[SI]XLAT ;通过换码,再显示MOV DX,D8279OUT DX,ALDEC SILOOP DISP1 ;依次读取数值9,0,0,2。
TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH DISPBUFF1 DB 2,0,0,9 ;定义显示缓冲区3.4.2 功能二按2键显示月日方法同功能一,当8279扫描寄存器AL=0AH时,说明按键为2号键。
显示月日方法和显示年份一样,首先定义一个显示缓冲区,用于存储表示月日的数字。
然后依次读取其值,经过换码,再通过8279以左端入口方式显示与数码管上。
程序段如下:CMP AL,0AH ;键值输入JZ MONTHMONTH: M OV CX,04HBB: MOV DX,D8279 ;其余四位,显示0MOV AL,3FHOUT DX,ALLOOP BBMOV BX,OFFSET TABMOV SI,OFFSET DISPBUFF2+3 ;设置要显示的初始位MOV CX,4DISP2: MOV AL,[SI]XLAT ;通过换码,再显示MOV DX,D8279OUT DX,ALDEC SI ;依次读取数值1,3,8,0LOOP DISP2。
TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDISPBUFF2 DB 0,8,3,1 ;定义显示缓冲区3.4.3 功能三按3键显示GOOD将G,O,O,D分别以七段代码6FH,3FH,3FH,5EH代替,由于8279为左端入口方式,所以应依次将5EH,3FH,3FH,6FH送与8279数据端,以显示GOOD字样。
然后清空LED数码管的显示,再将以上代码送与8279,并通过延时,让GOOD字样以闪烁方式显示与数码管。
程序如下:GOOD: MOV BL,0AH ;闪烁次数10次GOD: MOV CX,08H ;清空LED数码管的显示CLEAR:MOV DX,D8279MOV AL,00HOUT DX,ALLOOP CLEARCALL DELAY ;延时MOV CX,04HCC: MOV DX,D8279 其余位显示0MOV AL,3FHOUT DX,ALLOOP CCMOV DX,D8279 ;显示DMOV AL,5EHOUT DX,ALMOV DX,D8279 ;显示OMOV AL,3FHOUT DX,ALMOV DX,D8279 ;显示OMOV AL,3FHOUT DX,ALMOV DX,D8279 ;显示GMOV AL,6FHOUT DX,ALCALL DELAYDEC BLCMP BL,00H ;若已闪烁10次,则不再闪烁JNZ GOD3.4.4 功能四按4键数码管由左到右字符“0”循环显示当8279扫描寄存器AL=01H时,说明按键为4号键。
ZERO PROC NEARMOV DX,C8279 ;修改8279配置(右边输入,八位显示,外部译码)MOV AL,010HOUT DX,ALMOV CX,08H ;清空LED数码管的显示CLEAR1:MOV DX,D8279MOV AL,00HOUT DX,ALLOOP CLEAR1MOV CX,08H ;大循环计数MOV BL,01HC_DZERO:PUSH CXMOV BH,01HMOV CX,08H ;小循环计数DZERO:MOV AL,00HCMP BL,BH ;相等则显示0,否则不显示JNE NOAL_ZEROMOV AL,3FHNOAL_ZERO:MOV DX,D8279OUT DX,ALCALL DELAY ;延时ROL BH,1LOOP DZEROPOP CXROL BL,1LOOP C_DZEROMOV DX,C8279 ;改回8279配置(左边输入,八位显示,外部译码)MOV AL,0HOUT DX,ALRETZERO ENDP3.4.5 功能五自行设计特效显示功能此功能的实现引入了中断技术,通过边沿触发中断,执行中断服务子程序,进而达到效果。
(1)中断向量表的设置计8259的设置:CLI ;设置中断向量MOV AX,0 ;设置中断向量IR0用于键盘中断MOV ES,AXLEA AX,DATE ;设置中断类型号08HMOV ES:[4*08],AXMOV AX,CSMOV ES:[4*08+2],AXMOV DX,INT00 ;8259配置MOV AL,13H ;设置ICW1,边沿触发,单片8259A,需ICW4OUT DX,ALNOPMOV DX,INT01MOV AL,08H ;设置ICW2,中断类型号的高5位为00001OUT DX,ALMOV AL,01H ;设置ICW4,非AEOI方式,完全嵌套方式OUT DX,ALMOV DX,INT01IN AL,DXAND AL,0H ;设置OCW1,开放IR0OUT DX,ALSTI(2)中断服务子程序:DATE PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV CX,08HCLEAR2: MOV DX,D8279 ;清空LED数码管的显示MOV AL,00HOUT DX,ALLOOP CLEAR2MOV AH,00HDIS: MOV CX,08HDISP3: MOV AL,AHlea bx,TAB ;依次显示断码表中数字xlatmov dx,D8279out dx,alCALL DELAYLOOP DISP3INC AHTEST AH,01H ;根据AH的奇偶性选择输入方式JZ X1MOV AL,010HMOV DX,C8279 ;修改8279配置(右边输入,八位显示,外部译码)OUT DX,ALCMP AH,09HJBE DISX1: MOV AL,00HMOV DX,C8279 ;修改8279配置(右边输入,八位显示,外部译码)OUT DX,ALCMP AH,09HJBE DISMOV DX,INT00 ;中断结束命令MOV AL,20HOUT DX,ALPOP DXPOP CXPOP BXPOP AXIRETDATE endp4、汇编程序源代码C8279 EQU 222HD8279 EQU 220HINT00 EQU 200H ;8259地址INT01 EQU 201HMODE EQU 00H ;左边输入,八位显示,外部译码FEQ EQU 38H ;扫描频率CODE SEGMENTASSUME CS:CODE,DS:CODESTART:PUSH CSPOP DSMOV DX,C8279 ;初始化8279MOV AL,MODEOUT DX,ALMOV AL,FEQOUT DX,ALCLI ;设置中断向量MOV AX,0 ;设置中断向量IR0用于键盘中断MOV ES,AXLEA AX,DATE ;设置中断类型号08HMOV ES:[4*08],AXMOV AX,CSMOV ES:[4*08+2],AXMOV DX,INT00 ;8259配置MOV AL,13H ;设置ICW1,边沿触发,单片8259A,需ICW4 OUT DX,ALNOPMOV DX,INT01MOV AL,08H ;设置ICW2,中断类型号的高5位为00001OUT DX,ALMOV AL,01H ;设置ICW4,非AEOI方式,完全嵌套方式OUT DX,ALMOV DX,INT01IN AL,DXAND AL,0H ;设置OCW1,开放IR0OUT DX,ALSTI;清FIFO RAMBEGIN: MOV DX,C8279MOV AL,0C2HOUT DX,ALWAIT1: IN AL,DXMOV BL,ALAND AL,80HCMP AL,80HJE WAIT1MOV AL,BLAND AL,0FHCMP AL,00HJE WAIT1MOV AL,40H ;读FIFO/传感器RAM命令OUT DX,ALMOV DX,D8279 ;键值输入IN AL,DXCMP AL,02HJZ YEARCMP AL,0ahJZ MONTHCMP AL,22hJZ GOODCMP AL,01hJZCALL ZEROJMP BEGIN;=================================YEAR: MOV CX,04HAA: MOV DX,D8279 ;其余四位,显示0OUT DX,ALLOOP AAMOV BX,OFFSET TABMOV SI,OFFSET DISPBUFF1+3 ;设置要显示的初始位MOV CX,4DISP1: MOV AL,[SI]XLAT ;通过换码,再显示MOV DX,D8279OUT DX,ALDEC SILOOP DISP1 ;依次读取数值9,0,0,2JMP BEGIN;=================================MONTH: M OV CX,04HBB: MOV DX,D8279 ;其余四位,显示0MOV AL,3FHOUT DX,ALLOOP BBMOV BX,OFFSET TABMOV SI,OFFSET DISPBUFF2+3 ;设置要显示的初始位MOV CX,4DISP2: MOV AL,[SI]XLAT ;通过换码,再显示MOV DX,D8279OUT DX,ALDEC SI ;依次读取数值1,3,8,0LOOP DISP2JMP BEGINGOOD: MOV BL,0AH ;闪烁次数10次GOD: MOV CX,08H ;清空LED数码管的显示CLEAR:MOV DX,D8279OUT DX,ALLOOP CLEARCALL DELAY ;延时MOV CX,04HCC: MOV DX,D8279 其余位显示0MOV AL,3FHOUT DX,ALLOOP CCMOV DX,D8279 ;显示DMOV AL,5EHOUT DX,ALMOV DX,D8279 ;显示OMOV AL,3FHOUT DX,ALMOV DX,D8279 ;显示OMOV AL,3FHOUT DX,ALMOV DX,D8279 ;显示GMOV AL,6FHOUT DX,ALCALL DELAYDEC BLCMP BL,00H ;若已闪烁10次,则不再闪烁JNZ GODJMP BEGINZERO PROC NEARMOV DX,C8279 ;修改8279配置(右边输入,八位显示,外部译码)MOV AL,010HOUT DX,ALMOV CX,08H ;清空LED数码管的显示CLEAR1:MOV DX,D8279MOV AL,00HOUT DX,ALLOOP CLEAR1MOV CX,08H ;大循环计数MOV BL,01HC_DZERO:PUSH CXMOV BH,01HMOV CX,08H ;小循环计数DZERO:MOV AL,00HCMP BL,BH ;相等则显示0,否则不显示JNE NOAL_ZEROMOV AL,3FHNOAL_ZERO:MOV DX,D8279OUT DX,ALCALL DELAY ;延时ROL BH,1LOOP DZEROPOP CXROL BL,1LOOP C_DZEROMOV DX,C8279 ;改回8279配置(左边输入,八位显示,外部译码)MOV AL,0HOUT DX,ALRETZERO ENDPJMP BEGIN ;重复执行DATE PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV CX,08H;清空LED数码管的显示CLEAR2: MOV DX,D8279MOV AL,00HOUT DX,ALLOOP CLEAR2MOV AH,00HDIS: MOV CX,08HDISP3: MOV AL,AHlea bx,TABxlatmov dx,D8279out dx,alCALL DELAYLOOP DISP3INC AHTEST AH,01HJZ X1MOV AL,010HMOV DX,C8279 ;修改8279配置(右边输入,八位显示,外部译码)OUT DX,ALCMP AH,09HJBE DISX1: MOV AL,00HMOV DX,C8279 ;修改8279配置(右边输入,八位显示,外部译码)OUT DX,ALCMP AH,09HJBE DISMOV DX,INT00MOV AL,20H ;OUT DX,ALPOP DXPOP CXPOP BXPOP AXIRETDATE endpdelay proc nearpush cxmov cx,0ffffhloop $pop cxretdelay endpTAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDISPBUFF1 DB 2,0,0,9DISPBUFF2 DB 0,8,3,1CODE ENDSEND START5、实验效果(见截图)6、实验心得与体会本次课程设计,我看到了自己许多不足之处。