单片机C语言怎么能对P2口的1,2,3,4,5位进行清零或者置一,而不影响其他位的数字?

如果单独对单片机的P2^1赋值,会导致程序出错吗?我对几个数码管编程,其中片选信号和位选信号都是单独对位赋值的,结果放在硬件上实施起来的话,有几个数码管不能正常显示,后来听别人说要直接对口操作,也就是直接对P2赋值。只对1,2,3,4,5位进行操作,其他位的数字不能动,应该怎么写程序?

这种单独对指定I/O口赋值而不改变其他位的操作在430单片机用的很多的。
比如:你要给P2.1和P2.2赋1,但不想改变其他位,那么你可以这样写:P2=P2 | 0x06(51单片机的写法)P2OUT|=0x06(430单片机的写法)。
要给指定端口置0,而不影响其他位。比如要求P2^1=0,其他位不变。P2=P2&0xFD(即要置0 的那一位与0,其他位与1)这样就能保证不影响其他位了。追问

这种方法貌似很简便,是什么原理啊?我菜鸟没太看明白??求解释?谢谢

追答

这个其实一点都不难的,原理就是:在二进制位中任何位与1相或,都是1;任何位与0相或都是不变的(因为0和0相或还是0,1和0相或还是1)所以要对某一位置1 的话,只要把那一位与1相或就行了,而其他不想改变的位与0相或就可以保持不变。其他的以此类推.

这个其实一点都不难的,原理就是:在二进制位中任何位与1相或,都是1;任何位与0相或都是不变的(因为0和0相或还是0,1和0相或还是1)所以要对某一位置1 的话,只要把那一位与1相或就行了,而其他不想改变的位与0相或就可以保持不变。其他的以此类推.

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-16
首先明确一点,单操作一个引脚和操作一排引脚效果是一样的,只要你操作的时候没有改变其他引脚的值就ok了。

其次,单独改动一个引脚的值你可以定义如下:
sbit P2_0 = P2 ^ 0;
这就是只操作P2的第0个引脚。

最后如果你想一次性修改P2的某几个引脚,可以用位与或者位或(& |)来进行操作。如:
P2 = P2 & 0xff;
具体的用法就要因你自己的需要来定了。
第2个回答  2013-09-16
P2口有8位 若只对1,2,3,4,5位进行操作,其他位的数字动 让P2&11*****1
就能实现了
第3个回答  2013-09-16
跟0取异或为保持原来信号,跟1取异或为取反,所以取P2的异或,需要改变的位对应的取1的异或~

单片机C语言怎么能对P2口的1,2,3,4,5位进行清零或者置一,而不影响其他...
要给指定端口置0,而不影响其他位。比如要求P2^1=0,其他位不变。P2=P2&0xFD(即要置0 的那一位与0,其他位与1)这样就能保证不影响其他位了。

51单片机C语言程序4个独立按键实现对数码管数字显示的加减清零等
P1是LED.P2是按键sbit KEY_OUT_1 = P2^3;sbit KEY_OUT_2 = P2^2; sbit KEY_OUT_3 = P2^1;sbit KEY_OUT_4 = P2^0;#define uchar unsigned char#define ulint unsigned long#define Frequency 10\/\/定时器中断时间 = f*T#define Time 1\/\/一个周期1ms#define TubeNumber 6\/\/数码管个...

单片机怎么用c语言设置I\/O口输入或输出
P1M0=0;P1M1=255; \/\/all 推挽输出 而51单片机的所有IO引脚,在启动后默认都是1。因此,如之前没有对此引脚进行过置0操作的话,可以直接读该引脚。但为了保险起见,也为了使程序通用、可移植,最好在读取之前对此引脚置1。

如果需要让6个数码管分别显示1、2、3、4、5、6,如何用C语言编程?
在单片机上显示 五位 显示1 2 3 4 5 共阴的 但是电路很关键 看你怎么接 原理搞清楚。include <hidef.h> \/* common defines and macros *\/ include <MC9S12XS128.h> \/* derivative information *\/ void delay(int num){ unsigned int i,j;for(i=0;i<num;i++)for(j=0;j<35;...

在单片机C语言中如何对变量的某一位进行操作或赋值。
在C语言中,一般有两种方法来操作位,一种是使用C语言提供的位运算操作符,一种是使用位域。1、使用位域 在C语言中定义位域的一般格式如下:struct 位域结构名 { 位域列表 };struct:在C语言中定义位域所使用的关键字是struct。位域结构名:是一个C语言中的标识符,有字母、数字、下划线组成,...

用单片机C语言控制6位密码锁。要求有一个清除键和确认键,密码输错了...
1:扫描时去抖动 2:等待释放 3:释放时去抖动。#define LEDPORT P0 \/\/定义显示器段码输出端口#define LEDCON P1 \/\/定义显示器位控制端口uchar code SEGCODE[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,\/\/ 0~9的共阳极代码 0xff,\/\/不显示的共阳极段码 0X8C,\/\/字符P的共阳极段码 ...

用定时器定时一秒控制三个数码管依次显示2 4 5的c语言程序
数码管一般是用38译码器的,为了节约端口开销,那其实每次只能控制一个数码管,只要将单片机对应的io点拉高就可以了,如果是 C51单片机控制的话,直接用16进制控制引脚电位即可,至于示例程序也懒得给你写了,自己先琢磨一下吧...

51单片机c语言编程中,有没有只定义p2.1到p2.6的写法?不要一个个的定义...
对于51单片机而言是不能一次性定义单独的一个IO口的某些位的,Keil里面没有提供相应的处理方法,有些单片机的C语言有此功能,用到了联合和结构的方式。比如在瑞萨的单片机C语言上可以这样定义:union { \/* EBR1 *\/ unsigned char BYTE; \/* Byte Access *\/ struct { \/* Bit...

如何将单片机20h到2fh低四位清零高四位不变 用c语言编程
\/\/楼上提出了主要思路,尽管他用了清零32位中的低16位 include <reg51.h> unsigned char bdata *bitaddr _at_ 0x20 void main(){ unsigned char i;for(i=0;i<=20;i++){ bitaddr+=i;bitaddr&=0xf0;} } \/\/ 没调试,自己用keil调试一下 ...

怎么用C语言给一个字节的低四位赋值,而不影响高四位?
char c;c&=0xf0;c|=0x08; \/\/这里的8就是要给低四位赋得值。[0-f]

相似回答