接口课程设计实现特定功能的键盘及LED显
- 格式:doc
- 大小:1.28 MB
- 文档页数:16
独立按键控制led课程设计一、课程目标知识目标:1. 学生能理解独立按键的工作原理,掌握其电路连接方式。
2. 学生能掌握LED的基本特性,了解其在电路中的应用。
3. 学生能理解独立按键控制LED的原理,掌握相关编程方法。
技能目标:1. 学生能独立完成独立按键与LED的电路连接,并进行功能测试。
2. 学生能编写简单的程序,实现独立按键控制LED的亮灭、闪烁等功能。
3. 学生能运用所学知识解决实际问题,具备一定的创新意识和动手能力。
情感态度价值观目标:1. 学生通过课程学习,培养对电子技术的兴趣,提高学习积极性。
2. 学生在团队合作中,学会沟通、协作,培养团队精神。
3. 学生在实践过程中,树立正确的价值观,认识到科技对生活的影响。
课程性质:本课程为实践性课程,结合理论教学,注重培养学生的动手能力、创新意识和实际应用能力。
学生特点:学生处于初中阶段,具有一定的物理知识和动手能力,对电子技术有一定的好奇心和兴趣。
教学要求:教师应注重理论与实践相结合,引导学生主动参与实践,鼓励学生创新思维,提高解决问题的能力。
同时,关注学生的情感态度价值观培养,使学生在掌握知识技能的同时,形成良好的综合素质。
通过分解课程目标为具体的学习成果,为后续教学设计和评估提供依据。
二、教学内容1. 理论知识:- 介绍独立按键的原理、功能及其在电路中的应用。
- 讲解LED的基本结构、特性以及在电路中的作用。
- 分析独立按键控制LED的电路原理及编程方法。
2. 实践操作:- 指导学生进行独立按键与LED的电路连接,确保正确无误。
- 帮助学生编写程序,实现独立按键控制LED的亮灭、闪烁等功能。
- 引导学生进行功能测试,分析并解决可能出现的故障。
3. 教学大纲:- 第一课时:介绍独立按键和LED的基本概念、原理及应用。
- 第二课时:讲解独立按键控制LED的电路原理及编程方法。
- 第三课时:指导学生进行电路连接和程序编写,实现功能。
- 第四课时:进行功能测试,总结问题,提高实践能力。
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显示了解键盘及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显示_课程设计微机原理与接口技术课程设计题目:实现特定功能的键盘及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以左端入口方式显示与数码管上。
河北科技大学《接口技术》课程设计报告学生姓名:学号:专业班级:课程名称:学年学期:2 0 —2 0 学年第学期指导教师:2 0 年月课程设计成绩评定表目录一、设计题目:--------------------------------------------------------------------------------------------- 1二、设计目的:--------------------------------------------------------------------------------------------- 1三、设计原理及方案: ----------------------------------------------------------------------------------- 11、实验电路图---------------------------------------------------------------------------------------- 12、实验框图 ------------------------------------------------------------------------------------------- 23、各功能实现方案---------------------------------------------------------------------------------- 34、实验程序 ------------------------------------------------------------------------------------------- 3四、实验方法------------------------------------------------------------------------------------------------ 81、实验电路测试------------------------------------------------------------------------------------- 82、软件测试 ------------------------------------------------------------------------------------------- 8五、实验结果------------------------------------------------------------------------------------------------ 8六、改进意见及建议 -------------------------------------------------------------------------------------- 8七、设计体会------------------------------------------------------------------------------------------------ 8一、设计题目:实现特定功能的键盘及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显示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显示课程设计一、课程目标知识目标:1. 学生能理解LED的基本概念、工作原理和显示技术。
2. 学生能掌握LED显示电路的组成、功能及编程方法。
3. 学生了解LED显示技术在生活中的应用。
技能目标:1. 学生能运用所学知识,设计简单的LED显示电路。
2. 学生能编写程序,控制LED显示特定的文字或图案。
3. 学生具备分析和解决LED显示过程中出现问题的能力。
情感态度价值观目标:1. 学生培养对电子技术的兴趣,激发创新意识和探索精神。
2. 学生认识到LED显示技术在现实生活中的重要性,增强环保意识。
3. 学生在团队协作中,培养沟通、交流和合作能力。
课程性质:本课程为电子技术实践课程,结合理论知识与动手操作,提高学生的实践能力。
学生特点:六年级学生具备一定的电子技术基础,好奇心强,喜欢动手操作。
教学要求:教师需引导学生主动参与,注重理论与实践相结合,关注学生的个体差异,提高学生的综合素养。
通过分解课程目标为具体学习成果,使学生在学习过程中能够明确自己的任务和目标,为后续教学设计和评估提供依据。
二、教学内容1. LED基本知识:介绍LED的定义、分类、工作原理及参数。
- 教材章节:第一章第二节- 内容:LED的发光原理、亮度、颜色等。
2. LED显示技术:讲解LED显示模块的组成、功能及显示方式。
- 教材章节:第二章- 内容:点阵LED、数码管、LCD等显示技术。
3. LED显示电路设计:学习LED显示电路的搭建、编程及调试。
- 教材章节:第三章- 内容:电路元件、编程语言、调试方法。
4. LED显示应用案例:分析生活中常见的LED显示应用实例。
- 教材章节:第四章- 内容:广告牌、显示屏、指示灯等。
5. 实践操作:开展LED显示电路设计及编程实践活动。
- 教材章节:第五章- 内容:设计简单的LED显示电路,编写程序实现特定功能。
教学进度安排:1. 第1课时:LED基本知识学习。
2. 第2课时: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显示接口原理,设计实验电路图完成以下功能:
1. 按1键显示年;
2. 按2键显示月日;
3. 按3键显示GOOD ;
4. 按4键数码管由左到右字符“0”循环显示。
5.自行设计特效显示功能。
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START: MOV AX,CS
MOV DS,AX
INPUT: CALL KEYBOARD
LEA SI,KEYBUFFER;取按键的值
MOV AL,[SI]
CMP AL,1
JNZ L0
JMP SHOW_YEAR ;显示年
L0:
CMP AL,2
JNZ L1
JMP SHOW_MD ;显示月日
L1:
CMP AL,3
JNZ L2
JMP SHOW_GOOD ;显示GOOD
L2:
CMP AL,4
JNZ L3
JMP SHOW_0 ;由左到右字符“0”循环显示
L3:
CMP AL,7
JNZ L4
JMP SHOW_SUN ;显示SUN
L4:
JMP SHOW_HERO;显示HERO
;----------------------------------结束---------------------------------------------
;--------------------------------显示年开始----------------------------------------
SHOW_YEAR:
MOV CH,01111111B ;初始化位选码01111111B
MOV BH,11110111B ;显示位选结束位
LEA SI,YEARBUFFER
CALL DISPLAY
DEC COUNT ;重复显示COUNT次
JNZ SHOW_YEAR
MOV COUNT,250
JMP INPUT
;--------------------------------------结束-------------------------------------------
;-----------------------------------显示月开始---------------------------------------
SHOW_MD:
MOV CH,01111111B ;初始化位选码01111111B
MOV BH,11110111B ;显示位选结束位
LEA SI,MDBUFFER
CALL DISPLAY
DEC COUNT ;重复显示COUNT次
JNZ SHOW_MD
MOV COUNT,250
JMP INPUT
;---------------------------------结束--------------------------------------------------
;---------------------------------显示GOOD-----------------------------------------------
SHOW_GOOD:MOV CH,01111111B ;初始化位选码01111111B
MOV BH,11110111B ;显示位选结束位
LEA SI,GOODBUFFER
CALL DISPLAY
DEC COUNT ;重复显示COUNT次
JNZ SHOW_GOOD
MOV COUNT,250
JMP INPUT
;----------------------------------结束--------------------------------------------------
;---------------------------------显示HERO-----------------------------------------------
SHOW_HERO:
DE: MOV CH,01111111B ;初始化位选码01111111B LEA SI, HEROBUFFER
MOV BH,11110111B ;显示位选结束位
CALL DISPLAY
DEC COUNT ;重复显示COUNT次
JNZ SHOW_HERO
MOV COUNT,10
DEC XUN
MOV COUNT,10
CALL SHOWDELAY_H
CMP XUN,00H ;闪光显示
JNZ DE
MOV XUN ,15
MOV COUNT ,250
JMP INPUT
;----------------------------------结束-------------------------------------------------
;---------------------------显示由左到右字符“0”循环------------------------------------
SHOW_0: MOV BX,3
LSHOW0:
MOV CH,01111111B ;初始化位选码01111111
LEA DI,LINBUFFER
MOV AL,80H
MOV DX,203H
OUT DX,AL ;再次初始化8255
DISPLAY_0:MOV AL,CH
MOV DX,202H
OUT DX,AL
;位选码送PC口
MOV AL,[DI]
MOV DX,200H
;MOV AL,5BH
OUT DX,AL ;显示段码
CALL SHOWDELAY0
ROR CH,1 ;指向下一个数码管
CMP CH,11110111B
JNZ DISPLAY_0
DEC BX ;重复显示3次
JNZ LSHOW0
JMP INPUT
;----------------------------------结束-------------------------------------------------
;-----------------------------显示SUN-------------------------------------------
SHOW_SUN:
MOV CH,01111111B ;初始化位选码01111111B
MOV BH,11101111B ;显示位选结束位
LEA SI,SUNBUFFER
CALL DISPLAY
DEC COUNT ;重复显示COUNT次
JNZ SHOW_SUN
MOV COUNT,250
JMP INPUT
;-----------------------------------结束------------------------------------------------
;----------------------------------显示延时-----------------------------------------------SHOWDELAY PROC NEAR
PUSH BX
PUSH CX
MOV BX,10
SHOWDEL1:
MOV CX,100
SHOWDEL2:
LOOP SHOWDEL2
DEC BX
JNZ SHOWDEL1
POP CX
POP BX
RET
SHOWDELAY ENDP
;-----------------------------------结束-----------------------------------------------
;----------------------------------显示延时0--------------------------------------------
SHOWDELAY0 PROC NEAR
PUSH BX
PUSH CX
MOV BX,100
SHOW0DEL1:
MOV CX,2000
SHOW0DEL2:
LOOP SHOW0DEL2
DEC BX
JNZ SHOW0DEL1
POP CX
POP BX。