学习日志 姓名: 王瑶 日期: 2017.07.18
今日学习任务 |
单片机数码管的使用及实现计算器的操作。 |
今日任务完成情况 (详细说明本日任务是否按计划完成,开发的代码量。)
|
在早上的学习中理解还算透,但下午完成情况不是特别好,出现了很多问题,只能实现一位数的操作。 |
今日开发中遇到的问题汇总 |
在计算器中实现两位数或更多位数的点亮程序还是不能完成。 |
今日开发收获 |
|
自我评价 (是否规范完成指定任务,需要改进的地方,与他人合作等。) |
实际操作还是很有必要的,而且在这个不断发现错误更改错误的过程中也可以收获很多。 |
矩阵按键和数码管联合设计计算器:
#include<reg51.h>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int key=0, num1=0, num2=0,flag=0,flag1=0,flag2=0,s=0;
void delay(int x)
{
int i;
while(x--)
{
for(i=0;i<15;i++);
}
}
void KeyScan()
{
key=0;
P1=0xf0;
if(P1!=0Xf0)
{
switch(P1)
{
case 0xe0:key+=0;break;
case 0xd0:key+=1;break;
case 0xb0:key+=2;break;
case 0x70:key+=3;break;
}
P1=0x0f;
switch(P1)
{
case 0x0e:key+=1;break;
case 0x0d:key+=5;break;
case 0x0b:key+=9;break;
case 0x07:key+=13;break;
}
while(P1!=0x0f);//等待手松开
}
}
int equal(int f)
{
switch(f)
{
case 1:
num2=num2+num1;break;
case 2:
num2=num2-num1;break;
case 3:
num2=num1*num2;break;
case 4:
num2=num2/num1;break;
}
return num2;
}
void display(int n)
{
if(n>=0&&n<=9)
{
P2=0xfe;
P0=table[n];
}
else if(n>=10&&n<=99)
{
P2=0xfe;
P0=table[n/10];
delay(50);
P2=~(1<<1);
P0=table[n%10];
delay(50);
}
}
int main()
{
while(1)
{
flag=0;
KeyScan();
switch(key)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
num1=num1*10+key;
if(num1/10==0||flag2!=0)
{
s++;
}
break;
case 10:
num1=num1*10+0;
if(num1/10==0||flag2!=0)
{
s++;
}
break;
case 11:flag=1;flag1=1;break; //+
case 12:flag=2;flag1=2;break; //-
case 13:flag=3;flag1=3;break; //*
case 14:flag=4;flag1=4;break; // /
case 15: // =
s=0;
num1=equal(flag1);
flag=5;
break;
}
if(0!=flag)
{
display(num1);
num2=num1;
num1=0;
flag2++;
}
if(s==2)
{
display(num1);
s=1;
}
}
return 0;
}