在各个uadu

在各个uadu

10个粉丝

118

问答

1240

专栏

10

资料

在各个uadu  发布于  2008-11-15 12:41:39
采纳率 1%
118个问答
2181

通用的数码管显示C51程序

 
//8个数码管由8个74ls164级联而成,接到单片机串口

#i nclude //我用的单片机为at89s52
#i nclude //_nop_()语句在其中有定义
#define LED_A 0x0a
#define LED_B 0x0b
#define LED_C 0x0c
#define LED_D 0x0d
#define LED_E 0x0e
#define LED_F 0x0f
#define LED_BLANK 16       //数码管灭的索引值是16                                         #define LED_NEG 17      //负号的索引值是17
#define nop8() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
void led_update();
void lprinti(uint,uchar,uchar);
void lclear(uchar ,uchar );
完整版本:
[hide]#i nclude //我用的单片机为at89s52
#i nclude //_nop_()语句在其中有定义
#define LED_A 0x0a
#define LED_B 0x0b
#define LED_C 0x0c
#define LED_D 0x0d
#define LED_E 0x0e
#define LED_F 0x0f
#define LED_BLANK 16       //数码管灭的索引值是16                                         #define LED_NEG 17      //负号的索引值是17
#define nop8() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
void led_update();
void lprinti(uint,uchar,uchar);
void lclear(uchar ,uchar );

//共阴极                                 //  ' '  '-'
uchar code led_num[18]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x00,0x0

2};
uchar led_buf[8]={16,16,16,16,16,16,16,16};
void led_update()
{
uchar i;
for(i=0;i<8;i++)
{
  if(led_buf>=0x80) //若此位要显示小数点,
  {
   SBUF=led_num[led_buf&0x7f]|0x01; //数码管代码最低位置1
  }
  else
   SBUF=led_num[led_buf];
  nop8();//延时8个机器周期才能送下一个

}
}
//li: 要显示的数
//mode:高4位表示显示方式,5:十进制显示,1~4:十进制显示时的小数的个数即也是小数点位置,0:十六进制显示;   低4位,表示显示多少位数字。
//xy:从第几个数码管开始向左显示
void lprinti(uint li,uchar mode,uchar xy)  
{
uint asc[5];
uchar i;
uint div;
uchar base;
uchar type=mode>>4,dispn=(mode&0x0f)-1; //注意优先级, mode&0x0f必须打()
if(type==0)//十六进制显示

{
  div=4096;
  base=16;
  i=3;
}
else  //十进制显示
{
  div=10000;
  base=10;
  i=4;
}
asc=li;
for(;i!=0;i--)
{
  asc[i-1]=asc%div;//取出名位
  asc=asc/div;
  div/=base;
}
for(i=dispn;i!=0xff;i--)
{
  if(asc<=9)
  {
   if(i==type)
    asc|=0x80;//若要在此位显示小数点,把其最高位置为1
   led_buf[xy++]=asc;
  }
}
led_update();
}
//################################################################33
//清数码管的from到to位,上面不显示任何东西。
//####################################################################
void lclear(uchar from,uchar to)
{
  for(;from<=to;from++)
  led_buf[from]=LED_BLANK;
led_update();
}

[/hide]
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区