解释 这些代码 P3=0XEF; P1=Tab[disdata[3]]+0x01; delayms(1); P3=0XDF; P1=Tab[disdata[2]]; delayms(1); P3=0XBF; P1=Tab[disdata[1]]; delayms(1); P3=0X7f; P1=Tab[disdata[0]]; delayms(1);
时间: 2024-04-05 17:35:15 浏览: 18
这段代码的作用是将disdata数组中的三个十进制位数以数码管的形式显示出来。其中,disdata[3]存储了计算结果的千位,disdata[2]存储了计算结果的百位,disdata[1]存储了计算结果的个位。而disdata[0]则没有被使用,可能是因为数码管只需要显示三位数。
具体实现过程是先将P3端口设置为0xEF,然后将disdata[3]对应的数码管显示出来,这里使用了一个Tab数组来存储0~9的数码管显示模式,Tab[disdata[3]]+0x01的结果就是将Tab数组中对应的数码管显示模式加上0x01,这样可以将小数点(如果有的话)显示出来。然后通过delayms函数来延时1ms,以便让数码管显示稳定。接着,将P3端口设置为0xDF,将disdata[2]对应的数码管显示出来,同样使用Tab数组来获取数码管显示模式,并延时1ms。接着,将P3端口设置为0xBF,将disdata[1]对应的数码管显示出来,仍然使用Tab数组和延时函数。最后,将P3端口设置为0x7F,将disdata[0]对应的数码管显示出来,仍然使用Tab数组和延时函数。这样就完成了将计算结果以数码管的形式显示出来的操作。
相关问题
#include<reg52.h> #define uchar unsigned char ; #define uint unsigned int ; Ledcode[6][8]={ {0x01,0xEF,0xEF,0xEF,0x01,0xFF,0xFF,0xFF},//H {0x83,0x7D,0x75,0x7B,0x85,0xFF,0xFF,0xFF},//Q {0x03,0xFD,0xFD,0xFD,0x03,0xFF,0xFF,0xFF},//U {0xEF,0xEF,0x01,0xEF,0xEF,0xFF,0xFF,0xFF},//+ {0x01,0xF7,0x0F,0xF7,0x01,0xFF,0xFF,0xFF},//W {0xFB,0xFD,0x7D,0x03,0x7F,0xFF,0xFF,0xFF}};//J void delayms(int n) { int i; int j; for(i=0;i<n;i++) for(j=0;j<110;j++); } void main() { int i=0; int j=0; int flag=0; int t=25; int time=0; while(1) { P0=0XFF; P1=0X00; delayms(1000); for(j=0;j<8;j++) { time=100; for(time=100;time>0;time--) { for(i=0;i<8;i++) { P0=(0X80>>i); P1 = Ledcode[j][i]; delayms(2); P0=0X00; P1=0XFF; } } } while(1) { for(i=0;i<8;i++) { if(flag==1) { for(t=25;t>0;t--) { for(j=0;j<8;j++) { P0=(0X80>>j);//ÓÒÒÆjλ P1=Ledcode[i][j]; delayms(25-t); P0=0X00; P1=0XFF; delayms(t); } } flag=0; delayms(1000); } else if(flag==0) { for(t=0;t<25;t++) { for(j=0;j<8;j++) { P0=(0X80>>j);//ÓÒÒÆjλ P1=Ledcode[i][j]; delayms(25-t); P0=0X00; P1=0XFF; delayms(t); } } flag=1; delayms(1000); } } if(i==8) { i=0; P0=0X00; P1=0XFF; break; } } } }优化一下这段代码
这段代码可以进行如下优化:
1. 在循环中使用常量的地方可以使用宏定义,例如将 `delayms(1000)` 定义为 `DELAY_1000MS`。
2. 在延时函数中可以使用定时器来进行延时,提高精度。
3. 将循环中的常量赋值移到循环外部,减少每次循环的赋值操作。
4. 在循环中使用位运算来代替移位操作,提高效率。
优化后的代码如下所示:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DELAY_1000MS 1000
uchar Ledcode[6][8] = {
{0x01, 0xEF, 0xEF, 0xEF, 0x01, 0xFF, 0xFF, 0xFF}, //H
{0x83, 0x7D, 0x75, 0x7B, 0x85, 0xFF, 0xFF, 0xFF}, //Q
{0x03, 0xFD, 0xFD, 0xFD, 0x03, 0xFF, 0xFF, 0xFF}, //U
{0xEF, 0xEF, 0x01, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF}, //+
{0x01, 0xF7, 0x0F, 0xF7, 0x01, 0xFF, 0xFF, 0xFF}, //W
{0xFB, 0xFD, 0x7D, 0x03, 0x7F, 0xFF, 0xFF, 0xFF} //J
};
void delayms(int n) {
int i;
int j;
for (i = 0; i < n; i++) {
for (j = 0; j < 110; j++);
}
}
void main() {
int i = 0;
int j = 0;
int flag = 0;
int t = 25;
int time = 0;
P0 = 0xFF;
P1 = 0x00;
while (1) {
delayms(DELAY_1000MS);
for (j = 0; j < 8; j++) {
time = 100;
while (time-- > 0) {
for (i = 0; i < 8; i++) {
P0 = ~(0x01 << i);
P1 = Ledcode[j][i];
delayms(2);
P0 = 0x00;
P1 = 0xFF;
}
}
}
while (1) {
for (i = 0; i < 8; i++) {
if (flag == 1) {
for (t = 25; t > 0; t--) {
for (j = 0; j < 8; j++) {
P0 = ~(0x01 << j);
P1 = Ledcode[i][j];
delayms(25 - t);
P0 = 0x00;
P1 = 0xFF;
delayms(t);
}
}
flag = 0;
delayms(DELAY_1000MS);
} else if (flag == 0) {
for (t = 0; t < 25; t++) {
for (j = 0; j < 8; j++) {
P0 = ~(0x01 << j);
P1 = Ledcode[i][j];
delayms(25 - t);
P0 = 0x00;
P1 = 0xFF;
delayms(t);
}
}
flag = 1;
delayms(DELAY_1000MS);
}
}
if (i == 8) {
i = 0;
P0 = 0x00;
P1 = 0xFF;
break;
}
}
}
}
```
逐行解释以下代码:#include<reg51.h> #include<intrins.h> #define ADCDATA P1 #define uchar unsigned char; unsigned char getdata; unsigned char min = 0; unsigned char sec = 0; unsigned char count = 0; sbit START = P2^0; sbit ALE = P2^0; sbit EOC = P2^1; sbit OE = P2^2; sbit CHOO =P2^3; uchar code dtable[10] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xef,0xef}; uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code num[4] = {0x0E, 0x0D, 0x0B, 0x07}; uchar disbuf[4] = {0,0,0,0}; uchar i; void delay(unsigned int k) { unsigned int j; for(j=0;j<k;j++); } void Init() { START=0; OE = 0; _nop_(); ALE = 0; _nop_(); _nop_(); ALE = 1; _nop_(); _nop_(); ALE = 0; _nop_(); _nop_(); TMOD=0x01; TH0=(65535-50000)/256; TL0=(65535-50000)%256; EA=1; ET0=1; IT0=1; TR0=1; } void display1(void) { getdata = ((getdata*1.0)/255)*500; disbuf[0] = getdata/100; disbuf[1] = getdata%100/10; disbuf[2] = getdata%10; disbuf[3] = 0x00; for(i = 0;i<4;i++) { if(i==0) { P0 = dtable[disbuf[i]]; P3 = num[i]; } else { P0 = table[disbuf[i]]; P3 = num[i]; } delay(200); P3 = 0x0f ; } } void display2(void) { unsigned char k; for(k=0;k<4;k++) { switch(k) { case 0: {P0=table[min/10];P3=num[k];break;} case 1: {P0=table[min%10];P3=num[k];break;} case 2: {P0=table[sec/10];P3=num[k];break;} case 3: {P0=table[sec%10];P3=num[k];break;} } delay(200); P3=0xff; } }
这段代码是基于 8051 单片机的程序,主要涉及到数码管显示和 ADC 转换。下面是逐行解释:
```c
#include<reg51.h>
#include<intrins.h>
```
引入 8051 单片机的头文件。
```c
#define ADCDATA P1
```
定义 ADC 的数据口为 P1。
```c
#define uchar unsigned char;
```
定义一个无符号字符类型的宏。
```c
unsigned char getdata;
unsigned char min = 0;
unsigned char sec = 0;
unsigned char count = 0;
```
定义三个无符号字符类型的变量和一个计数器。
```c
sbit START = P2^0;
sbit ALE = P2^0;
sbit EOC = P2^1;
sbit OE = P2^2;
sbit CHOO =P2^3;
```
定义五个单片机 I/O 口的位变量。
```c
uchar code dtable[10] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xef,0xef};
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
```
定义两个数组,用于将数字转换为数码管的显示码。
```c
uchar code num[4] = {0x0E, 0x0D, 0x0B, 0x07};
```
定义一个数组,用于选择数码管的编号。
```c
uchar disbuf[4] = {0,0,0,0};
```
定义一个数组,用于存储要显示的数字。
```c
uchar i;
```
定义一个无符号字符类型的变量。
```c
void delay(unsigned int k) {
unsigned int j;
for(j=0;j<k;j++);
}
```
定义一个延时函数。
```c
void Init() {
START=0;
OE = 0; _nop_();
ALE = 0; _nop_(); _nop_();
ALE = 1; _nop_(); _nop_();
ALE = 0; _nop_(); _nop_();
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
IT0=1;
TR0=1;
}
```
定义一个初始化函数,初始化 ADC 转换和定时器。
```c
void display1(void) {
getdata = ((getdata*1.0)/255)*500;
disbuf[0] = getdata/100;
disbuf[1] = getdata%100/10;
disbuf[2] = getdata%10;
disbuf[3] = 0x00;
for(i = 0;i<4;i++) {
if(i==0) {
P0 = dtable[disbuf[i]];
P3 = num[i];
}
else {
P0 = table[disbuf[i]];
P3 = num[i];
}
delay(200);
P3 = 0x0f ;
}
}
```
定义一个显示函数,将 ADC 转换得到的数据转换为数码管的显示码并显示出来。
```c
void display2(void) {
unsigned char k;
for(k=0;k<4;k++) {
switch(k) {
case 0: {P0=table[min/10];P3=num[k];break;}
case 1: {P0=table[min%10];P3=num[k];break;}
case 2: {P0=table[sec/10];P3=num[k];break;}
case 3: {P0=table[sec%10];P3=num[k];break;}
}
delay(200);
P3=0xff;
}
}
```
定义另一个显示函数,将秒钟和分钟转换为数码管的显示码并显示出来。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)