注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

耳朵的博客

做自己想做的人

 
 
 

日志

 
 

8位数码管显示函数(使用74hc573锁存器)   

2009-05-04 09:05:01|  分类: 单片机 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

显示函数,测试程序及Proteus仿真下载:

下载地址1

 

仿真效果截图:

8位数码管显示函数(使用74hc573锁存器)  - 耳朵 - 耳朵的博客

部分源代码:

(由于文本所处环境不一样,这里比较不整齐,可以直接在上面的"下载地址1"下载)

/************************************************\
* 8位共阳数码管显示函数(使用74hc573锁存器)     *
*      力求程序高效,简洁            *  
\************************************************/
/************************************************\
* 分多个函数的原因:          *
* 显示要求不同,函数的执行效率不同     *
* 为了实现程序的高效性,显示要求不同调用不同的函数*
\************************************************/

#include<reg51.h>
#define DISPLAY_IO  P2  
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
sbit duan=P3^0;  //定义段
sbit wei=P3^1;  //定义位
 
unsigned char code w[]={ //共阴
 //0-F无小数点
 0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71,
 //0-F带小数点
 0xbf,0x86,0xdb,0xcf, 
    0xe6,0xed,0xfd,0x87,
    0xff,0xef,0xf7,0xfc,
    0xb9,0xde,0xf9,0xf1,
 //小数点  负号
 0x80,     0x40};     
/************************************************\
*           显示任意内容      *
*  n[0-7]数组的值表示数码管位置从左至右的内容  *
\************************************************/
void display_any(uchar n[8])
{
 uchar i,delay=0;
 for(i=0;i<8;i++)
 {
  //清除段锁存器内容
  DISPLAY_IO=0xff;
  duan=1;
  duan=0;
  //位值送入位锁存器
  DISPLAY_IO=0x01<<i;
  wei=1;
  wei=0;
  //段值送入段锁存器
  DISPLAY_IO=0xff-n[i];
  duan=1;
  duan=0;
  //延时0-255(越长越亮,但太长会闪)
  delay=100;
  while(delay--);
 }
 //清除段锁存器内容 不让第一个数最亮
 DISPLAY_IO=0xff;
 duan=1;
 duan=0; 
}
/************************************************\
*         10进制无符号整数显示        *
*   传入n为0到9999 9999        *
*   传入浮点型小数点后忽略,范围不正确显示不正确  *
*   右对齐,左边无多余0        *
\************************************************/
void display_ulong(ulong n)
{
 uchar i=8,delay=0;
 do
 {
  //清除段锁存器内容
  DISPLAY_IO=0xff;
  duan=1;
  duan=0;
  //位值送入位锁存器
  DISPLAY_IO=0x01<<(--i);
  wei=1;
  wei=0;
  //段值送入段锁存器
  DISPLAY_IO=0xff-w[n%10];
  duan=1;
  duan=0;
  n/=10;
  //延时0-255(越长越亮,但太长会闪)
  delay=100;
  while(delay--);
 }while(n>0);
 //清除段锁存器内容 不让第一个数最亮
 DISPLAY_IO=0xff;
 duan=1;
 duan=0;
}
/************************************************\
*         10进制有符号整数显示        *
*   传入n为-999 9999到9999 9999      *
*   传入浮点型小数点后忽略,范围不正确显示不正确  *
*   右对齐,左边无多余0        *
\************************************************/
void display_long(long n)
{
 uchar i=8,delay=0;
 bit flag=0;
 if(n<0)
 {
  flag=1;
  n=-n;
 }
 do
 {
  //清除段锁存器内容
  DISPLAY_IO=0xff;
  duan=1;
  duan=0;
  //位值送入位锁存器
  DISPLAY_IO=0x01<<(--i); 
  wei=1;
  wei=0;
  //段值送入段锁存器
  DISPLAY_IO=0xff-w[(n==100000000?33:n%10)];
  duan=1;
  duan=0;
  n/=10;
  if(n==10000000)
   n=-1;
  if(n==0&&flag==1)
   n=100000000; 
  //延时0-255(越长越亮,但太长会闪)
  delay=100;
  while(delay--);
 }while(n>0);
 //清除段锁存器内容 不让第一个数最亮
 DISPLAY_IO=0xff;
 duan=1;
 duan=0; 
}
/************************************************\
*         10进制无符号实型显示        *
*   传入n为0到9999 9800        *
*   传入范围不正确显示不正确        *
*   右对齐,左边无多余0,右边小数点后无多余0   *
\************************************************/
void display_udouble(double n)
{
 uchar i=8,delay=0,point_position=0;
 ulong n_long=n;  //将n赋值给整形变量
 while(n_long!=n)  //此循环的功能:使n变为8位整数,并记下小数点位置
 {
  n*=10;
  n_long=n;
  point_position++;//每乘一次,小数点左移一位
 }
 do
 {
  //清除段锁存器内容
  DISPLAY_IO=0xff;
  duan=1;
  duan=0;
  //位值送入位锁存器
  DISPLAY_IO=0x01<<(--i);
  wei=1;
  wei=0;
  //段值送入段锁存器
  DISPLAY_IO=0xff-w[n_long%10+((7-i)==point_position?16:0)];
  duan=1;
  duan=0;
  n_long/=10;
  //延时0-255(越长越亮,但太长会闪)
  delay=100;
  while(delay--);
 }while(n_long>0);
 //清除段锁存器内容 不让第一个数最亮
 DISPLAY_IO=0xff;
 duan=1;
 duan=0;
}
/************************************************\
*         10进制有符号实型显示        *
*   传入n为-999 999到9999 9800      *
*   传入范围不正确显示不正确        *
*   右对齐,左边无多余0,右边小数点后无多余0   *
\************************************************/
void display_double(double n)
{
 uchar i=8,delay=0,point_position=0;
 bit flag=0;
 long n_long=n;  //将n赋值给整形变量
 while(n_long!=n)  //此循环的功能:使n变为8位整数,并记下小数点位置
 {
  n*=10;
  n_long=n;
  point_position++;//每乘一次,小数点左移一位
 }
 if(n_long<0)
 {
  flag=1;
  n_long=-n_long;
 }
 do
 {
  //清除段锁存器内容
  DISPLAY_IO=0xff;
  duan=1;
  duan=0;
  //位值送入位锁存器
  DISPLAY_IO=0x01<<(--i); 
  wei=1;
  wei=0;
  //段值送入段锁存器
  DISPLAY_IO=0xff-w[(n_long==100000000?33:(n_long%10+((7-i)==point_position?16:0)))];
  duan=1;
  duan=0;
  n_long/=10;
  if(n_long==10000000)
   n_long=-1;
  if(n_long==0&&flag==1)
   n_long=100000000; 
  //延时0-255(越长越亮,但太长会闪)
  delay=100;
  while(delay--);
 }while(n_long>0);
 //清除段锁存器内容 不让第一个数最亮
 DISPLAY_IO=0xff;
 duan=1;
 duan=0; 
}
/************************************************\
*    2-16任意进制无符号不去零整数显示    *
*   传入n为0到X,X=((进制)^8)-1      *
*   传入范围不正确显示不正确        *
*   不自动去0                               *
\************************************************/
void display_number(ulong n,uchar jin_zhi)
{
 uchar i,delay=0;
 for(i=0;i<8;i++)
 {
  //清除段锁存器内容
  DISPLAY_IO=0xff;
  duan=1;
  duan=0;
  //位值送入位锁存器
  DISPLAY_IO=0x01<<(7-i);
  wei=1;
  wei=0;
  //段值送入段锁存器
  DISPLAY_IO=0xff-w[n%jin_zhi];
  duan=1;
  duan=0;
  n/=jin_zhi;
  //延时0-255(越长越亮,但太长会闪)
  delay=100;
  while(delay--);
 }
 //清除段锁存器内容 不让第一个数最亮
 DISPLAY_IO=0xff;
 duan=1;
 duan=0; 
}

/************************\
*  8位数码管测试程序   *
\************************/
void main(void)
{
 uint i,t=200;
 char n[8]={1,2,4,8,16,32,64,128};
 while(1)
 {
  i=t;
  while(i--)
  {
   display_any(n);
  }
  i=t;
  while(i--)
  {
   display_ulong(123);
  }
  i=t;
  while(i--)
  {
   display_long(-123);
  }
  i=t;
  while(i--)
  {
   display_udouble(123.45);
  }
  i=t;
  while(i--)
  {
   display_double(-123.45);
  }
  i=t;
  while(i--)
  {
   display_number(0x123abc,16);
  }
 }
}

  评论这张
 
阅读(10525)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018