⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doc3.c

📁 一个单片机程序
💻 C
字号:
/*-------------------------------LED数码管显示实验说明------------------------------------------------------------------------------
  [程序名称]      LED.C
  [程序作用]      实现8个8段数码管的扫描显示
  [程序作者]      鞠春阳
  [版权所有]      鞠春阳
  [创建时间]      2006年04月16日
  [疑问解答]      http://www.qqmcu.com
  [技术支持]      http://www.qqmcu.com/bbs
  [本人E-mail]    jcygood@163.com
  [本人QQ]        383547
  [实验板购买方式及详情请访问:www.qqmcu.com]
  

  QQ单片机实验板上使用的是共阴极的数码管,其8个公共端连接在P2.0-P2.7口上,每个数码管的8个段分别连接在P0.0-P0.7口上
  当某个数码管的公共端为“0”时,那么这个数码管被选中,这时此数码管的哪段为”1“则哪段就被点亮
  初学者可以利用本实验板自带的仿真器功能来单步执行,来观察数码管的工作原理,
                 
  由于I/O资源有限,一个51单片机只有32个I/O所以只能将8个数码管以动态扫描的方式来显示,何为动态扫描呢?

  动态扫描的连接方式是将8个数码管的8个段用相同的I/O来控制,即第一个数码管的”a“段由P0.0控制第二个数码管的”a“段也是由P0.0来控制的
  而8个数码管的公共端则是由不同的I/O来控制,即第一个数码管的公共端由P2.4控制而第二个数码管的公共端有P2.5控制

  动态扫描的控制原理是:将第一个数码管要显示的内容显示出来,然后立刻将第二个数码管的内容显示出来,一次把第8个数码管的内容显示出来
  由于单片机的工作速度非常快,所以当显示第8个数码管的时候第一个数码管的内容还没有完全消失,这时立刻重复上面的过程,就实现了数码管的
  动态扫描显示
                  
 以下是QQ单片机实验板上各I/O口与数码管各段的对应关系及数字的编码原理

   a              I/O口:          P0.7  P0.6  P0.5  P0.4  P0.3  P0.2  P0.1  P0.0
   ---            数码管各段:      h     g     f     e     d     c     b     a
 f| g |b                   1:      0     0     0     0     0     1     1     0     0x06;
   ---                     2:      0     1     0     1     1     0     1     1     0x5B;
 e|   | c                  3:      0     1     0     0     1     1     1     1     0x4F;
   --- .h                  4:      0     1     1     0     0     1     1     0     0x66;
   d                       5:      0     1     1     0     1     1     0     1     0x6D;
                           6:      0     1     1     1     1     1     0     1     0x7D;
                           7:      0     0     0     0     0     1     1     1     0x07;
                           8:      0     1     1     1     1     1     1     1     0x7F;
                           9:      0     1     1     0     1     1     1     1     0x6F;
                           0:      0     0     1     1     1     1     1     1     0x3F;

=====================================如需转载请保留以上信息,并通知作者=============================================================*/
#include "reg51.h"

//分别从0-9的数码编码,注意此编码只适合QQ单片机实验板,其他电路板上的编码请参考上面的算法自行计算。
unsigned char code Num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//最简单的延时程序
delay(unsigned int i)
{
 while(i--);
}

//QQ单片机私有函数,在其他的电路板上可能会不好使
//在8个数码管上显示任意字符,字符内容由8个参数LED1--LED8决定  如果显示的字符为空,则不对这一个数码管进行扫描以缩短扫描时间
ShowAny(unsigned char LED1,unsigned char LED2,unsigned char LED3,unsigned char LED4,unsigned char LED5,unsigned char LED6,unsigned char LED7,unsigned char LED8)
{
 if(LED1) { P2=0xEF; P0=LED1; delay(100); }
 if(LED2) { P2=0xDF; P0=LED2; delay(100); }
 if(LED3) { P2=0xBF; P0=LED3; delay(100); }
 if(LED4) { P2=0x7F; P0=LED4; delay(100); }
 if(LED5) { P2=0xFE; P0=LED5; delay(100); }
 if(LED6) { P2=0xFD; P0=LED6; delay(100); }
 if(LED7) { P2=0xFB; P0=LED7; delay(100); }
 if(LED8) { P2=0xF7; P0=LED8; delay(100); }
}


//QQ单片机私有函数,在其他的电路板上可能会不好使
//右队齐显示一个整型数(0-65535)
ShowNum(unsigned int Number)
{
 unsigned char b1=0,b2=0,b3=0,b4=0,b5=0;
 b1=Number/10000;           //分别将要显示的数的万位到个位放在b1-b5这5个变量中
 b2=Number/1000%10;
 b3=Number/100%10;
 b4=Number/10%10;
 b5=Number%10;
 if(Number>9999)       //如果这个数的万位上没有数则不显示
  {
   ShowAny(0,0,0,Num[b1],Num[b2],Num[b3],Num[b4],Num[b5]);
  }
 else if(Number>999)  //如果这个数的千位上没有数则不显示
  {
   ShowAny(0,0,0,0,Num[b2],Num[b3],Num[b4],Num[b5]);
  }
 else if(Number>99) 
  {
   ShowAny(0,0,0,0,0,Num[b3],Num[b4],Num[b5]);
  }
 else if(Number>9) 
  {
   ShowAny(0,0,0,0,0,0,Num[b4],Num[b5]);
  }
 else if(Number>0) 
  {
   ShowAny(0,0,0,0,0,0,0,Num[b5]);
  }
 else
  {
   ShowAny(0,0,0,0,0,0,0,Num[0]);
  }
}

main()
{
 while(1)    //循环扫描显示要显示的内容
  {
   ShowNum(234);
  }
}

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -