计算器
带小数点计算器
1、本设计是实现一个有加、减、乘、除、计算功能的多功能计算器。它的硬件主要由四部分组成,一个STC89C52单片机芯片,一块LCD1602液晶显示器,一个4X4的键盘。采用STC89C52单片机为主要控制电路,然后使用液晶显示管显示数据,利用44矩阵键盘加上一些功能键完成电路的输入操作部分。电路比较简单,但是很实用方便。 2、本设计拟实现的性能指标如下: (1) 采用LCD1602液晶屏显示 (2) 44键盘来输入数据。 (3) 能够进行小数运算。 (4) 可以计算不超过13位数的加减乘除。
LCD显示模块 LCD1602是一种工业字符型液晶,能够同时显示16x02 即32个字符。(16列2行)。在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单。 在单片机系统中应用晶液显示器作为输出器件有以下几个优点: 由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。 液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。 液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。 相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。 (1)引脚说明: 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平 R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。
硬件电路设计
显示电路设计 当系统需要显示少量数据时,采用LCD液晶显示屏进行显示是一种经济实用的方法。P0口作为液晶显示的数据端口,P3.5-P3.7口作为其控制端口,控制LCD液晶显示屏显示输出数据。电路如图: LCD液晶显示屏显示 键盘电路的设计 键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。通用计算机使用的标准键盘就是编码键盘。在智能仪器中,使用并行接口芯片8279或串行接口芯片HD7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可在芯片资料中得到。当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。非编码键盘成本低廉。 从成本角度出发,本设计选用的是非编码键盘。 键盘电路接线图 源文件下载 链接: 源文件下载.
仿真图
代码
#include "reg52.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^7;
sbit lcdrw=P2^6;
sbit lcden=P2^5;
bit idata form;
uchar idata state;
bit idata eqsign;
bit idata press;
bit idata savesign;
bit idata sc;
uchar idata process[30],proc;
uchar idata continu=0;
uchar idata pai[2][2];
uchar idata ferror;
uchar idata ywei;
uchar idata count=0;
uchar idata count_num=0;
uchar idata result[15];
uchar idata jieguo[15];
uchar idata bdate[2][14];
uchar idata on_symbol;
uchar idata fsym[2];
uchar idata ssym[2];
uchar idata bfun[2];
uchar idata futojiao[2];
double idata date[2];
double idata resultdate;
sbit stime=P3^3;
uchar idata ms50=0;
uchar idata s=0;
uchar idata m=0;
uchar idata h=0;
void delay(uchar z);
void write_com(uchar com);
void write_date(uchar date);
void read_date(void);
void write_str(uchar *str);
void init(void );
uchar keyscan(void);
void fuwei();
void callerror(void);
void huifu(void);
uchar funqian(void);
void cullars(uchar);
char memory(void);
void process_date(uchar press_date);
void calculator(uchar press_date);
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
lcdrw=0;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void read_date(void)
{
lcdrs=0;
lcdrw=1;
delay(5);
P0=0xff;
lcden=1;
delay(5);
state=P0;
delay(5);
lcden=0;delay(5);
state=state&127;
}
void write_str(uchar *str)
{
uchar idata i;
for(i=0;str[i]!='\0';i++)
write_date(str[i]);
}
void init(void )
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
uchar keyscan(void)
{ uchar idata key0,key1,keyment=0;
P1=0Xef;
key0=P1;
key0=key0&0x0f;
key1=key0;
if(key0!=0x0f)
{
delay(5);
P1=0Xef;
key0=P1;
key0=key0&0x0f;
if(key0==key1)
{
switch(key0)
{
case 0x0e:keyment='7';break;
case 0x0d:keyment='8';break;
case 0x0b:keyment='9';break;
case 0x07:keyment=0xfd;break;
}
while(key0!=0x0f)
{
key0=P1;
key0=key0&0x0f;
}
press=1;
return(keyment);
}
}
P1=0Xdf;
key0=P1;
key0=key0&0x0f;
key1=key0;
if(key0!=0x0f)
{
delay(5);
P1=0Xdf;
key0=P1;
key0=key0&0x0f;
if(key0==key1)
{
switch(key0)
{
case 0x0e:keyment='4';break;
case 0x0d:keyment='5';break;
case 0x0b:keyment='6';break;
case 0x07:keyment='*';break;
}
while(key0!=0x0f)
{
key0=P1;
key0=key0&0x0f;
}
press=1;
return(keyment);
}
}
P1=0Xbf;
key0=P1;
key0=key0&0x0f;
key1=key0;
if(key0!=0x0f)
{
delay(5);
P1=0Xbf;
key0=P1;
key0=key0&0x0f;
if(key0==key1)
{
switch(key0)
{
case 0x0e:keyment='1';break;
case 0x0d:keyment='2';break;
case 0x0b:keyment='3';break;
case 0x07:keyment='-';break;
}
while(key0!=0x0f)
{
key0=P1;
key0=key0&0x0f;
}
press=1;
return(keyment) ;
}
}
P1=0X7f;
key0=P1;
key0=key0&0x0f;
key1=key0;
if(key0!=0x0f)
{
delay(5);
P1=0X7f;
key0=P1;
key0=key0&0x0f;
if(key0==key1)
{
switch(key0)
{
case 0x0e:keyment='.';break;
case 0x0d:keyment='0';break;
case 0x0b:keyment='=';break;
case 0x07:keyment='+';break;
}
while(key0!=0x0f)
{
key0=P1;
key0=key0&0x0f;
}
press=1;
return(keyment);
}
}
else return(0);
}
void fuwei()
{ uchar idata j,i;
write_com(0x0f);
write_com(0x01);
write_com(0x81);
resultdate=0;
for(i=0;i<2;i++)
{ date[i]=0;bfun[i]=0;pai[0][i]=0;pai[1][i]=0;fsym[i]=0;futojiao[i]=0;
for(j=0;j<14;j++)
{
bdate[i][j]='\0';
}
}
count=0;
count_num=0;
proc=0;
ferror=0;
eqsign=0;
sc=0;
savesign=0;
ywei=0;
press=0;
on_symbol=0;
}
void callerror(void)
{ uchar idata i;
write_com(0x01);
write_com(0x81);
write_str(" error! ");
for(i=0;i<200;i++)delay(25);
}
void cullars(uchar csym)
{ read_date();
ferror++;
continu=csym;
if(ferror==2&&state<0x43){callerror();huifu();return;}
if(ferror==2&&state>0x42)
{
press=1;
process_date('=');
press=1;
process_date('m');
ferror=1;
if(continu=='^'||continu=='%'){process[proc]='h';
proc++;process[proc]=continu;proc++;}
else{process[proc]=continu;proc++;}
}
if(continu=='%'){write_str(" f");}else write_date(' ');
write_date(continu);
ywei=0;
savesign=0;
count_num=1;
count=0;
on_symbol=continu;
write_com(0xc2);
return;
}
char memory(void)
{ if((bdate[count_num][0]=='+'||bdate[count_num][0]=='-')&&count==1)
{
ssym[count_num]=bdate[count_num][0];
bdate[count_num][0]='\0';
bdate[count_num][1]='\0';
count=0;
}
if(bdate[count_num][0]!='\0'){callerror();huifu();return(1);}
return(0);
}
void process_date(uchar press_date)
{
if(form==0){write_com(0x0f);form=1;}
if(eqsign==1&&press==1)fuwei();
press=0;
if(press_date=='c'){huifu();press_date=0;}
if(press_date==0)return;
process[proc]=press_date;
proc++;
calculator(press_date);
return;
}
void calculator(uchar press_date)
{
uchar idata j=0;
if((press_date<='9'&&press_date>='0')||(press_date=='.'))
{ savesign=0;
if(sc==0)
{
if(count<14-ywei)
{
write_date(press_date);
bdate[count_num][count]=press_date;
count++;
}
else {callerror();huifu();}
}
}
else if(press_date=='m')
{
if(memory()==1)return;
for(j=0;result[j]!='\0';j++)write_date(result[j]);
strcpy(bdate[count_num],result);
savesign=1;
count=14;
}
else if((press_date=='+')||(press_date=='-'))
{
if(count==0)
{
write_date(press_date);
bdate[count_num][0]=press_date;
bdate[count_num][1]='0';
read_date();
write_date('0');
write_com(state+0x81);
count=1;
}
else
{
cullars(press_date);
}
}
else if(press_date==0xfd)
{
if(sc==1)
{ if(count!=0)
{futojiao[count_num]=1;sc=0;write_date(0xDF);count=14;}
else {callerror();huifu();}
}
else cullars(press_date);
}
else if(press_date=='*')
{
cullars(press_date);
}
else if(press_date=='=')
{
write_com(0x01);
write_com(0x80+0x40+4);
write_date(press_date);
for(j=0;j<2;j++)
{
date[j]=atof(bdate[j]);
if(fsym[j]=='-')date[j]=-date[j];
}
if(ferror==0)
{ resultdate=date[0];}
else
{
switch(on_symbol)
{
case '+':resultdate=date[0]+date[1];break;
case '-':resultdate=date[0]-date[1];break;
case '*':resultdate=date[0]*date[1];break;
case 0xfd:resultdate=date[0]/date[1];break;
case '^':resultdate=pow(date[0],date[1]);break;
case '%':resultdate=fmod(date[0],date[1]);break;
}
}
sprintf(jieguo,"%g",resultdate);
if((jieguo[0]>'9'||jieguo[0]<'0')&&(jieguo[1]>'9'||jieguo[1]<'0')&&jieguo[1]!='\0'&&jieguo[1]!='.')
{ callerror();fuwei();return; }
else strcpy(result,jieguo);
for(j=0;jieguo[j]!='\0';j++)
write_date(jieguo[j]);
for(;j<15;j++)write_date(' ');
eqsign=1;
}
return;
}
void main()
{
fuwei();
init();
TH0=0x3c;
TL0=0xb7;
TMOD=0x1;
TR0=1;
ET0=1;
EA=1;
form=1;
proc=0;
write_com(0x81);
while(1)
{
process_date(keyscan());
}
}
源文件下载 链接: 源文件下载.
|