学习日志 姓名: 徐雪 日期: 2017.07.18
今日学习任务 | 用矩阵按键,完成计算器加减乘除功能,在数码管上显示数字。 |
今日任务完成情况 (详细说明本日任务是否按计划完成,开发的代码量。)
| 今日任务已按计划完成。 编写了数码管显示0,8,0和1交替亮,6个LED顺次显示0到5,锁存器以及数码管锁存器等程序。
|
今日开发中遇到的问题汇总 | 两位数字的计算器功能无法实现 |
今日未解决问题 | 无 |
今日开发收获 |
共阴:指数码管各段的阴极接在一起;单片机的输出就必须接在各个阳极上。
|
自我评价 (是否规范完成指定任务,需要改进的地方,与他人合作等。) | 没有全部实现功能,只实现了一位数的计算。 |
其他 | 无 |
|
|
#include<reg51.h>
sbit wei=P2^1; //共阴数码管表
int key=0,num1=0,num2=0,flag=0,flag1=0,flag2=0,s=0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay()
{
int x=50,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); //等待手松开
}
}
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();
P2=~(1<<1);
P0=table[n%10];
delay();
}
}
int equal(int f)
{
switch(f)
{
case 1: num2=num1+num2;break;
case 2: num2=num2-num1;break;
case 3: num2=num1*num2;break;
case 4: num2=num2/num1;break;
}
return num2;
}
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)
{s++;} break;
case 10: num1=num1*10+0;
if(num1/10==0)
{s++;}
break;
case 11: flag=1;flag1=1;break; //+display_flag=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;
}
if(s==2)
{
display(num1);
s=1;
}
}
return 0;
}