指令集 内存 主频 集成电路 控制器 微架构
主页 正文

51单片机编程:实现44矩阵键盘按键松开等待功能

51单片机 c语言编程 4*4矩阵键盘如何实现等待按键松开功能?

if(key_l!=0xf0){lay_nms(5);key_l=P1; 在第 4 行添加 while(key_l!=0xf0); 如果未释放该键,则该键将被释放。
在此等待直至释放钥匙。
该语句将被执行。
跑得更远

急求一个由89C51单片机的代码!要求用4*4矩阵键盘控制LED矩阵输出0~9的数字!

/* 分别按下4×4键盘上的按键,显示键值0~16*/#includesbitspeaker=P3^7;///// // 歌曲 sbitv1=P2^0;sbitv2=P 2^1;sbitv3=P2^2;sbitv4=P2^3;sbith1=P2^4;sbith2=P2^5;sbith3=P2^6;sbith4=P2^7;///// /// 显示 sbit shu1=P1^3;/* 第一个数码管有公共负端*/sbitshu2=P1^2;/* 第二个数码管有公共负端 公共负端*/sbitshu3=P1^1;/*第三数码管负公共端负端*/sbitshu4 = P1^0,/4*数码管公共负端*//// // voiddelayms(unsignedinti);unsignedcharyima[]={0xeb,0x88,0xb3,0xba,0xd8,0x7a,0x 7b,0xa8,0xfb,0xfa};/* 解码表,此表中的数据为硬件 */unsignedintb=0;/*要显示的数据*/unsignedintb_count=0;/* 扫描仪数量*/voiddelee. yms(unsignedinti);unsignedintkeyboar();unsignedintb;voidt0()interrupt1using1/* 程序中断负责b的值*/{ unsigned dchara1=0,a2=0,a3=0,a4=0;staticintk=0; /*数码管显示*/a1=b/1000;/*获取千位数b*/a2=b%1000/ 100 ;/* 获取百分位 b*/a3=b%100 /10;/* 获取十位 b*/a4=b%10;/* 获取数字 b*/if(k==0){shu4=; shu1=0;shu2=0;shu3 =0 ;P0=yima[a1];}seif(k==1){shu4=0 ;shu1=1;shu2=0;shu3=0;P0=yima[a4];}elseif(k==2){shu4=0;shu1=0;shu2=1;shu3=0;P0=yima[a3 ];}seif(k= =3){shu4=0;shu1=0;shu2=0;shu3=1;P0=yima[a2];}k++;if(k>3)k=0;TH0=240;}main(){EA = I;/* 添加全局激活 */ TR0 = I;/* 确定定时器 0 开始计数 */ ET0=1;/* 定时器 0 打开 中断*/TMOD=0X01;/*定时器0工作在模式1:16位计算模式*/while(1){b=keyboar() ;/ *给出一个代表b链接的值*/}} void等待( unsignedinti){ unsignedintj;for(;i>0;i--)for(j=100;j>0;j--);}///// // ///////// ////////////// // 扫描方式:逐行查找通常用于按键比较少的情况 intkeyscan (){ unsignedch arkk_temp;P1=0xf0;// 最小位置0,准备查询按键 k=P1;//获取当前P1端口状态 if(k!=0xf0)//如果有变化则表示链路有延迟 k_temp=p1 ;if(k==k_temp)//关键确实表达了 {k=0xfe; do // 循环扫描每一行{p1=k; if(k!=p1){ switch(P1)//确定key并返回Key值 { //第1行 case0x7e:{ return n0; 中断;} case0xbe: {return1; 中断;} case0xde:{return2; 中断;} case0xee: {return3; Break;}// 第 2 行 case0x7d: {return4; 中断;} case0xbd:{return5; 中断;} case0xdd:{return6; break;} case0xed:{return7;break;}// 第 3 行 case0x7b: {return8; 中断;} case0xdb: {return10; 中断;} case0xeb: {return11; 休息 }// 第 4 行 case0x77:{return12;break;}case0xb7:{return13;break;}case0xd7:{return14;break;}case0xe7:{return n15;}}} k=_crol_(k,1);//推导第二行} while(k!=0xef); // //////////////反转法行:只需2步即可得到关键位置 */{ staticunsignedinta=0;unsignedchara1=0,b1=0;/* 插值线和列线为输出线 */v1=v2=v3=v4 =0;h1=h2=h3=h4=1; f0)/* 检查该行的按钮是否被按下 */ { wait(10); if(P2<0xf0){/* 行line为输入行,列行为输出行*/v1= v2=v3=v4=0 ;h1=h2=h3=h4=1;a1=P2; 输出行,列行输入行*/h1=h2=h3=h4=0;v1=v2=v3=v4=1;b1=P2;a=a1|b1;}}if(a==0xe7){ return7 ;} elseif(a==0xeb){return8 ;} elseif(a==0xed){return9;}elseif(a==0xee){return13;}elseif(a==0xd7){return4;}elseif(a==0xdb){return rn5;} elseif(a==0xdd){return6;}elseif(a==0xde){return12;}elseif(a==0xb7){return1;}elseif(a==0xbb){re turn2;}elseif(a==0xbd){return3;}elseif(a==0xbe){return11;}elseif(a==0x77){return0;}elseif(a==0x7b){ return15;}elseif(a==0x7d){return16;}elseif(a==0x7e){return10;}elsereturn17;}/******************** * * * * ******************** 写法流水灯1while(I){a = 0x01; // 赋值00000001for (i = 0; i < VIII ;i++) 循环8次 {P0=a;delay(500);a=a< <1;//左移1部分 } } 活水的写法lamp 2: a=0x01;//设置初始值为0001 while(1){ P0=a;//先点亮第一个LED(500); a = _crol_ (a, 1); // 将a循环左移1位后,再应用a}写入3灯流水的方法: while(1){a=0x01;//初始值0001for(i=0;i<7;i++) {P0=a; 延迟(500); a = a<<;//左移} for (i = 0, i<7; i* +){P0=a;delay(500);a=a>>1;//右移}}写入方法3:voidt0()interrupt1//中断函数function {TH0=(65356-50000)/256; //重新加载寄存器个数的高8位.Intra TL0=(65536-50000)%256; // 将计数表的低8位重新加载到num++中; i;//进入位移操作,关闭LED位P0=1,并将P0右移i + + i;

51单片机,4*4矩阵键盘,八位数码管

51单片机,4*4矩阵键盘,八位数码管,请看仿真例子。

#include

#defineucharunsignedchar

uchartemp;

intkey1,key, disbuf;//此表led字体为01 23456789abcdef

unsignedcharcodeLED7Code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E, 0x79,0x71};

unsignedcharledx[8];

位 s0,s1;

voiddelay(ucharz)

{

上,j;

for(i=0; i<120;i++)

for(j=0;j

}

voidscan() //如果按键按下,则扫描键盘编码值

{

P1=0xF0;

delay(1);

temp =P1;

开关(临时)

{

case0xe0:key1=0;

break;

case0xd0:key1=1;

break;

case0xb0:key1=2;

break;

case0x70: key1=3;

中断;

}

P1=0x0f;

延迟(1);

温度=P1;

开关(临时)

{

case0x0E:key=key1+0;

中断;

case0x0D: key=key1+4;

break;

case0x0 B:key=key1+8;

break;

case0x07:key=key1+12;

break;

默认:键=-1;

}

if((key1+1)&&(key+1))disbuf=key;

}

voidejjc( ) //判断按键是否按下

{

P1=0xF0 ;

if(P1!=0xF0){scan(); =1;}

其他 e{s0=0;s1=1;}

}

voidmain()

{

上;

while(1)

{

ejjc();

if(s0==1 &&s1== 1)

{

s0=0;s1=0;

for(i=0;i<8;i++)

{ledx[i]=ledx[i+1];ledx[8]=disbuf;}

}

P0=0xff;

P2=LED7Code[ledx[0]];

P0=0xfe;

延迟(5);

P0=0xff;

P2=LED7Code[ledx[1]];

P0=0xfd;

延迟(5);

P0=0xff;

P2=LED7Code[ledx[2]];

P0=0xfb;

延迟(5);

P0=0xff;

P2=LED7Code[ LEDx[3]];

P0=0xf7;

延迟(5);

P0=0xff;

P2=LED7Code [ledx[4]];

P0=0xef;

延迟(5);

<

P0=0xff;

P2=LED7Code[ledx[5]];

P0=0xdf;

延迟(5);

P0=0xff;

P2=LED7Code[ledx[6]];

P0=0xbf;

延迟(5);

P0=0xff;

P2=LED7Code[ledx[7]];

P0=0x7f;

延迟(5);

}

}

热门资讯
提升MySQL查询效率深度解析读缓存技巧
基金投资亏损风险解析
OPPO便签设置提醒及使用技巧详解
内存条从外观上怎么看型号
cpu的指令系统(core处理器的七大指令系统)
文件存储选择最佳解决方案指南
x86服务器使用什么指令集
汇编语言的基本语法