1、基于单片机的简易计算器设计 数控(卓越) 111 耿永 203110809 摘要: 按下键盘,通过键盘扫描程序,在 LCD 液晶显示屏上显示按键的操作过程,最终显示计算结果,实现计算器的基本功能。本文详细介绍 LCD 显示屏、矩阵键盘与 C51 单片机接口的应用,并介绍如何通过 C51 单片机实现计算器的算法。 关键字 : C51 单片机,键盘, LCD 液晶,计算器 一、设计任务: 本次实验是要以 51系列单片机为核心实现一个简易计算器,它的结构简单,外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块 STC90C51单片机构成,通过软件编程可实现简单加、减、乘、除、清除结果。 实现对
2、计算器的设计,具体设计如下: 1、采用 6位显示,最大显示值为“ 999999”,设计 16 个按键的矩阵键盘,按键包括 0 9、 +、 -、 *、 /、 =、 C。 2、加减法做四字节运算;乘法做双字节运算;除法被除数为四字节,除数为两字节。 3、当运算结果超出显示范围时,显示 ERROR!。 4、上述运算输入值均为整数,当结果带有小数时,可以采用四舍五入方式处理,也可以带小数显示。 二 、方案论证 经分析,计算器电路包括三 个部分:显示电路、 4*4键扫描电路、单片机微控制电路。具体如下: ) LCD显示电路 LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,
3、但是初学者往往要注意结合 LCD本身的时序图来完善初始化程序。又以其 微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点 ,故采用 LCD. ) 4*4键盘扫描电路 (中断式,扫描式,反转式 ) 用户设计行列键盘接口,一般常采用 3 种方法读取键值。一种是中断式,外两种是扫描法和反转法。 扫描法 : 对键盘上的某一行送低电平,其他行及列全 为高电平,然后读取列值,检查各列线点评的变化,如果某列线电平为低电平,就可以确定此行此列交叉点处的按键被按下,采用延时去抖动。 ) 单片机微控制电路 微控制电路就是以 AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。 三 硬件电路的设计
4、 3.1 硬件设计电路框图 线路原理框图 3.2、 系统模块图: 单片机运算模块显示模块输入模块LCD 显示 晶 振 电 路 51 系列单片 机 系统 4*4 键盘 复 位 电 路 四、键盘接口电路: 计算器输 入数字和其他功能按键要用到很多按键,矩阵键盘采用四条 I/O 线作为行线,四条 I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为 4 4个。这种行列式键盘结构能有效地提高单片机系统中 I/O 口的利用率。 矩阵键盘的工作原理: 计算器的键盘布局如图 1所示:一般有 16个键组成,在单片机中正好可以用一个 P口实现 16个按键功能,这种形式在单
5、片机系统中也最常用。 图 2 键盘接口电路图 五、 LCD 显示 LCD 显示器介绍 有字符型液晶显示模块( SMC1602A)和点阵式液晶显示模块( TCM12232A、 TCM12864N)下面以 SMC1602A 为例介绍字符型液晶显示模块的功能及应用。 (一)、字符型液晶显示模块的引脚及功能 在 1602 液晶内部有字模发生存储器 CGROM 及显示数据存储器 DDRAM。其中,字模发生存储器 CGROM 主要用来存储 192 个常用字符的字模编码,包含标准的 ASCII 码。DDRAM 是显示数据存储器共 80 个字节,分别对应 1602 液晶显示器的两行。第一行地址为0X00H0X
6、27H,共 40 个字节;第二行地址为 0X40H67H,共 40 个字节。 RAM 地址映像如下图: (二):字符型液晶显示模块的控制操作 RS R/W E DB0DB70 1 1 读出状态字1 1 1 读出数据引脚 符号 功能1 VSS 电源地2 VDD 电源正极3 Ve0 对比调整电压4 RS 0输入指令, 1输入数据5 R/W 0写入指令或数据, 1读取信息6 E 使能信号, 1读取数据,下降沿执行指令714 DB0DB7数据输入口15 BLA 背光电源正极16 BLK 背光电源负极在 1602 读 回的状态字中, D7 位为状态 BF,当 BF=1 时表示忙碌, 此时不能进行写操作。
7、当 BF=0 时表示状态为空闲,可以进行写操作。 ( 2)写操作: RS R/W E DB0 DB70 0 下降沿 输入指令1 0 下降沿 输入数据( 3) 初始化命令字 : a.工作方式设置指令 D7 D6 D5 D4 D3 D2 D1 D00 0 1 DL N F 0 0DL 设置与 MCU 的接口方式。 DL=1 表示数据宽度为 8 位, DB0 DB7 有效。 DL=0 表示数据宽度为 4 位, DB4DB7 有效。 N 设置显示字符行数。 N=0 表示显示一行字符, N=1 表示显示两行字符。 F 设置显示字符字体, 一般为 0。 F=0 表示显示 5X8 点阵字体, F=1 表示显
8、示 5X11 点整字体。 b.显示状态设置 D7 D6 D5 D4 D3 D2 D1 D00 0 0 0 1 D C BD 为画面显示状态位。 D=1 表示显示功能开, D=0 表示显示功能关。 C 为光标显示状态位。 C=1 表示有光标, C=0 表示无光标。 B 闪烁显示状态位。 B=1 表示光标闪烁, B=0 表示光标不闪烁。 c.输入方式设置指令 D7 D6 D5 D4 D3 D2 D1 D00 0 0 0 0 1 I/D S该指令的操作主要是设置显示字符的输入方式。即在操作数据写入 /读出 后, AC 数据地址指针的修改方式。 I/D=1 时, AC 为自动加一计数器, I/D=0
9、时, AC 为自动减一计数器。 S 设置写入字符时是否允许画面滚动。 S=1 时允许画面 /光标滚动, S=0 时禁止画面 /光标滚动。 d.光标或画面滚动设置指令 D7 D6 D5 D4 D3 D2 D1 D00 0 0 1 S/CR/L0 0S/C 滚动对象选择位。 S/C=1 时画面滚动, S/C=0 时光标滚动。 R/L 滚动方向选择位。 R/L=1 时向右滚动, R/L=0 时向左滚动。 e.清屏指令 D7 D6 D5 D4 D3 D2 D1 D00 0 0 0 0 0 0 1执行清屏指令后, DDRAM 内容为空白的 ASCII 码 20H,光标归位在 左上方,地址计数器 AC=0
10、. f.光标复位指令 D7 D6 D5 D4 D3 D2 D1 D00 0 0 0 0 0 1 0执行光标复位指令后, AC=0, DDRAM 中的值不变。 g.DDRAM 地址设置指令 D7 D6 D5 D4 D3 D2 D1 D01 A6 A5 A4 A3 A2 A1 A0当需要向某一地址中写入数据时,先写入地址,再写入数据。 程序图 Y N N 五、运算模块(单片机控制): MCS-51 单片机是在一块芯片中集成了 CPU、 RAM、 ROM、定时器 /计数器和多功能 I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器( CPU)、数据存储器( RA
11、M)、程序存储器( ROM/EPROM)、并行 I/O 口、串行口、定时器 /计数器、中断系统及特殊功能寄存器( SFR)。 单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。 开始 程序初始化 LCD 显示 有键输入 读键码 键码功能 数字键 输入键值 输入缓存 功能键 是“ =”? 执行计算 保存状态 保存结果,或执行功能 结果送入缓存 等待数值输出 Y Y 六:设计心得、体会、总结 我的题目简易计算器的设计,对于我们
12、这些实践中的新手来说,这是一次考验,怎样才能找到课堂所学与实际应用的最佳结合点?怎样让自己的计划更具有程序性,而不会忙无一用?这都需要我 们所要考虑和努力的。这次设计我学到了很多,在设计过程中怎样去克服心理上的不良情绪。不仅巩固了所学知识,而且学到了很多书上学不到的知识,掌握了一种系统的学习方法,可以进行一些简单的编程。这次设计使我懂得了理论与实际结合很重要,只有理论知识是远远不够的,从而提高自己的实际动手能力和独立思考的能力,同时在设计过程中发现自己的不足,加强巩固,有利于后续的单片机考试。 调试过程中也遇到了很多问题,例如,液晶显示明明定义了两行显示,但实际中却只有一行,最后竟查资料发现,
13、液晶内部自检时间比单片机慢,需要延时多定义,避免未 完成自检就执行指。 主要参考文献 单片机原理与接口技术 ,李升主编,北京大学 出版社, 2011 年 7 月 单片机原理及应用实验指导书,屈波等编, 2012 年 2月 25 日 微处理器综合实训系统模块化设计戴建 编 2012 年 2 月 单片机原理及应用,赵德安等编,机械工业出版社, 2009 年 附原理图 附:硬件设计电路的元件清单 器件名称 数量 AT89C51 1 按键 17 4k7x4 2 4k7x9 1 电容 22uF 1 LCD1602 1 晶振 12MHz 1 电容 30pF 2 电位器 103 1 附源代码 /*P1.0P
14、1.3 接行 *P1.4P1.7 接列 . * P0 接 LCD*/ #include #define uchar unsigned char uchar code dis1=“!rorre“;/后面使用倒序显示 uchar code dis2=“!rorre htam“; sbit busy=P07; sbit RS=P22; sbit RW=P21; sbit EN=P20; char i,j,temp,num; long a,b,c; uchar flag,fuhao; uchar code table= 7,8,9,0, 4,5,6,0, 1,2,3,0, 0,0,0,0 ; ucha
15、r code table1= 7,8,9,0x2f-0x30, 4,5,6,0x2a-0x30, 0x01-0x30,0,0x3d-0x30,0x2b-0x30 ; void delay(uchar z) /延时 uchar x,y; for(x=z;x0;x-) for(y=0;y125;y+); void ready() /忙检测 do P0=0xff; RS=0; RW=1; EN=0; delay(5); EN=1; while(busy=1); void write_com(uchar com) /写指令 P0=com; RS=0; RW=0; EN=0; ready(); EN=1
16、; delay(10); void write_data(uchar m) /写数据 P0=m; RS=1; RW=0; EN=0; ready(); EN=1; void inital() /初始化 EN=1; write_com(0x38); /【设置 LCD 为 16X2显示 ,5X7 点阵 ,八位数据接口】 delay(10); write_com(0x38); /【 LCD内检较单片机慢,为防止未完成内检就执行指令,延迟,再写指令以完成内检】 write_com(0x0c); /无光标 write_com(0x06); /光标后移 write_com(0x80); write_com(0x01); /清屏 i=0; j=0; a=0; /第一个参与运算的数 b=0; /第二个参与运算的数 c=0; flag=0; /flag 表示是否有符号键按下 fuhao=0; /fuhao 表征按下的是哪个符号 void keyscan() /键盘扫描程序