单片机编程 数码管数码管现实(使用数组元素来段选各...

君,已阅读到文档的结尾了呢~~
单片机控制数码管显示
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
单片机控制数码管显示
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口关于用51单片机控制数码管显示?
要求:1.显示1,2,4,5,7,8位时延时1秒,显示3,6位时延时3秒。2.用按键S1控制两种显示之间的切换,用S2控制熄灭和回复到原来的显示。现在我主要是想问在1,2,4,5,7,8位之间怎么才能移动,在显示时左移一位不是,左移两位也不是,该怎么移动,求具体的程序?
09-10-31 &
你所有调用display()和 delay()函数时候都没在后面加个分号。漏了还是???还有:uchar code table[]={ //显示编码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71} 也应该在后面加个分号!!你的分不好拿啊,该用分号的不用,不该用的地方用了,还有括号你用了很多中文的括号。现在帮你改了,你自己好好对一下了,反正编译通过了,运行结果你自己看吧,我没你的目标板,运行不了。#include&reg51.h& #define uchar unsigned char//宏定义 #define uint unsigned int sbit dula=P2^6; //段控制位 sbit wela=P2^7; //位控制位 uchar miao,fen,aa,n1,n2,n3,n4; uchar code table[]={ //显示编码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(uint z); //延时程序声明 void init(void);//初始化程序声明 void display(uchar n1 ,uchar n2,uchar n3,uchar n4); //显示程序声明 void main() //主程序 { init(); //调用初始化程序 while(1) //进入大循环 { if(aa==20) //判断是否到了1S { miao++; //秒数加1 if(miao==60) //判断是否到了60秒 { miao=0; //秒数清0 fen++; //分数加1 if(fen==60) //判断是否到了60分 { fen=0; //分数到60则清0 } n1=fen/10; //第一个数码管显示分的十位 n2=fen%10; //第二个数码管显示分的个位 n3=miao/10; //第三个数码管显示秒的十位 n4=miao%10; //第四个数码管显示秒的个位 } display(n1,n2,n3,n4);} } }void delay(uint z) //延时程序 { uint x,y; for(x=z;x&0;x--) for(y=110;y&0;y--);} void display(uchar n1 ,uchar n2,uchar n3,uchar n4) { dula=1; //开段选 P0=table[n1]; //送分的十位 dula=0; //关段选 P0=0 //消隐 wela=1; //开位选 P0=0 //选通分的十位 wela=0; //关位选 P0=0 //消隐 delay(1); //延时 dula=1; //开段选 P0=table[n2]; //送分的个位 dula=0; //关段选 P0=0 //消隐 wela=1; //开位选 P0=0 //选通分的个位 wela=0; //关位选 P0=0 //消隐 delay(1); //延时 dula=1; //开段选 P0=table[n3]; //送秒的十位 dula=0; //关段选 P0=0 //消隐 wela=1; //开位选 P0=0 //选通秒的十位 wela=0; //关位选 P0=0 //消隐 delay(1); //延时 dula=1; //开段选 P0=table[n4]; //送秒的个位 dula=0; //关段选 P0=0 //消隐 wela=1; //开位选 P0=0xf7; //选通秒的个位 wela=0; //关位选 P0=0 //消隐 delay(1); //延时 }void init(void){ }void timer0(void) interrupt 1 using 1 {TH0=()/256; //求模 TL0=()%256; //求余 aa++;}
请登录后再发表评论!关于单片机数码管动态显示的简单写法 - 单片机论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
关于单片机数码管动态显示的简单写法
17:20:28  
本帖最后由 eehome 于
10:09 编辑
昨晚刚刚看到郭天祥老师的《新概念51单片机入门》入门一书,刚刚看到数码管动态显示这一部分,嫌郭老师的代码太长,我又是一个懒猪,所以产生了改造代码的想法。过程如下(注,以下所有代码,在STC89C52上通过,系统环境win8,编译软件keil UV4)
先贴出郭天祥老师的源代码
#include&reg52.h&
#include&intrins.h&
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code lizheao[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
void delayms(uint);
void aoge(void);
uint f(uint);
void main()
&&P0=table[1];
&&delayms(500);
&&P0=table[2];
&&delayms(500);
&&P0=table[3];
&&delayms(500);
&&P0=table[4];
&&P0=0xf7;
&&delayms(500);
&&P0=table[5];
&&delayms(500);
&&P0=table[6];
&&delayms(500);
&&P0=table[7];
&&delayms(500);
&&P0=table[8];
&&P0=0x7f;
&&delayms(500);
void delayms(uint xms)
for(i=i&0;i--)
&&for(j=110;j&0;j--);
void aoge(void)
aa=_crol_(aa,1);
怎么样很长是吧,现在小菜我来改造一下,先上代码
#include&reg52.h&
#include&intrins.h&
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint);
void aoge(void);
unsigned char aa=0
uint f(uint);
void main()
&&P0=table[++b&=8?f(b):b];
&&a=_crol_(a,1);
&&delayms(500);
void delayms(uint xms)
for(i=i&0;i--)
&&for(j=110;j&0;j--);
void aoge(void)
aa=_crol_(aa,1);
uint f(uint c)
是不是要短了很多,当时小菜在想第一怎么控制他的位选时,第一想到的是_crol_函数,循环左移,因为小菜用的数码管是共阴数码管,所以这样得到的效果就是从左至右数码管依次点亮,可是怎么控制数码管选择的数字,也就是段选呢? ,这里最大的一个问题就是,数组超标,更何况我们只希望显示1到八这几个数字怎么办呢?,我们在学C语言的时候,有两个东西可以起到非常重要的作用条件判断式?=:还有就是函数的递归,代码单独出来,
P0=table[++b&=8?f(b):b];
uint f(uint c)
这样是不是就是很清楚了呢?,所以我们的C语言基础是非常重要的啊,好了就写到这里,菜鸟心德,大大勿拍
助理工程师
18:26:47  
21:36:57  
如果你看了金山工作室的视频讲解、你会知道这个可以更简单,看过郭天祥的看过李想的视频教程,代码还是冗长
22:39:49  
我们写数码管的基本思路是一个定时器订5ms扫描数码管!!!限制主函数执行5ms 因为每个数码管扫描时间不一样的话会亮暗不一样的!!!
11:39:54  
yy800119 发表于
如果你看了金山工作室的视频讲解、你会知道这个可以更简单,看过郭天祥的看过李想的视频教程,代码还是冗长 ...
恩恩,刚刚才开始搞单片机,又想偷下懒,所以自己琢磨的改进方法,以后还会继续研究怎么将这段代码更简洁
13:36:44  
锦绣星空 发表于
恩恩,刚刚才开始搞单片机,又想偷下懒,所以自己琢磨的改进方法,以后还会继续研究怎么将这段代码更简洁 ...
打错字了,不是金山,是金沙滩工作室,呵呵,我也是闲暇学习学习,正在看视频模仿的阶段~
11:35:06  
都是學習!来自: Android客户端
助理工程师
23:08:02  
有创意有思想,谢谢分享,只有不断的学习才会变得强大
10:05:52  
为什么我感觉好麻烦 我数码管都是直接拉低P口 最多也就加一个138译码器 看那代码我真想死
11:20:53  
有一个问题是,你用循环位移来控制位选,那你想改动某一位数码管显示的数的时候要怎么办呢?
助理工程师
14:33:40  
Powered by基于单片机的数码管显示实现自加功能
> 基于单片机的数码管显示实现自加功能
基于单片机的数码管显示实现自加功能
 本文主要介绍MCS-51的管自加1,从1一直到999.以下是硬件电路图、图以及源代码。(电路:使用74HC573锁存器控制段选,74H138控制位选;)本文引用地址:管自加的代码:  #include  #define uchar unsigned char  #define uint unsigned int  uchar code table[16] = {0x3f,0x06,0x5b,0x4f,  0x66,0x6d,0x7d,0x07,0x7f,  0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数字表  uchar flag,bai,shi,    void xunhuan();  void delay(uint z);  void init();  void main()  {  init();  while(1)  {  if(flag==20)  {  flag=0;  temp++;  if(temp==1000)  {  temp=0;  }  }  bai=temp/100;  shi=temp%100/10;
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一

我要回帖

更多关于 单片机编程 数码管 的文章

 

随机推荐