打印

再问C51嵌入汇编的程序

[复制链接]
1908|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chen3bing|  楼主 | 2011-9-8 19:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用STC12C5A60S2写彩屏程序,本来清一次显存687ms,
我试着嵌入了一下汇编,结果时间反而多了。
void ClearScreen(uchar color)
{// uchar j,k;
/***
设定显示屏幕的大小
***/
M7_BUS_Instruction_Command_8(0x2a);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(1);
M7_BUS_Instruction_Data_8(0XDF);//480 //row start_end
M7_BUS_Instruction_Command_8(0x2b);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(1);
M7_BUS_Instruction_Data_8(15);   //272



M7_BUS_Instruction_Command_8(0x2c);

SetM7_BUSDC();
SetM7_BUSRD();
ClrM7_BUSCS();

//for (j=34;j>0;j--)
//{
//for(k=120;k>0;k--)
//{
#pragma asm
MOV R0,#34
MOV R1,#120
LOOP:
#pragma endasm
M7_BUS_Data_Color_8(color);  //一次写32个点
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
//}    //color++;
//}
#pragma asm
DJNZ  R1,LOOP
DJNZ  R0,LOOP
#pragma endasm
SetM7_BUSCS();
}
高手看看给解释解释。谢谢!

相关帖子

沙发
chen3bing|  楼主 | 2011-9-8 19:38 | 只看该作者
后来我把uchar j,k;定义成全局变量。
#pragma asm
MOV R0,#34
MOV R1,#120
LOOP:
#pragma endasm
改成
#pragma asm
MOV j,#34
MOV k,#120
LOOP:
#pragma endasm
我用STC12C5A60S2写彩屏程序,本来清一次显存687ms,
我试着嵌入了一下汇编,结果时间反而多了。
void ClearScreen(uchar color)
{// uchar j,k;
/***
设定显示屏幕的大小
***/
M7_BUS_Instruction_Command_8(0x2a);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(1);
M7_BUS_Instruction_Data_8(0XDF);//480 //row start_end
M7_BUS_Instruction_Command_8(0x2b);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(1);
M7_BUS_Instruction_Data_8(15);   //272



M7_BUS_Instruction_Command_8(0x2c);

SetM7_BUSDC();
SetM7_BUSRD();
ClrM7_BUSCS();

//for (j=34;j>0;j--)
//{
//for(k=120;k>0;k--)
//{
#pragma asm
MOV R0,#34
MOV R1,#120
LOOP:
#pragma endasm
M7_BUS_Data_Color_8(color);  //一次写32个点
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
//}    //color++;
//}
#pragma asm
DJNZ  R1,LOOP
DJNZ  R0,LOOP
#pragma endasm

改成
我用STC12C5A60S2写彩屏程序,本来清一次显存687ms,
我试着嵌入了一下汇编,结果时间反而多了。
void ClearScreen(uchar color)
{// uchar j,k;
/***
设定显示屏幕的大小
***/
M7_BUS_Instruction_Command_8(0x2a);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(1);
M7_BUS_Instruction_Data_8(0XDF);//480 //row start_end
M7_BUS_Instruction_Command_8(0x2b);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(0x00);
M7_BUS_Instruction_Data_8(1);
M7_BUS_Instruction_Data_8(15);   //272



M7_BUS_Instruction_Command_8(0x2c);

SetM7_BUSDC();
SetM7_BUSRD();
ClrM7_BUSCS();

//for (j=34;j>0;j--)
//{
//for(k=120;k>0;k--)
//{
#pragma asm
MOV R0,#34
MOV R1,#120
LOOP:
#pragma endasm
M7_BUS_Data_Color_8(color);  //一次写32个点
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
M7_BUS_Data_Color_8(color);
//}    //color++;
//}
#pragma asm
DJNZ  k,LOOP
DJNZ  j,LOOP
#pragma endasm
用的时间和不嵌入汇编一样。
嵌入汇编没作用。

使用特权

评论回复
板凳
chen3bing|  楼主 | 2011-9-8 19:41 | 只看该作者
怎么传乱了?
后来我把uchar j,k;定义成全局变量。
#pragma asm
MOV R0,#34
MOV R1,#120
LOOP:
#pragma endasm
改成
#pragma asm
MOV j,#34
MOV k,#120
LOOP:
#pragma endasm
把#pragma asm
DJNZ  R1,LOOP
DJNZ  R0,LOOP
#pragma endasm

改成
#pragma asm
DJNZ  k,LOOP
DJNZ  j,LOOP
#pragma endasm
用的时间和不嵌入汇编一样。
嵌入汇编没作用。

使用特权

评论回复
地板
alicedodo| | 2011-9-8 20:06 | 只看该作者
LZ看一下编译之后的汇编代码吧。

建议LZ在C函数里嵌入汇编时,汇编代码里不要直接使用寄存器,C代码部分可能已经使用了对应的的寄存器,你这样直接使用寄存器可能会造成冲突,反而降低了效率。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

439

主题

2540

帖子

2

粉丝