模块训练
注意:当要用到LED(4)、蜂鸣器以及继电器(5)、数码管(位置选择6,段码选择7),则需要用到138译码器选择通道代码。
1.基本操作
2.独立按键的扩展应用
一、独立按键电路图
二、电路分析
对P30~P33接口进行检测,当按键按下时即为低电平
注意:先用sbit对端口进行重命名,在赋值使用时即可更清晰明了
三、程序代码
1.独立按键的基本操作
#include<regx52.h>sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
sbit L6=P0^5;
sbit L7=P0^6;
sbit L8=P0^7;void SelaectHC573(unsigned char n)
{switch(n){case 4:P2=(P2&0X1F)|0X80;break;case 5:P2=(P2&0X1F)|0Xa0;break;case 6:P2=(P2&0X1F)|0Xc0;break;case 7:P2=(P2&0X1F)|0Xe0;break;}
}
void DelayK(unsigned char t)//因为用来消抖所以参数小可以用char型参数
{while(t--);
}
void ScanKeys_Alone()
{if(S7==0){DelayK(100);//用来对按键进行消抖处理if(S7==0)//若是过了一会按键依然按下则说明时有效信号进行下一步{L1=0;while(S7==0); //若按键一直按下,则led灯一直亮着L1=1;}}if(S6==0){DelayK(100);if(S6==0){L2=0;while(S6==0);L2=1;}}if(S5==0){DelayK(100);if(S5==0){L3=0;while(S5==0);L3=1;}}if(S4==0){DelayK(100);if(S4==0){L4=0;while(S4==0);L4=1;}}
}
void main()
{SelaectHC573(4);while(1){ScanKeys_Alone();}
}
2.独立按键的扩展应用
自己写的代码
#include<regx52.h>sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
sbit L6=P0^5;
sbit L7=P0^6;
sbit L8=P0^7;void SelaectHC573(unsigned char n)
{switch(n){case 4:P2=(P2&0X1F)|0X80;break;case 5:P2=(P2&0X1F)|0Xa0;break;case 6:P2=(P2&0X1F)|0Xc0;break;case 7:P2=(P2&0X1F)|0Xe0;break;}
}
void DelayK(unsigned char t)
{while(t--);
}void ScanKeys_Alone()
{if(L2==1){if(S7==0)//S7控制第一组{DelayK(100);if(S7==0){L1=0;}}if(L1==0) //第一组控制键{if(S5==0){DelayK(100);if(S5==0){L3=0;while(S5==0);L3=1;}}if(S4==0){DelayK(100);if(S4==0){L4=0;while(S4==0);L4=1;}}}if(S7==0)//若S7再按下{DelayK(100);if(S7==0){L1=1;}}}if(L1==1)//S6控制另一组{if(S6==0){DelayK(100);if(S6==0){L2=0;}}if(L2==0) //第二组控制键{if(S5==0){DelayK(100);if(S5==0){L5=0;while(S5==0);L5=1;}}if(S4==0){DelayK(100);if(S4==0){L6=0;while(S4==0);L6=1;}}if(S6==0){DelayK(100);if(S6==0){L2=1;}}}}}void main()
{SelaectHC573(4);while(1){ScanKeys_Alone();}
}
3.独立按键扩展应用的改进代码
注意:用状态机实现对代码的改进
#include<regx52.h>sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
sbit L6=P0^5;
sbit L7=P0^6;
sbit L8=P0^7;unsigned char stat_k=0;//状态机的使用
void SelaectHC573(unsigned char n)
{switch(n){case 4:P2=(P2&0X1F)|0X80;break;case 5:P2=(P2&0X1F)|0Xa0;break;case 6:P2=(P2&0X1F)|0Xc0;break;case 7:P2=(P2&0X1F)|0Xe0;break;}
}
void DelayK(unsigned char t)//因为用来消抖所以参数小可以用char型参数
{while(t--);
}
void ScanKeys_Alone()
{if(S7==0){DelayK(100);if(S7==0){if(stat_k==0)//首先判断状态{L1=0;stat_k=1;}else if(stat_k==1){L1=1;stat_k=0;//释放状态}while(S7==0);}}if(S6==0){DelayK(100);if(S6==0){if(stat_k==0){L2=0;stat_k=2;}else if(stat_k==2){L2=1;stat_k=0;}while(S6==0);}}if(S5==0){DelayK(100);if(S5==0){if(stat_k==1){L3=0;while(S5==0);L3=1;}else if(stat_k==2){L5=0;while(S5==0);L5=1;}}}if(S4==0){DelayK(100);if(S4==0){if(stat_k==1){L4=0;while(S4==0);L4=1;}else if(stat_k==2){L6=0;while(S4==0);L6=1;}}}
}
void main()
{SelaectHC573(4);while(1){ScanKeys_Alone();}
}