51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
串行驱动led显示(C语言)
发布时间:2009/6/2  阅读次数:606  字体大小: 【】 【】【

作者:佚名 来源:不详

//一个74hc595位移寄存器驱动三极管驱动led位,
//两个74hc595驱动led段,方式位5位x8段x2=10个数码管
//5分频,每次扫描时间位1.25ms


//定义特殊符号

#define  nul  0xf
#define  qc  0xc
#define  qb  0xb
#define  q_  0xa
#define  q__  0xd
#define  q___  0xe
#define  qp  0x10
#define  qe  0x11
#define  qj  0x12
#define  qn  0x13
#define  qf  0x14
#define  qa  0x15
#define  qr  0x16
#define  qd  0x17
#define  qu  0x18
#define  ql  0x19
#define  qh  0x1a
#define  qwen  0x1b
#define  qt  0x1c
#define  qla  0x1d
#define  qlb  0x1e
#define  qlc  0x1f
#define  qld  0x20
#define  qle  0x21
#define  qlf  0x22
#define  qlg  0x23
#define  qldp  0x24


//显示段信息,不同led排列组合的段信息只需更改8个数值即可。
//因此,该定义具有通用性。

//  显示  
//    -d  20
//  |c  40  |e  10
//    -  g    80    
//  |b  2  |f  4
//    _a1  .dp  8
#define  pa  1
#define  pb  2
#define  pc  0x40
#define  pd  0x20
#define  pe  0x10
#define  pf  4  
#define  pg  0x80
#define  pdp  8

//--------------
#define  l0  pdp+pg
#define  l1  255-pf-pe
#define  l2  pdp+pc+pf
#define  l3  pdp+pc+pb
#define  l4  pdp+pa+pb+pd
#define  l5  pdp+pb+pe
#define  l6  pdp+pe
#define  l7  pdp+pc+pg+pb+pa
#define  l8  pdp
#define  l9  pdp+pb
#define  la  pdp+pa
#define  lb  pdp+pd+pe
#define  lc  pdp+pg+pe+pf
#define  ld  pdp+pc+pd
#define  le  pdp+pe+pf
#define  lf  pdp+pe+pf+pa
#define  l_  255-pg
#define  lnul  255
#define  ll  pdp+pg+pd+pf+pe
#define  lp  pdp+pa+pf
#define  lt  pdp+pd+pe+pf
#define  lr  pdp+pe+pf+pg+pa
#define  ln  pdp+pg+pa
#define  lh  pdp+pd+pe+pa
#define  ly  pdp+pb+pd
#define  lu  pdp+pg+pd
#define  l__  pdp+pg+pb+pc+pe+pf
#define  l___  l__-pg
#define  l_1  255-pa
#define  l_2  255-pa-pg
#define  lj  255-(pe+pf+pa)
#define  lwen  255-(pd+pe+pg+pb)
#define  lall  0


#define  lla  255-pa
#define  llb  255-pb
#define  llc  255-pc
#define  lld  255-pd
#define  lle  255-pe
#define  llf  255-pf
#define  llg  255-pg
#define  lldp  255-pdp


//串行送出的位信息,目前是10位led显示。
unsigned  char  code  un_dig[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb};
//串行送出的短信息。
unsigned  char  code  un_disp[]={l0,l1,l2,l3,l4,l5,l6,l7,l8,l9,l_,lb,lc,l__,l___,lnul,lp,le,lj,ln,lf,la,lr,ld,lu,
ll,lh,lwen,lt,lla,llb,llc,lld,lle,llf,llg,lldp,lnul};




sbit  d_clk=P0^0;    //移位时钟
sbit  d_dat=P0^1;    //移位数据
sbit  d_st=P0^2;      //移位锁定


unsigned  char  dig;      //位扫描计数器
unsigned  char  d[10];              //显示缓冲

//送出8位串行数据
void  out_disp(unsigned  char  dd)  {
  unsigned  char  i;
  for  (i=0;i<8;i++)  {
    if  (dd&1)  d_dat=1;  else  d_dat=0;
    d_clk=0;
    dd>>=1;
    d_clk=1;
  }
}
//控制小数点和闪烁,显示数据|0x040表示有小数点;显示数据|0x80表示闪烁。
void  out_displ(unsigned  char  dd)  {
  if  (dd>=0x80)  {
    if  (s001>flash_time)  {out_disp(0xff);return;}
  }
  dd&=0x7f;
  if  (dd>=0x40)  {
    dd=un_disp[dd&0x3f]^pdp;
  }  else  dd=un_disp[dd];
  out_disp(dd);
}





unsigned  int  s001;  //闪烁时间参考
void  int_t0(void)  interrupt  1  {
  unsigned  char  dd;
  TL0=TL0+30;TH0=0xfb;  //800
  time++;
  if  ((++s001)>=800)  s001=0;
  //  显示  
  if  ((++dig)>4)  dig=0;
  d_st=0;
  dd=d[dig+5];
  out_displ(dd);
  dd=d[dig];
  out_displ(dd);
  out_disp(un_dig[dig]);
  d_st=1;
}
void  main(void)  {
  unsigned  char  i;
  TMOD=0x1;
  TR0=ET0=1;
  EA=1;
  for  (i=0;i<10;i++)  d[i]=i;  //display  test
  while  (1)  {}
}

  

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号