单片机学习日志—2018.07.18

学习日志                     姓名:   王瑶           日期: 2017.07.18   

今日学习任务

单片机数码管的使用及实现计算器的操作。

 

日任务完成情况

(详细说明本日任务是否按计划完成,开发的代码量。)

 

在早上的学习中理解还算透,但下午完成情况不是特别好,出现了很多问题,只能实现一位数的操作。

今日开发中遇到的问题汇总

在计算器中实现两位数或更多位数的点亮程序还是不能完成。

日开发收获

  1. 使用的是六位七段数码管(涉及锁存器)。
  2. 数码管顺时针a\b\c\d\e\f\g。
  3. 数码管分为共阳合共阴。
  4. 点亮一段数码管。
  5. 锁存器:节约资源,段选位选都接的P0。

自我评价

(是否规范完成指定任务,需要改进的地方,与他人合作等。)

实际操作还是很有必要的,而且在这个不断发现错误更改错误的过程中也可以收获很多。

 

矩阵按键和数码管联合设计计算器:

#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;

}

猜你喜欢

转载自blog.csdn.net/qq_40616514/article/details/81102936