#define P_IOA_Data (unsigned int*)0x7000
#define P_IOA_Buffer (unsigned int*)0x7001
#define P_IOA_Dir (unsigned int*)0x7002
#define P_IOA_Attrib (unsigned int*)0x7003
#define P_IOA_Latch (unsigned int*)0x7004
#define P_IOB_Data (unsigned int*)0x7005
#define P_IOB_Buffer (unsigned int*)0x7006
#define P_IOB_Dir (unsigned int*)0x7007
#define P_IOB_Attrib (unsigned int*)0x7008
#define P_Watchdog_Clear (unsigned int*)0x7012
#define P_ADC (unsigned int*)0x7014
#define P_ADC_Ctrl (unsigned int*)0x7015
#define P_ADC_MUX_Ctrl (unsigned int*)0x702B
#define P_ADC_MUX_Data (unsigned int*)0x702C
unsigned int KeyScan(void);
void Delay(void);
unsigned int adc(unsigned int channel);
int main(void)
{
unsigned int Key ,kk;
*P_IOA_Dir=0x0000;
*P_IOA_Attrib=0x00f8;
*P_IOA_Data=0x0000;
*P_IOB_Dir=0x40ff;
*P_IOB_Attrib=0x40ff;
*P_IOB_Data=0x4000;
kk=4;
while(1)
{
Key = KeyScan();
switch(Key)
{
case 0x01:kk=4;break;
case 0x02:kk=5;break;
case 0x04:kk=6;break;
default:break;
}
*P_IOB_Data=adc(kk);
*P_Watchdog_Clear = 0x0001;
}
}
unsigned int adc(unsigned int channel)
{
unsigned int item;
unsigned int Key;
*P_ADC_Ctrl=0x0001;
*P_ADC_MUX_Ctrl=channel;
item=*P_ADC_MUX_Data;
while(1)
{
while(!(*P_ADC_MUX_Ctrl & 0x8000)) //判断AD转换是否完成
*P_Watchdog_Clear=0x0001;
item=*P_ADC_MUX_Data;
item&=0xff00;
item>>=8;
item|=0x4000;
return item;
}
}
unsigned int KeyScan(void)
{
unsigned int uiData;
if((*P_IOA_Data&0x0007) != 0) //非零则表示有键按下
{
Delay(); //延时消抖
if((*P_IOA_Data&0x0007) != 0)
{
uiData = *P_IOA_Data&0x0007;
while((*P_IOA_Data&0x0007) != 0)//按下状态
*P_Watchdog_Clear = 1;
return uiData;
} //两次读数不相等,则置返回值为0
}
return 0; //返回键值
}
void Delay(void)
{
unsigned int uiCount;
for(uiCount = 0;uiCount <= 3000;uiCount++)
{
*P_Watchdog_Clear = 0x0001; //清看门狗
}
}