fsfwl 发表于 2013-4-18 09:30:22

一个关于赋值的小问题

IAP_ADDRL与IAP_ADDRH是单片机内部的两个八位的特殊功能寄存器,分别用来寄存地址的低八位与高八位,而addr是一个16位的无符号整型变量(用以存放地址数据)
下面是两个寄存器的赋值语句(IAP_ADDRL与IAP_ADDRH 已声明为特殊功能寄存器)
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
我的问题是,当一个十六位数直接赋值给一个八位的寄存器时,寄存器只会保留低八位吗?同理将一个十六位的数赋值给一个八位的变量时情况是不是一样?
希望大家能帮忙解答一下,万分感谢。

qllaoda1 发表于 2013-4-18 09:40:58

跟你说个省事的方法,定义sfr16

lcw_swust 发表于 2013-4-18 09:41:31

求人不如求己,自己动手试一下不就知道了

fsfwl 发表于 2013-4-18 12:37:02

lcw_swust 发表于 2013-4-18 09:41 static/image/common/back.gif
求人不如求己,自己动手试一下不就知道了

我试了,结果是这样~但是我想知道为什么

fsfwl 发表于 2013-4-18 12:40:09

qllaoda1 发表于 2013-4-18 09:40 static/image/common/back.gif
跟你说个省事的方法,定义sfr16

如果你知道,你能不能回答一下我的问题?

qllaoda1 发表于 2013-4-18 12:50:10

fsfwl 发表于 2013-4-18 12:40 static/image/common/back.gif
如果你知道,你能不能回答一下我的问题?

你这个问题是C语言里一个很基本的问题,不同长度类型的变量互相赋值的问题,如果记不得了去翻书吧。
用sfr16定义寄存器,可以一条语句解决你的赋值问题。原因就不解释了,想知道的话自己翻书去。

绿茶山人 发表于 2013-4-18 13:53:43

在keil中有的单片机头文件比较死板,比如C8051f120.h里面就没定义16位的寄存器,赋值操作的时候不方便,干脆自己在头文件中添加寄存器,比如以前是
sfr TMR2L = 0xCC; /*TIMER/COUNTER 2 LOW BYTE*/
sfr TMR2H = 0xCD;/*TIMER/COUNTER 2 LOW BYTE*/
现在添加
sfr16 TMR2 = 0xCC; /*TIMER/COUNTER 2*/
这样做在定时器2初始化的时候会方便一些!

fsfwl 发表于 2013-4-19 17:07:35

qllaoda1 发表于 2013-4-18 12:50 static/image/common/back.gif
你这个问题是C语言里一个很基本的问题,不同长度类型的变量互相赋值的问题,如果记不得了去翻书吧。
用sf ...

谢谢了~

fsfwl 发表于 2013-4-19 17:07:53

绿茶山人 发表于 2013-4-18 13:53 static/image/common/back.gif
在keil中有的单片机头文件比较死板,比如C8051f120.h里面就没定义16位的寄存器,赋值操作的时候不方便,干 ...

谢谢了~

绿茶山人 发表于 2013-4-19 17:45:32

fsfwl 发表于 2013-4-19 17:07 static/image/common/back.gif
谢谢了~

共同进步!
页: [1]
查看完整版本: 一个关于赋值的小问题