基于adc的模拟按键识别与控制

有人能帮忙解释下面代码 下课提问。
stc8单片机

#include <stc8h.h>

unsigned char adc_data;

void Delay20ms() //@11.0592MHz
{
unsigned char i, j, k;

i = 2;
j = 32;
k = 60;
do
{
    do
    {
        while (--k);
    } while (--j);
} while (--i);

}

unsigned char adc_read()
{
unsigned char adc_value;
ADC_CONTR |= 0x40;
while (!(ADC_CONTR & 0x20));
ADC_CONTR &= ~0x20;
adc_value = ADC_RES;
ADC_RES = 0;
ADC_RESL = 0;
return adc_value;
}

void UartInit(void)
{
SCON = 0x50;
AUXR |= 0x40;
AUXR &= 0xFE;
TMOD &= 0x0F;
TL1 = 0xE0;
TH1 = 0xFE;
ET1 = 0;
TR1 = 1;
}

void uart1_int() interrupt 4
{
if(TI)
TI = 0;
if(RI)
{
RI = 0;
if(SBUF == 'B')
P00 = 0;
if(SBUF == 'C')
P0 |= 7;
}
}
void main()
{
ADC_CONTR |= 1 << 7;
EA = 1;
ES = 1;
P0M0 &= ~7;
P0M1 &= ~7;
UartInit();
while(1)
{
Delay20ms();
adc_data = adc_read();
SBUF = adc_data;
switch (adc_data)
{
case 0:
P00 = 0;
P01 = 1;
P02 = 1;
break;
case 0x2a:
P00 = 1;
P01 = 0;
P02 = 1;
break;
case 0x52:
P00 = 1;
P01 = 1;
P02 = 0;
break;
case 0x80:
P00 = 0;
P01 = 0;
P02 = 0;
break;
default:
P00 = 1;
P01 = 1;
P02 = 1;
break;
}
}
}

////////////////////
#include <stc8h.h>

unsigned char adc_data;

void Delay20ms() //@11.0592MHz延时20ms
{
unsigned char i, j, k;

i = 2;
j = 32;
k = 60;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}

unsigned char adc_read()////AD转换函数
{
unsigned char adc_value;
ADC_CONTR |= 0x40;///启动AD转换
while (!(ADC_CONTR & 0x20));////等待转换完成标志
ADC_CONTR &= ~0x20;///清除转换完成标志
adc_value = ADC_RES;////读取转换结果赋值给ad_value
ADC_RES = 0;///清转换结果寄存器
ADC_RESL = 0;
return adc_value;
}

void UartInit(void)////串口初始化
{
SCON = 0x50;
AUXR |= 0x40;
AUXR &= 0xFE;
TMOD &= 0x0F;
TL1 = 0xE0;
TH1 = 0xFE;
ET1 = 0;
TR1 = 1;
}

void uart1_int() interrupt 4////串口1中断
{
if(TI)
TI = 0;
if(RI)
{
RI = 0;
if(SBUF == 'B')////当接收到'B'字符时,P0.0输出0;
P00 = 0;
if(SBUF == 'C')////当接收到'C'字符时,P0.0,P0.1,P0.2均输出1;
P0 |= 7;
}
}
void main()
{
ADC_CONTR |= 1 << 7;/////打开ADC电源
EA = 1;///开启总中断
ES = 1;///允许中断
P0M0 &= ~7;/////设置P0.0,P0.1,P0.2为准双向口模式
P0M1 &= ~7;
UartInit();///串口初始化
while(1)
{
Delay20ms();///延时20ms
adc_data = adc_read();///读取AD转换的值
SBUF = adc_data;///把读取的值赋值给串口发送缓冲寄存器
switch (adc_data)/////对采集转换的ADC的不同值P0.0,P0.1,P0.2输出不同的电平
{
case 0:
P00 = 0;
P01 = 1;
P02 = 1;
break;
case 0x2a:
P00 = 1;
P01 = 0;
P02 = 1;
break;
case 0x52:
P00 = 1;
P01 = 1;
P02 = 0;
break;
case 0x80:
P00 = 0;
P01 = 0;
P02 = 0;
break;
default:
P00 = 1;
P01 = 1;
P02 = 1;
break;
}
}
}