在没有数字显示的开始,顺序为矩阵键盘后,依次显示的数码管0~F,6同时数字控制静态展示。
数字控制和矩阵式键盘
首先关闭全部的数码管的段选不让数码管显示不论什么数字。然后位选中全部的数码管,接下来仅仅须要选中全部的数码管,以后的操作的仅仅须要送段选数据即可了,接着进入while()大循环不停的扫描键盘是否有被按下
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 }; void delayms(uint xms) { uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--); } void display(uchar num) { P0=table[num];dula=1;dula=0; } void matrixkeyscan() { uchar temp,key;P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){ delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){ temp=P3;switch(temp){ case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;case 0x7e:key=3;break;}while(temp!=0xf0){ temp=P3;temp=temp&0xf0;}display(key);}}P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){ delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){ temp=P3;switch(temp){ case 0xed:key=4;break;case 0xdd:key=5;break;case 0xbd:key=6;break;case 0x7d:key=7;break;}while(temp!=0xf0){ temp=P3;temp=temp&0xf0;}display(key);}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){ delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){ temp=P3;switch(temp){ case 0xeb:key=8;break;case 0xdb:key=9;break;case 0xbb:key=10;break;case 0x7b:key=11;break;}while(temp!=0xf0){ temp=P3;temp=temp&0xf0;}display(key);}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){ delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){ temp=P3;switch(temp){ case 0xe7:key=12;break;case 0xd7:key=13;break;case 0xb7:key=14;break;case 0x77:key=15;break;}while(temp!=0xf0){ temp=P3;temp=temp&0xf0;}display(key);}} } void main() { P0=0;dula=1;dula=0;P0=0;wela=1;wela=0;while(1){ matrixkeyscan();} }
这里有几个
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ .........
P3=0xfe 将第1 行线置低电平,其余的行线所有为高电平
temp=P3 读取P3口当前的状态值赋值给暂时变量temp
temp=temp&0xf0 将temp与0xf0进行与运算 然后再将结果赋值给temp,主要是推断temp的高4位是否有0。假设temp的高4位没有0。那么他与0xf0“与”运算后的结果仍然等于0xf0.temp的高4位数据实际上就是矩阵键盘的4个列线,从而我们可通过推断temp与“0xf0运算后的结果是否为0xf0来推断出第一行按键是否有按键被按下。
if(temp!=0xf0) 表示temp是上面P3口数据与0xf0“与”运算后的结果,假设结果temp不等于0xf0来推断出有按键被按下。
另外
P3口全部引脚
其余的想复位引脚RES\VPD
还有EA\VPP
ALE\PROG
这是全部的了,我的是AT89S52(51系列)
版权声明:本文博主原创文章。博客,未经同意不得转载。