数码管

来源:互联网 发布:linux控制台显示中文 编辑:程序博客网 时间:2024/05/30 02:24

六位数码管共阴级显示(0-F)

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

例子:六位数码管从一自动计数

首先是关于六位数码管的数字显示问题
段选位选接口
这里写图片描述
这里写图片描述

sbit DX=P2^0;sbit WX=P2^1;

显示六位无符号整数

void displayint(unsigned long n)//显示6位无符号整数{   unsigned char temp;  temp=0xdf;  if(n==0)  {    P0=0XFF;      /*消除P0的值*/       WX=1;         /*位选输入有效*/       P0=temp;   /*输出位选码*/       WX=0;         /*位选锁存*/       P0=0;     /*消除P0的值*/       DX=1;         /*段选输入有效*/       P0=table[n];/*输出段码*/       DX=0;             /*段码锁存*/   }  while(n)  {       P0=0XFF;      /*消除P0的值*/       WX=1;         /*位选输入有效*/       P0=temp;   /*输出位选码*/       WX=0;         /*位选锁存*/       P0=0;     /*消除P0的值*/       DX=1;         /*段选输入有效*/       P0=table[n%10];/*输出段码*/       DX=0;             /*段码锁存*/       temp=_cror_(temp,1);       n=n/10;       delay(1);   }}

显示输入数字

void displayint(unsigned long n)//显示6位无符号整数{ unsigned char i;  unsigned char temp=0xfe;//位选  //从左往右(从高位到低为)开始显示  for(i=1;i<=6;i++)  {       P0=0XFF;      /*消除P0的值*/       WX=1;         /*位选输入有效*/       P0=temp;   /*输出位选码*/       WX=0;         /*位选锁存*/       P0=0;     /*消除P0的值*/       DX=1;         /*段选输入有效*/       P0=table[s[i-1]];/*输出段码*/       DX=0;             /*段码锁存*/       temp=_crol_(temp,1);       delay(1);   }}

独立按键实现相关按键功能

void main(){  EA=1;ET0=1;TMOD=0x01; //初始化定时器T0 while(1)  //扫描显示 { //按键一计数功能实现 if(K1==0)  //检测到有按键按下    { delay(10);//延迟去抖      if(K1==0) //检测到按键仍然被按下        {   TH0=15536/256;  //启动定时器T0:晶振12MHz,定时50ms,对应计数值50000,计数初值15536            TL0=15536%256;            TR0=1;            while(K1==0);      //检测按键是否释放        }     }     //按键二暂停功能实现    if(K2==0)  //检测到有按键按下    { delay(10);//延迟去抖      if(K2==0) //检测到按键仍然被按下        {   TR0=0;//停止定时器            while(K2==0);      //检测按键是否释放        }     }      //按键三清零功能实现   if(K3==0)  //检测到有按键按下    { delay(10);//延迟去抖      if(K3==0) //检测到按键仍然被按下        {   TR0=0;//停止定时器,并清零            num=0;            while(K3==0);      //检测按键是否释放        }     }   displayint(num); }  

按键触发中断T0
void ET0_INT() interrupt 1

{     TH0=15536/256;   TL0=15536%256;   c++;   if(c==20) {c=0;num++;}}

完整代码
这里写图片描述

//独立按键(3个按键,6位数码管)//按下K1启动自动计数(每秒加1,要用到定时器),显示在数码管上,接P3^0//按下K2暂停自动计数,接P3^1//按下K3计数值清零停止计数,接P3^2#include <reg51.h>#include <intrins.h>#define uch8  unsigned charsbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^7;sbit DX=P2^0;sbit WX=P2^1;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};unsigned long num=0;//计数值unsigned char c=0;//定时器定时为50ms,定时20次为1svoid delay(int x)     //延时x毫秒{int i,j;  for(i=0;i<x;i++)     for(j=0;j<115;j++)          ;}void displayint(unsigned long n)//显示6位无符号整数{   uch8 temp;  temp=0xdf;  if(n==0)  {    P0=0XFF;      /*消除P0的值*/       WX=1;         /*位选输入有效*/       P0=temp;   /*输出位选码*/       WX=0;         /*位选锁存*/       P0=0;     /*消除P0的值*/       DX=1;         /*段选输入有效*/       P0=table[n];/*输出段码*/       DX=0;             /*段码锁存*/   }  while(n)  {       P0=0XFF;      /*消除P0的值*/       WX=1;         /*位选输入有效*/       P0=temp;   /*输出位选码*/       WX=0;         /*位选锁存*/       P0=0;     /*消除P0的值*/       DX=1;         /*段选输入有效*/       P0=table[n%10];/*输出段码*/       DX=0;             /*段码锁存*/       temp=_cror_(temp,1);       n=n/10;       delay(1);   }}void main(){  EA=1;ET0=1;TMOD=0x01; //初始化定时器T0 while(1)  //扫描显示 { if(K1==0)  //检测到有按键按下    { delay(10);//延迟去抖      if(K1==0) //检测到按键仍然被按下        {   TH0=15536/256;  //启动定时器T0:晶振12MHz,定时50ms,对应计数值50000,计数初值15536            TL0=15536%256;            TR0=1;            while(K1==0);      //检测按键是否释放        }     }   if(K2==0)  //检测到有按键按下    { delay(10);//延迟去抖      if(K2==0) //检测到按键仍然被按下        {   TR0=0;//停止定时器            while(K2==0);      //检测按键是否释放        }     }   if(K3==0)  //检测到有按键按下    { delay(10);//延迟去抖      if(K3==0) //检测到按键仍然被按下        {   TR0=0;//停止定时器,并清零            num=0;            while(K3==0);      //检测按键是否释放        }     }   displayint(num); }   /*另一种方法   while(1)     //扫描显示 {    temp=P3;   temp=temp&0x07;         //只取低3位   if(temp!=0x07)         //检测到有按键按下   { delay(10);//延迟     temp=P3;     temp=temp&0x07;       if(temp!=0x07)       //检测到按键仍然被按下       switch(temp)        { case 0x06:TH0=15536/256;TL0=15536%256;TR0=1;break;//启动定时器T0:晶振12MHz,定时50ms,对应计数值50000,计数初值15536          case 0x05:TR0=0;break;//停止定时器          case 0x03:TR0=0;num=0;//停止定时器,并清零        }         do{temp=P3;       //检测按键是否释放        temp=temp&0x07;       }while(temp!=0x07);   }    displayint(num);  }  */}void ET0_INT() interrupt 1{     TH0=15536/256;   TL0=15536%256;   c++;   if(c==20) {c=0;num++;}}
原创粉丝点击