本帖最后由 azgg001 于 2014-4-10 20:29 编辑
实物上P1口接了8个LED,现在已经实现通过两个按键调PWM的占空比来调LED亮度,在数码管上显示了亮度级,1-19级的亮度...现在想要LED实现流水灯功能,最好有两种流水灯效果,通过另外的两个按键切换,可通过复位键复位。大神可否解决一下
#include<reg52.h>
unsigned char a, b;
sbit K1 = P3^2; //定义两个调整占空比的按键
sbit K2 = P3^3;
typedef unsigned char uchar ;
//------------------------------------------
void delay(unsigned int i)
{
unsigned char j;
while(i--) for(j = 0; j < 60; j++);
}
//------------------------------------------
void Display(uchar k)
{
uchar code table[11] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};
P0 = table[(20 - k) / 10]; //显示十位
P2 = 253; delay(5); //显示约5ms
P2 = 255;
P0 = table[(20 - k) % 10]; //显示个位
P2 = 254; delay(5);
P2 = 255; //消隐
}
//------------------------------------------
void main()
{
TMOD = 0x01; //T0定时方式1
TH0 = (65536 - 500) / 256; //500us@12MHz
TL0 = (65536 - 500) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
a = 0;
b = 10;
while(1) {
if(!K1) {Display(b); if(!K1) {b++; if(b > 19) b = 19; while(!K1) Display(b);}}
if(!K2) {Display(b); if(!K2) {b--; if(b < 1) b = 1; while(!K2) Display(b);}}
//以上两行是检查按键、延时消抖、修改占空比、等待按键释放,b = 1~19
Display(b); //显示占空比等级
}
}
//------------------------------------------
void time0() interrupt 1
{
TL0 = (65536 - 493) % 256; //补偿中断进入时间
TH0 = (65536 - 493) / 256; //500us@12MHz
a--; //a = 1~20
if(a == 0) {a = 20; P1 = 0;} //周期=20*500us
if(a <= b) P1 = 255; //输出到示波器
}
//------------------------------------------
void X0_INT() interrupt 0
{
b++;
if(b > 19) b = 19; //占空比等级最大为19
}
//------------------------------------------
void X1_INT() interrupt 2
{
b--;
if(b < 1) b = 1; //占空比等级最小为1.
}
电路图如下 |