优化这串代码#include <LED.h> void Delay() { char i,j; for(i=1;i<=30;i++) { for(j=1;j<=255;j++) { ; } } } void Liang(X,Y) { int i; for(i=1;i<=16;i++) { SER = X>>15; X = X<<1; SCK = 0; SCK = 1; } for(i=1;i<=16;i++) { SER = Y>>15; Y = Y<<1; SCK = 0; SCK = 1; } RCK = 0; RCK = 1; } #ifndef _LED_h #define _LED_h #include <reg51.h> #include <intrins.h> sbit SER = P2^0; sbit SCK = P2^1; sbit RCK = P2^2; void Liang(X,Y); void Delay(); #endif #include <LED.h> void main() { int L[]={0x0001,0x0002,0x0004,0x0008, 0x0010,0x0020,0x0040,0x0080, 0x0100,0x0200,0x0400,0x0800, 0x1000,0x2000,0x4000,0x8000}; int h[]={0x0000,0xe003,0xef7b,0xef7b,0xe80b,0xef7b,0xef7b,0xe003, 0xeffb,0xec1b,0xeddb,0xeddb,0xec1b,0xeffd,0xebfd,0xf7fe}; int i,j; while(1) { for(i=0;i<16;i++) { for(j=0;j<16;j++) { Liang(h[i],L[i]); Delay(); } } } }并使汉族在16x16的点阵滚动
时间: 2023-07-15 09:15:16 浏览: 46
这段代码看起来是在控制 LED 点阵的显示,其中 Liang 函数控制了两个 74HC595 移位寄存器的输出,Delay 函数则是用来延时的。优化的方向可以分为以下几点:
1. 使用宏定义或常量替代数字常量
代码中有很多数字常量,如 30、16、255、0x0001 等等,这样的常量不易维护,容易引起错误。可以使用宏定义或常量来替代这些数字常量,如:
```c
#define LED_NUM 16
#define DELAY_TIME 30
#define SHIFT_BIT 15
#define SHIFT_TIMES 16
```
2. 函数参数需要指定类型
在 Liang 函数中,X 和 Y 都没有指定类型,应该指定为 uint16_t 类型,这样可以避免类型转换错误。
3. 变量命名需要有意义
在代码中有很多单字母变量名,如 i、j,这样的变量名不易理解和维护。可以使用有意义的变量名,如 row、col 等。
4. 函数命名需要符合规范
Delay 函数的命名不符合命名规范,应该使用驼峰式命名法,如 delay。另外,Liang 函数的命名也不太符合规范,可以改为 shiftOut。
5. 代码结构可以更加清晰
代码中的注释很少,可以加上注释来提高代码可读性。另外,可以将代码分成多个函数,如显示函数和滚动函数等,这样可以使代码结构更加清晰。
综上所述,可以对代码进行如下优化:
相关问题
#include<REG52.H> #include<stdio.h> #include <intrins.h> sbit Trig=P2^0; sbit Echo=P2^1;超声模块测距代码补全
`#include<REG52.H>`是一段头文件的引用,代表使用了基于Intel 8051的单片机开发环境。`<stdio.h>`是标准输入输出头文件的引用。`<intrins.h>`是用于特殊函数的头文件引用。
以下是超声模块测距的代码补全:
```
#include<REG52.H>
#include<stdio.h>
#include <intrins.h>
sbit Trig=P2^0;
sbit Echo=P2^1;
void delay(unsigned int us) //延时函数
{
while(us--);
}
unsigned char read_distance() //读取距离函数
{
unsigned char distance;
Trig = 0; //初始化
delay(2);
Trig = 1; //触发测量
delay(10);
Trig = 0; //停止测量
while(!Echo); //等待Echo为高电平
TH0 = 0;
TL0 = 0; //清零计时器
while(Echo); //等待Echo为低电平
distance = (unsigned char)(TH0*256+TL0)/58.0; //计算距离
return distance;
}
void main()
{
unsigned char distance;
TMOD |= 0x01; //设置为定时器0,工作方式1
while(1)
{
distance = read_distance(); //读取距离
printf("The distance is %d cm\n",distance); //打印距离
delay(500); //延时500ms
}
}
```
优化这串代码#include <LED.h> void Delay() { char i,j; for(i=1;i<=30;i++) { for(j=1;j<=255;j++) { ; } } } void Liang(X,Y) { int i; for(i=1;i<=16;i++) { SER = X>>15; X = X<<1; SCK = 0; SCK = 1; } for(i=1;i<=16;i++) { SER = Y>>15; Y = Y<<1; SCK = 0; SCK = 1; } RCK = 0; RCK = 1; } #ifndef _LED_h #define _LED_h #include <reg51.h> #include <intrins.h> sbit SER = P2^0; sbit SCK = P2^1; sbit RCK = P2^2; void Liang(X,Y); void Delay(); #endif #include <LED.h> void main() { int L[]={0x0001,0x0002,0x0004,0x0008, 0x0010,0x0020,0x0040,0x0080, 0x0100,0x0200,0x0400,0x0800, 0x1000,0x2000,0x4000,0x8000}; int h[]={0x0000,0xe003,0xef7b,0xef7b,0xe80b,0xef7b,0xef7b,0xe003, 0xeffb,0xec1b,0xeddb,0xeddb,0xec1b,0xeffd,0xebfd,0xf7fe}; int i,j; while(1) { for(i=0;i<16;i++) { for(j=0;j<16;j++) { Liang(h[i],L[i]); Delay(); } } } }并使汉字在16x16的点阵滚动
首先,对于延迟函数Delay(),可以使用定时器来进行优化,避免CPU空转浪费时间。例如使用定时器0和中断,每次中断后计数器加1,当计数器达到一定值时,触发定时器0中断,从而进行LED灯的刷新。
其次,在Liang()函数中,可以将两个for循环合并成一个循环,同时使用位运算来代替移位操作,进一步提高代码效率。
最后,对于汉字的滚动,可以将汉字的每一列看作一个16位二进制数,然后依次将每一列二进制数传入Liang()函数进行显示,同时使用循环移位来实现滚动效果。
以下是优化后的代码示例:
```c
#include <LED.h>
void Timer0_Init() { // 定时器0初始化
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0x4C;
TL0 = 0x00;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer0_ISR() interrupt 1 { // 定时器0中断服务程序
static char count = 0;
TH0 = 0x4C;
TL0 = 0x00;
count++;
if (count >= 30) { // 30次中断后刷新一次LED
count = 0;
for (int i = 0; i < 16; i++) {
Liang(h[i], L[i]);
}
}
}
void Liang(X, Y) { // LED点阵显示函数
for (int i = 0; i < 16; i++) {
SER = X & 0x8000;
X <<= 1;
SCK = 0;
SCK = 1;
}
for (int i = 0; i < 16; i++) {
SER = Y & 0x8000;
Y <<= 1;
SCK = 0;
SCK = 1;
}
RCK = 0;
RCK = 1;
}
#ifndef _LED_h
#define _LED_h
#include <reg51.h>
#include <intrins.h>
sbit SER = P2^0;
sbit SCK = P2^1;
sbit RCK = P2^2;
void Liang(X, Y);
void Timer0_Init();
#endif
#include <LED.h>
int L[] = { 0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000 };
int h[] = { 0x0000,0xe003,0xef7b,0xef7b,0xe80b,0xef7b,0xef7b,0xe003,
0xeffb,0xec1b,0xeddb,0xeddb,0xec1b,0xeffd,0xebfd,0xf7fe };
void main() {
Timer0_Init(); // 初始化定时器0
while (1) {
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
for (int k = 0; k < 16; k++) { // 每一列移动16次
Liang(h[k], L[(i+k)%16]); // 每次显示移动后的列
Delay();
}
}
}
}
}
```
相关推荐
![application/x-dosexec](https://img-home.csdnimg.cn/images/20210720083343.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)