学习日志 姓名 :张卉 日期 : 2018. 7. 17
今日学习任务 | 数码管、锁存器的基本原理与功能 |
今日任务完成情况 | 数码管、锁存器的基本应用;简易计算器的开发 |
今日开发中出现的问题汇总 | 数码管无法正确显示预期数字 |
今日未解决问题 | 无 |
今日开发收获 | 矩阵键盘与数码管的联合使用方法、数码管的动态显示原理和代码 |
自我评价 | 听课效率较高,动手能力一般 |
其他 | 无 |
代码:
#include <reg51.h>
sbit wei = P2^1;
int key = 0, num1 = 0, num2 = 0, sum = 0;
//共阴数码管表
unsigned char code table[] = {0x3f, 0x06 ,
0x5b , 0x4f , 0x66 , 0x6d, 0x7d ,
0x07 , 0x7f , 0x6f };
void delay(int x)
{
int i;
while (x--)
{
for (i = 0; i < 15; i++);
}
}
void KeyScan()
{
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];
delay(50);
}
else if (n >= 10 && n <= 99)
{
P2 = 0xfe;
P0 = table[n / 10];
delay(50);
P2 = ~(1 << 1);
P0 = table[n % 10];
delay(50);
}
else if (n >= 100 && n <= 999)
{
P2 = 0xfe;
P0 = table[n / 100];
delay(50);
P2 = ~(1 << 1);
P0 = table[n % 100 / 10];
delay(50);
P2 = ~(1 << 2);
P0 = table[n % 100 % 10];
delay(50);
}
else if(n >= 1000 && n <= 9999)
{
P2 = 0xfe;
P0 = table[n / 1000];
delay(50);
P2 = ~(1 << 1);
P0 = table[n % 1000 / 100];
delay(50);
P2 = ~(1 << 2);
P0 = table[n % 1000 % 100 / 10];
delay(50);
P2 = ~(1 << 3);
P0 = table[n % 1000 % 100 % 10];
delay(50);
}
else if(n >= 10000 && n <= 99999)
{
P2 = 0xfe;
P0 = table[n / 10000];
delay(50);
P2 = ~(1 << 1);
P0 = table[n % 10000 / 1000];
delay(50);
P2 = ~(1 << 2);
P0 = table[n % 10000 % 1000 / 100];
delay(50);
P2 = ~(1 << 3);
P0 = table[n % 10000 % 1000 % 100 / 10];
delay(50);
P2 = ~(1 << 4);
P0 = table[n % 10000 % 1000 % 100 % 10];
delay(50);
}
else if(n >= 100000 && n <= 999999)
{
P2 = 0xfe;
P0 = table[n / 100000];
delay(50);
P2 = ~(1 << 1);
P0 = table[n % 100000 % 10000];
delay(50);
P2 = ~(1 << 2);
P0 = table[n % 100000 % 10000 / 1000];
delay(50);
P2 = ~(1 << 3);
P0 = table[n % 100000 % 10000 % 1000 / 100];
delay(50);
P2 = ~(1 << 4);
P0 = table[n % 100000 % 10000 % 1000 % 100 / 10];
delay(50);
P2 = ~(1 << 5);
P0 = table[n % 10000 % 100000 % 1000 % 100 % 10];
delay(50);
}
}
void calculate(int flag)
{
switch(flag)
{
case 1:
sum = num1 + num2;
break;
case 2:
sum = num1 - num2;
break;
case 3:
sum = num1 * num2;
break;
case 4:
sum = num1 / num2;
break;
}
}
int main()
{
int i, display_flag = 0, result_flag = 0, stop = 0;
while (1 != stop)
{
key = 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;
break;
case 10:
num1 = num1 * 10 + 0;
break;
case 11: //+
display_flag = 1;
break;
case 12: //-
display_flag = 2;
break;
case 13: //*
display_flag = 3;
break;
case 14: // /
display_flag = 4;
break;
}
if (0 != display_flag)
{
display(num1);
delay(1000);
stop = 1;
display(0x00);
P2 =0xff;
for(i = 0;i < 6;i++)
{
P2 = ~(1 << i);
P0 = 0x00;
delay(50);
}
}
}
while(1)
{
key = 0;
KeyScan();
switch(key)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
num2 = num2 * 10 + key;
break;
case 10:
num2 = num2 * 10 + 0;
break;
case 15:
result_flag = 1;
calculate(display_flag);
break;
}
if (1 == result_flag)
{
display(sum);
}
}
return 0;
}