用8个发光管演示出8位二进制数累加过程
时间:10-02
整理:3721RD
点击:
#include<reg52.h> //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{ //delay(500);大约延时500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{
uchar a;
while(1) //大循环
{
a++;
P1=~a;
delay(200);
}
}
请问这个程序为什么能实现用8个发光管演示出8位二进制数累加过程,而且在使用a++之前不用先给a赋值吗?新手,很困惑,望高手解答!
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{ //delay(500);大约延时500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{
uchar a;
while(1) //大循环
{
a++;
P1=~a;
delay(200);
}
}
请问这个程序为什么能实现用8个发光管演示出8位二进制数累加过程,而且在使用a++之前不用先给a赋值吗?新手,很困惑,望高手解答!
uchar a; 定义a时如果不给变量赋值 默认赋值0 a=1时为0x01 开发板上开机默认所有引脚为高电平 所以要取反 按16进制为0xfe 第一脚为低电平 使led亮 其他数值依次类推
至于a的值和编译器有关你可以试试你的编译器默认值是不是0
请教一下一轮8位二进制数累加完成后,怎么实现循环的了?
a定义的上一字符型量,只有8位,当a++到 1111 1111 时再a++就成了 1 0000 0000,字符型变量只有8位,所以第9位是会自动丢掉的,就成了 0000 0000 ,就一轮又开始了。个人理解,有误勿喷!
有一定道理,先谢谢再说、、、
a是uchar类型,范围0到255,255等于1111 1111,a=0,~a=1111 1111;
a=1,~a=1111 11110;a=2,~a=1111 1101。以此类推
a是uchar类型,范围0到255,255等于1111 1111,a=0,~a=1111 1111;此时都是高电平,不亮
a=1,~a=1111 11110,此时只有p01口低电平才亮;a=2,~a=1111 1101,只有p02口低电平才亮。以此类推