有关于单片机数据移位的问题,希望大虾们可以帮帮忙啊!!!小弟感激不尽啊。。。

一个整型变量PP里面有一个10位的二进制数,我现在想把这个10位的二进制数的最高位发送给单片机的P1管脚的最高位P1.7,10位数据的次高位发送给单片机管脚的次高位P1.6,以此类推,要把10位数据依次发送给P1管脚的P1.7到P1.3管脚上,请问怎么弄,还请大虾们多多帮忙啊,谢谢啦!!!!

sbit P1_7=P1^7;//需要先声明各个位引脚,因为C语言不能直接给P1.7幅值
sbit P1_6=P1^6;
sbit P1_5=P1^5;
sbit P1_4=P1^4;
sbit P1_3=P1^3;

pp=pp<<6; //整型变量16位,移动6位,让最高位到D15位置
if(pp&0x8000) P1_7=1; //最高位幅值给P1.7
else P1_7=0;

pp=pp<<1; //左移一位,让次高位到最高位位置
if(pp&0x8000) P1_6=1; //次高位赋值给P1.6
else P1_6=0;

pp=pp<<1; //左移一位,让次高位到最高位位置
if(pp&0x8000) P1_5=1; //依次类推P1_5,P1_4.......
else P1_5=0;

pp=pp<<1; //左移一位,让次高位到最高位位置
if(pp&0x8000) P1_4=1; //依次类推P1_4.......
else P1_4=0;

pp=pp<<1; //左移一位,让次高位到最高位位置
if(pp&0x8000) P1_3=1; //依次类推P1_3.......
else P1_3=0;

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-24
10位整形变量是0000 00AB CDEF GHIJ。根据你的题目,为了能快速处理,可以这样:
先右移2位变成:0000 0000 ABCD EFGH
这时取低字节,即ABCD EFGH
屏蔽掉低三位,即ABCD E000,将其赋值到P1口即可,所以程序这样写(假设变量为x)
P1=(x>>2)&0xF8;
这样完成了高5位的输出。
低于低5位的输出,则将变量左移3位,即000A BCDE FGHI J000,然后取低字节(FGHI J000)输出到P1即可,所以程序是:
P1=(x<<3)&0xF8;
第2个回答  2011-11-24
说明:PP是一个10位的二进制数,说是是双字节的。
void MoveBit(void){
unsigned int pp=0x0355;//xxxx-xx11-0101-0101
unsigned char high_5bits;//高5位
unsigned char low_5bits;//低5位
unsigned char temp=0;
high_5bits=(unsigned char)(pp>>2);//取高5位:xxxx-x000
low_5bits=(unsigned char)pp;//取低5位:000x-xxxx
//先送高5位
temp=P1;
temp|=high_5bits&0xF8;
P1=temp;
//注:此地方用户需要加入延时或其它处理。

//后送低5位
temp=P1;
temp|=low_5bits&0x1F;
P1=temp;
}

此函数可以在KEIL/IAR/VC所有C编译环境都能实现。
第3个回答  2011-11-24
P1=(10位二进制数>>2)&0x00F0;//将高5位赋给P1
P1=10位二进制数&0x000F;//将低5位赋给P1

其中0x00F0的长度根据你单片机整型变量的长度可以适当修改
相似回答