#include <reg52.h>
unsigned int count; //0.5ms次数标识
sbit cs1=P2^0;
sbit cs2=P2^1;
sbit cs3=P2^2;
sbit cs4=P2^3;
sbit pwm =P3^7 ; //PWM信号输出
sbit jia =P2^5; //角度增加按键检测IO口
sbit jan =P2^4; //角度减少按键检测IO口
unsigned char jd; //角度标识
unsigned char jdx; //角度显示
unsigned char fx; //判断正负
unsigned int jsbz=0;
unsigned char code tab[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf
};
unsigned char ds[]={0,0,0,0};
void smxs();
void delay(unsigned char i)//延时
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void delay1(unsigned int i)
{
while(i--);
}
void delay2(unsigned int i)
{
while(i--)smxs();
}
void cxx()
{
if(jd==8)jdx=90,fx=1;
else if(jd==9)jdx=78,fx=1;
else if(jd==10)jdx=57,fx=1;
else if(jd==11)jdx=36,fx=1;
else if(jd==12)jdx=14,fx=1;
else if(jd==13)jdx=6,fx=2;
else if(jd==14)jdx=27,fx=2;
else if(jd==15)jdx=49,fx=2;
else if(jd==16)jdx=70,fx=2;
else if(jd==17)jdx=90,fx=2;
if(fx==1)ds[0]=11;
else if(fx==2)ds[0]=10;
ds[1]=0;
ds[2]=jdx/10;
ds[3]=jdx%10;
}
void smxs()
{
cxx();
cs1=0;P0=tab[ds[0]];delay1(50);cs1=1;cs2=1;cs3=1;cs4=1;
cs2=0;P0=tab[ds[1]];delay1(50);cs2=1;cs1=1;cs3=1;cs4=1;
cs3=0;P0=tab[ds[2]];delay1(50);cs3=1;cs2=1;cs1=1;cs4=1;
cs4=0;P0=tab[ds[3]];delay1(50);cs4=1;cs2=1;cs3=1;cs1=1;
}
void Time0_Init() //定时器初始化
{
TMOD = 0x01; //定时器0工作在方式1
IE = 0x82;
TH0 = 0xff;
TL0 = 0xa4; //11.0592MZ晶振,0.5ms
TR0=1; //定时器开始
}
void keyscan() //按键扫描
{
unsigned char ajx;
if(jia==0) //角度增加按键是否按下
{
delay(10); //按下延时,消抖
if(jia==0) //确实按下
{
if(jd<17)jd++; //角度标识加1
count=0;jsbz=0; //按键按下 则20ms周期从新开始
while(jia==0) //等待按键放开
{ smxs();
if(jsbz>30000)
{
jsbz=0;ajx=1;
}
if(ajx==1)
{
delay2(50);if(jd<17)jd++;
}
}
ajx=0;
}
}
if(jan==0) //角度减小按键是否按下
{
delay(10);
if(jan==0)
{
if(jd>8)jd--; //角度标识减1
count=0;
while(jan==0)
{
if(jsbz>30000)
{
jsbz=0;ajx=1;
}
if(ajx==1)
{
delay2(50);if(jd>8)jd--;
}
}
ajx=0;
}
}
}
void Time0_Int() interrupt 1 //中断程序
{
TH0=0xff; //重新赋值
TL0=0xa4;
jsbz++;
if(count<jd) //判断0.5ms次数是否小于角度标识
pwm=1; //确实小于,PWM输出高电平
else
pwm=0; //大于则输出低电平
count=(count+1); //0.5ms次数加1 0.5 40 0.1 200
count=count%200; //次数始终保持为40 即保持周期为20ms
}
void main()
{
jd=12;//12
count=0;
Time0_Init();
while(1)
{
smxs();
keyscan();
}
}