|
发表于 2010-1-30 13:35:46
|
显示全部楼层
两点疑问A和B。
在书中第三章 数码管的显示(下) 讲动态驱动2个数码管显示的实现方法中曾提到:
“有读者可能会问,送出数码管2的段码时,数码管1的公共端仍然处于驱动状态,为什么没有造成数码管1显示混乱呢?这是因为单片机的程序运行速度非常快,从送出数码管2的段码,到关闭数码管1的公共端,只有微秒级的时间,数码管是不会在这样短的时间内发光的。 所以没有必要在送出数码管2的段码前关闭数码管1的公共端驱动信号。”
实际程序如下:
while(1)
{
PORTD=DisTab[Led_H];
PORTC=Led_1; //驱动数码管1
Delay_ms(3);
PORTD=DisTab[0x07];
PORTC=Led_2; //驱动数码管2
Delay_ms(3);
PORTC=Led_M; //数码管熄灭
Delay_ms(14);
}
从PORTD=DisTab[0x07]; 送出数码管2的段码 到PORTC=Led_M=0b11111111 两个数码管全熄灭; 用时至少3ms=3000us(已经不是微秒级了) 数码管在这样的时间内是否会发光呢-----A疑问?
如果人的眼睛在3ms内能看清的话,就能看到显示混乱了吧(当然人眼没有那么快)
鉴于以上认识,我个人觉得应该在送出数码管2的段码前关闭数码管1的公共端驱动信号。----B疑问
while(1)
{
PORTD=DisTab[Led_H];
PORTC=Led_1; //驱动数码管1
Delay_ms(3);
================= 熄灭数码管1
PORTD=DisTab[0x07];
PORTC=Led_2; //驱动数码管2
Delay_ms(3);
PORTC=Led_M; //数码管熄灭
Delay_ms(14);
}
不知两处疑问认识是否到位,还请版主批评指教。
一下是书中源码:
led_dis.h
/*********************************************************/
/*程序名称: 数码管段码表 */
/*程序开发: 江海波 */
/*编写时间: 2007年4月5日 */
/*软件环境: ICCAVR */
/*硬件环境: 数码管a段对应MSB */
/*MCU: */
/*程序版本: V1.00 */
/*最后修订时间: */
/*修订部分说明: */
/*********************************************************/
#define Led_P 0x10
#define Led_L 0x11
#define Led_H 0x12
#define Led_U 0x13
#define Led_r 0x14
#define Led__ 0x15
#define Led_- 0x16
const unsigned char DisTab[]=
{
0xFC,0x60,0xDA,0xF2,0x66, //0,1,2,3,4
0xB6,0xBE,0xE0,0xFE,0xF6, //5,6,7,8,9
0xEE,0x3E,0x9C,0x7A,0x9E, //A,b,C,d,E
0x8E,0xCE,0x1C,0x6E,0x7C, //F,P,L,H,U
0x0A,0x10,0x02 //r,_,-
};
delay.h
/*********************************************************/
/*程序名称: 软件延时函数 */
/*程序开发: 江海波 */
/*编写时间: 2007年4月1日 */
/*软件环境: ICCAVR */
/*硬件环境: ATmega48/88/168 CPU时钟频率8MHz */
/*MCU: ATmega48/88/168 */
/*程序版本: V1.00 */
/*最后修订时间: */
/*修订部分说明: */
/*********************************************************/
void Delay_ms(unsigned int Time)
{
unsigned char n=0;
while(Time>0)
{
for (n=1;n<187;n++)
{
NOP();
}
Time--;
}
}
/*********************************************************/
/* */
/* 实例5 数码管的显示(下) 源程序 */
/* */
/* 编写:江海波 */
/* */
/* 2007-03 V1.0 */
/* */
/* 提示 : 本程序仅随本书使用,保留版权 */
/* 实例代码用于工程时应谨慎! */
/* */
/* E-mail : soundman@sohu.com */
/* */
/*********************************************************/
#include <iom48v.h>
#include <macros.h>
#include "delay.h"
#include "led_dis.h"
#define Led_1 0b11011111 //数码管1公共端驱动管脚,PC.5
#define Led_2 0b11101111 //数码管2公共端驱动管脚,PC.4
#define Led_M 0b11111111 //数码管熄灭
void main (void)
{
DDRC=0xFF;
DDRB=0xFF;
DDRD=0xFF;
PORTC=0xFF;
PORTB=0xFF;
PORTD=0xFF;
while(1)
{
PORTD=DisTab[Led_H];
PORTC=Led_1; //驱动数码管1
Delay_ms(3);
PORTD=DisTab[0x07];
PORTC=Led_2; //驱动数码管2
Delay_ms(3);
PORTC=Led_M; //数码管熄灭
Delay_ms(14);
}
}
原谅我贴了这么多源代码 占了大家的视线,目的只为了版主能方便理解我这样口齿不清的人所说的问题 |
|