找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18996|回复: 1
打印 上一主题 下一主题
收起左侧

单片机入门课堂实例:数码管显示4x4矩阵键盘的键号(仿真+代码)

[复制链接]
跳转到指定楼层
楼主
目录
数码管显示4x4矩阵键盘的键号              2
摘要              2
    关键词              2
第一章 硬件              2
AT89C51              2
4*4键盘              6
第二章 软件              9
    KEIL4              9
   汇编程序              10
   Proteus              15
   仿真电路图              17
第三章 实物              17
   材料              17
   实物展示              18
课程设计心得              19
参考文献              20
摘要:1、设计要求:单片机的p1口的p1.0-p1.7连接4x4矩阵键盘,p0口控制一只数码管,当4x4矩阵键盘中的某一按键按下时,数码管上显示对应的键号。例如,1号键按下时,数码管显示“1”;九号键按下时,数码管显示“9”,等等。原理说明:本设计的关键点是如何进行键盘扫描,并计算出键号,然后把键号送数码管显示。

4*4矩阵式键盘       矩阵式键盘(或者叫行列式键盘)常应用在按键数量比较多的系统之中。这种键盘由行线和列线组成,按键设置在行、列结构的交叉点上,行、列线分别接在按键开关的两端。行列式键盘可分为非编码键盘和编码键盘两大类。编码键盘内部设有键盘编码器,被按下键的键号由键盘编码器直接给出,同时具有防抖和解决重键的功能。非编码键盘通常采用软件的方法,逐行逐列检查键盘状态,当有键按下时,通过计算或查表的方法获取该键的键值,通常,计算机通过程序控制对键盘扫描,从而获取键值,根据计算机扫描的方法可以分为定时扫描法和中断扫描法两种。  本系统中的4*4矩阵式键盘结构简单,按键数较少,采用非编码式键盘,当有键按下时,由单片机通过程序扫描确定键值,并将获得的键值通过LED数码管显示出来。键盘扫描原理 :本设计采用中断式扫描法,这样可以节约单片机开销,提高单片机工作效率,使得单片机在没有键盘输入时可以处理其他工作,其具体工作过程为:  在没有键按下时矩阵键盘行线接高电平,列线接低电平,当某个键被按下时,该按键所在行线电位被拉低,触发单片机的外部中断INT0,进入中断子程序,在中断程序中,单片机对矩阵键盘进行扫描以确定按下的键值,扫描过程如下:1、检测行线电平,确定是否有按键被按下;2、延时去抖动;  [7]3、重新确认是否有按键被按下,若有,扫描键值,若没有,返回主程序;4、扫描键值,首先行线接高电平,列线接低电平,对行线电平进行检测, 以确定按下的键所在的行; 5、行线接低电平,列线接高点平,对列线电平进行检测,确定按下的键所 在的列; 6、将扫描所得的按键值送入LED数码管显示。LED数码管 本设计中使用的是七段共阴极LED数码管。  如下图所示为七段共阴极LED显示器件的结构及外形图。七段LED显示器件就是将7个发光二极管按一定的方式组合在一起,如下图所示。下表给出了共阳极7段LED显示器件所能显示的部分字符与7段控制显示代码的对应关系  下表给出了共阳段LED显示器件所能显示的部分字符与7段控制显示代码的对应关系
显示字符
控制显示代码(十[8]六进制)
显示字符
控制显示代码(十六进制)
1
F9H
A
88H
2
A4H
B
83H
3
B0H
C
C6H
4
99H
D
A1H
5
92H
E
86H
6
82H
F
8EH
7
F8H
不显示
FFH
8
80H


9
90H


0
C0H


在本设计中,4*4键盘共有16个键,对其编号0~9,A~F,所以用一个7段数码管静态显示即可满足即时显示按键信息的要求。所谓静态显示,就是当显示器件显示某个字符时,相[9]应的显示段(发光二级管)恒定地导通或截止,直到显示另一个字符为止。这种显示方式显示一个字符时,只需要微处理器送一次代码,因此占用机时少,而且显示稳定可靠,其缺点是,使用元器件相对较多,且线路比较复杂,相对而言成本较高,比较适合显示位数较少的情况。第二章 软件部分KeilKeil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,并将这些部分组合在一起。其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。  系统概述  :Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。 Keil C51单片机软件开发系统的整体结构 C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目[10]标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。使用独立的Keil仿真器时,注意事项  仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。仿真器上的复位按钮只复位仿真芯片,不复位目标系统。  仿真芯片的31脚(/EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。

汇编程序如下:
scan_code EQU 30H
          ORG 0000H
                              JMP start
                              ORG 0030H
start:  
          MOV P0,#0FFH ;初始化p0口,使输出无显示
loop:                                                            ; 循环调用read—key获取键盘信息,若键盘按下,
         CALL read_[11]key              ; 则用R7返回键值信息
         CJNE R7,#0FFH,next              ; 若R7返回值不为0xff,则调用显示函数
                              JMP loop
next:                                                                          ;显示程序
          MOV A,R7
                              MOV DPTR,#disp_code
                            MOVC A,@A+DPTR
                              MOV P0,A
                              JMP loop
read_key:
          MOV scan_code,#7FH
                              MOV P1,#0FH
                              MOV A,P1
                              MOV R7,#0FFH
                            CJNE A,#0FH,wait_key   ;键盘按下则p1的值会改变
                              JMP end_key
wait_key:[12]
   CALL delay_10ms   ;延时10ms,若p1口仍右键按下,则跳到scan—key
                              MOV A,P1
                              MOV R7,#0FFH
                              MOV R6,#4
                            CJNE A,#0FH,scan_key
                              JMP end_key
scan_key:
          MOV P1,scan_code       ;将0x7f循环右移并赋给P1
                              MOV A,P1
                            CJNE A,scan_code,get_key;p1的值改变则确定出其行数
                               RR A
                              MOV scan_code,A
                            DJNZ R6,scan_key
                              JMP end_key
get_key:
   ;       MOV P1,#0FH
              ;                MOV R1,P1
              ;              CJNE R1,#0FH,$[13]
                              MOV R7,#4
get_key0:
          JNB ACC.0,add_r6;移位循环判断最低位,为0则确定其列数
                               RR A
                            DJNZ R7,get_key0
                              MOV R7,#0FFH
                              JMP end_key
add_r6:
    DEC R6 ;从第0个键盘数起,数满(R6-1)*4个键盘,再加上第R6行
              MOV A,R6      ;的列数R7-1,便得第几个键盘按下
                              MOV B,#4
                              MUL AB
                              DEC R7
                              ADD A,R7
                              MOV R7,A
end_key:
          RET[14]
delay_10ms:
          MOV R7,#10
delay0:
          MOV R6,#0FAH
delay1:
          NOP                                ;   1us
                              NOP                                          ;  1us
                            DJNZ R6,delay1              ; 2us+R6循环250次,延时250*4us
                            DJNZ R7,delay0                ;2us+R7循环10次,延时10*250*4us=10ms
                            RET
disp_code:
          DB 40H,79H,24H,30H
                              DB 19H,12H,02H,78H
                              DB 00H,18H,08H,03H
                              DB 46H,21H,06H,0EH
              END

使用Proteus 软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;在单片机课程设计和全国大学生电子设计竞赛中,我们使用 Proteus 开发环境对学生进行培训,在不需要硬件投入的条件下,学生普遍反映,对单片机的学习比单纯学习书本知识更容易接受,更容易提高。实践证明,在使用 Proteus 进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。因此,Proteus 有较高的推广利用价值。仿真电路图如下:第三章 实物材料:
材料名称
晶振
22pf电容
10uf电容
按键
C51芯片
芯片卡槽
数码管
USB接口
杜邦线
数量
1
2[18]
1
17
1
1
1
1
若干
实物展示:第四章  心得体会通过本次单片机课程设计,我不仅加深了对单片机理论知识的理解,学会了学以致用的重要性;而且还学会了如何去加强锻炼创新精神,同时也提高了自身的动手能力,让我深刻的意识到理论与实际结合的重要性。 在本次设计过程中,虽然设计的题目不是很难,但在实际操作过程当中也遇到了不少困难,通过遇到的困难[19]也让我不断地去查找资料,不断地询问同学,不断地去开动自己的脑子,从而也不断地超越自我,让自己的知识能够得到不断地完善;同时更重要的是,在这一设计过程当中,让我懂得了在学习的道路上会遇到很多的阻碍,但关键的是能做到坚持不懈,不轻易放弃;最终达到自己想要的目标。  单片机的学习对于我们专业来说非常的重要,通过本次设计也让我更加清晰了对专业的了解,理论知识再丰富,没有实际的操作经验也是不行的;本次设计也运用到了proteus仿真软件,由于之前没有学过该仿真软件,所以在操作的过程中遇到了很多困难,但庆幸的是通过不断的学习,对proteus软件也有了很大的了解,也学会了一些简单的操作,所以也让我意识到,如果你想学好,通过自己的努力就一定会学好。 当然在本次设计过程中,也遇到了很多的困难,比如很多关于单片机的基础知识学的不是很好。当然在设计过程中也少不了同学们的互相帮助,要是没有同学帮助的帮助,我想我一个人也不可能在短时间内完成设计要求;所以在此也要感谢在设计中给予我帮助的指导老师和同学们。

全部资料51hei下载地址:
数码管显示4x4矩阵键盘的键号.zip (149.2 KB, 下载次数: 122)
课设数码管显示4x4矩阵键盘的键号.doc (103 KB, 下载次数: 32)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:115923 发表于 2020-3-24 20:31 | 只看该作者
------------------------------------
P1.0 P1.1 P1.2 P1.3
p1.4 S1 S5 S9 S13
P1.5 S2 S6 S10 S14
P1.6 S3 S7 S11 S15
P1.7 S4 S8 S12 S16
------------------------------------
实现原理:
当高电平端口与低电平端口短接时,高电平端口会被拉成低电平
------------------------
算法分析:
1,检查是否有键按下:
P1=f0h (即0-3置1,4-7置0)
检查P1口是否是0F0H
是,则无键按下
否,则有键按下
2,扫描按下的键值:
循环(依次将4至7口单独置0)
检查0-3口是否有低电平端
确定被按下的键
返回键值
3,键盘防抖:
抖动原因:键按下时,会产生电压的波动,持续约10MS
去抖方法:10MS扫描一次,使前后两次均有键按下
********************************************************/
#include<ytc51.h>
uchar jps,ks; //键盘缓存
/*键盘扫描程序1,检查是否有按键*/
uchar keyfun()
{
uchar key_c;
P2 = P2 & 0x03;
P2 = P2 | 0x3c;
key_c = P2;
if((key_c & 0xfc) == 0x3c) return (0);
else return(1);
}
/*键盘扫描程序2,确定按键数值*/
uchar keyscan()
{
uchar i,k;
P2 = P2 & 0x03;
P2 = P2 | 0xbc;
if((P2 & 0x3c) != 0x3c)
{
i = 0;
k = (~P2) & 0x3c;
}
else
{
P2 = P2 & 0x03;
P2 = P2 | 0x7c;
if((P2 & 0x3c) != 0x3c)
{
i = 1;
k = (~P2) & 0x3c;
}
}
k = k>>3;
if( k==4 ) k=3;
k=i*4+k+1;
return(k);
}
/**********************************************************************
函数功能: 定时器中断函数(扫描键盘)(10ms 16位定时)
入口参数: 无
出口参数: 无
***********************************************************************/
void Time0_Func() interrupt 3 /*当定时器中断时执行此函数*/
{
TH1=(0xffff-9259)/256; /*T0初始化*/
TL1=(0xffff-9259)%256;
WR = 1;
if((ks == 0) && ( keyfun() ))
{
jps = keyscan();
}
ks = keyfun();
}
/**********************************************************************
函数功能: 上电初始化函数
入口参数: 无
出口参数: 无
***********************************************************************/
void Power_Up(void)
{
TMOD = 0x10;/*Time0/1为16计数器*/
TH1=(0xffff-9216)/256;/*10ms*/
TL1=(0xffff-9216)%256;/*10ms*/
TR1=1;
SCON = 0x00;//串口工作模式设置
IE=0x88; /*EA=1 ET1=1*/
P0=0xff;
P2=0xff;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表