学单片机的时候想到一个问题:如何判断单片机点亮的LED灯是奇数位还是偶数位?
在网上搜了一圈没找到,于是打算自己写一个。
单片机型号:AT89C52,LED为低电平有效接法,P3.0口接一个开关。
程序如下,实现功能:按下按钮,左移到最近的奇数位;否则,右移到最近的偶数位。采用库函数方式移位实现,移位之前需要判断现在点亮的位的奇偶。
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit SW=P3^0;
uchar temp;
void Delay()
{
uchar i, j;
for (i=0;i<255;i++)
for (j=0;j<255;j++);
}
uchar judge(uchar b) //判断现在点亮的是奇数位还是偶数位,并决定移位数
{
uchar a[8] = {1, 2, 4, 8, 16, 32, 64, 128};
uchar i = 0;
uchar k = 0;
while(i<8)
{
k = b & a[i]; //按位与方式判断
if(k == 0 && (i+1)%2)
return 1;
else
return 2;
}
i++;
return 0;
}
void zt1()
{
temp = _crol_(temp,judge(temp)); //左移到最近的奇数位
Delay();Delay();Delay();
}
void zt2()
{
temp = _cror_(temp,judge(temp)); //右移到最近的偶数位
Delay();Delay();Delay();
}
void main()
{
P1 = 0xff;
temp = 0xfe;
while(1)
{
P1 = temp;
{
if(SW==1)
{
zt1();
}
else
{
zt2();
}
}
}
}
写得较为仓促,若有错误欢迎指正