单片机学习日志 王鹏 2018.07.18

今日学习任务

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

 

日任务完成情况

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

 

根据老师编写的代码为基础,已经实现部分功能。

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

当数字位数变多时,数码管显示不正常。

日开发收获

 

  1. 数码管分为共阳合共阴。
  2. 点亮一段数码管。
  3. 锁存器:节约资源,段选位选都接的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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值