标题: 51单片机数码管无法实现动态显示 [打印本页]
作者: 18377222045 时间: 2018-7-29 17:37
标题: 51单片机数码管无法实现动态显示
我是一名51单片的出学者,我想实现数码管的动态显示,我模仿了教学视频写了以下代码,可是为什么只可以在第一个数码管亮呢?求大神指教
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit A=P2^2;
sbit W=P2^3;
sbit C=P2^4;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delaym(uint a)//延时函数
{
作者: angmall 时间: 2018-7-30 07:00
给你数码管的动态显示程序试试
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 数 名 : DigDisplay
- * 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示
- *******************************************************************************/
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//显示第7位
- }
- P0=smgduan[i];//发送段码
- delay(100); //间隔一段时间扫描
- P0=0x00;//消隐
- }
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- while(1)
- {
- DigDisplay(); //数码管显示函数
- }
- }
复制代码
作者: 关外秀才 时间: 2018-7-30 10:33
你这个程序不完整,没法给你看是哪里出问题了!你检查一下是不是在循环的地方出问题了,左移或者右移程序出错。
作者: zero..... 时间: 2018-7-30 16:03
51单片机的数码管一次只能亮一个,假设A=0,W=0,C=1;第一个数码管亮,之后要再设A=0,W=1,C=0,第二个数码管亮,如果没改变的话就会只亮一个,我看不到下面的程序,只能推断一下,显示一个后要消影一下。delay较短的时间就可以了。
作者: lystone 时间: 2018-7-30 16:36
定义有些问题
作者: lystone 时间: 2018-7-30 16:36
定义有些问题
作者: jdddd 时间: 2018-7-30 19:54
程序不完整,没办法看出程序错误在哪
作者: Jory_Ho 时间: 2018-7-30 20:29
main函数呢
作者: guangshi_wq 时间: 2018-7-30 21:15
我的回贴在下面,是关于动态显示的方法与技巧
http://www.51hei.com/bbs/dpj-129474-1.html
作者: comkik 时间: 2018-7-30 21:39
你这个程序不完整,没法给你看是哪里出问题了
作者: guangshi_wq 时间: 2018-7-31 00:22
把他的代码复制一下,然后看我在8楼的修改方法.对着改.把重复的地方删了就行拉.人家都这样学习的,
别直接捡现成的,对你的学习没帮助.先学会改程序
作者: zl2168 时间: 2018-7-31 09:57
本帖最后由 zl2168 于 2018-7-31 12:43 编辑
介绍你几个动态显示参考案例,自己去对照研究。
先Proteus仿真一下,确认有效。
实例56 PNP晶体管选通3位共阳LED数码管动态显示;
实例57 74LS139选通4位LED数码管动态显示
实例58 74LS138选通8位LED数码管动态显示
实例59 74LS595串行选通8位LED数码管动态显示
实例60 8255A扩展8位LED数码管动态显示
实例63 8155扩展8位LED数码管动态显示
实例64 MAX7221控制8位LED数码管动态显示
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |