打印

懒惰的确是一种美德。。。。

[复制链接]
5305|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XIANSir|  楼主 | 2011-4-10 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 XIANSir 于 2011-4-10 09:50 编辑

我承认,我是在说“一劳永逸”绝对是一种美德;P

对于我们这些经常与单片机打交道的电工们来说,**单片机的寄存器和以及寄存器的位定义实在是一件痛苦的事情,可是如果记不住编程时效率又会受到影响——因为每次都要查手册!下面是我的做法,希望对和我一样记不住寄存器位定义的电工们有所帮助:




//将b0到b7表示的二进制数转换成十六进制,注意b0至b7都只能取值0或1
#define B2H0_8(b0,b1,b2,b3,b4,b5,b6,b7) ((b0<<0) + (b1<<1) + (b2<<2) + (b3<<3) + (b4<<4) + (b5<<5) + (b6<<6) + (b7<<7))
#define B2H8_0(b7,b6,b5,b4,b3,b2,b1,b0) ((b0<<0) + (b1<<1) + (b2<<2) + (b3<<3) + (b4<<4) + (b5<<5) + (b6<<6) + (b7<<7))

相关帖子

沙发
XIANSir|  楼主 | 2011-4-10 09:41 | 只看该作者
唉!贴代码会变乱,而且没有代码着色;贴图片又不清晰,这个比较无奈啊!:dizzy:

使用特权

评论回复
板凳
e掾木| | 2011-4-10 09:43 | 只看该作者
LZ的书写很规范,赞一个

使用特权

评论回复
地板
XIANSir|  楼主 | 2011-4-10 09:55 | 只看该作者
当然了,51单片机就那么几个寄存器,估计很多人都能够把寄存器以及寄存器的每一位都给记下来,所以这种做法好像没有太大的意义。
不过,对于AVR这样的寄存器比较多的单片机,上面的做法就很有意义了。下一步俺就打算在AVR单片机里面使用上面的方法——AVR的寄存器还是蛮多滴;P

使用特权

评论回复
5
XIANSir|  楼主 | 2011-4-10 10:11 | 只看该作者
讲一个编写上面的代码的时候发生的一个“事故”,老调重弹:还是关于“括号”——优先级的:

一开始定义宏时写的代码是:
#define B2H8_0(b7,b6,b5,b4,b3,b2,b1,b0)        (b0<<0 + b1<<1 + b2<<2 + b3<<3 + b4<<4 + b5<<5 + b6<<6 + b7<<7)

结果总是错。

最终改为:
#define B2H8_0(b7,b6,b5,b4,b3,b2,b1,b0)        ((b0<<0) + (b1<<1) + (b2<<2) + (b3<<3) + (b4<<4) + (b5<<5) + (b6<<6) + (b7<<7))

结果对了!

错误的原因一目了然:肯定是优先级问题,至于更细节的详细原因,我也不想细究了。总之一句话:C语言中多写小括号和大括号也是一种美德:)

使用特权

评论回复
6
ningling_21| | 2011-4-10 12:58 | 只看该作者
顶一个...

使用特权

评论回复
7
xiaoyuan_ly| | 2011-4-10 14:58 | 只看该作者
就那么些SFR,记住有难度吗??!!  记住了,反而更加的的心应手,不是吗??!!

使用特权

评论回复
8
123jj| | 2011-4-10 15:54 | 只看该作者
呵呵!

白娘子的老公写的东东,都是好东东,帮顶~~~

使用特权

评论回复
9
XIANSir|  楼主 | 2011-4-10 16:44 | 只看该作者
7# xiaoyuan_ly
我只是提供一种思路而已,51的也许你能记住,那AVR的呢??ARM的呢??你能把所有寄存器的某一位是什么意思记下吗??

再说了,就算大侠你能全部记住,但我相信还是有很多和我一样记性比较差的需要一些辅助手段来完成对寄存器正确赋值这项工作!

所以,我这项工作还挺有意义滴!:lol

使用特权

评论回复
10
z125239641| | 2011-4-10 17:13 | 只看该作者
必须支持了 LZ是优化工作者

使用特权

评论回复
11
xb007| | 2011-4-10 17:56 | 只看该作者
不错,赞一个!

使用特权

评论回复
12
yuyi21ic| | 2011-4-10 17:58 | 只看该作者
MARK,貌似还不错!但是感觉工作量有点大吧!

使用特权

评论回复
13
XIANSir|  楼主 | 2011-4-10 18:39 | 只看该作者
12# yuyi21ic
这叫“一劳永逸”,以后编程的时候就不用老是查手册了!

而且,别看下面的“说明”部分字怪多,其实这个可以(而且最好)直接从芯片的编程手册上“拷贝”、“粘贴”,这样要打的字其实就少多了!!;P

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
谈的元 + 6
14
jack_shine| | 2011-4-10 21:22 | 只看该作者
学习了

使用特权

评论回复
15
hsw_21| | 2011-4-10 21:43 | 只看该作者
不错,顶。LZ有创新发明,革新精神。

使用特权

评论回复
16
XIANSir|  楼主 | 2011-4-10 21:55 | 只看该作者
15# hsw_21
创新实在谈不上,只不过老是查手册查烦了!

使用特权

评论回复
17
ejack| | 2011-4-11 07:56 | 只看该作者
这的确是一种方案。不过更常见的方案是为寄存器的各个有效位域定义直观明了的别名。
例如:
SCON = UART_MODE1 | REC_EN | TI_EN;
就算是从未见过SCON的兄弟也能大体明白这是什么意思吧?

使用特权

评论回复
18
mytempid| | 2011-4-11 08:17 | 只看该作者
本帖最后由 mytempid 于 2011-4-11 08:19 编辑

我还以为是懒羊羊的口头禅

使用特权

评论回复
19
ayb_ice| | 2011-4-11 08:26 | 只看该作者
记住这个更难

使用特权

评论回复
20
mbutterfly| | 2011-4-11 08:43 | 只看该作者
熟悉的单片机记住或者简单注释是可以的,对于新接触的,像楼主写这么详细还是有必要的,甚至可以再详细些。这样,用同款单片机再去开发别的产品的时候,整个程序框架可以先拷贝过去,可以减少查手册的几率。甚至可以这样做:在第一次看书的时候,把全部外设的性能都写到第一个程序里,用不到加注释就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:冷暖自知,泰然处之;持之以恒,必有所成!

0

主题

609

帖子

2

粉丝