#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Kport P3
#define Ledport P1
uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED从低位往高位移
unsigned char kscancnt; //记录进入中断的次数,满一个周期清零
void timer0_init(); //定时器0初始化
void delayMS(uint x); //延时函数
void KeyProcess(uchar Key); //按键处理函数
bit flag;
uchar knum;
uint F3cnt,F2cnt,Pwmcnt,T0cnt;
uchar temp=0xff,temp1;
uchar sh_cnt;
//延时函数
void delayMS(uint x)
{
uchar i;
while (x--)
for(i=0;i<120; i++) ;
}
/***************************************************
* 定时器0初始化子函数
* 工作方式2,每1000us中断一次
****************************************************/
void timer0_init(void)
{
TMOD = 0x01; //采用定时器0,工作方式2,
TH0 = (65536-1000)/256; //定时器设置,每隔20us发起一次中断。
TL0 = (65536-1000)%256;
ET0 = 1; //开定时器0中断
EA = 1; //开总中断
TR0 = 1; //打开定时器
}
//检测按键
uchar GetKey(uchar kscancnt)
{
uchar ktmp;
if(kscancnt==0)
{
temp=(Kport&0xf0)>>4;
ktmp=~temp &(temp1);
if(ktmp)knum=ktmp;
temp1=temp;
}
return knum;
}
//键盘按键处理
void KeyProcess(uchar Key)
{
switch (Key)
{
case 1:Ledport=0x00;
break;
case 2:if(F2cnt==200){sh_cnt=++sh_cnt%8;F2cnt=0;}
Ledport=table0[sh_cnt];
break;
case 4:if(T0cnt==300)
{F3cnt=F3cnt+10;T0cnt=0;}
if(F3cnt==130){F3cnt=0;flag=!flag;}
Pwmcnt=++Pwmcnt%100;
if(flag)
{if(Pwmcnt>F3cnt)Ledport=0x00;else Ledport=0xff;}
else
{if(Pwmcnt>F3cnt)Ledport=0xff;else Ledport=0x00;}
break;
case 8:Ledport=0xff; //全部关闭
break;
}
}
/***************************************************
* 中断服务子函数
*****************************************************/
void time0(void) interrupt 1
{
TH0 = (65536-1000)/256; //定时器设置,每隔20us发起一次中断。
TL0 = (65536-1000)%256;
kscancnt=++ kscancnt%10;
if(knum==2) {F2cnt++; }
if(knum==4) {T0cnt++; }
}
//--------------------------------------------------------------------
void main(void)
{
uchar Key;
P0=P1=0xFF;
timer0_init();
while(1)
{
Key=GetKey(kscancnt);
KeyProcess(Key);
}
}
先把程序理解 |