#include "stc12c5410ad.h"
#include "intrins.h"
sfr ADC_RES = 0xC6; //ADC high 8-bit result register
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //420 clocks
#define ADC_SPEEDL 0x20 //280 clocks
#define ADC_SPEEDH 0x40 //140 clocks
#define ADC_SPEEDHH 0x60 //70 clocks
static code unsigned char Tab[4][4]={{'0','1','2','3'},{'4','5','6','7'},{'8','9','a','b'},{12,13,14,15}};
void Delay(unsigned int n)
{
unsigned int x;
while (n--)
{
x = 5000;
while (x--);
}
}
void InitADC(void)
{
P1 = P1M0 = P1M1 = 0xff; //Set all P1 as Open-Drain mode
ADC_RES = 0; //Clear previous result
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC power-on and delay
}
unsigned char GetADCResult(unsigned char ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //Must wait before inquiry
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
ADC_CONTR &= ~ADC_FLAG; //Close ADC
return ADC_RES; //Return ADC result
}
static unsigned char ScanKey(void)
{
unsigned char x=0,y=0;
P1M1 |= ((1<<7)|(1<<5));
P1M0 &=~ ((1<<7)|(1<<5));
P1 &=~ (1<<7);//X+为GND
P1 |= (1<<5);//X-为VCC
P1M0 |= ((1<<6)|(1<<4));
P1M1 &=~ ((1<<6)|(1<<4));//Y+为Hi-Z 且Y-作为AD口使用
// Delay(5);
x = GetADCResult(6);
P1M1 |= ((1<<4)|(1<<6));
P1M0 &=~ ((1<<4)|(1<<6));
P1 &=~ (1<<4);//Y+为GND
P1 |= (1<<6);//Y-为VCC
P1M0 |= ((1<<7)|(1<<5));
P1M1 &=~ ((1<<7)|(1<<5));//X+为Hi-Z 且X-作为AD口使用
// Delay(5);
y = GetADCResult(5);
return Tab[x/75][y/64];//返回键值
}
/*----------------------------
Initial UART
----------------------------*/
void InitUart(void)
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
EA = 1;
}
void SendData(unsigned char dat)
{
EA=0;
SBUF = dat; //Send current data
while (!TI); //Wait for the previous data is sent
TI = 0; //Clear TI flag
EA=1;
}
static void Sys_init(void)
{
P1M0 |= ((1<<2)|(1<<3));
P1M1 &=~ ((1<<2)|(1<<3));
InitUart();
InitADC();
}
void main(void)
{
Sys_init();
while(1)
{
ScanKey();
}
}
void getch(void) interrupt 4
{
unsigned char a;
EA=0;//清除中断标志,硬件置位,软件清零
RI=0;
a=SBUF; //接受串口缓冲区数据
if(a==0x80)
{
// ShowResult(6); //Show Channel6
// ShowResult(7); //Show Channel7
SendData(ScanKey());
}
EA=1;
}