📄 第四章 keil c51高级编程.htm
字号:
lang=EN-US>C51提供了三种访问绝对地址的方法:</SPAN></P>
<H3 style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm"><A
name=_Toc475103184><SPAN lang=EN-US style="FONT-SIZE: 15pt">1.
</SPAN>绝对宏:</A></H3>
<P class=MsoBodyTextFirstIndent>在程序中,用“#<SPAN
lang=EN-US>include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括:</SPAN></P>
<P class=MsoBodyTextIndent style="MARGIN-LEFT: 36.75pt"><SPAN
lang=EN-US>CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD</SPAN></P>
<P class=MsoBodyTextFirstIndent>具体使用可看一看<SPAN
lang=EN-US>absacc.h便知</SPAN></P>
<P class=MsoBodyTextFirstIndent>例如:</P>
<P class=MsoBodyTextIndent style="MARGIN-LEFT: 36.75pt"><SPAN
lang=EN-US>rval=CBYTE[0x0002];指向程序存贮器的0002h地址</SPAN></P>
<P class=MsoBodyTextIndent style="MARGIN-LEFT: 36.75pt"><SPAN
lang=EN-US>rval=XWORD<SPAN
style="mso-tab-count: 1">
</SPAN>[0x0002];指向外RAM的0004h地址</SPAN></P>
<H3 style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm"><A
name=_Toc475103185><SPAN lang=EN-US style="FONT-SIZE: 15pt">2.
</SPAN><SPAN lang=EN-US>_at_关键字</SPAN></A></H3>
<P class=MsoBodyTextFirstIndent>直接在数据定义后加上<SPAN
lang=EN-US>_at_ const即可,但是注意:</SPAN></P>
<P class=MsoBodyTextIndent style="MARGIN-LEFT: 36.75pt"><SPAN
lang=EN-US>(1)绝对变量不能被初使化;</SPAN></P>
<P class=MsoBodyTextIndent style="MARGIN-LEFT: 36.75pt"><SPAN
lang=EN-US>(2)bit型函数及变量不能用_at_指定。</SPAN></P>
<P class=MsoBodyTextFirstIndent>例如:</P>
<P class=MsoBodyTextIndent style="MARGIN-LEFT: 36.75pt"><SPAN
lang=EN-US>idata struct link list _at_
0x40;指定list结构从40h开始。</SPAN></P>
<P class=MsoBodyTextIndent style="MARGIN-LEFT: 36.75pt"><SPAN
lang=EN-US>xdata char text[25b]
_at_0xE000;指定text数组从0E000H开始</SPAN></P>
<P class=MsoBodyTextFirstIndent>提示:如果外部绝对变量是<SPAN
lang=EN-US>I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。</SPAN></P>
<H3 style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm"><A
name=_Toc475103186><SPAN lang=EN-US style="FONT-SIZE: 15pt">3.
</SPAN>连接定位控制</A></H3>
<P class=MsoBodyTextFirstIndent>此法是利用连接控制指令<SPAN
lang=EN-US>code xdata pdata \data
bdata对“段”地址进行,如要指定某具体变量地址,则很有局限性,不作详细讨论。</SPAN></P>
<H2 style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm"><A
name=_Toc475103187><SPAN lang=EN-US
style="FONT-SIZE: 16pt">第二节 </SPAN><SPAN lang=EN-US>Keil
C51与汇编的接口</SPAN></A></H2>
<H3 style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm"><A
name=_Toc475103188><SPAN lang=EN-US style="FONT-SIZE: 15pt">1.
</SPAN>模块内接口</A><SPAN
style="mso-bookmark: _Toc475103188"></SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt"><O:P></O:P></SPAN></H3>
<P class=MsoBodyTextFirstIndent>方法是用#<SPAN
lang=EN-US>pragma语句具体结构是:</SPAN></P>
<P class=MsoBodyTextIndent style="MARGIN-LEFT: 36.75pt"><SPAN
lang=EN-US>#pragma asm</SPAN></P>
<P class=MsoBodyTextIndent
style="MARGIN-LEFT: 36.75pt">汇编行</P>
<P class=MsoBodyTextIndent style="MARGIN-LEFT: 36.75pt"><SPAN
lang=EN-US>#pragma endasm</SPAN></P>
<P class=MsoBodyTextFirstIndent>这种方法实质是通过<SPAN
lang=EN-US>asm与ndasm告诉C51编译器中间行不用编译为汇编行,因而在编译控制指令中有SRC以控制将这些不用编译的行存入其中。</SPAN></P>
<H3 style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm"><A
name=_Toc475103189><SPAN lang=EN-US style="FONT-SIZE: 15pt">2.
</SPAN>模块间接口</A><SPAN
style="mso-bookmark: _Toc475103189"></SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt"><O:P></O:P></SPAN></H3>
<P class=MsoBodyTextFirstIndent><SPAN
lang=EN-US>C模块与汇编模块的接口较简单,分别用C51与A51对源文件进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递问题,C51中有两种参数传递方法。</SPAN></P>
<P class=MsoNormal
style="TEXT-INDENT: 24pt; TEXT-ALIGN: left; tab-stops: 63.0pt"
align=left><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">(1)
通过寄存器传递函数参数</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><O:P></O:P></SPAN></P>
<P class=MsoBodyTextFirstIndent>最多只能有<SPAN
lang=EN-US>3个参数通过寄存器传递,规律如下表:</SPAN></P>
<P class=MsoNormal
style="TEXT-INDENT: 24pt; TEXT-ALIGN: left; tab-stops: 63.0pt"
align=left><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"> <O:P></O:P></SPAN></P>
<TABLE
style="MARGIN-LEFT: 32.4pt; BORDER-COLLAPSE: collapse; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt"
cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD
style="BORDER-RIGHT: windowtext 0.75pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 78.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.75pt solid"
vAlign=top width=105>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">参数数目</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><O:P></O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.75pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 78.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.75pt solid; mso-border-left-alt: solid windowtext .75pt"
vAlign=top width=105>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">char<O:P></O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.75pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 78.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.75pt solid; mso-border-left-alt: solid windowtext .75pt"
vAlign=top width=105>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">int<O:P></O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.75pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 78.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.75pt solid; mso-border-left-alt: solid windowtext .75pt"
vAlign=top width=105>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">long,float<O:P></O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: medium none; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 78.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.75pt solid; mso-border-left-alt: solid windowtext .75pt"
vAlign=top width=105>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">一般指针</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><O:P></O:P></SPAN></P></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 0.75pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 78.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-border-top-alt: solid windowtext .75pt"
vAlign=top width=105>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">1<O:P></O:P></SPAN></P>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">2<O:P></O:P></SPAN></P>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">3<O:P></O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.75pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 78.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-border-left-alt: solid windowtext .75pt; mso-border-top-alt: solid windowtext .75pt"
vAlign=top width=105>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">R7<O:P></O:P></SPAN></P>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">R5<O:P></O:P></SPAN></P>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">R3<O:P></O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.75pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 78.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-border-left-alt: solid windowtext .75pt; mso-border-top-alt: solid windowtext .75pt"
vAlign=top width=105>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">R6 &
R7<O:P></O:P></SPAN></P>
<P class=MsoNormal
style="TEXT-ALIGN: center; tab-stops: 63.0pt"
align=center><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">R4 &
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -