数据类型
在写流水灯程序之前,我们了解一下数据类型。
int在51中为2Byte
类型 | 位数 | 数据范围 |
---|---|---|
int | 16 | -32768 ~ 32767 |
short | 16 | -32768 ~ 32767 |
long | 32 | -2147483648 ~ 2147483647 |
unsigned int | 16 | 0 ~ 65535 |
unsigned short int | 16 | 0 ~ 65535 |
unsigned long int | 32 | 0 ~ 4294967295 |
char | 8 | -128 ~ 127 |
unsigned char | 8 | 0 ~ 255 |
使用对应数据时,应该注意溢出问题,若溢出编译器也有可能编译通过,但是执行结果是错误的。
流水灯
操作LED前必须先了解LED是什么电平点亮,LED连接在什么引脚上,通常需要查找原理图。此处我的8个LED连接在P2口,为低电平点亮(因为灌电流比拉电流能力强)。
1、函数式循环流水灯:
#include "reg52.h"
#include <intrins.h> //函数头文件
#define led P2 //对整个LED的P2端口进行定义
/* 延时函数 */
void delay(unsigned int del) //10ms * del
{
unsigned int i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++);
}
/* while(i--);//延时 10 * i us;因为单指令为1us; */
void main()
{
unsigned char i; //使用char 节省RAM
led=0xfe; //初始状态将LED0点亮,1111 1110
while(1)
{
for(i=0;i<7;i++) //将led循环左移一位
{
led=_crol_(led,1);
delay(10); //大约延时100ms,LED显示比较快
}
// 此时 led为 0111 1111
for(i=0;i<7;i++) //将led循环右移一位
{
led=_cror_(led,1);
delay(10);
}
}
}
逻辑移位式(补0)流水灯
#include "reg52.h"
#include <intrins.h> //此为函数头文件
#define led P2 //对整个P2端口进行操作
/* 延时函数 */
void delay(unsigned int del) //10ms * del
{
unsigned int i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
/* while(i--);//大概延时10us;因为单指令为1us; */
void main()
{
unsigned char i;
led=0xfe; //初始状态将LED0点亮
while(1)
{
for(i=0;i<8;i++)// 1111 1110
{
P2=~(0x01<<i); //将0000 0001左移i位,然后将结果取反赋值到P2口
delay(10); //大约延时100ms,比较快哦
}
for(i=0;i<8;i++)
{
P2=~(0x80>>i); //将1右移i位,然后将结果取反赋值到P2口
delay(10);
}
}
}
这两种方式效果一致。至此,LED的操作结束啦。