单片机矩阵键盘
#include<reg51.h> sbit P34=P3^4; sbit P35=P3^5; sbit P36=P3^6; sbit P37=P3^7; unsigned char code Tab[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char keyval; //定义变量储存按键值void delayms(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--) ; }void display(unsigned char k){ P1=0xbf; //点亮数码管DS6 P0=Tab[k/10]; //显示十位 delayms(2); //动态扫描延时 P1=0x7f; //点亮数码管DS7 P0=Tab[k%10]; //显示个位 delayms(2); //动态扫描延时 P0=0; //关闭数码管 消除重影}void main( ){ EA=1; //开总中断 ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-500)/256; //定时器T0的高8位赋初值 TL0=(65536-500)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 while(1) //无限循环 { display(keyval); //调用按键值的数码管显示子程序 }}void timer0( ) interrupt 1 //定时器T0的中断编号为1{ TR0=0; //关闭定时器T0 P3=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1” if((P3&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下 delayms(20); //延时一段时间、软件消抖 if((P3&0xf0)!=0xf0) //确实有键按下 { P3=0xfe; //第一行置为低电平“0”(P3.0输出低电平“0”) if(P34==0) //如果检测到接P3.4引脚的列线为低电平“0” keyval=1; //可判断是S1键被按下 if(P35==0) //如果检测到接P3.5引脚的列线为低电平“0” keyval=2; //可判断是S2键被按下 if(P36==0) //如果检测到接P3.6引脚的列线为低电平“0” keyval=3; //可判断是S3键被按下 if(P37==0) //如果检测到接P3.7引脚的列线为低电平“0” keyval=4; //可判断是S4键被按下 P3=0xfd; //第二行置为低电平“0”(P3.1输出低电平“0”) if(P34==0) //如果检测到接P3.4引脚的列线为低电平“0” keyval=5; //可判断是S5键被按下 if(P35==0) //如果检测到接P3.5引脚的列线为低电平“0” keyval=6; //可判断是S6键被按下 if(P36==0) //如果检测到接P3.6引脚的列线为低电平“0” keyval=7; //可判断是S7键被按下 if(P37==0) //如果检测到接P3.7引脚的列线为低电平“0” keyval=8; //可判断是S8键被按下 P3=0xfb; //第三行置为低电平“0”(P3.2输出低电平“0”) if(P34==0) //如果检测到接P3.4引脚的列线为低电平“0” keyval=9; //可判断是S9键被按下 if(P35==0) //如果检测到接P3.5引脚的列线为低电平“0” keyval=10; //可判断是S10键被按下 if(P36==0) //如果检测到接P3.6引脚的列线为低电平“0” keyval=11; //可判断是S11键被按下 if(P37==0) //如果检测到接P3.7引脚的列线为低电平“0” keyval=12; //可判断是S12键被按下 P3=0xf7; //第四行置为低电平“0”(P3.3输出低电平“0”) if(P34==0) //如果检测到接P3.4引脚的列线为低电平“0” keyval=13; //可判断是S13键被按下 if(P35==0) //如果检测到接P3.5引脚的列线为低电平“0” keyval=14; //可判断是S14键被按下 if(P36==0) //如果检测到接P3.6引脚的列线为低电平“0” keyval=15; //可判断是S15键被按下 if(P37==0) //如果检测到接P3.7引脚的列线为低电平“0” keyval=16; //可判断是S16键被按下 } TR0=1; //开启定时器T0 TH0=(65536-500)/256; //定时器T0的高8位赋初值 TL0=(65536-500)%256; //定时器T0的高8位赋初值 }
按第三列都是13 按第四列都是16 为什么?
怎么乱了?
格式太乱了吧 弄的好看点行不行
http://zhidao.baidu.com/question/918251686447667979.html# 大神到这里看