单片机试验数码管上如何显示数字

/********************************************************************************标题:试... /*******************************************************************************
* 标题: 试验数码管上如何显示数字(共阳极) *
* *
* 连接方法:P0 与JP3 用8PIN排线连接 *
********************************************************************************
* *
* 请学员认真消化本例程,用单片机脚直接控制数码管 *
********************************************************************************/

#include <reg51.h>

void delay(unsigned int i); //函数声名

// 此表为 LED 的字模 01 2 3 4 5 6 7 8 9 a b c d e f
unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};

main()
{
unsigned int LedNumVal ; //定义变量

while(1)
{
// 将字模送到P0口显示
LedNumVal++;
P0 = LED7Code[LedNumVal%16]&0x7f; //LED7 0x7f为小数点 共阴和共阳此处也是不一样;
delay(20000); //调用延时程序

}
}

/*****************************************************************
**
* 延时程序*
**
*****************************************************************/
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--) //循环6000*200次
for(j = 200; j > 0; j--);
}
问题是
while(1)
{
// 将字模送到P0口显示
LedNumVal++;
P0 = LED7Code[LedNumVal%16]&0x7f; 这一段为什么&0x7f 小数点会亮,没&0x7f小数点不会亮?请告诉我原理。
展开
 我来答
zhaozhi6862179
推荐于2017-10-09 · TA获得超过3546个赞
知道小有建树答主
回答量:269
采纳率:0%
帮助的人:16.4万
展开全部
  解决方法:
  试验数码管上显示数字( 单片机直接实现位选 共阴极) 。
  解决方式:
  连接方法:P0与J12 用8PIN排线连接 P1与JP16 用排线连接 。
  代码:

  #include<reg52.h>
  #define uint unsigned int
  #define uchar unsigned char
  void delay(uint z)
  {
  uint x,y;
  for(x=z;x>0;x--)
  {
  for(y=0;y<113;y++)
  {
  }
  }
  }
  unsigned int code dbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};
  unsigned int code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
  void main()
  {
  while(1)
  {
  P1=dbit[4];
  P0=num[9];
  }
  }

  位定义
  #include<reg52.h>
  #include<intrins.h>
  #define uint unsigned int
  #define uchar unsigned char
  sbit LSA=P2^2;
  sbit LSB=P2^3;
  sbit LSC=P2^4;
  uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  void delay(uint z)
  {
  uint x,y;
  for(x=z;x>0;x--)
  {
  for(y=0;y<113;y++)
  {
  }
  }
  }
  void main()
  {
  while(1)
  {
  LSA=0;
  LSB=0;
  LSC=0;
  P0=num[6];
  delay(2);
  LSA=1;
  LSB=0;
  LSC=0;
  P0=num[6];
  delay(2);
  }
  }

  //让八个数码管全部亮并且从0~9循环
  #include<reg52.h>
  #include<intrins.h>
  #define uint unsigned int
  #define uchar unsigned char
  uchar num;
  uchar wnum=0x00;
  uchar code dbit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选,选择要显示的数字
  //uchar code wnum[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//八位数码管
  void delay(uint z)
  {
  uint x,y;
  for(x=z;x>0;x--)
  {
  for(y=0;y<113;y++)
  {
  }
  }
  }
  void main()
  {
  P1=wnum;
  while(1)
  {
  for(num=0;num<10;num++)
  {
  P0=dbit[num];
  delay(500);
  }
  }
  }
c3344c
2013-05-13 · TA获得超过2418个赞
知道小有建树答主
回答量:966
采纳率:57%
帮助的人:671万
展开全部
0x7f的8位二进制数是01111111,与字模相与(&)之后会亮,这说明共阳LED数码管小数点属于字模编码的最高位,如果最高位为0小数点则亮。而字模编码的小数点默认都是不亮的。如数字0的字模~0x3F按位取反后的二进制数是11000000,最高位为1小数点不亮,那么11000000与上述01111111相与的结果是01000000,最高位变为0小数点也就亮了。还有:
数字1的字模~0x06按位取反后的二进制数是11111001,最高位为1;
数字2的字模~0x5B按位取反后的二进制数是10100100,最高位为1;
。。。。。。
其它的字模你自己看看最高位都是1。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式