资源简介
基于51单片机和lcd1602的简易计算器的设计 源程序 其中也包括按键识别
代码片段和文件信息
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit rs=P1^5;
sbit lcdcs=P1^7;
sbit ledlk=P2^0;
sbit smglk=P2^1;
sbit smgbitlk=P2^2;
sbit rw=P1^6;
uchar code table[]={“0123456789+-*/=“};
uchar numktempnsymbolk1numzx3;
ulong numxnumynumend;
uchar tableinput[8];
uchar tableinputlater[8];
uchar end[8];
void display1602(uchar adruchar date);
void initcaculate();
uchar keyscan();
void writecom1602(uchar com);
void writedate1602(uchar date);
void delayms(uchar z);
uchar keypress();
void displaysymbol(uchar x);
uchar estimate(ulong x);
ulong exten(uchar xuchar y);
void excount();
ulong caculate(uchar xulong yulong z);
void divide(ulong numenduchar z);
void main()
{ rw=0;
initcaculate();
while(1)
{
temp=keyscan();//按键扫描,并记录返回值存入temp
if(temp!=16)//判断是否有按键按下
{
//有按键按下,同时按下的不是任何运算符号
if((temp!=10)&&(temp!=11)&&(temp!=12)&&(temp!=13)&&(temp!=14))
{
//有按键按下,并且判断是运算符号前的输入
if(symbol==0)
{
tableinput[k]=temp;//把按下的各位存入相应数组
k++;
for(n=0;n {
/*并做逆向显示,在此比如输入1234,也需要按照1234来输出*/
display1602(0x80+0x40+0x10-(k-n)table[tableinput[n]]);
}
}
//有按键按下,并且判断是运算符号后的输入,
else
{
tableinputlater[k1]=temp;
k1++;
for(n=0;n {
display1602(0x80+0x40+0x10-(k1-n)table[tableinputlater[n]]);
}
}
}
//判断是否是按下运算符号(非等号),如果是,进入
else if((temp==10)||(temp==11)||(temp==12)||(temp==13))
{
symbol=temp;
writecom1602(0x01);
//先将符号前输入的数上移一行
for(n=0;n {
display1602(0x80+0x10-(k-n)table[tableinput[n]]);
}
//同时在第二行显示符号后输入的数
for(n=0;n {
display1602(0x80+0x40+0x10-(k1-n)table[tableinputlater[n]]);
}
//同时再在固定位置显示运算符号
displaysymbol(table[symbol]);
}
//判断是否是等号被按下,如果是,进入
else if(temp==14)
{
excount();//将运算符号前后的两次输入值实际计算
numend=caculate(symbolnumxnumy);//根据运算符计算得出一个任意数
numz=estimate(numend);//判断任意数的位数!
divide(numendnumz);//分离未知数的各位以待显示
writecom1602(0x01);//清屏以待显示
//显示结果
for(x3=0;x3 {
displaysymbol(‘=‘);
display1602(0x80+0x40+0x10-(numz-x3)table[end[numz-1-x3]]);
}
}
}
}
}
//分离已知数的各位,并存入相应数组中
void divide(ulong numenduchar z)
{
uchar x4;
for(x4=0;x4 {
end[x4]=numend%10;
numend/=10;
}
}
uchar estimate(ulong x)
{
uchar i=0;//判断一个未知数的位数
while(x!=0)
{
x/=10;
i++;
}
return i;
}
//在固定位置显示运算符号
void displaysymbol(uchar x)
{
display1602(0x80+0x40+0x04x);
}
//计算某位数所代表的值,比如1234中的1代表1000,2代表200....
ulong exten(uchar xuchar y)
{
ulong numax1;
numa=x;
for(x1=0;x1<(y-1);x1++)
{
numa*=10;
}
return numa;
}
//因为之前输入的数字是以单个字符形式存入数组,所以在此计算前两次输入数的实际值。
void excount()
{
uchar x2ex;
ex=k;
for(x2=0;x2 {
numx+=exten(tableinput[x2]ex);
ex--;
}
ex=k1;
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 6114 2011-06-13 00:19 简易计算器\caculate.c
文件 16183 2011-05-16 00:26 简易计算器\caculate.LST
文件 18396 2011-05-16 00:26 简易计算器\caculate.OBJ
文件 14442 2011-05-16 00:26 简易计算器\calculator
文件 4787 2011-05-16 00:26 简易计算器\calculator.hex
文件 50 2011-05-16 00:26 简易计算器\calculator.lnp
文件 19565 2011-05-16 00:26 简易计算器\calculator.M51
文件 163 2011-06-13 00:19 简易计算器\calculator.plg
文件 55222 2011-06-13 00:19 简易计算器\calculator.uvopt
文件 13240 2011-05-16 00:30 简易计算器\calculator.uvproj
文件 55218 2011-06-13 00:19 简易计算器\calculator_uvopt.bak
文件 13236 2011-05-16 00:17 简易计算器\calculator_uvproj.bak
文件 34446 2011-06-12 14:43 简易计算器\counter.rar
目录 0 2011-06-13 00:19 简易计算器
----------- --------- ---------- ----- ----
251062 14
相关资源
- 编译原理实验 计算器 语法树 逆波兰
- 51单片机应用系统典型模块开发大全源
- proteus 仿真51单片机串口通讯
- 基于51单片机的门禁控制器设计
- 51单片机秒表定时器实验
- MD5计算器软件+代码
- 基于51单片机的简易电子琴设计
- 51单片机1602与DS1302万年历仿真,时钟
- AT89C51单片机温度控制系统
- FPGA LCD1602驱动
- LCD显示计算器键盘按键带源程序+电路
- Qt 4.70 多功能科学计算器
- CRC多种验证计算器
- 温度控制系统
- ansoft maxwell 场计算器的中文资料
- 基于89C51单片机的智能超声波流量检测
- 设计一个模拟计算器的程序,要求能
- 51单片机双机通信程序(含仿真)
- 51单片机交通灯完整版
- 变位齿轮计算器
- 51单片机频率计-六位数码管显示-汇编
- 51单片机—串口计算器
- 51单片机—计算器包含小数计算
- LTC 6803 PEC计算器
- 基于51单片机的温度控制系统.rar
- 51单片机电子钟 proteus仿真 完美电子钟
- LD50计算器
- 51单片机数码管动态显示+汇编程序+
- Qt creator 做的计算器工程文件
- 表达式求值,模拟计算器功能的程序
评论
共有 条评论