今日学习任务 | 单片机数码管的使用及实现计算器的操作。 |
今日任务完成情况 (详细说明本日任务是否按计划完成,开发的代码量。)
| 根据老师编写的代码为基础,已经实现部分功能。 |
今日开发中遇到的问题汇总 | 当数字位数变多时,数码管显示不正常。 |
今日开发收获 |
|
自我评价 (是否规范完成指定任务,需要改进的地方,与他人合作等。) | 老师讲解理论知识和实际操作运用还是有很大区别的,下午操作的时候还是有很多不会的地方。 |
矩阵按键和数码管联合设计计算器:
#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;
}