资源简介
基于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
相关资源
- 基于MCS_51单片机的工业屏柜散热方案
- MCS_51单片机与8255A的接口设计
- 电脑卡西欧计算器 fx-991CN X Emulator19中
- 51单片机PWM程序,占空比、周期可调整
- 51单片机多功能自行车测速仪
- 卡西欧工程计算器模拟器Casio FX
- 00
- 用51单片机实现G代码翻译
- 简易的电阻电容测量电路
- 51单片机基于protues的几个仿真实例
- 51单片机PCB设计图
- PC -- 单片机的串口数据传输系统设计
- 51单片机控制舵机程序
- [免费]msp430f149控制PS2键盘并用1602显示
- 51单片机读取温度数据存储到SD卡中并
- 【单片机】51单片机数码管显示万年历
- vhdl与lcd1602实现的多控制电子钟
- ADC0809数字电压表 LCD1602显示 汇编程序
- PIC 单片机定时器初值计算器
- 湍流k-e经验值计算器
- C51单片机汇编指令查询、学习工具集
- 基于8051单片机的红外接收程序
- PIC单片机延时计算器
- 51单片机频率计(很简单)
- MVC模式实现的计算器
- 基于51单片机的智能温控器
- powerbuilder 计算器小程序
- 简单计算器的实现(数据结构)
- 基于51单片机的16*16点阵动态显示
- 基于51单片机的模数转换与数模转换
评论
共有 条评论