資源簡介
基于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
評論
共有 條評論