资源简介

基于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


评论

共有 条评论