本帖最后由 huo_hu 于 2014-4-16 12:56 编辑
我们知道C52单片机带有256字节ram,其中的高128字节的只能用R0R1做寄存器间接寻址访问,这部分内存很少有程序用到,很多书上访问这部分存储单元都是汇编语言。C语言虽然可以使用扩展关键字idata做访问,但是指定RAM地址时程序编译会出问题。
本贴讲述如何使用C嵌入汇编语句访问高128RAM。
首先在keilC项目中加入一个源文件,右键选择文件选项
钩选上这两个
src文件是混合编译的中间过程文件,由编译器自动生成。
编写两个读写函数
#include "REG52.h"
//写入高端,addr:写入地址,val:写入值
void Write(unsigned char addr,unsigned char val) {
ACC=addr;
B=val;
#pragma ASM
MOV R0,A
MOV @R0,B
#pragma ENDASM
}
//读取,addr:读取地址,返回值:地址内容
unsigned char Read(unsigned char addr) {
ACC=addr;
#pragma ASM
MOV R0,A
MOV A,@R0
#pragma ENDASM
return ACC;
}
编译预处理
#pragma ASM
#pragma ENDASM
之间是汇编代码。
编译后工程目录里会生成一个src文件,打开它看看。
主函数里测试
#include "REG52.h"
typedef unsigned char uint8;
typedef unsigned int uint16;
extern void Write(uint8 addr,uint8 val);
extern uint8 Read(uint8 addr);
int main(void) {
uint8 i,readval;
//地址128~255写入0~127
for (i=128;i!=0;i++)
Write(i,i-128);
//读出
for (i=128;i!=0;i++)
readval=Read(i);
while(1) {
}//end while(1)
}
调试是有嵌入汇编的原来的c程序是不能设定断点的,要在src文件里设置断点。
数据已经写入