数码管的简单应用

①数码管显示1-9的自加

②数码管显示1-99的自加

③数码管滚动显示11位的电话号码

 

/****************************************************************************************************/

#include <reg51.h>

#define DatePort P1
#define MAXCOUNT 40

sbit Seg_Latch = P2^2; //段锁存
sbit Bit_Latch = P2^3; //位锁存


unsigned char code seg_ca[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极段码
unsigned char code seg_cc[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极段码
unsigned char code bit_seg_ca[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code my_tele_seg_code[11] = {0x06,0x4f,0x5b,0x7d,0x3f,0x7f,0x7f,0x07,0x7f,0x6f,0x06};//电话表

unsigned char display_Num[8];

void display(unsigned char FirstBit,unsigned char Lenth );
void display_mytele(unsigned char FirstBit,unsigned char Lenth,unsigned char seg_code_first);
void DelayUs2x(unsigned char t)
{
    while(t--);
}


void DelayMs(unsigned int t)
{
    while(t--)
    {
        DelayUs2x(245);
        DelayUs2x(245);
    }
}

void main()
{
    unsigned char i = 0;
    unsigned char j = 0;
    unsigned int temp = 0;
    unsigned char x = 0; //个位
    unsigned char y = 0; //十位
    unsigned int Num = 0;
    unsigned int a = 0;
    
/**********************************************
0~9 自增    
**********************************************/
/*    P0 = 0x00;
    while(1)
    {
        for(i = 0; i < 10 ; i++)
        {
            P0 = seg_cc[i];
            DelayMs(100);
        }
    }*/
/***********************************************
    0~99 自增
***********************************************/
/*    P0 = 0x00;
    while(1)
    {
        x++;
        if(x == 10)//累加,往下运行,就是刷新,不会卡住
        {    
            y++;
            x = 0;
        }
        if(y == 50)
        {
            y = 0;
            Num++;
        }//用if循环的目的是不断地刷新数字,如果用delay则停止,不能使人眼及时捕捉到数字
    //    DelayMs(100);//延时,不往下运行,不是我想要的
        if(Num == 99)
            Num = 0;
        display_Num[0] = Num/10;
        display_Num[1] = Num%10;
        display(0,2);
    }*/
/***************************************************************
只要改#define MAXNUM 就能实现任意数的累加
***************************************************************/    
/*    P0 = 0x00;
    temp = MAXCOUNT;
    while(temp /= 10)
        i++;
    i++;
    j = i;//判断共有多少位需要显示
    while(1)
    {
        x++;
        if(x == 200)//累加,往下运行,就是刷新,不会卡住
        {    
            Num++;
            x = 0;
            if(Num == MAXCOUNT+1)
            {
                Num = 0;
            }
        }
        
//    DelayMs(100);//延时,不往下运行,不是我想要的
        a = Num;
        i = j;
        while(i != -1)
        { 
            display_Num[--i] = a%10;//bit0为个位
            a/=10;
        }
        display(0,j);
    
    }*/
/******************************************************************
滚动数码管,显示电话号码
******************************************************************/
    while(1)
    {
        x++;
        if(x == 100)//累加,往下运行,就是刷新,不会卡住
        {    
            i++;
            x = 0;
        }
        if(i <= 7)
        {
            DelayUs2x(200);
            display_mytele(7-i,i+1,0);//未填满数码管至填满数码管
        }
        else if(i>7 && i<=10)
        {
            display_mytele(0,8,i-7);//填满数码管但电话号码还未全部显示
        }
        else if(i>10 && i <= 18)
        {
            DelayUs2x(200);
            display_mytele(0,18-i,i-7);//电话号码全部演示至最后一位移除数码管
        }
        else 
        {
            i = 0;
        }
    }
}    

void display_mytele(unsigned char FirstBit,unsigned char Lenth,unsigned char seg_code_first)//seg_code_first显示的段码的第一位位
{
    unsigned char a = 0;
    unsigned char z = seg_code_first;
    for(a = FirstBit ; a < FirstBit+Lenth ; a++)
    {
                DatePort = 0;
                Seg_Latch = 1; //开门
                Seg_Latch = 0; //关门    
                
                DatePort = bit_seg_ca[a];
                Bit_Latch = 1; //开门
                Bit_Latch = 0; //关门
                
                DatePort = my_tele_seg_code[z++];
                Seg_Latch = 1; //开门
                Seg_Latch = 0; //关门
                DelayUs2x(100);
    }
}


void display(unsigned char FirstBit,unsigned char Lenth)//常用的显示函数
{
    unsigned char a;
    for(a = FirstBit ; a < FirstBit+Lenth ; a++)
    {
            DatePort = 0;
            Seg_Latch = 1; //开门
            Seg_Latch = 0; //关门    
            
            DatePort = bit_seg_ca[a];
            Bit_Latch = 1; //开门
            Bit_Latch = 0; //关门
            
            DatePort = seg_ca[display_Num[a]];
            Seg_Latch = 1; //开门
            Seg_Latch = 0; //关门
        
            DelayUs2x(100);
    }
}
 

 

 

对于电话号码的滚动,我们开始是用分为4类情况处理,但其实还有更简单的方法,就是在电话号码前留7位0,电话号码后留7位0,共25位进行循环左移。具体实现这里就不实现了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值