数码显示及键盘实验
【实验内容】
1、数码管显示0-7 2、按键识别
【需要了解的知识】
1、GPIO设定
2、数码管动态扫描显示原理,键盘扫描工作原理,输入与输出及其处理
【实验预习】
仔细预读实验指导电子文档的实验六、七及其前面的实验流程
【实验设备】
Keil C51软件、ICE52 仿真驱动、MEFlash编程软件、USB驱动程序
【实验过程】
实验一 数码管显示0-7
实验任务:
1)先将“0-7”数码管的段码值写入存储器中,使8位数码管从右至左显示0-7.
实验步骤:
1)首先在硬盘上建立一个文件夹; 2)启动Keil C51软件;
3)执行Keil C51软件的菜单“Project|New Project„„”,弹出一个名为“Create New Project”的对话框。输入工程文件名,选择保存路径uv2后缀,点击“保存”按钮;
4)紧接着弹出“Options for Target‘Target 1’”,为刚才的项目选择ATMEL的ATS52的CPU。选择之后,点击“确定”按钮;
5)接下来弹出一个对话框提示你是否要把标准8051的启动代码添加项目中去,此时,点击“否”按钮;
6)执行 菜单“File|New„„”,出现一个名为“Text1”的文档。接着执行菜单“File|Save”弹出一个名为“Save As”的对话框,将文件名改为“.asm”后缀,然后保存;
7)添加源程序文件到工程中,一个空的源程序文件建成。单击Keil C51软件左边项目工作窗口“Target1”上的“+”,将其展开。然后右击“Source Group1”文件夹弹出下拉菜单,单击其中的“Add Files to Group‘Source Group1’”项;
8)在弹出的对话框中先选择文件类型为“Asm Source file(*.s*;*.src;*.a*)”,这时对话框内创建的空的源程序文件已经出现在项目工作窗口的“Source Group1”文件夹中; 输入源程序代码;
9)点击工具栏“Options for target”按钮,弹出一个对话框,定义“Xtal”为11.0592.下面依序是存储模式、程序空间大小等设置,均用默认值即可。点击Output选项,选中“Create Hex File”,
10)单击编译按钮,编译当前源程序; 11)运行。
12)将JP21的8个短接子用短接帽短接,使数码管的位控制线与P2端口接通。
13)将JP22的9个短接子用短接帽短接,使数码管的位控制线与P0端口接通,并使VCC向数码管接口电路供电。
14)将JP24的OFF端用短接帽短接,禁止LCD1602显示功能,否则数码管将不能正常显示。
程序设计:
数码管显示的编程方法:
1)先准备好要显示的数据,放入相应的显示存储单元中。 2)根据要使用的数码管的具体位置来确定扫描初值和扫描方向。
3)根据使用数码管的个数来确定扫描的位数。
4)查表要将显示的数据转换为能使数码管正确显示相对应的段码。 5)分时送段码和位码,数码管开始循环显示。
试验流程图:
汇编源程序:
DISSTART EQU 40H LED_DATA EQU P0 ORG 0000H AJMP MAIN
ORG 0050H
MAIN: MOV SP,#60H
MOV P0,#0FFH
;显示单元首地址 ;数码管数据口定义 ;初始化 ;跳转到主函数
;初始化
;设置堆栈指针
;初始化
MOV P2,#0FFH MOV R2,#08H
;初始化
;8组数据
MOV R0,#DISSTART
MOV R1,#00H
MAIN1: MOV A,R1 MOV @R0,A INC R1 INC R2
DJNZ R2,MAIN1
LOOP: ACALL PLAY
SJMP LOOP
PLAY:
MOV R0,#DISSTART MOV R1,#0FEH
MOV R2,#08H
DISP1: MOV A,@R0
MOV DPTR,#TAB_NU MOVC A,@A+DPTR MOV LED_DATA,A MOV P2,R1 MOV A,R1
RL A MOV R1,A INC R0
ACALL DELAY
;显示存储单元首地址 ;初始化
;将0-7分别存入累加器A ;将0-7分别存入显示存储单元;R1自增1 ;R2自增1
;若不按键则跳转回到MAIN1
;循环显示
;不长按键则转移到LOOP ;显示子程序 ;获得显示单元首地址 ;位码初始值 ;有8位数码管显示
;取要显示的数据 ;置段码表首址 ;根据数据查段码表 ;段码输出 ;位码输出
;准备下一次显示的位码
;保存位码
;取下一个显存单元地址 ;调用延时
DJNZ R2,DISP1 MOV P2,#0FFH RET
;8位数码管是否显示完 ;关闭显示 ;显示完成返回 ;1ms延时子程序
DELAY:
MOV R6,#5
DEL1:
MOV R7,#93
DEL2:
DJNZ R7,DEL2 DJNZ R6,DEL1 RET
;断码表
;第一层循环 ;第二层循环
TAB_NU:
END
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H DB 090H,088H,083H,0C6H,0A1H,086H,08EH,0FFH
;结束
实验结果:
将“0-7”数码管的段码值写入存储器中,8位数码管从右至左显示0-7.
问题解决及讨论:
1)没有正确加载烧写文件。必须是先选芯片在加载文件
2)芯片型号没有选择正确。可重新选择型号
3)没有放置芯片。先放芯片,再压下锁紧座手柄锁紧 4)芯片损坏。换新的芯片重试
5)仔细输入汇编源程序,最好是新建txt文档后先更改扩展名为asm再输入源程序,否则可能无法编译
分析讨论:
经过这次试验,我发现我们在做实验时要有足够的细心和耐心,如果发现程序无法运行要认真寻找发现错误。比如这次,我输入汇编源程序时新建txt文档后没有直接更改扩展名为asm而是直接输入源程序,之后再更改扩展名最终造成程序无法编译,直接原因是在txt文档中输入时多输入了部分空格。经过这次教训,我以后一定会更加仔细的。
实验二 按键识别
实验任务:
当有键按下,对应的LED灯亮。 K1-K8对应P0端口的LED D00-D07 K1键按下后,D00亮
......
K8键按下后,D07亮
在确认有按键按下是,蜂鸣器会响一声
实验步骤:
1)首先在硬盘上建立一个文件夹; 2)启动Keil C51软件;
3)执行Keil C51软件的菜单“Project|New Project„„”,弹出一个名为“Create New Project”的对话框。输入工程文件名,选择保存路径uv2后缀,点击“保存”按钮;
4)紧接着弹出“Options for Target‘Target 1’”,为刚才的项目选择ATMEL的ATS52的CPU。选择之后,点击“确定”按钮;
5)接下来弹出一个对话框提示你是否要把标准8051的启动代码添加项目中去,此时,点击“否”按钮;
6)执行 菜单“File|New„„”,出现一个名为“Text1”的文档。接着执行菜单“File|Save”弹出一个名为“Save As”的对话框,将文件名改为“.asm”后缀,然后保存;
7)添加源程序文件到工程中,一个空的源程序文件建成。单击Keil C51软件左边项目工作窗口“Target1”上的“+”,将其展开。然后右击“Source Group1”文件夹弹出下拉菜单,单击其中的“Add Files to Group‘Source Group1’”项;
8)在弹出的对话框中先选择文件类型为“Asm Source file(*.s*;*.src;*.a*)”,这时对话框内创建的空的源程序文件已经出现在项目工作窗口的“Source Group1”文件夹中; 输入源程序代码;
9)点击工具栏“Options for target”按钮,弹出一个对话框,定义“Xtal”为11.0592.下面依序是存储模式、程序空间大小等设置,均用默认值即可。点击Output选项,选中“Create Hex File”,
10)单击编译按钮,编译当前源程序; 11)运行; 12)将JP8的8个短接子全部用短接帽短接,使按键与相应的端口接通; 13)将JP9的VCC-VCC3短接子用短接帽短接,使VCC向发光二极管D00-D07供电;
14)将JP15短接子用短接帽短接,使蜂鸣器接口电路工作使能; 15)如果PS2接口插了键盘,请拔下键盘插头或取下JP12上的短接帽
程序流程图:
汇编源程序:
BEEP BIT P3.7 ORG 0000H AJMP MAIN ORG 0050H
MAIN:
MOV SP,#60H
MOV P2,#0FFH
LOOP0: MOV P0,#0FFH MOV P1,#0FFH MOV P3,#0FFH ACALL SCANKEY
CJNE A,#0FFH,LOOP1
AJMP LOOP0
LOOP1: MOV R5,#2
ACALL DELAY ACALL SCANKEY
CJNE A,#0FFH,LOOP2
AJMP LOOP0
LOOP2: MOV P0,A
ACALL BEEP_BL
AJMP LOOP0
SCANKEY:
;初始化 ;跳转到主函数 ;初始化
;主函数 ;设置堆栈指针 ;初始化
;关闭所有LED显示;为输入状态 ;初始化 ;第一次判键 ;
;绝对转移到LOOP0
;延时20ms ;延时 ;第二次判键 ;
;跳转到LOOP0
;键值送显示 ;响应蜂鸣器程序 ;跳转到LOOP0 ;键盘扫描子程序
MOV P1,#0FFH MOV P3,#0FFH
MOV R0,P1 MOV R1,P3
MOV A,R0 ANL A,#0F0H SWAP A
MOV R0,A
MOV A,R1 RL A
RL A
ANL A,#0F0H ORL A,R0
RET
BEEP_BL:
MOV R6,#200
BL1: ACALL BL2 CPL BEEP
DJNZ R6,BL1 SETB BEEP MOV R5,#15
ACALL DELAY
RET
BL2:
MOV R7,#220
;为输入状态 ;为输入状态
;读P1端口 ;读P3端口
;读取P1端口
;保留高四位
;低四位与高四位互换 ;低四位为有效位(K1-K4)
;读取P3端口 ;左移两次
;高四位为有效位(K5-K8) ;重新组合,键值保存在A ;返回
;蜂鸣器响一声子程序
;跳转到BL2
;蜂鸣器取反产生驱动脉冲 ;R6减1,非零则跳转到BL1 ;关闭蜂鸣器
;延时150ms,防止键连击 ;跳转到延时子程序 ;返回
BL3:
NOP
DJNZ R7,BL3 RET
;寄存器R7减1,非零则跳转到BL3 ;返回
;延时子程序,延时R5*10ms
DELAY:
MOV R6,#50
DEL1:
MOV R7,#93
DEL2:
END
;结束
DJNZ R7,DEL2 DJNZ R6,DEL1 DJNZ R5,DELAY RET
;寄存器R7减1,非零则跳转到DEL2 ;寄存器R6减1,非零则跳转到DEL1 ;寄存器R5减1,非零则跳转到DELAY ;返回
实验结果:
当有键按下,对应的LED灯亮。 K1-K8对应P0端口的LED D00-D07 K1键按下后,D00亮
......
K8键按下后,D07亮
在确认有按键按下是,蜂鸣器会响一声
问题及解决:
1)没有正确加载烧写文件。必须是先选芯片在加载文件
2)芯片型号没有选择正确。可重新选择型号
3)没有放置芯片。先放芯片,再压下锁紧座手柄锁紧 4)芯片损坏。换新的芯片重试
5)仔细输入汇编源程序,最好是新建txt文档后先更改扩展名为asm再输入源程序,否则可能无法编译
分析讨论:
经过这次试验,我发现我们在做实验时要有足够的细心和耐心,如果发现程序无法运行要认真寻找发现错误。比如这次,我输入汇编源程序时新建txt文档后没有直接更改扩展名为asm而是直接输入源程序,之后再更改扩展名最终造成程序无法编译,直接原因是在txt文档中输入时多输入了部分空格。经过这次教训,我以后一定会更加仔细的。