网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月19日漏签0天
51单片机吧 关注:74,269贴子:303,506
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 7回复贴,共1页
<<返回51单片机吧
>0< 加载中...

请问这段程序可以怎么优化

  • 只看楼主
  • 收藏

  • 回复
  • 麦斯多鲁特
  • 举人
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
想实现mixly这种效果

用最原始的办法实现了8x8二维数组变成,一个8位数组,然后发送到AIP1640驱动芯片点亮8x8LED阵列.
void draw_fullmap()
{uchar x1,x2,x3,x4,x5,x6,x7,x8,y1,y2,y3,y4,y5,y6,y7,y8;
uint code fullmap[8][8]={{0,1,1,0,1,1,0,0},
{1,1,1,0,1,1,1,0},
{1,1,1,1,1,1,1,0},
{1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,0,0},
{0,0,1,1,1,0,0,0},
{0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0}};
x1=fullmap[0][0]*128;
x2=fullmap[0][1]*64;
x3=fullmap[0][2]*32;
x4=fullmap[0][3]*16;
x5=fullmap[0][4]*8;
x6=fullmap[0][5]*4;
x7=fullmap[0][6]*2;
x8=fullmap[0][7]*1;
y1=x1+x2+x3+x4+x5+x6+x7+x8;
x1=fullmap[1][0]*128;
x2=fullmap[1][1]*64;
x3=fullmap[1][2]*32;
x4=fullmap[1][3]*16;
x5=fullmap[1][4]*8;
x6=fullmap[1][5]*4;
x7=fullmap[1][6]*2;
x8=fullmap[1][7]*1;
y2=x1+x2+x3+x4+x5+x6+x7+x8;
x1=fullmap[2][0]*128;
x2=fullmap[2][1]*64;
x3=fullmap[2][2]*32;
x4=fullmap[2][3]*16;
x5=fullmap[2][4]*8;
x6=fullmap[2][5]*4;
x7=fullmap[2][6]*2;
x8=fullmap[2][7]*1;
y3=x1+x2+x3+x4+x5+x6+x7+x8;
x1=fullmap[3][0]*128;
x2=fullmap[3][1]*64;
x3=fullmap[3][2]*32;
x4=fullmap[3][3]*16;
x5=fullmap[3][4]*8;
x6=fullmap[3][5]*4;
x7=fullmap[3][6]*2;
x8=fullmap[3][7]*1;
y4=x1+x2+x3+x4+x5+x6+x7+x8;
x1=fullmap[4][0]*128;
x2=fullmap[4][1]*64;
x3=fullmap[4][2]*32;
x4=fullmap[4][3]*16;
x5=fullmap[4][4]*8;
x6=fullmap[4][5]*4;
x7=fullmap[4][6]*2;
x8=fullmap[4][7]*1;
y5=x1+x2+x3+x4+x5+x6+x7+x8;
x1=fullmap[5][0]*128;
x2=fullmap[5][1]*64;
x3=fullmap[5][2]*32;
x4=fullmap[5][3]*16;
x5=fullmap[5][4]*8;
x6=fullmap[5][5]*4;
x7=fullmap[5][6]*2;
x8=fullmap[5][7]*1;
y6=x1+x2+x3+x4+x5+x6+x7+x8;
x1=fullmap[6][0]*128;
x2=fullmap[6][1]*64;
x3=fullmap[6][2]*32;
x4=fullmap[6][3]*16;
x5=fullmap[6][4]*8;
x6=fullmap[6][5]*4;
x7=fullmap[6][6]*2;
x8=fullmap[6][7]*1;
y7=x1+x2+x3+x4+x5+x6+x7+x8;
x1=fullmap[7][0]*128;
x2=fullmap[7][1]*64;
x3=fullmap[7][2]*32;
x4=fullmap[7][3]*16;
x5=fullmap[7][4]*8;
x6=fullmap[7][5]*4;
x7=fullmap[7][6]*2;
x8=fullmap[7][7]*1;
y8=x1+x2+x3+x4+x5+x6+x7+x8;
AIP1640_draw(0,y1);
AIP1640_draw(1,y2);
AIP1640_draw(2,y3);
AIP1640_draw(3,y4);
AIP1640_draw(4,y5);
AIP1640_draw(5,y6);
AIP1640_draw(6,y7);
AIP1640_draw(7,y8);
}
但是重复代码太多,x1~x8要多次复用,不知道该如何循环。


  • 麦斯多鲁特
  • 举人
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

找AI咨询怎么优化
void draw_fullmap() {
unsigned char x;
unsigned char y1 = 0, y2 = 0, y3 = 0, y4 = 0, y5 = 0, y6 = 0, y7 = 0, y8 = 0;
uint code fullmap[8][8]={{0,1,1,0,1,1,0,0},
{1,1,1,0,1,1,1,0},
{1,1,1,1,1,1,1,0},
{1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,0,0},
{0,0,1,1,1,0,0,0},
{0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0}};
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
x = fullmap[i][j];
y1 += (x & 0x80) != 0 ? 1 : 0;
y2 += (x & 0x40) != 0 ? 1 : 0;
y3 += (x & 0x20) != 0 ? 1 : 0;
y4 += (x & 0x10) != 0 ? 1 : 0;
y5 += (x & 0x08) != 0 ? 1 : 0;
y6 += (x & 0x04) != 0 ? 1 : 0;
y7 += (x & 0x02) != 0 ? 1 : 0;
y8 += (x & 0x01) != 0 ? 1 : 0;
}
}
AIP1640_draw(0,y1);
AIP1640_draw(1,y2);
AIP1640_draw(2,y3);
AIP1640_draw(3,y4);
AIP1640_draw(4,y5);
AIP1640_draw(5,y6);
AIP1640_draw(6,y7);
AIP1640_draw(7,y8);


2026-01-19 23:52:49
广告
不感兴趣
开通SVIP免广告
  • 麦斯多鲁特
  • 举人
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
编译结果不正确,
这一段看着就觉得有问题。
y1 += (x & 0x80) != 0 ? 1 : 0;
y2 += (x & 0x40) != 0 ? 1 : 0;
y3 += (x & 0x20) != 0 ? 1 : 0;
y4 += (x & 0x10) != 0 ? 1 : 0;
y5 += (x & 0x08) != 0 ? 1 : 0;
y6 += (x & 0x04) != 0 ? 1 : 0;
y7 += (x & 0x02) != 0 ? 1 : 0;
y8 += (x & 0x01) != 0 ? 1 : 0;


  • 麦斯多鲁特
  • 举人
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void draw_freedraw() {
unsigned char y1 = 0, y2 = 0, y3 = 0, y4 = 0, y5 = 0, y6 = 0, y7 = 0, y8 = 0;
uint code f[8][8]= {{0,1,1,0,1,1,0,0},
{1,1,1,1,1,1,1,0},
{1,1,1,1,1,1,1,0},
{1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,0,0},
{0,0,1,1,1,0,0,0},
{0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0}};
y1 = f[0][0]*1+ f[0][1]*2+f[0][2]*4+f[0][3]*8+f[0][4]*16+f[0][5]*32+f[0][6]*64+f[0][7]*128;
y2 = f[1][0]*1+ f[1][1]*2+f[1][2]*4+f[1][3]*8+f[1][4]*16+f[1][5]*32+f[1][6]*64+f[1][7]*128;
y3 = f[2][0]*1+ f[2][1]*2+f[2][2]*4+f[2][3]*8+f[2][4]*16+f[2][5]*32+f[2][6]*64+f[2][7]*128;
y4 = f[3][0]*1+ f[3][1]*2+f[3][2]*4+f[3][3]*8+f[3][4]*16+f[3][5]*32+f[3][6]*64+f[3][7]*128;
y5 = f[4][0]*1+ f[4][1]*2+f[4][2]*4+f[4][3]*8+f[4][4]*16+f[4][5]*32+f[4][6]*64+f[4][7]*128;
y6 = f[5][0]*1+ f[5][1]*2+f[5][2]*4+f[5][3]*8+f[5][4]*16+f[5][5]*32+f[5][6]*64+f[5][7]*128;
y7 = f[6][0]*1+ f[6][1]*2+f[6][2]*4+f[6][3]*8+f[6][4]*16+f[6][5]*32+f[6][6]*64+f[6][7]*128;
y8 = f[7][0]*1+ f[7][1]*2+f[7][2]*4+f[7][3]*8+f[7][4]*16+f[7][5]*32+f[7][6]*64+f[7][7]*128;
AIP1640_draw(0, y1);
AIP1640_draw(1, y2);
AIP1640_draw(2, y3);
AIP1640_draw(3, y4);
AIP1640_draw(4, y5);
AIP1640_draw(5, y6);
AIP1640_draw(6, y7);
AIP1640_draw(7, y8);
}
这是现在的样子,减去了大量的X赋值,把数组名也改短了。还有优化空间吗?


  • 麦斯多鲁特
  • 举人
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void draw_freedraw() {
unsigned char y1 = 0;
int x=0;
uint code f[8][8]= {{0,1,1,0,1,1,0,0},
{1,1,1,1,1,1,1,0},
{1,1,1,1,1,1,1,0},
{1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,0,0},
{0,0,1,1,1,0,0,0},
{0,0,0,1,0,0,0,0},
{0,1,0,0,0,1,0,0}};
while(1)
{ if(x==7)
break;
else
y1 = f[x][0]*1+ f[x][1]*2+f[x][2]*4+f[x][3]*8+f[x][4]*16+f[x][5]*32+f[x][6]*64+f[x][7]*128;
AIP1640_draw(x, y1);
x++;
}
}
对这个结果也满足了


  • 正在缓冲QAQ0
  • 进士
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
电量和8*8的点阵 需要这么麻烦吗?


  • 啧嘖擇-
  • 白丁
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
为啥按位实现,直接按字节不行吗。。。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 7回复贴,共1页
<<返回51单片机吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示