Keil中C51编程注意要点(更新)

主要是日常的一些繁琐的编程问题,死活查不出来,个人新手,如果有问题或者不全面,请指正!

一、指针部分

1、同时定义两个指针注意

    C语言语法规则。

int* a,b;    //a为指针,b不为指针

2、指针和普通变量定义和赋值先后注意

    原因暂未知。

    错误示例

uchar led_wr(uchar num){    //错误,Keil C51编译器报错,左值错误

	uchar* xdata i;
	i=0xe000;        //先定义和初始化指针

	uchar code led_num[12]=        //后定义数组变量
		{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
		0x00,0xff};

	*i=led_num[num];
	return 0;
}

    正确示例

uchar led_wr(uchar num){    //Keil C51编译器编译通过

	uchar code led_num[12]=        //先定义数组变量
		{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
		0x00,0xff};

	uchar* xdata i;
	i=0xe000;        //后定义和初始化指针

	*i=led_num[num];
	return 0;
}

3、C51中,定义外部存储指针数据注意

    对C语言指针符号“*”,认识不深入。

char * xdata p=0x0000;    //表示指针p本身在外部存储地址空间,而非指针指向的内容

char xdata * p=0x0000;    //表示指针p指向的内容在外部存储地址空间,即常用的寻址外部地址指令用法。

二、C51代码部分(keil u5编译器)

    1、数码管显示子函数内加入自定义的延时函数(原目的是想延时让数字显示暂留一定时间,让人眼可见……结果想多了),会导致proteus仿真异常(无显示或者显示全亮异常)。

    暂解决办法:扫描显示子函数内不加延时函数,直接快速扫描显示。或者减少子函数内运行时长(精简复杂语句和循环体之类的高开销语句)

    原因,暂认为是C51子函数不能负担太多指令和运行时间。

    (顺带说一句,keil5编译好差劲,要么显示莫名其妙的语法错误……本人C语言底子也不好,要么直接不显示错误……这就是编译器问题了搞得我头疼,proteus仿真也很差,单片机程序运行结果真的很“飘忽不定”,因为一遍一遍测试,同一个代码结果就是不同……我都不敢看仿真结果了,所以仿真只能当前期的简陋测试吧,别太较真)

    2、写了代码但是完全没执行结果,我找了半天,可能是变量定义在子函数文件里用不了啦,可能是没把子函数声明在头文件里啦,可能是子函数声明出岔子啦……但编译器一直没报错,郁闷……

    原因:子函数的C源文件没添加到工程里!(对自己无语……)

    子函数虽然在头文件里正确声明了,但函数本身文件未添加到工程,编译器确实不会报错,只当这个子函数是个空函数,什么都不做。

    我经常把子函数尽量孤立的写入独立源文件,以方便各个程序工程之间增删使用,所以子函数一多也就可能忘了添加进当前工程,导致这个问题现象,真是粗心。

三、keil在线调试部分

    1、简单的做了个程序框架,子函数都是空函数,编译没问题,但在线调试老是运行不下去,每到一个空子函数就调回程序头,或者卡在STARTUP.A51启动文件里死循环不出来。

    找了半天原因,原来是我使用了空的字函数原因。每次运行到字函数体,便会转到STARTUP.A51启动文件的一个固定代码处,然后就……不知道怎么开始卡在那里死循环了。

    查的这个博客,作者博客总结了很多调试问题和解决办法,挺靠谱我就搬过来:《Keil使用Debug调试模式时出现的几种错误总结https://www.cnblogs.com/lucky-3/p/11176515.html。 里面有一个问题描述,和我的问题状况相符:

“4.在debug模式下进行调试时,发现程序没有从main函数进行运行,而是一直在汇编代码BKPT那里停下,当点复位时,到了systemInit那里”

“3).程序中存在的问题,就好比上述使用了未实现 printf() 函数或未实现的函数、条件宏等;”

“我的问题就出在第三点,函数中使用了printf函数,但是没有在Target Options Configure的Target那栏里把Use MicroLIB这个选项选择上。之后将其选择上编译下载程序,就能在debug下进入到main函数。”

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值