| #include <reg51.h> #define uchar unsigned char
 #define uint unsigned int
 /*
 变量定义
 */
 uchar key_stime_counter,hight_votage=15,timeT_counter;
 bit key_stime_ok;
 /*
 引脚定义
 */
 sbit control_signal=P0^0;
 sbit turn_left=P3^4;
 sbit turn_right=P3^5;
 /*****************************************************************
 名称:定时器0初始化
 功能:20ms定时,11.0592M晶振
 初值=65536-11059200*0.02/12=65536-18432=47104=0xB800   20ms
 初值=65536-11059200*0.0001/12=65536-92.16=64430=0xFFA3 0.1ms
 *****************************************************************/
 void TimerInit()
 {
 control_signal=0;
 TMOD=0x01;                               //设置定时器0为工作方式1
 EA=1;                                   //开总中断
 ET0=1;                                   //定时器0中断允许
 TH0 = 0xFF;                        //定时器装初值
 TL0 = 0xA3;
 TR0=1;          //启动定时器0
 }
 /**********************************************
 定时器0中断服务函数
 ***********************************************/
 void timer0(void) interrupt 1 using 0
 {
 TH0=0xFF;
 TL0=0xA3; //定时器0重新装入数值
 if (++key_stime_counter>=200)
 {
 key_stime_counter=0;
 control_signal=1;
 key_stime_ok = 1;               // 20ms到
 timeT_counter=0;
 }
 if (key_stime_ok&&(++timeT_counter>=hight_votage))
 {
 key_stime_ok=0;
 timeT_counter=0;
 control_signal=0;              // hight_votage*0.1ms到
 }
 }
 /*********************************************
 名称:键盘扫描
 功能:在按键稳定期内判断键值,并返回键值
 **********************************************/
 uchar keyscan(void)
 {
 static char key_state = 0;
 static char key_value = 0;
 uchar key_press, key_return = 0;
 key_press=turn_left&turn_right;     //读按键I/O电平
 
 switch (key_state)
 {
 case 0 :     // 按键初始态
 if (key_press==0) key_state = 1; // 键被按下,但需要确认是否是干扰
 break;
 case 1 :     // 按键确认态
 if (key_press==0)//如有键按下则不是干扰,判断键值
 {
 if(turn_left==0)               //判断是哪一个按键被按下
 key_value=1;       //按键较多时可采用switch选择结构
 else if(turn_right==0)
 key_value=2;
 else
 key_value=0;
 
 key_state = 2; // 状态转换到键释放态
 }
 else
 key_state = 0; // 按键已抬起,属于干扰,转换到按键初始态
 break;
 case 2 :
 if (key_press==1)
 {
 key_return=key_value;//按键释放后再输出键值,如果按下键就输出则可省略key_value
 key_value=0;
 key_state = 0; //如果按键释放,转换到按键初始态
 }
 break;
 }
 return key_return; //返回键值
 }
 /*********************************************
 名称:按键处理
 功能:
 **********************************************/
 void key_operation(void)
 {
 switch (keyscan())      //根据键值不同,执行不同的内容
 {
 case 1:
 hight_votage-=1;
 if(hight_votage<5)
 hight_votage=5;
 break;
 case 2:
 hight_votage+=1;
 if(hight_votage>25)
 hight_votage=25;
 break;
 default :
 break;
 }
 }
 
 //LED显示函数
 void diplay()
 {
 if(hight_votage>=5&&hight_votage<=7) P1=0xFD;   //1灯亮,舵机接近或到达右转极限位置
 if(hight_votage>7&&hight_votage<=10) P1=0xFB;    //2灯亮
 if(hight_votage>10&&hight_votage<=13) P1=0xF7;    //3灯亮
 if(hight_votage>13&&hight_votage<=16) P1=0xEF;    //4灯亮,舵机到达中间位置
 if(hight_votage>16&&hight_votage<=19) P1=0xDF;   //5灯亮
 if(hight_votage>19&&hight_votage<=22) P1=0xBF;   //6灯亮
 if(hight_votage>22&&hight_votage<=25) P1=0x7F;   //7灯亮,舵机接近或到达左转极限位置
 }
 /*主程序*/
 void main(void)
 {
 TimerInit();
 while(1)
 {
 key_operation();
 diplay();
 }
 }
 
 
 |