//**********************************************************************// 4独立键盘扫描子程序,采用逐键扫描的方式//**********************************************************************uchar Key_Scan_4(void){P1SEL = 0X00; //设置为普通IO,可省P1DIR = 0X0F; //高四位输入,低4位输出P1OUT= 0XF0; //高四位输出值无意义,低四位输出0,//当有按键按下时,高4位输入值被拉低uchar key_check;uchar key_checkin;key_checkin=P1IN; //读取IO口状态,判断是否有键按下key_checkin&= 0xF0; //屏蔽掉低四位的不确定值if(key_checkin!=0xF0) //IO口值发生变化则表示有键按下{delay_ms(20); //键盘消抖,延时20MSkey_checkin=P1IN; //再次读取IO口状态if(key_checkin!=0xF0) //确定是否真正的有键按下{key_check=P1IN; //有键按下,读取端口值switch (key_check & 0xF0) //判断是哪个键按下{case 0xE0:key=1;break;case 0xD0:key=2;break;case 0xB0:key=3;break;case 0x70:key=4;break;}}}else{key=0xFF; //无键按下,返回FF}return key;}
程序3 4个独立键盘扫描子程序,采用中断扫描方式
P1IES = 0xF0; //P14~P17选择下降沿中断P1IE = 0xF0; //打开中断使能P1IFG = 0x00; //中断标志位清零
//*************************************************************************// 中断服务函数//*************************************************************************#pragma vector=PORT1_VECTOR__interrupt void PORT1_ISR(void){if(P1IFG & 0xF0){switch(P1IFG&0xF0) //进行一个与操作,避免判断值出现其他影响{case 0x10:if(P1IN == 0xE0) //如果是第一个按键被按下{delay_ms(20); //20ms的消抖时间if(P1IN == 0xE0){while(P1IN != 0xF0); //等待键释放KEY_VAL = 1; //标志是第几个按键按下P1IFG = 0; //清除中断标志return;}}case 0x20:if(P1IN == 0xD0) //如果是第二个按键被按下{delay_ms(20);if(P1IN == 0xD0){while(P1IN != 0xF0); //等待键释放KEY_VAL = 2;P1IFG = 0;return;}}case 0x40:if(P1IN == 0xB0) //如果是第三个按键被按下{delay_ms(20);if(P1IN == 0xB0){while(P1IN != 0xF0); //等待键释放KEY_VAL = 3;P1IFG = 0;return;}}case 0x80:if(P1IN == 0x70) //如果是第四个按键被按下{delay_ms(20);if(P1IN == 0x70){while(P1IN != 0xF0); //等待键释放KEY_VAL = 4;P1IFG = 0;return;}}default:while(P1IN != 0xF0); //等待键释放P1IFG = 0;return;}}}
数码管
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void Display(void){uchar i,j;j=0x01; //此数据用来控制位选for(i=0;i<8;i++){DCTR1; //控制数码管段数据的74HC573的LE管脚置高WCTR1; //控制数码管位的74HC573的LE管脚置高DATAPORT=~j; //设置要显示的位,也就是哪一个数码管亮WCTR0; //锁存位数据,下面送上段数据以后,就显示出来了DATAPORT=table; //送要显示的数据,就是段数据,如显示0送的是0x3fDCTR0; //锁存段数据,数码管亮一个时间片刻j=j<<1; //移位,准备进行下一位的显示delay_ms(1); //显示一个时间片刻,会影响亮度和闪烁性}}
用户403664 2013-11-14 15:56