关于使单片机输出高低电平的问题。

举个例子:用C语言写一个使单片机P3口高四位LED和低四位LED轮流点亮的程序
我自己写的程序里主函数是
void main(void)
{
while(1)
{
P3=0xfe; //第一个灯亮
P3=0xfd; //第二个灯亮
P3=0xfb; //第三个灯亮
P3=0xf7; //第四个灯亮
delay(); //调用延时函数
P3=0xef; //第五个灯亮
P3=0xdf; //第六个灯亮
P3=0xbf; //第七个灯亮
P3=0x7f; //第八个灯亮
delay(); //调用延时函数
而正解只要这样
void main()
{
P3=0x0f;
while(1)
{
P3=~P3;
delay();
}
}
为什么只要P3=0x0f就能代替我自己写的一大堆程序呢?0x0f是输出高电平还是低电平?P3=~P3里的~P3又是什么意思?
问题比较多,请各位大侠多多赐教哦~

把0x0f转化成二进制是B’00001111’,这8位数字由右往左对应你的第1到8个灯,其实就是P3的8个口,0表示这个口输出低电平,1是输出高电平。看你的程序是设定低有效的,就是0的时候灯亮。正解按题目要求分高4位和低4位每次亮四个灯(每次4个数字是0),0x0f就是高4位亮,~是取反符,P3=~P3就是把P3的值取反后再赋给P3,就是0变1,1变0,这样0x0f取反变成0xf0,就是B‘11110000’,这样原来亮的4个灯变暗,原来暗的4个灯被点亮。而你的程序每亮一个灯就把上面的灯关掉了,和正解是不一样的,不能说正解可以代替你的程序,是你回答错了,呵呵。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-28
P3=0xfe; //第一个灯亮
P3=0xfd; //第二个灯亮
P3=0xfb; //第三个灯亮
P3=0xf7; //第四个灯亮
它们之间执行时间很短,所以和P3=0xf0的效果一样,也就是前差不多同时亮四个亮,
接下来delay();
然后P3=0x0f后四个亮,
然后delay();
然后while(1);
第2个回答  2012-02-28
0x0f是十六进制,对应二进制就是00001111,对应8个引脚一目了然
P3=~P3是取反(即P3取反后的值赋予给P3),0x0f取反后就是0xf0(即为11110000),0xf0再取反就恢复为原先的0x0f,这样循环,就形成了高4bit和低4bit交替变换
相似回答