数码管——8段共阴极数码管

在德飞莱的系统中,数码管的解法是这样接的:
这里写图片描述

段锁存器:使能端(低电平有效)
c = 0时,锁存;
c = 1时,传送数据;

段选和位选的操作:

sbit bit_sel = P2^0;//位选
sbit seg_sel = P2^1;//段选

unsigned char segdata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴极0~f
unsigned char coode[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//控制位选

先操作段码,再作位码。

//消重影
SEGPORT = 0xff;                     
bit_sel = 1;
bit_sel = 0;

SEGPORT = 0x0;
seg_sel = 1;
seg_sel = 0;

//对数字的刷新                
SEGPORT = coode[i];
bit_sel = 1;
bit_sel = 0;

SEGPORT = outdata[i];
seg_sel = 1;
seg_sel = 0;

在没有中断的程序的情况下,写入以下程序,实现数码管计数:

#include <reg52.h>
#include "./delay/delay.h"

#define SEGPORT P1

sbit bit_sel = P2^0;
sbit seg_sel = P2^1;

unsigned char segdata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char coode[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char outdata[8] = {0x3f,0x3f,0x40,0x3f,0x3f,0x40,0x3f,0x3f};

unsigned char second = 0;
unsigned char minute = 0;
unsigned char hour = 0;

void hour_seg()
{

      hour++;
      while(hour > 23)
        {
         hour = 0;
    }

      outdata[0] = segdata[hour/10];
      outdata[1] = segdata[hour%10];
}

void minute_seg()
{

      minute++;
      while(minute > 59)
        {
         minute = 0;
               hour_seg();
    }

      outdata[3] = segdata[minute/10];
      outdata[4] = segdata[minute%10];
}

void second_seg()
{
      second++;
      while(second > 59)
        {
         second = 0;
               minute_seg();
    }

      outdata[6] = segdata[second/10];
      outdata[7] = segdata[second%10];

}


void main()
{
    unsigned char i,j;

      while(1)
        {   
              for(j = 0;j<120;j++)
              {
                  for(i = 0; i < 8; i++)
                  {
                           SEGPORT = 0xff;                  
                           bit_sel = 1;
                           bit_sel = 0;

                           SEGPORT = 0x0;
                           seg_sel = 1;
                           seg_sel = 0;

                           SEGPORT = coode[i];
                           bit_sel = 1;
                           bit_sel = 0;

                           SEGPORT = outdata[i];
                           seg_sel = 1;
                           seg_sel = 0;

                           delay_ms(1);        

                }
             }
                second_seg();
        }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值