用开天斧做计数器,用LED通过二进制表示计数值,但是出现bug
前段时间,我们用8H8K64U实验箱做了计数器的实验,回来之后我想用送的开天斧板子把这个实验再做一个拓展,但是当我敲好代码之后我发现,我的LED灯一旦亮了就灭不掉了,或者说只会亮度微微变化代码如下:
#include <stc8h.h> //包含支持STC8H系列单片机的头文件
#include <intrins.h> //I/O口初始化文件
#include <gpio.c> //设置为准双向口
#define uchar unsigned char
#define uint unsigned int
uint counter=0; //设置计数变量
//控制P2端口
sbit num0=P2^7;
sbit num1=P2^6;
sbit num2=P2^5;
sbit num3=P2^4;
sbit num4=P2^3;
sbit num5=P2^2;
sbit num6=P2^1;
sbit num7=P2^0;
void Timer0_init(void)
{
TMOD=0x0C;
TH0=0x00;
TL0=0x00;
TR0=1;
}
//用LED灯作二进制计数显示(主要问题就出在这里)
void number(uint i)
{
uint a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
for(a=0;a<i;a++)
{
if(a%2==0)
num0=0x01;//用不同的方法控制LED,让LED点亮
else
num0=0x00;//用不同的方法控制LED,让LED熄灭(失败)
if(a%2==0&&a>0)
{
b+=1;//如果到达2的倍数,控制P2.6亮或灭,否则,P2.6保持(后面以此类推)
if(b%2==1)
num1=0;
else
num1=1; //用不同的方法控制LED,让LED熄灭(失败)
}
if(a%4==0&&a>0)
{
c+=1;
if(c%2==1)
num2=0;
else
num2=1;
}
if(a%8==0&&a>0)
{
d+=1;
if(d%2==1)
num3=0;
else
num3=1;
}
if(a%16==0&&a>0)
{
e+=1;
if(e%2==1)
num4=0;
else
num4=1;
}
if(a%32==0&&a>0)
{
f+=1;
if(f%2==1)
num5=0;
else
num5=1;
}
if(a%64==0&&a>0)
{
g+=1;
if(g%2==1)
num6=0;
else
num6=1;
}
if(a%128==0&&a>0)
{
h+=1;
if(h%2==1)
num7=0;
else
num7=1;
}
}
}
//主函数
void main(void)
{
uint temp1,temp2;
gpio();
Timer0_init();
while(1)
{
for(;;)
{
temp1=TL0;
temp2=TH0;
counter=TL0;
number(counter);
}
}
}
后面我还试了让 num0 = !num0 ,或者P27 = !P27,同样也不行 我今天试着改进了一下代码,虽然可以灭了但是好像逻辑不太对,出来的结果不是想要的
#include <stc8h.h> //包含支持STC8H系列单片机的头文件
#include <intrins.h>//I/O口初始化文件
#include <gpio.c> //设置为准双向口
#define uchar unsigned char
#define uint unsigned int
uint counter=0; //设置计数变量
uchar a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
sbit num0=P2^7;
sbit num1=P2^6;
sbit num2=P2^5;
sbit num3=P2^4;
sbit num4=P2^3;
sbit num5=P2^2;
sbit num6=P2^1;
sbit num7=P2^0;
void Timer0_init(void)
{
TMOD=0x0C;
TH0=0x00;
TL0=0x00;
TR0=1;
}
void main(void)
{
uint temp1,temp2;
gpio();
Timer0_init();
while(1)
{
for(;;)
{
////////////////////////////////////////////////////////////////
//控制P2端口
if(counter%2==0) num0=1; //如果用num0 = !num0,那么这个灯就只能亮,不会灭
else num0=0;
if(counter%2 == 0 && counter > 0)
{
b+=1;//如果到达2的倍数,控制P2.6亮或灭,否则,P2.6保持(后面以此类推)
if(b%2==1)
num1 = 0;
else
num1=1;
}
if(counter%4 ==0 && counter > 0)
{
c+=1;
if(c%2==1)
num2=0;
else
num2=1;
}
if(counter%8 == 0 && counter > 0)
{
d+=1;
if(d%2==1)
num3=0;
else
num3=1;
}
if(counter%16 == 0 && counter > 0)
{
e+=1;
if(e%2==1)
num4=0;
else
num4=1;
}
if(counter%32 == 0 && counter > 0)
{
f+=1;
if(f%2==1)
num5=0;
else
num5=1;
}
if(counter%64 == 0 && counter > 0)
{
g+=1;
if(g%2==1)
num6=0;
else
num6=1;
}
if(counter%128 == 0 && counter > 0)
{
h+=1;
if(h%2==1)
num7=0;
else
num7=1;
}
////////////////////////////////////////////////////////////////
temp1=TL0;
temp2=TH0;
counter=TL0;
}
}
}
硬件仿真看一下,是哪里出现的问题 IO口设置为准双向口,点亮LED用灌电流。看你的程序里显示num0=1来点亮LED是不合适的,你还是把gpio设置为推挽输出为好。还有就是if(a%2==0&&a>0)类似语句改成if((a%2==0)&&(a>0)),运算符是有优先级的,不加括号可能会得不到想要的结果的
页:
[1]