mcs-51单片机 扫描矩阵键盘程序
时间:08-24
来源:互联网
点击:
#includereg52.h>#define uint unsigned int#define uchar unsigned charsbit DSCQ=P2^6;//位定义段锁存器控制端sbit WSCQ=P2^7;//位定义位锁存器控制端uchar code table[]={0x3f,0x06,0x5b,0x4f, //0,1,2,30x66,0x6d,0x7d,0x07, //4,5,6,70x7f,0x6f,0x77,0x7c, //8,9,a,b0x39,0x5e,0x79,0x71};//c,d,e,fvoid delay(uint t);//声明延时函数void keyscan(); //声明扫描函数void main(){DSCQ=0;//段锁存器锁存WSCQ=0;//位锁存器锁存P0=0x00;//P0口输出0000 0000WSCQ=1; //位锁存器允许通过WSCQ=0; //位锁存器锁存(数码管接地端全为低电平0)P0=table[8];//P0口输出8DSCQ=1; //段锁存器允许通过while(1){keyscan();//恒扫描}}void delay(uint t){uint x,y;for(x=t;x>0;x--){for(y=120;y>0;y--){}}}void keyscan(){uchar key1,key2;P3=0xfe; //1111 1110(将P3.0置为低电平0。高4位写1,以便读取4高位I/O口状态)key1=P3; //第一次读取P3口delay(15);//延时15mskey2=P3; //第二次读取P3口key1=key10xf0;//1111 0000(将第一次的值保留高4位,屏蔽低4位)key2=key20xf0;//1111 0000(将第二次的值保留高4位,屏蔽低4位)if((key1==key2)key1!=0xf0)
//如果key1的值等于key2的值,并且key1的值不等于1111 0000 表明确实有键被按下{switch(key1){case 0xe0:P0=table[0];break;//1110 0000case 0xd0:P0=table[1];break;//1101 0000case 0xb0:P0=table[2];break;//1011 0000case 0x70:P0=table[3];break;//0111 0000}}P3=0xfd; //1111 1101(将P3.1置为低电平0。高4位写1,以便读取4高位I/O口状态)key1=P3; //第一次读取P3口delay(15);//延时15mskey2=P3; //第二次读取P3口key1=key10xf0;//1111 0000 保留高4位(将第一次的值保留高4位,屏蔽低4位)key2=key20xf0;//1111 0000 保留高4位(将第二次的值保留高4位,屏蔽低4位)if((key1==key2)key1!=0xf0)
//如果key11的值等于key2的值,并且key1的值不等于1111 0000 表明确实有键被按下{switch(key1){case 0xe0:P0=table[4];break;//1110 0000case 0xd0:P0=table[5];break;//1101 0000case 0xb0:P0=table[6];break;//1011 0000case 0x70:P0=table[7];break;//0111 0000}}P3=0xfb; //1111 1011(将P3.2置为低电平0。高4位写1,以便读取4高位I/O口状态)key1=P3; //第一次读取P3口delay(15);//延时15mskey2=P3; //第二次读取P3口key1=key10xf0;//1111 0000(将第一次的值保留高4位,屏蔽低4位)key2=key20xf0;//1111 0000(将第二次的值保留高4位,屏蔽低4位)if((key1==key2)key1!=0xf0)
//如果key11的值等于key2的值,并且K1的值不等于1111 0000 表明确实有键被按下{switch(key1){case 0xe0:P0=table[8];break; //1110 0000case 0xd0:P0=table[9];break; //1101 0000case 0xb0:P0=table[10];break;//1011 0000case 0x70:P0=table[11];break;//0111 0000}}P3=0xf7; //1111 0111(将P3.3置为低电平0。高4位写1,以便读取4高位I/O口状态)key1=P3; //第一次读取P3口delay(15);//延时15mskey2=P3; //第二次读取P3口key1=key10xf0;//1111 0000(将第一次的值保留高4位,屏蔽低4位)key2=key20xf0;//1111 0000(将第二次的值保留高4位,屏蔽低4位)if((key1==key2)key1!=0xf0)
//如果key1的值等于key2的值,并且key1的值不等于1111 0000 表明确实有键被按下{switch(key1){case 0xe0:P0=table[12];break;//1110 0000case 0xd0:P0=table[13];break;//1101 0000case 0xb0:P0=table[14];break;//1011 0000case 0x70:P0=table[15];break;//0111 0000}}}
- MCS-51系列单片机结构化程序设计探讨(04-20)
- 基于MCS-51的嵌入式Internet接入技术(09-02)
- MCS-51单片机的定时器/计数器应该掌握的知识(10-19)
- MCS-51系列单片机的结构(12-02)
- MCS-51单片机汇编指令详解(12-01)
- MCS-51单片机的存储器结构---单片机基础(11-29)