uchar key_stime_ok=0; // 定时器定时时间标志位
//*************** 函数定义 ******************
void delay1ms(unsigned int j);
void senddata_uart0(uchar dc);
void sendstring_uart0(uchar *dd);
//*************** 主程序 ********************
void main(void)
{
TMOD=0x2; //定时器0方式2
TH0=0xa5; //定时时间0.1mS
TL0=0xa5;
TR0=1; //启动定时器
ET0=1; //定时器0中断允许
SCON=0x50; //uart0方式1,允许接收
AUXR=BRTR|S1BRS|BRTx12; //独立波特率发生器时钟为1T,uart0使用并启动独立波特率发生器
BRT=0xb8; //设置独立波特率发生器波特率 115200bps
ES=1; //uart0中断允许
EA=1; //中断总允许
delay1ms(1);
while(1)
{
if(key_stime_ok!=0)
{
key_stime_ok=0;
switch(read_key())
{
case dk0:
{
sendstring_uart0("0");
break;
}
case dk1:
{
sendstring_uart0("1");
break;
}
case dk2:
{
sendstring_uart0("2");
break;
}
case dk3:
{
sendstring_uart0("3");
break;
}
case dk4:
{
sendstring_uart0("4");
break;
}
case dk5:
{
sendstring_uart0("5");
break;
}
case dk6:
{
sendstring_uart0("6");
break;
}
case dk7:
{
sendstring_uart0("7");
break;
}
case dkup:
{
sendstring_uart0("a");
break;
}
default:
{
break;
}
}
}
}
}
void timer0(void) interrupt 1
{
static key_stime_counter=0;
if(++key_stime_counter>=100) //定时100次,定时时间=100*0.1 mS
{
key_stime_counter=0;
key_stime_ok=1; //10ms到,置位标志位
}
}
//uart interrupt
void uart0(void) interrupt 4
{
uchar cdd;
EA=0;
if (RI)
{
RI=0;
cdd=SBUF;
if (cdd==0xaa) //如果接收到0xaa,产生软件复位
{
IAP_CONTR=0x20; //软复位,从用户程序区启动
}
senddata_uart0(cdd+1); //将接收到的数据+1,再发送回去
}
EA=1;
}
//***************************发送数据**************************
void senddata_uart0(uchar dc)
{
SBUF=dc;
while (!TI); //当TI=0时,发送未结束,循环等待
TI=0; //当TI=1时,发送结束,用软件将TI清零
}
//************************发送字符串数据***********************
void sendstring_uart0(uchar *dd)
{
while ((*dd)!=0)
{
senddata_uart0(*dd);
dd++;
}
}
//*************************延时 n*1ms********************
void delay1ms(unsigned int j)
{
unsigned int i;
for (;j>0;j--)
{
for (i=0;i<124;i++)
{;}
}
}
//*************** 函数定义 ******************
void delay1ms(unsigned int j);
void senddata_uart0(uchar dc);
void sendstring_uart0(uchar *dd);
//*************** 主程序 ********************
void main(void)
{
TMOD=0x2; //定时器0方式2
TH0=0xa5; //定时时间0.1mS
TL0=0xa5;
TR0=1; //启动定时器
ET0=1; //定时器0中断允许
SCON=0x50; //uart0方式1,允许接收
AUXR=BRTR|S1BRS|BRTx12; //独立波特率发生器时钟为1T,uart0使用并启动独立波特率发生器
BRT=0xb8; //设置独立波特率发生器波特率 115200bps
ES=1; //uart0中断允许
EA=1; //中断总允许
delay1ms(1);
while(1)
{
if(key_stime_ok!=0)
{
key_stime_ok=0;
switch(read_key())
{
case dk0:
{
sendstring_uart0("0");
break;
}
case dk1:
{
sendstring_uart0("1");
break;
}
case dk2:
{
sendstring_uart0("2");
break;
}
case dk3:
{
sendstring_uart0("3");
break;
}
case dk4:
{
sendstring_uart0("4");
break;
}
case dk5:
{
sendstring_uart0("5");
break;
}
case dk6:
{
sendstring_uart0("6");
break;
}
case dk7:
{
sendstring_uart0("7");
break;
}
case dkup:
{
sendstring_uart0("a");
break;
}
default:
{
break;
}
}
}
}
}
void timer0(void) interrupt 1
{
static key_stime_counter=0;
if(++key_stime_counter>=100) //定时100次,定时时间=100*0.1 mS
{
key_stime_counter=0;
key_stime_ok=1; //10ms到,置位标志位
}
}
//uart interrupt
void uart0(void) interrupt 4
{
uchar cdd;
EA=0;
if (RI)
{
RI=0;
cdd=SBUF;
if (cdd==0xaa) //如果接收到0xaa,产生软件复位
{
IAP_CONTR=0x20; //软复位,从用户程序区启动
}
senddata_uart0(cdd+1); //将接收到的数据+1,再发送回去
}
EA=1;
}
//***************************发送数据**************************
void senddata_uart0(uchar dc)
{
SBUF=dc;
while (!TI); //当TI=0时,发送未结束,循环等待
TI=0; //当TI=1时,发送结束,用软件将TI清零
}
//************************发送字符串数据***********************
void sendstring_uart0(uchar *dd)
{
while ((*dd)!=0)
{
senddata_uart0(*dd);
dd++;
}
}
//*************************延时 n*1ms********************
void delay1ms(unsigned int j)
{
unsigned int i;
for (;j>0;j--)
{
for (i=0;i<124;i++)
{;}
}
}