|
#include<reg52.h>
sbit pwm=P3^0;//PWM信號輸出口
sbit up=P3^7;//角度增加按鍵檢測I/O口
sbit down=P3^6;//角度減少按鍵檢測I/O口
sbit we=P2^7;
sbit du=P2^6;
unsigned char angle;//角度標識
unsigned char count;//0.5ms次數標識,可修改
unsigned code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄滅
0x00 //自定義
};
void delay(unsigned char z)
{
unsigned char x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void Time0_Init()//定時器初始化
{
TMOD=0x01;//定時器0工作在方式1
IE=0x82;
TH0=0xfe;
TL0=0x33;//11.0592MHz晶振,0.5ms
TR0=1;//定時器開始
}
void Time0_Int() interrupt 1
{
TH0=0xfe;
TL0=0x33;
if(count<angle) //判斷0.5ms次數是否小于角度標識
pwm=1;//確實小于,pwm輸出高電平
else
pwm=0;//大于則輸出低電平
count=(count+1);//0.5ms次數加1
count=count%40;//次數始終保持為40即保持周期為20ms
}
void keyscan()//按鍵掃描
{
if(up==0)//角度增加按鍵是否按下
{
delay(10);//按下延時,消抖
if(up==0)//確實按下
{
angle++;//角度標識加1
count=0;//按鍵按下則20ms周期從新開始
if(angle==6)
angle=5;//已經是180度,則保持?
while(up==0);//等待按鍵放開?
}
}
if(down==0)//角度減小按鍵是否按下
{
delay(10);
if(down==0)
{
angle--;//角度標識減1
count=0;
if(angle==0)
angle=1;//已經是0度,則保持
while(down==0);
}
}
}
void display()
{
unsigned char bai,shi,ge;
switch(angle)
{
case 1:bai=0;shi=0;ge=0;break;
case 2:bai=0;shi=4;ge=5;break;
case 3:bai=0;shi=9;ge=0;break;
case 4:bai=1;shi=3;ge=5;break;
case 5:bai=1;shi=8;ge=0;break;
}
du=0;
P0=leddata[bai];
du=1;
du=0;
we=0;
P0=0xfe;
we=1;
we=0;
delay(5);
P0=leddata[shi];
du=1;
du=0;
P0=0xfd;
we=1;
we=0;
delay(5);
P0=leddata[ge];
du=1;
du=0;
P0=0xfb;
we=1;
we=0;
delay(5);
}
void main()
{
angle=1;
count=0;
Time0_Init();
while(1)
{
keyscan();//按鍵掃描
display();
}
}
|
|