本設(shè)計(jì)是實(shí)現(xiàn)一個(gè)有加、減、乘、除、計(jì)算功能的多功能計(jì)算器。它的硬件主要由四部分組成,一個(gè)STC89C52單片機(jī)芯片,一塊LCD1602液晶顯示器,一個(gè)4*4的鍵盤。采用STC89C52單片機(jī)為主要控制電路,然后使用液晶顯示管顯示數(shù)據(jù),利用4*4矩陣鍵盤加上一些功能鍵完成電路的輸入操作部分。電路比較簡單,但是很實(shí)用方便。
要求:
1) 采用LCD1602液晶屏顯示
2) 4*4鍵盤來輸入數(shù)據(jù)。
3) 能夠進(jìn)行小數(shù)運(yùn)算。
4) 可以計(jì)算不超過13位數(shù)的加減乘除。
#include <stdlib.h> //包含atof(),字符串->實(shí)數(shù)
#include <stdio.h> //包含sprintf(),實(shí)數(shù)->字符串
#include <string.h> //包含strcpy(),字符串復(fù)制
#include <math.h> //數(shù)學(xué)函數(shù)頭文件
#define uchar unsigned char
#define uint unsigned int
//sbit choose=P3^4; //時(shí)鐘和計(jì)算器選擇鍵
/*************lcd****************/
sbit lcdrs=P2^7; //LCD控制腳
sbit lcdrw=P2^6;
sbit lcden=P2^5;
bit idata form; //lcd顯示方式切換
uchar idata state; //lcd狀態(tài)字存儲(chǔ)
/************計(jì)算器*************/
//sbit reset=P3^0; //計(jì)算器復(fù)位
//sbit back=P3^1; //撤銷上次鍵入鍵
//sbit save=P3^2; //存儲(chǔ)鍵,存儲(chǔ)有上次的結(jié)果和另外某次計(jì)算值
bit idata eqsign; //按等號(hào)標(biāo)志
bit idata press; //鍵按標(biāo)志
bit idata savesign; //可存儲(chǔ)結(jié)果標(biāo)志
bit idata sc; //復(fù)用標(biāo)志
uchar idata process[30],proc; //記憶計(jì)算過程,以便錯(cuò)誤恢復(fù)和撤銷輸入
uchar idata continu=0; //連續(xù)計(jì)算運(yùn)算符號(hào)存儲(chǔ)
uchar idata pai[2][2]; //π 前有數(shù)據(jù)標(biāo)志
uchar idata ferror; //計(jì)算檢錯(cuò)標(biāo)志
uchar idata ywei; //屏幕移位
uchar idata count=0; //輸入計(jì)數(shù)
uchar idata count_num=0; //組號(hào)計(jì)數(shù)
uchar idata result[15]; //計(jì)算結(jié)果立存,save
//uchar idata saveresult[15];//存儲(chǔ)結(jié)果數(shù)組, sc+save
uchar idata jieguo[15]; //結(jié)果字符串
uchar idata bdate[2][14]; //待計(jì)算字符串二維組
uchar idata on_symbol; //運(yùn)算符號(hào)
uchar idata fsym[2]; //函數(shù)前符號(hào)
uchar idata ssym[2]; //存儲(chǔ)組前符號(hào)
uchar idata bfun[2]; //計(jì)算值調(diào)用函數(shù)選擇
uchar idata futojiao[2]; //幅度 to 角度變換
double idata date[2]; //計(jì)算值雙精度變量組
double idata resultdate; //雙精度結(jié)果值
/***************時(shí)鐘****************/
sbit stime=P3^3; //時(shí)間設(shè)置鍵,同時(shí)用于計(jì)算器模式的復(fù)用鍵
uchar idata ms50=0; //時(shí)間調(diào)節(jié)變量
uchar idata s=0; //秒
uchar idata m=0; //分
uchar idata h=0; //小時(shí)
/******************函數(shù)聲明**********************/
/***************延時(shí)******************/
void delay(uchar z);
/*************lcd寫命令***************/
void write_com(uchar com);
/*************lcd寫數(shù)據(jù)***************/
void write_date(uchar date);
/*************lcd讀狀態(tài)***************/
void read_date(void);
/*************lcd寫字符串*************/
void write_str(uchar *str);
/************液晶初始化***************/
void init(void );
/**************鍵盤掃描***************/
uchar keyscan(void);
/*************計(jì)算器復(fù)位**************/
void fuwei();
/************error處理****************/
void callerror(void);
/***************撤銷鍵入**************/
void huifu(void);
/**********函數(shù)組前符號(hào)處理***********/
uchar funqian(void);
/************運(yùn)算符預(yù)處理*************/
void cullars(uchar);
/***********輸出存儲(chǔ)數(shù)據(jù)預(yù)處理********/
char memory(void);
/***********按鍵功能主處理************/
void process_date(uchar press_date);
/***********按鍵功能子處理************/
void calculator(uchar press_date);
/************************************************/
/*************LCD程序****************/
/**************延時(shí)******************/
void delay(uchar z) //0.2 ms
{
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;
}
/*************寫數(shù)據(jù)******************/
void write_date(uchar date)
{
lcdrs=1;
lcdrw=0;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*************讀AC 地址*****************/
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]!='?';i++)
write_date(str[i]);
}
/***********液晶初始化***************/
void init(void )
{
write_com(0x38); //模式:8位數(shù)據(jù),兩行,5*7字體
write_com(0x0c); //開顯示,無光標(biāo)
write_com(0x06); //向左增量移動(dòng)
write_com(0x01); //清屏
}
/**************鍵盤掃描*************/
uchar keyscan(void) //按行掃描,有鍵按下則返回鍵符號(hào),否則返回null
{ uchar idata key0,key1,keyment=0;
P1=0Xef; //行1
key0=P1;
key0=key0&0x0f;
key1=key0;
if(key0!=0x0f)
{
delay(5); //鍵抖動(dòng)處理
P1=0Xef;
key0=P1;
key0=key0&0x0f;
if(key0==key1)
{
switch(key0)
{
資料借鑒于此紛傳
閱讀全文