C51联盟 —— 活泼的数码管

版权声明: https://blog.csdn.net/JRK_CSDN/article/details/85040857
/*****************************************************************************************************
- 文件名:第二讲:数码管.c
- 开发板:普中HC6800-ES V2.0  @STC 89C52RC
- 作者:  C51联盟
- 时间: 2018-12-12
**************************************************************************************************** */
#include<reg52.h>
#include<intrins.h>
#define SEGLED P0

sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

u8 code SEG_Content[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数字码
u8 SEG_Buff[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //段码缓冲区

void Delay1ms();   //延时函数
void Scan_SEG();   //数码管显示
void DP_Number(u32 dat); //数据处理

void main()
{
 u32 sec = 99999900;  //初始化计数值
 while(1)
 {
  DP_Number(sec);
  sec++;
  Scan_SEG();
  if(sec>99999999)
   sec = 0;
 }
}

void Scan_SEG()
{
  u8 i;
  for(i=0;i<8;i++)
  {
   switch(i)  
   {
    case(0):
     LSA=0;LSB=0;LSC=0; break;
    case(1):
     LSA=1;LSB=0;LSC=0; break;
    case(2):
     LSA=0;LSB=1;LSC=0; break;
    case(3):
     LSA=1;LSB=1;LSC=0; break;
    case(4):
     LSA=0;LSB=0;LSC=1; break;
    case(5):
     LSA=1;LSB=0;LSC=1; break;
    case(6):
     LSA=0;LSB=1;LSC=1; break;
    case(7):
     LSA=1;LSB=1;LSC=1; break; 
   }
  SEGLED = SEG_Buff[i]; //输出字符
  Delay1ms();
  SEGLED = 0x00; //消隐
 }
}

void Delay1ms()  //@12.000MHz
{
 unsigned char i, j;
 
 i = 2;
 j = 239;
 do
 {
  while (--j);
 } while (--i);
}

void DP_Number(u32 dat)
{
 int i;
 u8 buf[8];
 
 for(i=0;i<8;i++)
 {
  buf[i] = dat % 10; //取余数充当低位
  dat /= 10; //舍弃余数
 }
 for(i=7;i>0;i--)
 {
  if(buf[i] == 0)
   SEG_Buff[i] = 0x00; //高位去零
  else
   break;
 }
 
 for(;i>=0;i--)
 {
   SEG_Buff[i] = SEG_Content[buf[i]];  //填充缓冲区
 }
}

猜你喜欢

转载自blog.csdn.net/JRK_CSDN/article/details/85040857