单片机计算器设计说明书_第1页
单片机计算器设计说明书_第2页
单片机计算器设计说明书_第3页
单片机计算器设计说明书_第4页
单片机计算器设计说明书_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 摘 要一般情况下,在进行大量数据运算时,用计算器比手算正确率更高,速度更快。我此次就是利用单片机,LED显示器,键盘和伟福系统设计一个简单的计算器。实现加,减,乘,除,平方,根号等功能。目录第一章 概述3第二章 原理4第三章 原始程序8第四章 改进后的程序14第五章 地址计算20第六章 总结22参考文献23第一章 概 述一个计算器基本需要键盘实现输入功能,显示器实现显示功能。再经过单片机系统和正确的程序实现计算。LED显示器电路,键盘扫描电路。如下图所示: 本设计使用了6位8段LED显示器,它按程序要求显示输入数字和计算结果。本实验还用到一个6*4的小键盘,使用它输入数字和符号指令,它向列扫

2、描码地址输出低电平,然后从行码地址读回。 原程序实现了加减乘除,清零5项功能。改编后的程序增加了平方和开根号两项功能。第二章 原理1.LED显示器本设计使用了6位8段LED显示器,它按程序要求显示输入数字和计算结果为了显示字符,要为LED显示器提供显示断码,组成一个8字形字符7段,再加上一个小数点,共计8段。因此LED显示器的显示断码为一个字节。各断码位的对应关系如下:断码位D7D6D5D4D3D2D1D0显示段dpgfedcba本设计中采用共阴极方式。7段LED显示器字码如下:字符0123456789字符码0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6fLED

3、显示器有静态显示和动态显示两种控制方式。位数太多时,用静态显示所需I/O口太多,不经济。所以本设计中使用动态显示。即用扫描的方法一位一位轮流点亮显示器各位。2.键盘键盘是由6*4的开关矩阵,它是最简单的单片机输入设备,可以通过它输入数据或指令。实现简单的人机对话。可以通过延时的方法实现键盘的去抖动。而且为了实现功能多样化,需要采用编码键盘。键盘的硬件电路如下:3.程序流程图 先是对输入输出数字先是的程序流程图,如下: 总的计算流程图如下: 第三章 原程序 KEYLEDCS连接片选CS1所以位控制口地址0x9002, 段控制口地址地址0x9004,键盘读入口地址0x9001. 根据流程图所示编译

4、程序和注释如下:#define LEDLen 6#define PB1 2#define PB0 1xdata unsigned char OUTBIT _at_ 0x9002; / 位控制口xdata unsigned char OUTSEG _at_ 0x9004; / 段控制口xdata unsigned char IN _at_ 0x9001; / 键盘读入口unsigned char LEDBufLEDLen; / 显示缓冲unsigned char LEDMAP = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f

5、, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 / 八段管显示码;void Delay(unsigned char CNT) /延时程序 unsigned char i; while (CNT- !=0) for (i=100; i !=0; i-);void DisplayLED() unsigned char i; unsigned char Pos; unsigned char LED; Pos = 0x20;/ 从左边开始显示 for (i = 0; i = 1;/ 显示下一位 unsigned char KeyTable = 0x16, 0x15, 0x14

6、, 0xff, 0x13, 0x12, 0x11, 0x10, 0x0d, 0x0c, 0x0b, 0x0a, 0x0e, 0x03, 0x06, 0x09, 0x0f, 0x02, 0x05, 0x08, 0x00, 0x01, 0x04, 0x07;/ 键码定义unsigned char TestKey() OUTBIT = 0;/ 输出线置为0 return (IN & 0x0f);/ 读入键状态(高四位不用)unsigned char GetKey() unsigned char Pos; unsigned char i; unsigned char k; i = 6; Pos = 0

7、x20;/ 找出键所在列 do OUTBIT = Pos; Pos = 1; k = IN & 0x0f; while (-i != 0) & (k = 0);/ 键值 = 列 x 4 + 行 if (k != 0) i *= 4; if (k & 2) i += 1; else if (k & 4) i += 2; else if (k & 8) i += 3; OUTBIT = 0;do Delay(10); while (TestKey();/ 等键释放return(KeyTablei);/ 取出键码 else return(0xff);/* =*/#define ADD 0x0a#de

8、fine SUB 0x0b#define MUL 0x0c#define DIV 0x0d#define EQU 0x0e#define CLR 0x0f/功能键定义void DisplayResult(signed int Result)/数值显示方法 unsigned char i; if (Result = 0) / 数值大于0 / 不显示符号位 LEDBuf0 = 0; else / 在符号位显示 - LEDBuf0 = 0x40; Result = - Result; LEDBuf1 = 0; LEDBuf2 = 0; LEDBuf3 = 0; LEDBuf4 = 0; / 数值对1

9、0取模,所得结果为最低位 LEDBuf5 = LEDMAPResult % 10; Result = Result / 10; i = 4; / 如果数值除以10后不等于0,继续向高位显示 while (Result != 0) LEDBufi- = LEDMAPResult % 10; Result = Result / 10; void main() signed int Last, Result; unsigned char OP; unsigned char Key; Last = 0; Result = 0; OP = ADD; DisplayResult(Result); whil

10、e (1) while (!TestKey() DisplayLED(); / 读取键码 Key = GetKey(); if ( (Key = 0) & (Key = 9) ) / 是数字键 / 输入数值 Result = Result*10 + Key; / 数值送显示缓冲 DisplayResult(Result); else if (Key = CLR) / 是清零键 / 状态清零 Last = 0; Result = 0; OP = ADD; / 数值送显示缓冲 DisplayResult(Result); else if ( (Key=ADD) | (Key=SUB) | (Key

11、=MUL) | (Key=DIV) | (Key=EQU) ) / 是功能键 switch (OP) /上一按键是? case ADD: Result = Last + Result; break;/加法计算 case SUB: Result = Last - Result; break;/减法计算 case MUL: Result = Last * Result; break;/乘法计算 case DIV: Result = Last / Result; break;/除法计算 if (Key = EQU) / 功能键是= / 计算最后结果 Last = 0; OP = ADD; else

12、/ 是其它功能键 / 保存结果, 保存按键功能 Last = Result; OP = Key; / 计算值送显示缓冲, DisplayResult(Result); / 等待下一个数值输入. Result = 0; 以上程序实现了加减乘除和清零功能。上机实验后,调试执行,验证程序正确有效。第四章 改进的程序增加平方和开根号的功能:Result = Result* Result;Result = sqrt( Result);由于用到了开根号函数,所以需要增加#include 声明。改进后的程序输入电脑,连接实验箱调试改进。最后改进后的完整正确且有效的程序如下:#define LEDLen 6#

13、define PB1 2#define PB0 1#include xdata unsigned char OUTBIT _at_ 0x9002;xdata unsigned char OUTSEG _at_ 0x9004; / 段控制口xdata unsigned char IN _at_ 0x9001;unsigned char LEDBufLEDLen;unsigned char LEDMAP = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71;v

14、oid Delay(unsigned char CNT) unsigned char i; while (CNT- !=0) for (i=100; i !=0; i-);void DisplayLED() unsigned char i; unsigned char Pos; unsigned char LED; Pos = 0x20; for (i = 0; i = 1; unsigned char KeyTable = 0x16, 0x15, 0x14, 0xff, 0x13, 0x12, 0x11, 0x10, 0x0d, 0x0c, 0x0b, 0x0a, 0x0e, 0x03, 0

15、x06, 0x09, 0x0f, 0x02, 0x05, 0x08, 0x00, 0x01, 0x04, 0x07;unsigned char TestKey() OUTBIT = 0; return (IN & 0x0f);unsigned char GetKey() unsigned char Pos; unsigned char i; unsigned char k; i = 6; Pos = 0x20; do OUTBIT = Pos; Pos = 1; k = IN & 0x0f; while (-i != 0) & (k = 0); if (k != 0) i *= 4; if (

16、k & 2) i += 1; else if (k & 4) i += 2; else if (k & 8) i += 3; OUTBIT = 0; do Delay(10); while (TestKey(); return(KeyTablei); else return(0xff);/* =*/#define ADD 0x0a#define SUB 0x0b#define MUL 0x0c#define DIV 0x0d#define EQU 0x0e#define CLR 0x0f#define DEF 0x15#define ABC 0x16void DisplayResult(sig

17、ned int Result) unsigned char i; if (Result = 0) / 数值大于0 / 不显示符号位 LEDBuf0 = 0; else / 在符号位显示 - LEDBuf0 = 0x40; Result = - Result; LEDBuf1 = 0; LEDBuf2 = 0; LEDBuf3 = 0; LEDBuf4 = 0; / 数值对10取模,所得结果为最低位 LEDBuf5 = LEDMAPResult % 10; Result = Result / 10; i = 4; / 如果数值除以10后不等于0,继续向高位显示 while (Result !=

18、0) LEDBufi- = LEDMAPResult % 10; Result = Result / 10; void main() signed int Last, Result; unsigned char OP; unsigned char Key; Last = 0; Result = 0; OP = ADD; DisplayResult(Result); while (1) while (!TestKey() DisplayLED(); / 读取键码 Key = GetKey(); if ( (Key = 0) & (Key = 9) ) / 是数字键 / 输入数值 Result =

19、 Result*10 + Key; / 数值送显示缓冲 DisplayResult(Result); else if (Key = CLR) / 是清零键 / 状态清零 Last = 0; Result = 0; OP = ADD; / 数值送显示缓冲 DisplayResult(Result); else if ( (Key=ADD) | (Key=SUB) | (Key=MUL) | (Key=DIV) | (Key=EQU) | (Key=ABC) | (Key=DEF) / 是功能键 switch (OP) /上一按键是? case ADD: Result = Last + Resul

20、t; break; case SUB: Result = Last - Result; break; case MUL: Result = Last* Result; break; case DIV: Result = Last / Result; break; case ABC: Result = Result* Result; break; case DEF: Result = sqrt( Result); break; if (Key = EQU) / 功能键是= / 计算最后结果 Last = 0; OP = ADD; else / 是其它功能键 / 保存结果, 保存按键功能 Last = Result; OP = Key; / 计算值送显示缓冲, DisplayResult(Result); / 等待下一个数值输入. Result = 0; 第五章 地址计算KEYLEDCS连接片选CS1。所以位控制口地址0x9002, 段控制口地址地址0x9004,键盘读入口地址0x9001.有CS0,CS1,CS2,CS3,CS4,CS5,CS6,CS7八个片选端口。每个端口地址范围如下表:CS008000h-08fffhCS109000h-09fffhCS20a000h-0afffhCS30b000h

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论