本设计是以STC89C52单片机为核心的计算器模拟系统设计,输入采用5×8矩阵键盘,可以进行加、减、乘、除等十几种数字运算,同时支持括号的嵌套使用级浮点数的运算,并在LCD1602上显示操作过程。
本次设计注重设计方法及流程,首先根据原理设计电路,利用keil编程,借助实验开发平台进行仿真实验,进而利用altium designer 制作PCB,最后到焊接元器件,直至调试成功。在设计的同时,特别注重keil软件和altium designer软件的使用方法和技巧以及常用的LCD显示器和矩阵键盘的设计和使用方法。



单片机源程序如下:
#include #include #include #include #include sbit RS = P2^5; sbit RW = P2^6; sbit E = P2^7; #define Data P0//数据端口 //全局变量 float num1;//第一操作数num1 (初始为零) float num2;//第二操作数num2 (初始为零) char yun_flag='+';//运算符号 yun_flag (默认为+ ) char key_last;//上次按键状态标志 key_last char sqrt_flag;//开方键按下标志 sqrt_flag unsigned long pos_flag=1;//小数位权pos_flag (默认为1) char neg_flag;//正负标志 neg_flag char data c_num1[15]=" ";//c_num1 字符型第一操作数 (数组不定义大小与其他变量冲突) char data c_num2[15]=" ";//c_num2 字符型第二操作数 char error;//运算法则错误; char len;//小数点后位数 /* 微秒延时函数 */ /******************************************************************/ void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us>>1; /*12MHz频率*/ while(--uscnt); } /******************************************************************/ /* 毫秒函数声明 */ /******************************************************************/ void DelayMs(unsigned char ms) { while(--ms) { DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); } } /******************************************************************/ /* 写入命令函数 */ /******************************************************************/ void WriteCommand(unsigned char c) { DelayMs(5);//操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0; } /******************************************************************/ /* 写入数据函数 */ /******************************************************************/ void WriteData(unsigned char c) { DelayMs(5); //操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0; } /******************************************************************/ /* 写入字节函数 */ /******************************************************************/ void ShowChar(unsigned char pos,unsigned char c) { unsigned char p; if (pos>=0x10) p=pos+0xb0; //是第二行则命令代码高4位为0xc else p=pos+0x80; //是第二行则命令代码高4位为0x8 WriteCommand (p);//写命令 WriteData (c); //写数据 } /******************************************************************/ /* 写入字符串函数 */ /******************************************************************/ void ShowString (unsigned char line,char *ptr) { unsigned char l,i; l=line<<4; for (i=0;*(ptr+i)!='
