找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

新手求助,关于51实现简单计算器

[复制链接]
admin 发表于 2012-9-2 17:50:27 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
最近看了看红金龙老大的系列,心有所动,于是利用红金龙老大的定时器文件和LED显示文件,自己又写了些代码,准备去做一个简单计算器。新手就从实现最简单的加法功能开始,写了些代码,但是无法顺利实现。往各位老大顺手帮忙看看,改改,提出些改进建议。
拜谢!
文件如下
实现按键功能的KEY文件
由于状态转移太复杂,仍然使用了延时
#include <reg52.h>
#include "MacroAndConst.h"
#include "Led7Seg.h"
uint count=0;
uint flag;
static uchar g_uKeyBuffer[6]={0};
uchar g_uKeyBufferTemp[6]={0};
int32 g_u32KeyTemp1=0;
int32 g_u32KeyTemp2=0;
int32 g_u32KeyTemp3=0;
uchar g_uKeyValue;

/*延时子程序 */
static void delay(int k)
{
uchar i,j;
for(i=k;i>0;i--)
for(j=100;j>0;j--);
}

/*键值判断子程序*/
static void KeyValue(uchar unknowed_key)
{
switch(unknowed_key) //通过 switch 语句判断当前按键的键号
{
case 0xee: g_uKeyValue='1'; break;
case 0xde: g_uKeyValue='2'; break;
case 0xbe: g_uKeyValue='3'; break;
case 0x7e: g_uKeyValue='+'; break;

case 0xed: g_uKeyValue='4'; break;
case 0xdd: g_uKeyValue='5'; break;
case 0xbd: g_uKeyValue='6'; break;
case 0x7d: g_uKeyValue='-'; break;
case 0xeb: g_uKeyValue='7'; break;
case 0xdb: g_uKeyValue='8'; break;
case 0xbb: g_uKeyValue='9'; break;
case 0x7b: g_uKeyValue='*'; break;

case 0xe7: g_uKeyValue='0'; break;
case 0xd7: g_uKeyValue='c'; break;
case 0xb7: g_uKeyValue='='; break;
case 0x77: g_uKeyValue='\\'; break;
}
}
//计算g_u32KeyTemp1
static void KeyTemp1()
{
uint i,j;
for(i=0;i<count;i++)
g_uKeyBufferTemp[i]=g_uKeyBuffer[i];
for(i=0;i<count;i++)
{
for(j=count-i-1;j>0;j--)
g_uKeyBufferTemp[i]*=10;
g_u32KeyTemp1+=g_uKeyBufferTemp[i];
}
}
//计算g_u32KeyTemp2
static void KeyTemp2()
{
uint i,j;
for(i=0;i<count;i++)
g_uKeyBufferTemp[i]=g_uKeyBuffer[i];
for(i=0;i<count;i++)
{
for(j=count-i-1;j>0;j--)
g_uKeyBufferTemp[i]*=10;
g_u32KeyTemp1+=g_uKeyBufferTemp[i];
}
}
//显示g_u32KeyTemp3
static void KeyTemp3()
{
uint i;
uint32 t1;
uint16 t2,t3;
uint8 t4;
g_uKeyBufferTemp[0]=g_u32KeyTemp3/100000;
t1=g_u32KeyTemp3%100000;
g_uKeyBufferTemp[1]=t1/10000;
t2=t1%10000;
g_uKeyBufferTemp[2]=t2/1000;
t3=t2%1000;
g_uKeyBufferTemp[3]=t3/100;
t4=t3%100000;
g_uKeyBufferTemp[4]=t4/10;
g_uKeyBufferTemp[5]=t4%100000;
for(i=0;i<count;i++)
g_uKeyBuffer[i]=g_uKeyBufferTemp[i];
}
static void KeyCalculate(uint flagtemp)
{
switch(flagtemp)
{
case 1 :
{
g_u32KeyTemp3=g_u32KeyTemp1+g_u32KeyTemp2;
KeyTemp3();
}break;
}
}
static void KeyProcess()
{
switch(g_uKeyValue)
{
case '0':
{
//count++;
g_uKeyBuffer[count-1]=0;
} break;
case '1':
{
//count++;
g_uKeyBuffer[count-1]=1;
} break;
case '2':
{
//count++;
g_uKeyBuffer[count-1]=2;
} break;
case '3':
{
//count++;
g_uKeyBuffer[count-1]=3;
} break;
case '4':
{
//count++;
g_uKeyBuffer[count-1]=4;
KeyTemp1();
} break;
case '5':
{
//count++;
g_uKeyBuffer[count-1]=5;
} break;
case '6':
{
//count++;
g_uKeyBuffer[count-1]=6;
} break;
case '7':
{
//count++;
g_uKeyBuffer[count-1]=7;
} break;
case '8':
{
//count++;
g_uKeyBuffer[count-1]=8;
} break;
case '9':
{
//count++;
g_uKeyBuffer[count-1]=9;
} break;
case '+':
{
count--;
KeyTemp1();
count=0;
flag=1;
} break;
case '=':
{
count--;
KeyTemp2();
count=6;
KeyCalculate(flag);
} break;


}
}

/*按键判断程序*/
void Key()
{
uint i;
uchar line_key,row_key,final_key;
P3=0x0f; //给P3口赋初值 0x0f
if (P3 != 0x0f) //若在某时刻检测到P3口不为 0x0f,则说明有键按下
{
delay(10); //防抖动延时
if (P3 != 0x0f)
{
line_key=P3; //变量a存取翻转前的P3口值,其中高四位为0,低四位与动作按键所处的行有关
P3=0xf0; //对P3口进行翻转
row_key=P3; //变量b存取翻转后的P3口值,其中低四位为0,高四位与动作按键所处的列有关
while(P3!=0xf0); //等待按键释放
count++;
final_key=row_key|line_key; //变量c取a的低四位和b的高四位即为当前按键的键值。
}
}
KeyValue(final_key);
KeyProcess();
for(i=0;i<count;i++)
g_u8LedDisplayBuffer[i]=g_uKeyBuffer[i];
LedDisplay(g_u8LedDisplayBuffer,count);

}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-29 02:51 , Processed in 0.054092 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表