苏嵌暑期实训----day10

姓名:祝俊宝                                           日期:2018.07.18

今日 学习任务
  1. 七段数码管共阴共阳的区别
  2. 数码管的静态显示、动态显示
  3. 如何通过锁存器控制数码管
  4. 编程实现一个简易计算器、在数码管上显示数值 

今日任务完成

情况

完成了关于数码管的相关内容的学习

实现了数码管的动态显示、静态显示的 编程

实现了通过锁存器来控制数码管的亮灭

完成了一个简单计算器的编程

今日开发中遇

到的问题汇总

1、如何使数码管动态显示

2、如何实现除法和乘法以及清零功能

今日未解决问

今日开发收获

1、了解了共阴共阳的概念,知道了共阴共阳数码管表的编码

2、学会了通过锁存器控制数码管

3、完成了简单计算器的编码

自我评价状态不错,但实践经验太少,程序功能实现起来有点困难
其他

#include <reg51.h>

sbit wei = P2^1;

int key = 0, num1 = 0, num2 = 0;
int i,j,display_flag;

//共阴数码管表
unsigned char code table[] = {0x3f, 0x06 , 
        0x5b , 0x4f , 0x66 , 0x6d, 0x7d , 
        0x07 , 0x7f  , 0x6f };


void delay(int x)
{
    for(j = 0; j < x; j++)
    {
        for (i = 0; i < 15; i++);
    }
}

void delay1(int x)
{
    for(j = 0; j < x; j++)
    {
        for (i = 0; i < 200; 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];
    }
    else if(n >= 10 && n <= 99)
    {
        P2 = 0xfe;
        P0 = table[n / 10];
        delay(20);

        P2 = ~(1 << 1);
        P0 = table[n % 10];
        delay(20);
    }
    else if (n >= 100 && n <= 999)
    {
        P2 = 0xfe;
        P0 = table[n / 100];
        n = n % 100;
        delay(20);

        P2 = ~(1 << 1);
        P0 = table[n / 10];
        delay(20);

        P2 = ~(1 << 2);
        P0 = table[n % 10];
        delay(20);    
    }    
}

int main()
{
    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:
                num1 = num1 * 10 + key;
                break;
            case 10:
                num1 = num1 * 10 + 0;
                break;
            case 11:  //+
                {
                    num2 = num1 + num2;
                    display_flag = 1;            
                    break;
                }
            case 12:  //-
                {    num2 = num1 - num2;
                    display_flag = 2;
                    break;
                }
            case 13:  //*
                {
                    if(num2 == 0)
                    {
                        num2 = 1;
                    }
                    num2 = num1 * num2;
                    display_flag = 3;
                    break;
                }
            case 14:  // /
                {    
                    num2 = num2 / num1;

                    if(num2 == 0)
                    {
                        num2 = num1;
                    }
                    
                    display_flag = 4;
                    break;
                }
            case 15:
                display_flag = 5;
                break;
            case 16:
                display_flag = 6;
                break;

        }
        if (1 == display_flag)
        {
            display(num2);
        //    delay(50);
            num1 = 0;

        }

        else if(2 == display_flag)
        {
            display(num2);
    //        delay(50);
            num1 = 0;    
        }

        else if(3 == display_flag)
        {
            display(num2);
        //    delay(50);
            num1 = 0;
            
        }

        else if(4 == display_flag)
        {
            display(num2);
        //    delay(50);
            num1 = 0;
        }

        else if(5 == display_flag)  
        {
            P0 = 0x00;
            //num1 = 0;
        }

        else if(6 == display_flag)        
        {
            P2 = 0xfe;
            P0 = table[0];
            if(num1 != 0 && num2 != 0)
            {
                num1 = 0;
                num2 = 0;
            }
            //delay(20);
        }
                 
    }
    return 0;
}

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值