数码管的动态显示中这段代码的作用DataPort=WM[i]; LATCH2=1; LATCH2=0; DataPort=ziMa[i]; LATCH1=1; LATCH1=0; Delay(20); i++; if(8==i)i=0; } if(key==0) { DataPort=WM[i]; LATCH2=1; LATCH2=0; DataPort=DuanMa[i]; LATCH1=1; LATCH1=0; Delay(20); i++; if(8==i)i=0; } } }
时间: 2023-10-23 17:08:39 浏览: 188
这段代码是数码管动态显示的核心代码,主要实现了按照固定的时间间隔,依次在数码管的不同位上显示不同数字或字符。
具体实现过程如下:
1. 首先通过DataPort口输出WM[i],即指定数码管的位码,然后将LATCH2置为1,再将LATCH2置为0,以产生锁存时序信号,控制锁存器将DataPort口上的数据锁存。
2. 然后通过DataPort口输出ziMa[i],即指定数码管的字码,再将LATCH1置为1,再将LATCH1置为0,以产生锁存时序信号,控制锁存器将DataPort口上的数据锁存。
3. 延时20ms,以便数码管有足够的时间完成显示。
4. i自增1,如果i已经等于8,则将i重新赋值为0。这里i的作用是控制数码管显示的位数,通过不断地改变i的值,实现在数码管不同的位上依次显示数字或字符。
5. 如果key==0,即按键未被按下,则执行与上述步骤类似的操作,不同之处在于通过DataPort口输出DuanMa[i],即指定数码管的段码,以实现在数码管不同的段上显示不同的数字或字符。
6. 循环执行以上步骤,实现数码管的动态显示。
需要注意的是,数码管的显示是依赖于PWM[i]、ziMa[i]和DuanMa[i]这三个数组的值的,这三个数组分别存放了数码管的位码、字码和段码。因此,在使用这段代码时,需要根据具体的需求修改这三个数组的值,以实现不同的显示效果。
相关问题
解释一下这段代码void main() { unsigned char i=0; EA=1; EX1=1; IT1=1; while(1) { if(key==1) { DataPort=WM[i]; LATCH2=1; LATCH2=0; DataPort=ziMa[i]; LATCH1=1; LATCH1=0; Delay(20); i++; if(8==i)i=0; } if(key==0) { DataPort=WM[i]; LATCH2=1; LATCH2=0; DataPort=DuanMa[i]; LATCH1=1; LATCH1=0; Delay(20); i++; if(8==i)i=0; } } }
这段代码是8051单片机的程序,主要实现的是控制数码管显示。具体解释如下:
1. 首先定义了一个无符号字符型变量i,并初始化为0。
2. 打开全局中断开关EA,开启外部中断1的中断响应EX1,设置外部中断1为下降沿触发模式IT1。
3. 进入一个无限循环while(1)。
4. 如果按键key被按下(即key==1),就执行以下操作:
- 将WM[i]的值输出到DataPort口上;
- 先将LATCH2置1,然后再置0,以产生锁存时序信号,控制锁存器将DataPort口上的数据锁存;
- 将ziMa[i]的值输出到DataPort口上;
- 先将LATCH1置1,然后再置0,以产生锁存时序信号,控制锁存器将DataPort口上的数据锁存;
- 延时20ms;
- i自增1,如果i已经等于8,则将i重新赋值为0。
5. 如果按键key未被按下(即key==0),就执行以下操作:
- 将WM[i]的值输出到DataPort口上;
- 先将LATCH2置1,然后再置0,以产生锁存时序信号,控制锁存器将DataPort口上的数据锁存;
- 将DuanMa[i]的值输出到DataPort口上;
- 先将LATCH1置1,然后再置0,以产生锁存时序信号,控制锁存器将DataPort口上的数据锁存;
- 延时20ms;
- i自增1,如果i已经等于8,则将i重新赋值为0。
6. 循环执行以上步骤,实现数码管的动态显示。
注:其中的WM数组和ziMa数组分别存放了数码管的位码和字码,DuanMa数组存放了数码管的段码。LATCH1和LATCH2是控制锁存器的控制信号,DataPort则是数码管的数据口。
#include<reg52.h> #define DataPort P0; sbit LATCH2=P2^2; sbit LATCH1=P2^3; unsigned char code zima[]={0x76,0x73,0x38,0x38,0x7f}; unsigned char code wm[]={0xfe,0xfd,0xfb,0xf7,0xef}; void delay(unsigned int t); void main() { unsigned char i=0; while(1){ DataPort=wm[i]; LATCH2=1; LATCH2=0; DataPort=zima[i]; LATCH1=1; LATCH1=0; delay(20); i++; if(i==5) i=0; } } void Delay(unsigned int t) { while(--t); } 哪里错了
这段代码中有几个问题:
1. 在 `#define DataPort P0;` 这一行中,应该将分号(;)去掉,否则会导致后续使用 `DataPort` 宏时出现语法错误。
2. `void Delay(unsigned int t)` 函数名称大小写不一致,应该统一为 `delay`。
3. `delay` 函数中的 `while(--t);` 应该改为 `while(--t) ;`,添加一个空格以避免编译器误解为语句结束。
4. 在 `void main()` 函数中,应该添加 `Delay(20);` 语句,以调用 `delay` 函数。
下面是修改过的代码:
```C
#include<reg52.h>
#define DataPort P0
sbit LATCH2 = P2^2;
sbit LATCH1 = P2^3;
unsigned char code zima[] = {0x76,0x73,0x38,0x38,0x7f};
unsigned char code wm[] = {0xfe,0xfd,0xfb,0xf7,0xef};
void delay(unsigned int t);
void main() {
unsigned char i = 0;
while(1) {
DataPort = wm[i];
LATCH2 = 1;
LATCH2 = 0;
DataPort = zima[i];
LATCH1 = 1;
LATCH1 = 0;
Delay(20);
i++;
if (i == 5) i = 0;
}
}
void delay(unsigned int t) {
while(--t) ;
}
```
希望这可以帮助您解决问题。
阅读全文