实现流水灯,崔老师的程序:
#include <reg52.h>
#include "main.h"
void main()
{
int i;
uchar out=0x01;
for(;;)
{
out=out<<1;
if (!out) out=0x01; //左移有可能全是0
P1=out;
for (i=0; i<1000;i++); //代替延时函数
}
}
没有使用库函数_crol_(循环左移函数),没有延时函数,没有额外的头文件。
产生的hex文件与M51文件,是一致的。
流水灯的hex文件如下:
:100800007D01ED25E0FD70027D018D90E4FEFFC3CA
:10081000EF94E8EE6480948350E80FBF00010E80EF
:01082000EEE9
:10082100EF1FAA0670011E4A600B7D7CEDD3940078
:0508310040EE1D80F700
:01083600229F
:03000000020837BC
:0C083700787FE4F6D8FD75810702080008
:00000001FF
流水灯的M51文件部分如下:
TYPE BASE LENGTH RELOCATION SEGMENT NAME
-----------------------------------------------------
* * * * * * * D A T A M E M O R Y * * * * * * *
REG 0000H 0008H ABSOLUTE "REG BANK 0"
IDATA 0008H 0001H UNIT ?STACK
* * * * * * * C O D E M E M O R Y * * * * * * *
CODE 0000H 0003H ABSOLUTE
0003H 07FDH *** GAP ***
CODE 0800H 0021H INBLOCK ?PR?MAIN?MAIN
CODE 0821H 0016H INBLOCK ?PR?_DELAY_MS?DELAY
CODE 0837H 000CH UNIT ?C_C51STARTUP
地址部分都是0800 都是0837
流水灯的各种C语言实现产生的代码量都是差不多的。但是会变成的就相差很大了。
崔老师的汇编代码如下:
ORG 0000H
LJMP START
ORG 100H
START:
MOV A, #1 //将数值1放入a中
K1:
RL A //左移
MOV P1, A //放P1
SJMP K1 //循环
END
产生的M51文件如下:
TYPE BASE LENGTH RELOCATION SEGMENT NAME
-----------------------------------------------------
* * * * * * * D A T A M E M O R Y * * * * * * *
REG 0000H 0008H ABSOLUTE "REG BANK 0"
* * * * * * * C O D E M E M O R Y * * * * * * *
CODE 0000H 0107H ABSOLUTE