实用C51编程的高级技巧(C51编程)
一、C51热启动代码的编制
void main()
{
char data *HotPoint=(char *)0x7f;
if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))
{
/*热启动的处理 */
}
else
{
HotPoint=0x7e; /*冷启动的处进
*HotPoint=0xaa;
*(++HotPoint)=0xaa;
}
/*正常工作代码*/
}
如果你的程序包含startup.a51,则需要对startup.a51进行修改。对于startup.a51的修改,根据自已的需要进行,如将IDATALEN EQU 80H中的80H改为70H,就可以使6F到7F的16字节内存不被清零。
二、直接调用EPROM中已固化的程序
void main(void)
{
void (*DispBuffer)(); /*定义指向函数指针*/
DispBuffer=0xde00; /*赋值*/
for(;;)
{
Key();
DispBuffer();
}
}
原理:利用指向函数的指针来实现的 (*指针变量名)();
三、将浮点数转化为字符数组
#define uchar unsigned char
#define uint unsigned int
void FtoC(void)
{
float a;
uchar i,*px
uchar x[]; /*定义字符数组,准备存储浮点数的四个字节*、
void *pf;
px=x; /*px指针指向数组x*/
pf=&a; /*void 型指针指向浮点数首地址*/
a=34.526;
;i<;i++)
{
*(px+i)=*((char *)pf+i); /*强制void 型指针转成char型,因为void型指针不能运算*/
}
}
如果已将数存入EEPROM,要将其取出合并,方法也是一样,可参考下面的程序。
void CtoF(void)
{
float a;
uchar i,*px
uchar x[]={,,,};
void *pf;
px=x;
pf=&a;
;i<;i++)
{
*((char *)pf+i)=*(px+i);
}
}
四、绝对存储器访问
(1)绝对存储器访问宏
#define CBYTE ((unsigned char volatile code *)0) #define DBYTE ((unsigned char volatile data *)0) #define XBYTE ((unsigned char volatile xdata *)0) #define IBYTE ((unsigned char volatile idata *)0) #define PBYTE ((unsigned char volatile pdata *)0)
(2)连接器位置控制
KeilC编译设置中,有定义
(3)关键字_at_
data unsigned char aaa _at_ 0x40; idata unsigned char aaa _at_ 0x40; xdata unsigned char aaa _at_ 0x40; code unsigned char aaa _at_ 0x40;
五、强制函数的编译模式
void GetDataLen()small;
void GetDataLen()small
{
……………….
}
六、C程序与汇编的接口
1.第1种情况:直接嵌入汇编
#pragma asm ... #paragma endasm
2.第2种情况:文件间调用
通过寄存器传递参数,通过固定存储区传递参数。
3.第3种情况:由C生成汇编接口
#pragma SRC
#pragma SMALL
unsigned int asmfunc1 (
unsigned int arg)
{
+ arg);
}
七、volatile的使用方法及使用条件点
第一种情况涉及到内存映射硬件(memory-mapped hardware,如图形适配器,这类设备对计算机来说就好象是内存的一部分一样);
#define XBYTE[1000] PORTADD //硬件口地址定义
第二种情况涉及到共享内存(shared memory,即被两个以上同时运行的程序所使用的内存)。
实用C51编程的高级技巧(C51编程)的更多相关文章
- (转载)10个实用的但偏执的Java编程技术
10个实用的但偏执的Java编程技术 在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常.因为,你知道的…… 作者:小峰来源:码农网|2015-09- ...
- javascript实用技巧、javascript高级技巧
字号+作者:H5之家 来源:H5之家 2016-10-31 11:00 我要评论( ) 三零网提供网络编程. JavaScript 的技术文章javascript实用技巧.javascript高级技巧 ...
- 并发编程概述--C#并发编程经典实例
优秀软件的一个关键特征就是具有并发性.过去的几十年,我们可以进行并发编程,但是难度很大.以前,并发性软件的编写.调试和维护都很难,这导致很多开发人员为图省事放弃了并发编程.新版.NET 中的程序库和语 ...
- Python黑帽编程2.1 Python编程哲学
Python黑帽编程2.1 Python编程哲学 本节的内容有些趣味性,涉及到很多人为什么会选择Python,为什么会喜欢这门语言.我带大家膜拜下Python作者的Python之禅,然后再来了解下P ...
- Python黑帽编程2.9 面向对象编程
Python黑帽编程2.9 面向对象编程 我个人认为,计算机语言的发展,有两个方向,一个是从低到高的发展过程,在这个过程中,语言的思考和解决问题的方式是面向硬件的.硬件本质上处理的是信号,在此基础上, ...
- [转]Windows网络编程学习-面向连接的编程方式
直接附上原文链接:windows 网络编程学习-面向连接的编程方式
- WCF编程系列(六)以编程方式配置终结点
WCF编程系列(六)以编程方式配置终结点 示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...
- 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程
老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程 poptest是国内唯一一家培养测试开发工程师的培训机 ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
随机推荐
- Windows 已在 DImageProcess.exe 中触发一个断点。
其原因可能是堆被损坏,这说明 DImageProcess.exe 中或它所加载的任何 DLL 中有 Bug. 原因也可能是用户在 DImageProcess.exe 具有焦点时按下了 F12. 输出窗 ...
- motan源码分析二:使用spi机制进行类加载
在motan的源码中使用了很多的spi机制进行对象的创建,下面我们来具体分析一下它的实现方法. 1.在实际的jar包的\META-INF\services目录中引入相关的文件,例如下图中,我解压了co ...
- hdu3724Encoded Barcodes(Trie tree)
题目请戳这里 题目大意:给n个字符串,给m个询问,每个询问给k个条形码.每个条形码由8个小码组成,每个小码有相应的宽度,已知一个条形码的宽度只有2种,宽的表示1,窄的表示0.并且宽的宽度是窄的宽度的2 ...
- Spring-----1、Spring一个简短的引论
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)
1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...
- /etc/motd and /etc/issue
/etc/motd and /etc/issue Bash offers an option to include messages in the /etc/motd and the /etc/iss ...
- 2015 UESTC Winter Training #4【Regionals 2008 :: Asia - Tehran】
2015 UESTC Winter Training #4 Regionals 2008 :: Asia - Tehran 比赛开始时电脑死活也连不上WIFI,导致花了近1个小时才解决_(:зゝ∠)_ ...
- #include<iostream.h>与#include<iostream> using namespace std的区别
所谓namespace,是指标识符的各种可见范围.C++标准程序库中的所有标识符都被定义于一个名为std的namespace中. 一 :<iostream>和<iostream.h ...
- 关于 keybd_event (vb篇)
最近有个VB的项目,做到64位的win7上,传统的VB6.0的sendkeys()函数没法用,可能是由于微软的证书验证机制造成的,于是最常用的一句话指令没法用了“SendKeys "{Hom ...
- C#判断网站运行状态是否正常
我使用的是控制台应用程序来监控网站的运行状态,通过判断网站请求头(HEAD)来判断是否运行正常 下面列出几种常见的网站状态码 StatusCode 数字表示 OK 200. OK 指示请求成功,且请求 ...