数字显示与键盘输入例程设计
微机原理实验六从键盘输入数据并显示
实验六从键盘输入数据并显示1要求:编写程序,将键盘接收到的四位十六进制数转换为等值的二进制数,并显示在屏幕上。
若输入的不是0—F间的数字,则显示出错信息,并要求重新输入。
2目的:掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII码的原理。
实验程序CRLF MACROMOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HENDMDATA SEGMENTMARK DB?MESS DB'please input the number(H),press inter,ture into number(B).press space end.',0DH,0AH,'$'ERROR DB 0DH,0AH, 'input error',0DH,0AH,'$'DATA ENDSSTACK SEGMENTSTA DW32 DUP(?)TOP DW?STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV SP,TOPHEAD: CRLFMOV MARK,0MOV AH,09HLEA DX,MESSINT 21H ;显示提示输入的信息CALL GETNUM ;接收键入数值送DXCMP MARK,01HJE HEADMOV CX,0010H ;16位MOV BX,DXTTT: ROL BX,1 ;循环左移1位MOV DL,BLAND DL,01H ;屏蔽掉高7位ADD DL,30HMOV AH,02HINT 21H ;显示二进制位对应的ASCII字符LOOP TTTJMP HEADFINI: MOV AX,4C00HINT 21H ;返回DOSGETNUM PROC NEAR ;子程序,接收键入数值送DX PUSH CXXOR DX,DXGGG: MOV AH,01HINT 21HCMP AL,0DH ;输入为回车,则进行转换JE PPPCMP AL,20H ;输入为空格,则退回DOSJE FINICMP AL,30HJB KKKSUB AL,30HCMP AL,0AHJB GETSCMP AL,11HJB KKKSUB AL,07HCMP AL,0FHJBE GETSCMP AL,2AHJB KKKCMP AL,2FHJA KKKSUB AL,20HGETS: MOV CL,04SHL DX,CLXOR AH,AHADD DX,AXJMP GGGKKK: MOV AH,09HMOV DX,OFFSET ERRORINT 21HMOV MARK,01HPPP: PUSH DXCRLFPOP DXPOP CXRETGETNUM ENDPCODE ENDSEND START。
键盘录入数据的转换与显示程序设计说明书
OUT_ASC_SUMDB 6 DUP(?),'$';将二个数的和转换为ASCII码后,放于此 处,以供9号调 用显示
DATAENDS
MOV AX,DATA
MOV DS,AX;设置DS
MOV DX,OFFSET INPUT1;取第一个输入数的首地址
MOV AH,09H
INT 21H;提示输入一个数
MOV DX,OFFSET IN_ASC_BUF
MOV AH,0AH
INT 21H;读取第一个数
MOV CX,3;设置次数
在程序得到正确的结果之前,会产生一些错误,只有经过调试阶段才能纠正程序中的错误,从而的到正确的结果。在程序编译过程中会提示语法错误,可再用编辑程序来修改源程序中的错误。当没有语法错误而得不到正确结果时,可用调试程序DEBUG来调试。它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
LOOP LP循环LP,读取出第一个数
模块二:输入第二个数
MOV B_BUF1,AX
MOV DX,OFFSET INPUT2;取第二个输入数的首地址
MOV AH,09H
INT 21H;提示输入二个数
MOV DX,OFFSET IN_ASC_BUF
MOV AH,0AH
INT 21H;读取第二个数
MOV CX,3;设置次数
ADD AX , BIN_BUF1;计算这二个数之和
CALL BIN_TO_ASCII;将和转换为ASCII码,以供显示用
课程设计键盘输入及数据显示程序设计
课程设计键盘输入及数据显示程序设
计
中北大学
汇编语言程序设计
课程设计说明书
学生姓名:学号:
学院:信息与通信工程学院
专业:自动化
题目:键盘输入及数据显示程序设计指导教师:沈小林职称:副教授
6月24日
中北大学
汇编语言程序设计实验
课程设计任务书
11/12 年第二学期
学院:信息与通信工程学院
专业:自动化
学生姓名:学号:
课程设计题目:数据显示及键盘输入程序设计
起迄日期: 6月18 日~6月24日
课程设计地点:中北大学
指导教师:沈小林
系主任:王忠庆
下达任务书日期: 06月20日
课程设计任务书
课程设计任务书
一、设计目的
1、经过程序设计和调试,加深对字符串程序设计的认识,。
键盘录入数据的转换与显示程序课程设计报告
3.要求程序运行后显示器显示:“please input the first number from -9999 to 9999!”的提示。
4.在输入数据之后,屏幕显示输入的值。
5.接着显示器显示“please input the second number from -9999 to 9999!”的提示。
MOV SI,OFFSET IN_ASC_BUF1+2;将第二个数的第一个字符放于源
数据区指针中
LP:MOV AX,[DI]地址内容送入AX
MOV [SI],AX
INC SI
INC SI
INC DI
INC DI
LOOP LP循环LP,读取出第一个数
模块二:输入第二个数
MOV B_BUF1,AX
MOV DX,OFFSET INPUT2;取第二个输入数的首地址
IN_ASC_BUFDB 6;十进制数的输入缓冲区,共可接收6个字符
DB ?;保留,用于10号调用时DOS填入实际输入字符个数
DB 6 DUP(?),'$';一个符号位,四位数字ASCII码,加上一个回车符,共计6字符
IN_ASC_BUF1DB 6
DB ?
DB 12 DUP(?),'$'
B_BUF1 DW ?;将第一个数转换为二进制后,放于此处
MOV AX,DATA
MOV DS,AX;设置DS
MOV DX,OFFSET INPUT1;取第一个输入数的首地址
MOV AH,09H
INT 21H;提示输入一个数
MOV DX,OFFSET IN_ASC_BUF
MOV AH,0AH
INT 21H;读取第一个数
数字显示与键盘输入设计武汉理工
数字显示与键盘输入设计武汉理工课 程 设 计题 目数字显示与键盘输入设计 学 院计算机科学与技术学院 专 业 计算机科学与技术班 级姓 名指导教师 袁小玲2013 年 7 月 4 日学号: 012111034目录课程设计任务书 (2)数字显示与键盘输入设计 (3)1.系统描述: (3)1.1实验目的: (3)1.2实验设备: (3)1.3实验要求: (3)2.实验过程: (3)2.1实验原理: (3)2.2实验步骤: (8)2.2.2软件设计: (9)2.2.3设计成功标志: (10)2.3程序设计: (10)2.4 程序代码: (11)3.调试过程: (15)3.1 程序编译调试 (15)4.课程设计总结 (17)本科生课程设计成绩评定表 (18)课程设计任务书学生姓名:专业班级:计算机zy1101班指导教师:袁小玲工作单位:计算机科学与技术学院题目: 数字显示与键盘输入例程设计初始条件:1.课程设计使用ZG211硬件综合实验平台(8051单片机),配有课程设计接口芯片和辅助芯片以及器件;2.Z G211有程序设计集成开发环境,程序设计语言为C语言;3.Z G211硬件综合实验平台使用说明书;要求完成的主要任务:(包括课程设计工作量及其技术要求,撰写说明书具体要求)1.学习使用ZG211硬件综合实验平台,程序设计集成开发环境;2.根据课程设计题目,进行需求分析,搞清楚课程设计需要设计需求和需要解决的设计内容。
3.查阅和学习课程设计题目需要的接口芯片资料,掌握接口芯片的使用方法和编程要领。
查阅和学习课程设计题目需要的辅助芯片以及器件资料。
4.设计接口芯片和辅助芯片以及器件与8051单片机连接硬件电路原理图。
5.设计与硬件电路原理图对应的C语言程序(或8051汇编语言)。
给出程序流程图。
在集成开发环境中调试程序。
给出程序的详细注释。
能够解释使用程序模拟电路时序信号和数据。
6.撰写课程设计报告,1)详细陈述以上的设计过程;2)详细陈述电路的调试过程。
数字显示与键盘输入例程设计
学号:课程设计题目数字显示与键盘输入例程设计学院计算机科学与技术专业计算机科学与技术班级计算机班姓名指导教师201 年月日目录课程设计任务书 (2)1.课程设计目的与要求 (3)1.1目的描述 (3)1.2要求描述 (3)2.设计分析 (3)2.1需求分析 (3)2.2背景知识 (4)2.2.1微控制器AT89S52 (4)2.2.2 CH451芯片 (8)3.设计原理 (15)3.1硬件平台 (15)3.2设计原理 (16)3.3硬件连接 (18)3.4软件设计 (18)4.详细设计 (19)4.1平台初始化 (19)4.1.1MCU初始化 (19)4.1.2 CH451芯片初始化 (19)4.2模块说明 (20)4.2.1主要函数模块及功能 (20)4.2.2模块框图 (21)4.2.3 程序流程图 (21)5. 开发平台及源程序 (22)5.1开发平台 (22)5.2源程序的主要部分 (23)6. 程序测试 (29)6.1测试用例 (29)6.2程运行结果及分析 (30)7. 自我评价与总结 (32)7.1自我评价 (32)7.2经验与收获 (33)本科生课程设计成绩评定表 (34)课程设计任务书学生姓名:专业班级:计算机班指导教师:工作单位:计算机科学与技术学院题目: 数字显示与键盘输入例程设计初始条件:1.课程设计使用ZG211硬件综合实验平台(8051单片机),配有课程设计接口芯片和辅助芯片以及器件;2.ZG211有程序设计集成开发环境,程序设计语言为C语言;3.ZG211硬件综合实验平台使用说明书;要求完成的主要任务:(包括课程设计工作量及其技术要求,撰写说明书具体要求)1.学习使用ZG211硬件综合实验平台,程序设计集成开发环境;2.根据课程设计题目,进行需求分析,搞清楚课程设计需要设计需求和需要解决的设计内容。
3.查阅和学习课程设计题目需要的接口芯片资料,掌握接口芯片的使用方法和编程要领。
44键盘输入课程设计
4 4键盘输入课程设计一、课程目标知识目标:1. 让学生掌握44键盘的基本布局和功能键的使用方法;2. 使学生了解并熟练运用键盘输入字母、数字及常用符号;3. 帮助学生理解键盘输入在计算机操作中的应用价值。
技能目标:1. 培养学生快速、准确的键盘输入能力;2. 培养学生运用键盘输入法进行文字、数据等信息处理的能力;3. 提高学生在实际操作中,灵活运用键盘输入技巧的能力。
情感态度价值观目标:1. 培养学生对键盘输入学习的兴趣,激发学生主动学习的积极性;2. 培养学生良好的计算机使用习惯,注重信息安全意识;3. 增强学生对键盘输入在日常生活和学习中作用的认同感,提高信息素养。
课程性质:本课程为信息技术课程,旨在帮助学生掌握键盘输入技能,提高信息处理能力。
学生特点:四年级学生具备一定的计算机操作基础,对键盘输入有一定了解,但熟练程度不一。
教学要求:结合学生特点,采用循序渐进的教学方法,注重实践操作,提高学生的键盘输入技能。
在教学过程中,关注学生的情感态度,激发学习兴趣,培养良好的计算机使用习惯。
通过课程学习,使学生能够达到预定的学习成果,为后续学习打下坚实基础。
二、教学内容1. 键盘布局与功能键:介绍标准44键盘的布局,包括字母键、数字键、功能键、控制键等;讲解功能键(如Ctrl、Alt、Shift)的作用及组合使用方法。
2. 键盘输入基本操作:学习字母、数字及常用符号的输入方法;掌握大小写切换、中英文输入法切换等操作。
3. 输入技巧与速度提升:教授键盘输入的指法原则,如“盲打”、“逐指击键”等;通过练习提高学生的输入速度和准确性。
4. 实用软件与应用:结合课本内容,介绍键盘输入法在文字处理、表格制作等软件中的应用;举例说明键盘快捷键在提高工作效率方面的优势。
5. 信息安全与计算机使用习惯:强调在键盘输入过程中保护个人信息安全的重要性;培养学生良好的计算机使用习惯,如正确的坐姿、预防颈椎病等。
教学大纲安排:第一课时:键盘布局与功能键认识第二课时:字母、数字及符号的输入方法第三课时:输入技巧与速度提升第四课时:键盘输入法在实用软件中的应用第五课时:信息安全与计算机使用习惯培养教学内容进度:按照教学大纲安排,每课时完成相应内容的学习与实践操作,确保学生充分掌握键盘输入技能。
CPLD课程设计键盘输入显示
1.所做设计题目2.实现方案3.程序4.硬件调试结果5.总结(包括设计中所用到的知识点。
遇到的问题及解决方法。
建议或意见等)在为期一周的CPLD课程设计中,从选课题查资料,到学软件做仿真,再到检测与调试,我都收获了很多。
不光理论知识得到了强化,实践动手能力也被大大增强了,此外我对课程设计的流程也更熟稔了。
在知识方面,我不仅回顾了这个学期所学的CPLD技术基础理论知识,也回顾了过去所学的模数电相关的知识;不仅加深了对CPLD 理论的理解,在与之相关的学科方面也得到了拓展与深化。
此次课程设计,让我对模数电与CPLD等科目有了更深入细致的了解。
同时我也深深发觉到,仅懂得理论、纸上谈兵是远远不够的,我们还需要进行更多的实物制作,或是软件仿真,因为当理论运用到实际中时,往往会出现很多的问题与偏差。
所以这次的实践训练是非常合时并且有意义的,它使我懂得了只有不断实践才能真正掌握知识。
最后感谢指导教师的细心教导,谢谢介于实验箱键盘输入模块为4行5列输入,而其内部电路为3行8列电路,所以采用行扫描的方法来进行扫描。
借助时钟clk0及变量kk来控制led灯变亮的顺序process(clk0)variable kk:std_logic;beginif(clk0'event and clk0='1')thenkk := not kk;end if;if kk = '0' thensel <= "000";y <= HighLed;elsesel <= "001";y <= LowLed;end if;end process;定义信号q来控制行线x的扫描process(clk,q)beginif rising_edge(clk) thenif q=2 thenq<=0;elseq<=q+1;end if;case q iswhen 0=>x<="110";when 1=>x<="101";when 2=>x<="011";end case;扫描行信号q所在的各列是否有按键,以下为第一行case q iswhen 0 =>if (h="11111110") thenHighLed <= "11111100"; --00LowLed <= "11111100";elsif (h="11111101") thenHighLed <= "11111100"; --01LowLed <= "01100000";elsif (h="11111011")thenHighLed <= "11111100"; --02elsif (h="11110111")thenHighLed <= "11111100"; --03LowLed <= "11110010";elsif (h="11101111")thenHighLed <= "11111100"; --04LowLed <= "01100110";elsif (h="11011111")thenHighLed <= "11111100"; --05LowLed <= "10110110";elsif (h="10111111")thenHighLed <= "11111100"; --06LowLed <= "10111110";elsif (h="01111111")thenHighLed <= "11111100"; --07LowLed <= "11100000";end if;在原先判断列是否有按键的语句中加入一个if语句来改变进制when 1 =>if (h="11111110") thenif (n='1')thenHighLed <= "01100000"; --16elsif(n='0')thenHighLed <= "01100000"; --10 LowLed <= "11111100";end if;elsif (h="11111101")thenif (n='1')thenHighLed <= "01100000"; --17 LowLed <= "11100000";elsif(n='0')thenHighLed <= "01100000"; --11 LowLed <= "01100000";end if;elsif (h="11111011")thenif (n='1')thenHighLed <= "01100000"; --18 LowLed <= "11111110";elsif(n='0')thenHighLed <= "01100000"; --12 LowLed <= "11011010";end if;elsif (h="11110111")thenif (n='1')thenHighLed <= "01100000"; --19LowLed <= "11110110";elsif(n='0')thenHighLed <= "01100000"; --13LowLed <= "11110010";end if;程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jianpan isport( clk0, clk :in std_logic;n :in bit;h :in std_logic_vector(7 downto 0);x :out std_logic_vector(2 downto 0); y :out std_logic_vector(7 downto 0);sel :out std_logic_vector(2 downto 0)); end;architecture erban of jianpan issignal q:integer range 0 to 2;signal w:integer range 0 to 3;signal HighLed,LowLed:std_logic_vector(7 downto 0); beginprocess(clk0)variable kk:std_logic;beginif(clk0'event and clk0='1')thenkk := not kk;end if;if kk = '0' thensel <= "000";y <= HighLed;elsesel <= "001";y <= LowLed;end if;end process;process(clk,q)beginif rising_edge(clk) thenif q=2 thenq<=0;elseq<=q+1;end if;case q iswhen 0=>x<="110";when 1=>x<="101";when 2=>x<="011";end case;case q iswhen 0 =>if (h="11111110") thenHighLed <= "11111100"; --00LowLed <= "11111100";elsif (h="11111101") thenHighLed <= "11111100"; --01LowLed <= "01100000";elsif (h="11111011")thenHighLed <= "11111100"; --02LowLed <= "11011010";elsif (h="11110111")thenHighLed <= "11111100"; --03LowLed <= "11110010";elsif (h="11101111")thenHighLed <= "11111100"; --04LowLed <= "01100110";elsif (h="11011111")thenHighLed <= "11111100"; --05 LowLed <= "10110110";elsif (h="10111111")thenHighLed <= "11111100"; --06LowLed <= "10111110";elsif (h="01111111")thenHighLed <= "11111100"; --07LowLed <= "11100000";end if;when 2 =>if (h="11111110") thenHighLed <= "11111100"; --08 LowLed <= "11111110";elsif (h="11111101") thenHighLed <= "11111100"; --09 LowLed <= "11110110";elsif (h="11111011")thenif (n='1')thenHighLed <= "01100000"; --10LowLed <= "11111100";elsif(n='0')thenHighLed <= "00000000"; --ALowLed <= "11101110";end if;elsif (h="11110111")thenif (n='1')thenHighLed <= "01100000"; --11 LowLed <= "01100000";elsif(n='0')thenHighLed <= "00000000"; --bLowLed <= "00111110";end if;elsif (h="11101111")thenif (n='1')thenHighLed <= "01100000"; --12 LowLed <= "11011010";elsif(n='0')thenHighLed <= "00000000"; --CLowLed <= "10011100";end if;elsif (h="11011111")thenif (n='1')thenHighLed <= "01100000"; --13 LowLed <= "11110010";elsif(n='0')thenHighLed <= "00000000"; --d LowLed <= "01111010";end if;elsif (h="10111111")thenif (n='1')thenHighLed <= "01100000"; --14 LowLed <= "01100110";elsif(n='0')thenHighLed <= "00000000"; --E LowLed <= "10011110";end if;elsif (h="01111111")thenif (n='1')thenHighLed <= "01100000"; --15 LowLed <= "10110110";elsif(n='0')thenHighLed <= "00000000"; --F LowLed <= "10001110";end if;end if;when 1 =>if (h="11111110") thenif (n='1')thenHighLed <= "01100000"; --16LowLed <= "10111110";elsif(n='0')thenHighLed <= "01100000"; --10 LowLed <= "11111100";end if;elsif (h="11111101")thenif (n='1')thenHighLed <= "01100000"; --17 LowLed <= "11100000";elsif(n='0')thenHighLed <= "01100000"; --11 LowLed <= "01100000";end if;elsif (h="11111011")thenif (n='1')thenHighLed <= "01100000"; --18LowLed <= "11111110";elsif(n='0')thenHighLed <= "01100000"; --12 LowLed <= "11011010";end if;elsif (h="11110111")thenif (n='1')thenHighLed <= "01100000"; --19 LowLed <= "11110110";elsif(n='0')thenHighLed <= "01100000"; --13 LowLed <= "11110010";end if;end if;end case;end if;end process;end;0 1 2 3 F1 4 5 6 7 F28 9 A B F3C D E F F4。
微机原理实验一 编程实现键盘输入和显示
实验一编程实现键盘输入和显示**************************************************************************************一、题目内容**************************************************************************************❖循环提示由键盘输入一个字符,若为自己姓的首字母(大小写均可),则显示‘My name is:XXX(自己的姓名拼音);若为自己学号的末位数字,则显示’ My ID number is:XXX(自己的学号);若输入其他字符则退出程序。
(三种情况都要验证至少一次截图附在实验报告中。
)❖以电科2班张弛同学1207071201242为例,运行程序后显示:▪Please input a character: z▪My name is: Zhang Chi▪Please input a character: 2▪My ID number is: 1207071201242▪Please input a character:a▪Quit the program.**************************************************************************************二、流程图****************************************************************************************************************************************************************************三、程序代码************************************************************************************** stack segment stack 'stack'dw 32 dup(0) ;定义32字空间stack endsdata segmentOBUF DB 'Please input a key',0DH,0AH,'$' ;定义字符串MSG1 DB 20H,'My name is:Zeng HongQing',0DH,0AH,0AH,'$' ;定义字符串MSG2 DB 20H,'My ID number is:2',0DH,0AH,0AH,'$' ;定义字符串data endscode s egmentbegin proc farassume ss:stack, cs:code, ds:datapush dssub ax,axpush axmov ax,datamov ds,axAGAIN: MOV DX,OFFSET OBUF;调用9号功能,输出字符串“Please input a character:”MOV AH,9INT 21HMOV AH,1;1号功能调用,等待输入一个字符INT 21HCMP AL,'z';将输入的字符与“z”比较是否一样JZ NAM ;如果为零即输入字符为z则跳转至NAMJMP ID ;如果不为零即输入字符非z则跳转至IDNAM: MOV DX,OFFSET MSG1;9号功能调用,输出“My name is:Zeng HongQing”MOV AH,9INT 21HJMP AGAINID: CMP AL,32H ;将输入的字符与2的ASSCII码比较是否相等JNZ OTHER ;如果不为零即输入不为2则跳转至OTHERMOV DX,OFFSET MSG2 ;为零即输入为2则调用9号功能输出“My ID number is:2”MOV AH,9INT 21HJMP AGAINOTHER: M OV AH,4CH;若输入的是其他字符,调用中断21h的4ch号功能,退出程序INT 21Hretbegin endpcode e ndsend begin**************************************************************************************四、操作截图****************************************************************************************************************************************************************************五、实验分析或经验总结************************************************************************************** 1、编译汇编文件:先在记事本里输入代码后,再用汇编编译器编译。
微机原理实验1 编程实现键盘输入和显示
微机原理实验实验名称:编程实现键盘输入和显示将自己的姓名拼音和9位学号定义在数据段循环提示由键盘输入一个数字,若为奇数,则显示自己的姓名拼音;若为偶数和0,则显示自己的学号;若输入其他字符则退出程序返回DOS 。
(三种情况都要有实验结果。
)▪ Please input a number:7▪ My name is:卢丽霞▪ Please input a number:8▪ My ID number is: 110703220.▪ Please input a number:q▪ Quit the program.YNYNNY代码:stack segment stack 'stack'dw 32 dup(0) 开始 输入mingzi 和num 调用1号系统功能,将输入的符号的ASCII 码值放入AL 中AL<’0’ AL>’9’a 是奇数 输出学号输出姓名 输出”Quit the program ” 结束stack endsdata segmentbuf1 db 'Please input a number:$'buf2 db 'My name is:$'buf3 db 'Please input a number:$'buf4 db 'My ID number is: $'buf5 db 'please input a number:$'buf6 db 'Quit the program$'mingzi db 'My name is:lulixia$'num db 'My ID number is:110703220$' data endscode segmentbegin proc farassume ss: stack, cs: code, ds: data push dssub ax, axpush axmov ax, datamov ds, axmov ax,datamov ds,axmov dx,offset buf1mov ah,9int 21hmov ah,01int 21hcmp al,'0'jb stopcmp al,'9'ja stopxor ah,ahmov bl,2div blcmp ah,0jz idmov ah,9mov dx,offset mingzi int 21hjmp beginid:mov ah,9mov dx,offset numint 21hjmp beginstop:mov ah,9mov dx,offset buf6int 21hmov ah,4chint 21hretbegin endpcode endsend begin程序结果:实验分析:本实验预先设置好的结果按需要显示,并运用科各种系统功能的调用,还用了比较cmp判断,还通过判断除法余数是否为零判断被除数的奇偶。
键盘输入系统设计
D1HD7279R1100KGPIOR2200K图2-3 键盘功能布局3、键盘按键代码确定图2-4 键盘按键连接及代码分布当键盘阵列和硬件电路的连接如图3-2所示时,从HD7279中所读出的按键代码如图中所示分布。
三、键盘输入系统软件设计1、对应键盘系统的LCD显示界面LCD对应的键盘输入界面即控制器参数配置界面如图3-1所示。
图3-1 控制器参数配置界面LCD对于输入框在选中状态和输入状态的设计如图3-2所示。
图3-2 输入框的选中状态和输入状态LCD的初始化、应用和退出三个按钮的选中和按下状态类似输入框的选中状态和输入状态,只是内部文字不变。
2、键盘输入系统软件功能描述及设计对照上面LCD的显示界面,根据整个系统的需求分析,可以把键盘系统需要实现的功能描述如下:(1) 通过一定方式使系统由显示界面进入控制参数配置界面这里我们采用输入口令序列的方式,这样既可以提高系统安全性,亦可以防止系统由于干扰的原因造成的误操作。
(2) 通过方向键实现配置界面中各个功能框的轮流选中实现方法是把显示界面的功能框设计为包含坐标值、功能码和数据区的结构体。
并建立和界面中功能框位置对应的一个6x4的结构体数组,同时定义一个保存当前选中数组元素下标的变量。
当按下一个方向键时,下标变量对应位加一或减一。
(3) 改变功能框的选中(虚框)和输入状态(实框)这个功能通过一个标志位来实现。
默认为选中状态,按下‘确定’时,设为输入状态(输入框)或按下状态(按钮框);当再次按下‘确定’或按下‘取消’时,设置为选中状态。
(4) 输入框中数据的输入这部分功能可以进一步详细的描述为:支持0~9个数字的随机顺序输入;支持数据从左至右,随着输入依次平移推进式显示;支持退格键,这里使用向左键复用;支持‘取消’不保存数据,‘确定’保存最终的完整数据到输入框结构体的数据区。
我们把0~9、向左键、‘取消’键和‘确定’键的键码放到一个switch 语句中,每个键码后跟随需要实现的功能代码。
实验三 从键盘输入数据并显示
实验2 从键盘输入数据并显示编写程序,将键盘接收到的4位16进制数转换为等值的二进制数,再显示在荧光屏上。
分析:整个程序分为3个部分:键盘输入、转换、显示,可以分别用子程序来完成。
1. 输入。
输入可以利用字符串输入。
这时需要在主程序中先开辟一段输入缓冲区。
先复习一下字符串输入的知识。
字符串输入 ( 0AH 功能 )入口参数 DS : DX = 缓冲区的首地址( DS :DX ) = 限制最多输入的字符数功能号 AH = 0AH类型号 21H出口参数 ( DS : DX+1 ) = 实际键入的字符(不含回车符) 从( DS : DX+2 )开始顺序存放键入的字符串,回车符0DH为串尾最后一字符。
实现功能等待从键盘输入字符串,并存入设定的缓冲区内,同时回显字符串,光标随着移动,回车符使光标回到行首。
注意事项:应按要求先定义缓冲区,再调用。
数据缓冲区的设置如下:data SEGMENT ;定义缓冲区stri DB ‘PLEASE INPUT’ ,0AH,0DH, ’$’ ;输入提示max DB 4 ;定义限制最多输入个数lenth DB ? ;用于存放实际输入个数stri DB 5 DUP(?) ;用于存放输入的字符串data ENDS从键盘输入‘ABCD’, 回车,内存的存放结果:子程序如下:INPUT PROCLEA DX, striMOV AH, 09H ;调显示功能INT 21HLEA DX , maxMOV AH , 0AHINT 21H; 调0A输入功能RETINPUT ENDP2. 转换。
由于在缓冲区中存放的是输入字符的ASCII码,比如1→31H,A→41H ,a→61H,所以首先需要将它们转换成对应的数字的大小。
如1→0000,0001B,A和a→1010。
如何转换?数字和字母的ASCII码是一个有序序列数字0~9 : 30H ~ 39H大写字母A~Z : 41H ~ 5AH小写字母a~z : 61H ~ 7AH对于每个字符,先减去30H,数字0~9就转换完了;如果判断是否大于09H,是则减去07H,大写字母A~F转换完毕,如果是小写字母a~f,还要减去20H。
键盘录入数据的转换与显示微机原理课程设计
微机原理课程设计题目: 键盘录入数据的转换与显示初始条件:从键盘读入二个五位十进制数(1位符号位+4位数值位),并将这二个十进制数,分别转换为二进制数,然后求其和,再将和以十进制形式进行显示。
按Q退出程序。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)设计任务及要求分析(2)方案比较及认证说明(3)系统原理阐述(4)硬件设计课题需要说明:硬件原理,电路图,采用器件的功能说明(5)软件设计课题需要说明:软件思想,流程图,源程序及程序注释(6)调试记录及结果分析(7)总结(8)参考资料(9)附录:芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图摘要:本文所设计的程序是运行于硬件和DOS操作系统下的,本程序通过调用DOS下的基本输入输出中断,实现数据的输入和输出。
程序中有两个子程序,输入的两个五位的十进制数通过调用一个叫ASC_TO_BIN的子程序可以将其转换成二进制数,然后求两个二进制数的和,求和完成后,再调用一个叫BIN_TO_ASCII的子程序将二进制和转换成相应的ASCII码,调用DOS输出中断显示在屏幕上,最后看用户是否输入的是Q或者q,若是则程序结束,若不是则程序循环。
关键字:8086;DOS系统;ASCII码;中断目录1设计任务及要求分析 (1)1.1设计任务 (1)1.2要求分析 (1)2方案比较及认证说明 (2)3系统原理阐述 (3)3.1统设计的软硬件环境 (3)3.2统设计中用到的DOS调用 (3)4软件设计说明 (5)4.1 ASCII码转换成二进制算法实现 (5)4.2二进制转换成ASCII码算法实现 (5)4.3主程序结构分析 (5)4.4子程序结构分析 (6)4.5中断程序的结构分析 (8)5调试记录及结果分析 (9)5.1调试记录 (9)5.2调试结果分析 (9)总结和心得体会 (10)参考文献 (11)附录一源程序和程序注释 (12)附录二程序运行结果截图 (16)附录三本科生课程设计成绩评定表 (17)附录四评定项目表 (18)键盘录入数据的转换与显示1设计任务及要求分析1.1设计任务从键盘读入二个五位十进制数(1位符号位+4位数值位),并将这二个十进制数,分别转换为二进制数,然后求其和,再将和以十进制形式进行显示。
微机原理实验六从键盘输入数据并显示
实验六从键盘输入数据并显示1要求:编写程序,将键盘接收到的四位十六进制数转换为等值的二进制数,并显示在屏幕上。
若输入的不是0—F间的数字,则显示出错信息,并要求重新输入。
2目的:掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII码的原理。
实验程序CRLF MACROMOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HENDMDATA SEGMENTMARK DB?MESS DB'please input the number(H),press inter,ture into number(B).press space end.',0DH,0AH,'$'ERROR DB 0DH,0AH, 'input error',0DH,0AH,'$'DATA ENDSSTACK SEGMENTSTA DW32 DUP(?)TOP DW?STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV SP,TOPHEAD: CRLFMOV MARK,0MOV AH,09HLEA DX,MESSINT 21H ;显示提示输入的信息CALL GETNUM ;接收键入数值送DXCMP MARK,01HJE HEADMOV CX,0010H ;16位MOV BX,DXTTT: ROL BX,1 ;循环左移1位MOV DL,BLAND DL,01H ;屏蔽掉高7位ADD DL,30HMOV AH,02HINT 21H ;显示二进制位对应的ASCII字符LOOP TTTJMP HEADFINI: MOV AX,4C00HINT 21H ;返回DOSGETNUM PROC NEAR ;子程序,接收键入数值送DX PUSH CXXOR DX,DXGGG: MOV AH,01HINT 21HCMP AL,0DH ;输入为回车,则进行转换JE PPPCMP AL,20H ;输入为空格,则退回DOSJE FINICMP AL,30HJB KKKSUB AL,30HCMP AL,0AHJB GETSCMP AL,11HJB KKKSUB AL,07HCMP AL,0FHJBE GETSCMP AL,2AHJB KKKCMP AL,2FHJA KKKSUB AL,20HGETS: MOV CL,04SHL DX,CLXOR AH,AHADD DX,AXJMP GGGKKK: MOV AH,09HMOV DX,OFFSET ERRORINT 21HMOV MARK,01HPPP: PUSH DXCRLFPOP DXPOP CXRETGETNUM ENDPCODE ENDSEND START。
微机原理实验六从键盘输入数据并显示
实验六从键盘输入数据并显示1要求:编写程序,将键盘接收到的四位十六进制数转换为等值的二进制数,并显示在屏幕上。
若输入的不是0—F间的数字,则显示出错信息,并要求重新输入。
2目的:掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII码的原理。
实验程序CRLF MACROMOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HENDMDATA SEGMENTMARK DB?MESS DB'please input the number(H),press inter,ture into number(B).press space end.',0DH,0AH,'$'ERROR DB 0DH,0AH, 'input error',0DH,0AH,'$'DATA ENDSSTACK SEGMENTSTA DW32 DUP(?)TOP DW?STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV SP,TOPHEAD: CRLFMOV MARK,0MOV AH,09HLEA DX,MESSINT 21H ;显示提示输入的信息CALL GETNUM ;接收键入数值送DXCMP MARK,01HJE HEADMOV CX,0010H ;16位MOV BX,DXTTT: ROL BX,1 ;循环左移1位MOV DL,BLAND DL,01H ;屏蔽掉高7位ADD DL,30HMOV AH,02HINT 21H ;显示二进制位对应的ASCII字符LOOP TTTJMP HEADFINI: MOV AX,4C00HINT 21H ;返回DOSGETNUM PROC NEAR ;子程序,接收键入数值送DX PUSH CXXOR DX,DXGGG: MOV AH,01HINT 21HCMP AL,0DH ;输入为回车,则进行转换JE PPPCMP AL,20H ;输入为空格,则退回DOSJE FINICMP AL,30HJB KKKSUB AL,30HCMP AL,0AHJB GETSCMP AL,11HJB KKKSUB AL,07HCMP AL,0FHJBE GETSCMP AL,2AHJB KKKCMP AL,2FHJA KKKSUB AL,20HGETS: MOV CL,04SHL DX,CLXOR AH,AHADD DX,AXJMP GGGKKK: MOV AH,09HMOV DX,OFFSET ERRORINT 21HMOV MARK,01HPPP: PUSH DXCRLFPOP DXPOP CXRETGETNUM ENDPCODE ENDSEND START。
模拟计算器数字输入及显示课程设计
摘要本设计是一个实现加、减、乘、除的计算器,它的硬件主要由四部分组成,一个AT89C51单片机芯片,一个八位共阳极的数码管,一个4*4的键盘,一个排阻(10K)做P0口的上拉电阻(接线图在附录2),它可以实现结果低于65535的加、减、乘、除运算。
显示部分:采用动态显示,由八位共阳极数码管通过P0口,P2口与单片机相连,数码管的A,B,C,D,E,F,G,DP分别依次与单片机的P0.0—P0.7相连,P0口做为单片机的字码控制端,数码管的1,2,3,4,5,6,7,8各引脚分别与单片机的P2.0—P2.7相连,P2口作为数码管的位控制端。
按键部分:采用4*4键盘。
采用软件识别键值并执行相应的操作,键盘的第0行到第3行依次与单片机的P3.4—P3.7管脚相连,键盘的第0列到第3列依次与单片机的P1.0—P1.3管脚相连,程序运行时依次扫描各行,查询是否有键按下,如果有则进入键盘识别处理程序,实现相应的运算,然后通过数码管输出结果,如果没有按键就调用显示程序显示一个0,等待按键按下,在进入按键扫描程序。
执行过程:开机即显示0,等待键入数值,当键入数字,将通过数码管显示出来,在键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当在键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。
注:结果不能超出65535。
(具体操作见后面仿真图)目录1 概述1.1MCS-51单片机在自动化仪表中的作用 (3)1.2掌握单片机仿真软件Proteus的使用方法 (3)1.3设计方法 (3)1.4基本功能 (4)2 系统总体方案及硬件设计2.1计算器总体思想 (5)2.2硬件的选择与连接 (6)3 软件设计3.1显示程序设计 (7)3.2键盘识别程序设计 (8)3.3运算程序设计 (10)3.4风鸣器程序设计 (10)4 Proteus软件仿真 (12)5课程设计体会 (16)参考文献 (18)附1:源程序代码 (19)附2:计算器模拟系统电路图 (31)1 概述1.1MCS-51单片机在自动化仪表中的作用单片机体积小,功耗小,价格低,用途灵活,无处不在,属专用计算机。
实验5键盘输入与数码管显示实验
班级学号姓名实验组别实验日期室温报告日期成绩报告内容:(目的和要求、原理、步骤、数据、计算、小结等)实验名称:实验5键盘输入与数码管显示实验一、实验目的学习键盘工作原理,掌握数据输入输出的方法。
二、实验内容及原理矩阵键盘扫描原理:由处理器通过行线给某一行按键送入低电平信号,按键在未使用的情况下列线上拉高电平信号,处理器对行线输出相连的I/O口进行扫描,当扫描到低电平信号时证明对应的键被按下。
本实验中采用的是2*8键盘,为了减少对处理器芯片I/O接口的直接引用,实验中使用了一片74HC595(U6)用来实验数据串并转换。
三、实验原理图四、实验步骤1. 实验连线74HC595(U6)时钟控制端接LPC2103总线接口模块的P0.19,数据输入端接总线接口模块的P0.20,选通端接总线接口模块的P0.21。
数据输出端接按键行扫描输入端。
按键8根行线接74HC595的数据输出端,2根列线分别接LPC2103总线接口模块的P0.17,P0.18.同时在列线上接入+3.3V 电源和上拉电阻以确保在没有信号输入的情况下列线给处理器送入的是高电平信号。
2.仿真器的设置:一般选用JTAG 调试,若使用RelInFlash 生成目标时,编译连接生成的目标代码会将芯片加密。
此时调试无法继续,须将硬件调成ISP 模式进行全片擦除。
3. 运行程序:keytest.hex4. 接通电源,按下按键并观察实验板上数码管的变化。
五、流程图主程序显示子程序键盘扫描六、实验程序#include "config.h" #include "Num show.h" #include "key.h"/**************************************************************************** * 名称:main()* 功能:数据送入数码管显示****************************************************************************/ int main(void){uint8 key_val=0,dis;uint8 str[8]={0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00};PINSEL0=0x00000000;//设置所有引脚连接GPIOPINSEL1=0x00000000;IODIR=SPI_IOCON; //设置LED为输出其他为输入//Num_show(str);while(1){key_val=get_key(); //取键值if(key_val<16){dis = key_val;if(dis<10){str[7]=dis;str[6]=0;}else{str[6]=1;str[7]=dis%10;}//for(m=0;m<10;m++) //延时显示键值}Num_show(str);//显示改变后的数值}return (0);}#include "config.h"#define SPI_CS 0x00000100//P0.8#define SPI_CS1 1<<11//P0.11#define SPI_DATA 0x00000040//P0.6#define SPI_DATA1 0x00000080//P0.7/**************************************************************************** * 名称:DelayNS()* 功能:长软件延时* 入口参数:dly参数越大延时越久* 出口参数:无****************************************************************************/ void DelayNS(uint32 dly){uint32 i;for(;dly>0;dly--)for(i=0;i<5000;i++);}/**************************************************************************** * 名称:HC595_SendDat()* 功能:向74HC595发送一个字节的数据* 入口参数:data要发送的数据* 出口参数:无* 说明:高位数据先发送****************************************************************************/ void HC595_SendDat(uint8 dat){uint8 i;IOCLR = SPI_CS; //SPI_CS=0for(i=0;i<8;i++) //发送8位数据{IOCLR = SPI_CLK; //SPI_CLK=0if((dat&0x80)!=0) IOSET = SPI_DA TA;else IOCLR = SPI_DA TA;dat<<=1;IOSET = SPI_CLK; //SPI_CLK=1}IOSET = SPI_CS; //SPI_CS=1,输出显示数据}void HC595_SendDat1(uint8 dat){uint8 i;IOCLR = SPI_CS1; //SPI_CS=0for(i=0;i<8;i++) //发送8位数据{IOCLR = SPI_CLK; //SPI_CLK=0if((dat&0x80)!=0) IOSET = SPI_DA TA1;dat<<=1;IOSET = SPI_CLK; //SPI_CLK=1}IOSET = SPI_CS1; //SPI_CS=1,输出显示数据}/***************************************************************************** 名称:Num_show()* 功能:显示收到的数据* 入口参数:str[],要显示的数据****************************************************************************/ int Num_show(uint8 str[]){const uint8 DISP_TAB1[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80};const uint8 DISP_TAB[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0--f 暗亮G P U r -uint8 i;// while(1){for(i=0;i<8;i++){HC595_SendDat(DISP_TAB[str[i]]);HC595_SendDat1(DISP_TAB1[i]);DelayNS(1);HC595_SendDat(0xff);HC595_SendDat1(DISP_TAB1[i]);}}return(0);}#include "config.h"#include "Num show.h"#define SPI_CS2 1<<21//P0.21#define SPI_DATA2 1<<20//P0.20#define SPI_CLK2 1<<19//P0.19#define KEY1 1<<17// P0.17#define KEY2 1<<18// P0.18/***************************************************************************** 名称:HC595_SendDat2()* 功能:向74HC595发送一个字节的数据* 入口参数:data要发送的数据* 说明:高位数据先发送****************************************************************************/ void HC595_SendDat2(uint8 dat){uint8 i;IOCLR = SPI_CS2; //SPI_CS2=0for(i=0;i<8;i++) //发送8位数据{IOCLR = SPI_CLK2; //SPI_CLK2=0if((dat&0x80)!=0) IOSET = SPI_DA TA2;else IOCLR = SPI_DA TA2;dat<<=1;IOSET = SPI_CLK2; //SPI_CLK2=1}IOSET = SPI_CS2; //SPI_CS2=1,输出显示数据}/**************************************************************************** * 名称:get_key()* 功能:按下按键取数值* 入口参数:无* 出口参数:键值* 说明:高位数据先发送****************************************************************************/uint8 get_key(void){uint8 key_value=16,i,j;uint8 k1[8]={0,1,2,3,4,5,6,7};uint8 k2[8]={8,9,10,11,12,13,14,15};const uint8 DISP_TAB2[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};for(i=0;i<8;i++){HC595_SendDat2(DISP_TAB2[i]); //扫描if((IOPIN&KEY1)==0){ DelayNS(10);if((IOPIN&KEY1)==0){ while((IOPIN&KEY1)==0);key_value=k1[i];break;}}}{for(j=0;j<8;j++){HC595_SendDat2(DISP_TAB2[j]); //扫描if((IOPIN&KEY2)==0){ DelayNS(10);if((IOPIN&KEY2)==0){while((IOPIN&KEY2)==0);key_value=k2[j];break;}}}}return key_value;}。
23单片机模拟计算器数字输入和显示实验
23.模拟计算器数字输入及显示1.实验任务(1.开机时,显示“0”(2.第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音。
2.电路原理图图4.23.13.系统板上硬件连线(1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;(2.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;(3.把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;(4.把“单片机系统:区域中的P2.0-P2.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;4.相关程序设计内容(1.行列式键盘输入及按键功能设定;(2.动态数码显示;(3.数码显示方式处理;5.汇编源程序(略)6.C语言源程序#include <AT89X51.H>unsigned char codedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x 00};unsigned char codedispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char dispbuf[8]={0,16,16,16,16,16,16,16};unsigned char dispbitcount;unsigned char temp;unsigned char i,j;unsigned char key;unsigned char keypos;bit alarmflag;void change(unsigned char *p,unsigned char count){while(count>0){*(p+count)=*(p+count-1); count--;}}void main(void){TMOD=0x01;TH0=(65536-4000) / 256;TL0=(65536-4000) % 256;TR0=1;ET0=1;EA=1;while(1){P3=0xff;P3_4=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--); temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=7;break;case 0x0d:key=8;break;case 0x0b:key=9;break;case 0x07:key=10;break;}if ((key>=0) && (key<10)){keypos++;if(keypos<8){change(dispbuf,keypos); dispbuf[0]=key;}else{keypos=8;alarmflag=1;}}temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }alarmflag=0;}}P3=0xff;P3_5=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=11;break;}if ((key>=0) && (key<10)){keypos++;if(keypos<8){change(dispbuf,keypos); dispbuf[0]=key;}else{keypos=8;alarmflag=1;}}temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }alarmflag=0;}}P3=0xff;P3_6=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=1;break;case 0x0d:key=2;break;case 0x0b:key=3;break;case 0x07:key=12;break;}if ((key>=0) && (key<10)){keypos++;if(keypos<8){change(dispbuf,keypos); dispbuf[0]=key;}else{keypos=8;alarmflag=1;}}temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }alarmflag=0;}}P3=0xff;P3_7=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=0;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}if ((key>=0) && (key<10)){keypos++;if(keypos<8){change(dispbuf,keypos); dispbuf[0]=key;}else{keypos=8;alarmflag=1;}}temp=P3;P1_0=~P1_0;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f; }alarmflag=0;}}}}void t0(void) interrupt 1 using 0{TH0=(65536-4000) / 256;TL0=(65536-4000) % 256;P0=dispcode[dispbuf[dispbitcount]];P2=dispbitcode[dispbitcount];dispbitcount++;if (dispbitcount==8){dispbitcount=0; }if (alarmflag==1) {P1_1=~P1_1;}}。
键盘显示程序设计实验
实验四键盘显示程序设计实验目的1、理解串行接口键盘单片机汇编语言程序的基本结构2、了解单片机汇编语言程序的设计和调试方法3、掌握几个的基本的传送类、控制类指令的使用方法实验仪器单片机开发板、万利仿真机、稳压电源、计算机实验原理1、键盘接口电路工作原理串行接口键盘盘电路如图4-15所示。
键盘扫描线与显示位选扫描信号共用。
键盘输入只需要一根线,电路简单。
键盘扫描信号从74LS164输出,低电平有效。
当扫描到某个键时,若按键按下,在KEY端得到低电平,否则得到高电平。
通过判断KEY的电平就可以知道相应键盘是否按下。
图4-15 键盘接口电路图2、读键盘程序设计从上面工作原理分析可知,读键程序可以和显示程序结合在一起,也可以单独设计。
这种结构的键盘同样存在抖动问题。
为了减少程序误动作,程序设计时也要考虑去抖动问题。
这里设计一个把键值显示在LED上的程序。
为了简化问题,把读键程序与显示结合起来。
程序流程图如图4-16所示。
图4-16 键盘扫描程序流程图实验内容1、设计程序把键值显示在数码管。
#include<reg52.h>#include"display.h"extern uchar point;extern uchar table[8];uchar t,temp,time;char num;bit flag1;/*void main(){uchar i;table[0]=0x0;for(i=1;i<8;i++)table[i]=0x11;while(1){num=dispkey();if(flag==1)table[0]=num;delay_1ms(2);}}*//************************************************************2、设计程序按不同键时实现不同功能。
功能:按向上键:最右边一位数码管数值加1(0-9),到9时加1回到0 按向下键:最右边一位数码管数值减加1(9-0),到0时减1回到9按向左键:显示数字左移一位按向右键:显示数字右移一位keypointr:短按小数点右移,长按显示学号;接口:上下左右keypointrkeypointl**************************************************************/ void main(){uchar i,j=7,k=0;for(i=0;i<8;i++)table[i]=0x11;TMOD=0x01;EA=1;TH0=(65536-20000)/256;TL0=(65536-20000)%256;ET0=1;TR0=1;table[7]=0x1;while(1){delay_1ms(5);temp=dispkey();switch(temp){case 5: if ( flag==0){num=++table[j];//加1if(num==10)num=0;table[j]=num;delay_1ms(1);}; flag=1; break;case 4:if ( flag==0){num=--table[j];//减1if(num==-1)num=9;table[j]=num;delay_1ms(1);};flag=1;break;case 2: if ( flag==0) //右移{if(j==7){table[0]=table[7];table[7]=0x11;j=0;continue;}table[j+1]=table[j];//左边赋给右边j++;table[j-1]=0x11;delay_1ms(1);//关闭左一位};flag=1;break;case 8:if ( flag==0){ //左移if(j==0){table[7]=table[0];table[0]=0x11;j=7;continue;}table[j-1]=table[j];//右边赋给左边j--;table[j+1]=0x11;delay_1ms(1);//关闭右一位};flag=1;break;case 1:if ( flag==0) //小数点右移{if(flag1==1){table[0]=0x9;table[1]=0x4;table[2]=0x0;table[3]=0x8;table[4]=0x1;table[5]=0x0;table[6]=0x3;table[7]=0x1;}else{if(k==7){ point=tablepoint[7];k=0;continue;}point=tablepoint[k];k++;delay_1ms(1);}};flag=1;break;default:flag=0; break;}}}void timer0() interrupt 1{TH0=(65536-20000)/256;TL0=(65536-20000)%256;t++;time++;if(temp==1){if(time==50){if(temp==1)flag1=1;time=0;}}}/*******************************************************显示函数*******************************************************///#define __DISPLAY_H__#include"display.h"uchar code disptable[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,0xfe,0xff};//0~F数码代码uchar code tablepoint[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 }; uchar point;uchar table[8];void delay_1ms(uchar z){uint x,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}uchar dispkey(void){uchar i,keynum=0;i=8;DA T=disptable[table[i-1]];if(point&tablepoint[i-1])DA T=DA T&0xfe; //加入小数点DISPDIN =0;DISPCLK =0;DISPCLK =1;DISPDIN =1;delay_1ms(1);if(!key){delay_1ms(5);if(!key) keynum=i;}for (i=7;i>0;i--){DA T =0xff;DA T =disptable[table[i-1]];if(point&tablepoint[i-1])DA T=DA T&0xfe; //加入小数点DISPCLK =0;DISPCLK =1;delay_1ms(1);if(!key){delay_1ms(5);if(!key) keynum=i;}}DA T=0xff;return keynum;}思考题1、当按加1键时,每按一次数码管值变化可能超过1,是什么原因?答:原因是机械按键会有抖动现象,所以每按一次数码管值变化可能超过1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号:0120810340309课程设计题目数字显示与键盘输入设计学院计算机科学与技术学院专业计算机科学与技术专业班级计算机1006班姓名张亚辉指导教师唐建雄2013 年7 月 1 日目录课程设计说明书 (2)数字显示与键盘输入设计 (3)1.实验描述: (3)1.1实验目的 (3)1.2实验设备: (3)1.3设计要求: (3)2.实验过程: (3)2.1实验原理: (3)2.2实验步骤: (8)2.2.1硬件连接: (8)2.2.2软件设计: (9)2.2.3设计成功标志: (10)2.3程序代码: (10)3.调试过程 (15)3.1程序编译调试 (15)3.2在线编程写入程序 (16)3.3实验结果显示 (16)4.课程设计总结: (17)本科生课程设计成绩评定表 (18)课程设计任务书学生姓名:张亚辉专业班级:计算机1006班指导教师:唐建雄工作单位:计算机科学与技术学院题目: 数字显示与键盘输入设计初始条件:1.课程设计使用ZG211硬件综合实验平台(8051单片机),配有课程设计接口芯片和辅助芯片以及器件;2.ZG211有程序设计集成开发环境,程序设计语言为C语言;3.ZG211硬件综合实验平台使用说明书;要求完成的主要任务:(包括课程设计工作量及其技术要求,撰写说明书具体要求)1.学习使用ZG211硬件综合实验平台,程序设计集成开发环境;2.根据课程设计题目,进行需求分析,搞清楚课程设计需要设计需求和需要解决的设计内容。
3.查阅和学习课程设计题目需要的接口芯片资料,掌握接口芯片的使用方法和编程要领。
查阅和学习课程设计题目需要的辅助芯片以及器件资料。
4.设计接口芯片和辅助芯片以及器件与8051单片机连接硬件电路原理图。
5.设计与硬件电路原理图对应的C语言程序(或8051汇编语言)。
给出程序流程图。
在集成开发环境中调试程序。
给出程序的详细注释。
能够解释使用程序模拟电路时序信号和数据。
6.撰写课程设计报告,1)详细陈述以上的设计过程;2)详细陈述电路的调试过程。
时间安排:第17周:1.熟悉ZG211硬件综合实验平台,KEILC UVISION2集成开发环境;查阅接口芯片资料,熟悉接口芯片和它的使用方法。
2.设计硬件电路原理图,。
第18周:1.使用C语言或汇编语言设计和调试接口程序。
2.撰写计算机硬件综合设计报告。
指导教师签名:年月日系主任(或责任教师)签名:年月日数字显示与键盘输入设计1.系统描述:1.1实验目的:1> 掌握对单片机IO口的操作,及中断的应用2> 掌握显示接口芯片CH451的运用1.2实验设备:1> PC 机一台2> ZG-211 单片机系统实验板一块3> 实验连接线若干4> 芯片:CH451,89S525> 并口编程线一根6> 配套电源1 个1.3设计要求:1> 能正常操作LED数码显示2> 能通过中断方式接收按键信息2.实验过程:2.1实验原理:本实验的显示接口采用 CH451 芯片。
该芯片整合了数码管显示驱动和键盘扫描控制可以动态驱动8 位数码管或者64 位LED,具有BCD 译码、闪烁、移位等功能;同时还可以进行64 键的键盘扫描;芯片内部有多个寄存器控制整个芯片的运行,其中有8 个寄存器存入所要显示的数字,每个寄存器有8 位,每一位控制一个数码管其中的一段(1 为点亮,0 为熄灭)。
单片机通过4 根信号线(串行数据输入线DIN、串行数据时钟线DCLK、串行数据加载线LOAD、串行数据输出线DOUT)控制CH451,显示数据,同时通过CH451 对键盘的扫描,达到人机交换信息的目的。
该芯片与实验板相关器件连接原理图如下:CH451原理图CH451引脚图CH451操作命令表1>空操作:0000XXXXXXXXB空操作命令不对CH451 产生任何影响。
为了在不影响CH451 的前提下变化DCLK 以清除看门狗计时,也可以发送空操作命令。
空操作命令可以只发送有效数据B8~B11,简化描述是0^0^0^0^↑。
2>芯片内部复位:001000000001B内部复位命令将CH451 的各个寄存器和各种参数复位到默认的状态。
芯片上电时,CH451总是被复位,此时各个寄存器均复位为0,各种参数均恢复为默认值。
3>字数据左移:001100000000B字数据左移命令将CH451 的字数据左移一次,即从DIG0 向DIG7 移动一位,然后最右边的DIG0 补进数据00H。
例如,在数码管DIG7~DIG0 显示“87654321”时,执行字数据左移命令,显示变为“7654321 ”(不译码方式)或者“76543210”(BCD 译码方式)。
4>字数据右移:001100000010B字数据右移命令将CH451 的字数据右移一次,即从DIG7 向DIG0 移动一位,然后最左边的DIG7 补进数据00H。
例如,在数码管DIG7~DIG0 显示“87654321”时,执行字数据右移命令,显示变为“ 8765432”(不译码方式)或者“08765432”(BCD 译码方式)。
5>字数据左循环:001100000001B字数据左循环命令将CH451 的字数据左循环一次,即从DIG0 向DIG7 移动一位,然后最右边的DIG0 补进原DIG7 的数据。
例如,在数码管DIG7~DIG0 显示“87654321”时,执行字数据左循环命令,显示变为“76543218”。
6>字数据右循环:001100000011B字数据右循环命令将CH451 的字数据右循环一次,即从DIG7 向DIG0 移动一位,然后最左边的DIG7 补进原DIG0 的数据。
例如,在数码管DIG7~DIG0 显示“87654321”时,执行字数据右循环命令,显示变为“18765432”。
7>设定系统参数:010000000[WDOG][KEYB][DISP]B设定系统参数命令用于设定CH451 的系统级参数:看门狗使能WDOG,键盘扫描使能KEYB,显示驱动使能DISP。
各个参数均通过1 位数据控制,将相应的数据位置为1 则启用该功能,否则关闭该功能(默认值)。
例如,命令数据010*********B 表示启用看门狗的功能、关闭键盘扫描的功能、启用显示扫描驱动的功能。
8>设定显示参数:0101[MODE][LIMIT][INTENSITY]B设定显示参数命令用于设定CH451 的显示参数:译码方式MODE,扫描极限LIMIT,显示亮度INTENSITY。
译码方式MODE 通过1 位数据控制,置1 时选择BCD 译码方式,置0 时选择不译码方式(默认值)。
扫描极限LIMIT 通过3 位数据控制,数据001B~111B 和000B 分别设定扫描极限为1~7 和8(默认值)。
显示亮度INTENSITY 通过4 位数据控制,数据0001B~1111B 和0000B 分别设定显示驱动占空比为1/16~15/16 和16/16(默认值)。
例如,命令数据010*********B 表示选择不译码方式、扫描极限为7、显示驱动占空比为16/16;命令数据010*********B 表示选择BCD 译码方式、扫描极限为8、显示驱动占空比为10/16。
9>设定闪烁控制:0110[D7S][D6S][D5S][D4S][D3S][D2S][D1S][D0S]B设定闪烁控制命令用于设定CH451 的闪烁显示属性:D7S~D0S 分别对应于8 个字驱动DIG7~DIG0。
闪烁属性D7S~D0S 分别通过1 位数据控制,将相应的数据位置为1 则使能闪烁显示,否则为正常显示,不闪烁(默认值)。
例如,命令数据011000100001B 表示设定数码管DIG5 和DIG0 闪烁显示,其余数码管正常显示,不闪烁。
10>加载字数据:1[DIG_ADDR][DIG_DATA]B加载字数据命令用于将字数据DIG_DATA 写入DIG_ADDR 指定地址的数据寄存器中。
DIG_ADDR 通过3 位数据指定数据寄存器的地址,数据000B~111B 分别指定地址0~7,对应于DIG0~DIG7 引脚驱动的8 个数码管。
DIG_DATA 是8 位的字数据。
例如,命令数据100001111001B 表示将字数据79H 写入第1 个数据寄存器,如果是不译码方式,则DIG0引脚驱动的数码管将显示E;命令数据110010001000B 表示将字数据88H 写入第5 个数据寄存器,如果是BCD 译码方式,则DIG4 引脚驱动的数码管将显示8.11>读取按键代码:0111XXXXXXXXB读取按键代码命令用于获得CH451 最近检测到的有效按键的按键代码。
该命令是唯一的具有数据返回的命令,CH451 从DOUT 引脚输出按键代码,按键代码总是7 位数据,最高位是状态码,位5~位0 是扫描码。
读取按键代码命令的位数据B0~B7 可以是任意值,所以控制器可以将该操作命令缩短为4 位数据B8~B11。
例如,CH451 检测到有效按键并中断,按键代码是5EH,简化描述1^1^1^0^↑H^L^H^H^H^H^L^表示先向CH451 发出读取按键代码命令0111XXXXXXXXB,然后从DOUT 获得按键代码5EH。
CH451BCD 码译码表2.2实验步骤:2.2.1硬件连接:CPU 89S52 CH451 J5_89S52 P34 P15 P33 P32 J23_CH451 LOAD DCLK DIN DOUT将并口线插在实验板与 PC 机的并口插座上;按上图连接实验线路;仔细检查无误后,接通电源。
(图中箭头表示需要接线的地方)电路板连接实物图2.2.2软件设计:进入 KEILC 环境编写程序。
89S52 首先向DIN 发送一个上升沿,通知CH451 数据线使能,然后89S52 发送010*********,010*********,通知CH451 打开键盘扫描功能,开启显示功能,选择BCD 译码方式,在就可以向每个显示寄存器送入要显示的数据。
例如:八个数码管全显示“8”时送入的二进制数据为:100000001000;100100001000;101000001000;101100001000;110000001000;110100001000;111000001000;111100001000;打开 89S52 的外部中断1,并设置为下降沿中断方式,当KEY1-KEY5任一键按下时,CH451的DOUT 脚会产生一个下降沿,这时89S52 便会产生一个中断,并进入中断程序。
中断程序中,应首先关闭中断,然后向CH451 发送读键值指令(0111),读取键值。