4X4矩阵式键盘输入程序
proteus中4乘4矩阵键盘代码
KeyValue=KeyValue+12;
break;
//default:KeyValue=17;
}
while((a<50)&&(GPIO_KEY!=0xf0))//检测按键松手检测
{
Delay10ms();
a++;
}
a=0;
}
}
// switch(KeyValue)
// {
// case(10):
// case(14):
// KeyValue=KeyValue;
// break;
// case(15):
// KeyValue=KeyValue;
// break;
// }
}
/*******************************************************************************
*函数名: Delay10ms
*函数功能:延时函数,延时10ms
*输入:无
*输出:无
*******************************************************************************/
void Delay10ms(void) //误差0us
{
unsigned char a,b,c;
for(c=1; c>0; c--)
for(b=38; b>0; b--)
for(a=130; a>0; a--);
}
#include <Key.h>
unsigned char KeyValue;//用来存放读取到的键值
4X4矩阵式键盘输入程序
4*4键盘程序readkeyboard:begin: acall key_onjnz delayajmp readkeyboarddelay:acall delay10msacall key_onjnz key_numajmp beginkey_num:acall key_panl a,#0FFhjz beginacall key_ccodepush akey_off:acall key_onjnz key_offpop aretkey_on: mov a,#00horl a,#0fhmov p1,amov a,p1orl a,#0f0hcpl aretkey_p: mov r7,#0efhl_loop:mov a,r7mov p1,amov a,p1orl a,#0f0hmov r6,acpl ajz nextajmp key_cnext: mov a,r7jnb acc.7,errorrl amov r7,aajmp l_looperror:mov a,#00hretkey_c:mov r2,#00hmov r3,#00hmov a,r6mov r5,#04hagain1:jnb acc.0,out1rr ainc r2djnz r5, again1out1: inc r2mov a,r7mov r5,#04hagain2:jnb acc.4,out2rr ainc r3djnz r5,again2out2: inc r3mov a, r2swap aadd a,r3retkey_ccode:push aswap aanl a,#0fhdec arl a ;行号乘4rl amov r7,apop aanl a,#0fhdec aadd a,r7retdelay10ms:anl tmod,#0f0horl tmod,#01hmov th0,#0d8hmov tl0,#0f0hsetb tr0wait:jbc tf0,overajmp waitclr tr0over:ret单片机键盘设计(二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。
51单片机4×4矩阵键盘且在数码管最后一位显示汇编语言
51下面是51单片机使用4×4矩阵键盘的汇编程序,并在数码管的最后一位显示一个字符:```ORG 0 ;程序从地址0开始MOV P1,#0FFH ;P1口设置为输入口MOV P0,#0FH ;P0口设置为输出口LOOP:MOV A,P1 ;读取P1口的值CJNE A,#0FFH,KEY_PRESSED ;判断是否有按键按下SJMP LOOP ;如果没有按键按下,继续循环KEY_PRESSED:MOV R0,A ;保存按键的值CLR P0.0 ;选定行0MOV A,P1ANL A,#0F0H ;按位与运算,保留列位的值CJNE A,#0F0H,COL0 ;判断是否有按键按下在第0列MOV A,#'0' ;如果在第0列按下按键,则A的值为0JMP DISP ;跳转到显示程序COL0:CLR P0.1 ;选定行1MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL1 ;判断是否有按键按下在第1列MOV A,#'1' ;如果在第1列按下按键,则A的值为1JMP DISP ;跳转到显示程序COL1:CLR P0.2 ;选定行2MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL2 ;判断是否有按键按下在第2列MOV A,#'2' ;如果在第2列按下按键,则A的值为2JMP DISP ;跳转到显示程序COL2:CLR P0.3 ;选定行3MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL3 ;判断是否有按键按下在第3列MOV A,#'3' ;如果在第3列按下按键,则A的值为3JMP DISP ;跳转到显示程序COL3:CLR P0.4 ;选定行4MOV A,P1ANL A,#0F0H4MOV A,#'4' ;如果在第4列按下按键,则A的值为4 JMP DISP ;跳转到显示程序COL4:CLR P0.5 ;选定行5MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL5 ;判断是否有按键按下在第5列 MOV A,#'5' ;如果在第5列按下按键,则A的值为5 JMP DISP ;跳转到显示程序COL5:CLR P0.6 ;选定行6MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL6 ;判断是否有按键按下在第6列 MOV A,#'6' ;如果在第6列按下按键,则A的值为6 JMP DISP ;跳转到显示程序COL6:CLR P0.7 ;选定行7MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL7 ;判断是否有按键按下在第7列 MOV A,#'7' ;如果在第7列按下按键,则A的值为7 JMP DISP ;跳转到显示程序COL7:MOV A,#00HJMP EXIT ;如果没有按下任何键,退出程序DISP: ;数码管显示程序MOV R1,#100B ;延时计数器初始化MOV P2,A ;把按键值存入P2口MOV A,#07HANL A,P0 ;从P0口读取选定的行值MOV P0,A ;根据选定的行值输出相应的值ACALL DELAY ;调用延时程序MOV P0,#0FH ;关闭所有行DJNZ R1,$ ;当延时计数器不为0时,继续延时MOV A,#0FHMOV P0,A ;清除所有显示JMP LOOP ;跳转回主程序EXIT:MOV P2.7,1 ;在数码管的最后一位显示字符1SJMP EXIT ;无限循环DELAY: ;延时程序MOV R2,#75DMOV R3,#200D DELAY3:DJNZ R3,$DJNZ R2,DELAY2 RET```。
4×4矩阵键盘数码管显现按键值程序
4×4矩阵键盘数码管显现按键值程序4;x;4矩阵键盘数码管显现按键值程序//电路阐明如下。
//单片机:运用51系列兼容的即可;//4;x;4矩阵键盘:接在P1口;//两位数码显现器:P0口输出七段码,P2口输出位选码。
//===================================================== =========//C言语程序如下。
/****************************************************** ********文件名:KEY_LED.c*功用:对4;x;4矩阵键盘进行输出,在数码管后两位显现按键值。
******************************************************* *******/#includelt;reg51.h#includelt;intrins.h#defineuintunsignedint#defineucharunsignedchar//ucharcodetable[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x 01,0x09};ucharcodetable[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x8 0,0x90};/****************************************************** *********称谓:Delay_1ms()*功用:延时子程序,延时时刻为1ms*x*输入:x(延时一毫秒的个数)*输出:无******************************************************* ********/voidDelay_1ms(uintx){uinti;ucharj;for(i=0;ilt;x;i++)for(j=0;jlt;=148;j++);}/*******************************************************称谓:Keyscan()*功用:P1外接4;x;4按键,依照扫描法读出键值*输出:按键值0~15/如无键按下,回来16******************************************************* ********/ucharKeyscan(void){uchari,j,temp,Buffer[4]={0xef,0xdf,0xbf,0x7f};for(j=0;jlt;4;j++){//循环四次P1=Buffer[j];//在P1高四位别离输出一个低电平temp=0x01;//方案先判别P1.0位for(i=0;ilt;4;i++){//循环四次if(!(P1temp))//从P1低四位,截取1位return(i+j*4);//回来获得的按键值templt;lt;=1;//判别的位,左移一位}}return16;//判别完毕,没有键按下,回来16}//哈哈,实质性的句子不过8行,即是这么简练!/*******************************************************称谓:Display(uchark)*功用:将参数分红十位、个位别离显现*输入:k(键盘数值)*输出:P0口输出七段码,P2口输出位选码******************************************************* ********/voidDisplay(uchark){P2=0;//消隐P0=table[k/10];P2=0x02;Delay_1ms(5);//显现5ms十位P2=0;//消隐P0=table[k%10];P2=0x01;Delay_1ms(5);//显现5ms个位}/****************************************************** *********称谓:Main()*功用:主函数******************************************************* ********/voidMain(void){ucharKey_Value=16,Key_Temp1,Key_Temp2;//两次读出的键值while(1){//---------以下读入按键、消抖、等候按键开释P1=0xff;Key_Temp1=Keyscan();//先读入按键if(Key_Temp1!=16){//假如有键按下//Delay_1ms(10);//延时一下Display(Key_Value);//可用显现替代延时Key_Temp2=Keyscan();//再读一次按键if(Key_Temp1==Key_Temp2){//有必要是两次持平Key_Value=Key_Temp1;//才保留下来,这即是消除颤动while(Keyscan()lt;16)//等候按键开释Display(Key_Value);//等候时期显现键值//---------以下是对按键的处理Display(Key_Value);//显现键值}}Display(Key_Value);//没有按键按下,也显现键值}}//用PROTEUS仿真作业时的屏幕截图如下:。
4乘4矩阵式键盘使用
4乘4矩阵式键盘在单片机中的应用--C语言下图为4*4键盘的结果图,用单片机的P1口接4×4矩阵键盘,接法如图所示,用数码管显示按键的值,按下键S1,数码管显示0,按下S2,数码管显示1,按下S16,显示F。
先看程序代码:#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//八段数码管对应0—F值。
void Delay_1ms(uint i)//1ms延时{uchar x, j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void delay()//消除按键抖动延时{int i,j;for(i=0; i<=10; i++)for(j=0; j<=2; j++);}uchar Keyscan(void){uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};for(j=0; j<4; j++){P1 = Buffer[j];delay();temp = 0x10;for(i=0; i<4; i++){if(!(P1 & temp)){return (i+j*4);}temp <<= 1;}}}void Main(void){uchar Key_V alue; //读出的键值while(1){P1 = 0xf0;if(P1 != 0xf0){Delay_1ms(15); //按键消抖if(P1 != 0xf0){Key_Value = Keyscan();}}P0 = table[Key_V alue];//P0口输出数据到数码管}}代码分析:程序从Main开始执行,Key_V alue用来存放Keyscan();的返回值,Key_V alue为1,则数码管会显示1。
单片机键盘程序(4×4矩阵式)
单片机键盘程序(4×4矩阵式)
1.实验任务
如图4.14.2 所示,用AT89S51 的并行口P1 接4 乘以4 矩阵键盘,以
P1.0-P1.3 作输入线,以P1.4-P1.7 作输出线;在数码管上显示每个按键的
0-F 序号。
对应的按键的序号排列如图4.14.1 所示
图4.14.1
2.硬件电路设计原理图
图4.14.2
3.系统板上硬件连线设计
(1.把单片机系统区域中的P3.0-P3.7 端口用8 芯排线连接到4X4 行列式键盘区域中的C1-C4R1-R4 端口上;
(2.把单片机系统区域中的P0.0/AD0-P0.7/AD7 端口用8 芯排线连接到四路静态数码显示模块区域中的任一个a-h 端口上;要求:P0.0/AD0 对应着a,P0.1/AD1 对应着b,,P0.7/AD7 对应着h。
4.程序设计内容
(1.4 乘以4 矩阵键盘识别处理
(2.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU 通信。
每个按键的状
态同样需变成数字量0 和1,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字0 实现的。
键盘处理程序的任务是:确定有无键按下,判断。
4x4矩阵键盘(仅供参考)
{
if(rPDATG&(1<<4)==0) keyvalue=2;
else if(rPDATG&(1<<5)==0) keyvalue=6;
else if(rPDATG&(1<<5)==0) keyvalue=7;
else if(rPDATG&(1<<6)==0) keyvalue=11;
else if(rPDATG&(1<<6)==0) keyvalue=15;
}
else if(rPDATF&(1<<8)==0);
longdelay(3);
if(rPDATF&(1<<8)==0);
{ if(rPDATG&(1<<4)==0) keyvalue=4;
rPUPG=rpupG&0x0f; //使能GPG4~GPG7内部上拉电阻
while(1)
{ (rPDATG&0x00)|(0x0e<<4);delay(1);
(rPDATG&0x00)|(0x0d<<4);delay(1);
if(rPDATF&(1<<5)==0); //如果GPF5为低
longdelay(3); //延时
if(rPDATF&(1<<5)==0); //如果GPF5为低
{if(rPDATG&(1<<4)==0) keyvalue=1; //判断GPG4,若为低,则按键为1号键
单片机-4x4个矩阵按键控制数码管显示数字程序
单⽚机-4x4个矩阵按键控制数码管显⽰数字程序1 #include "8051.h"2 typedef unsigned char u8;3 typedef unsigned int u16;4 u8 smgduan[]= {5/*0 1 2 3 4 5 6 7 */60x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,7/*8 9 A B C D E F */80x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};910// P0⼝为数码管的位选的8位输⼊引脚11// P0 = 0x00;121314void Delayms(u16 ms);15void shumaguan(u8 n);16void DigDisplay();17void KeyTest();18void smg(u8 n, u8 m);19void key_4x4();2021void main()22 {23while(1)24 {25 key_4x4();26 }27 }2829// 不精确的延时函数30void Delayms(u16 ms)31 {32 unsigned int i, j;33for(i = ms; i > 0; i--)34for(j = 110; j > 0; j--);35return;36 }3738// 数码管根据74HC138译码器选择对应的段(选择哪个数码管显⽰)39void shumaguan(u8 n)40 {41switch(n)42 {43case0:44 LSA = 0;LSB = 0;LSC = 0;break;45case1:46 LSA = 1;LSB = 0;LSC = 0;break;47case2:48 LSA = 0;LSB = 1;LSC = 0;break;49case3:50 LSA = 1;LSB = 1;LSC = 0;break;51case4:52 LSA = 0;LSB = 0;LSC = 1;break;53case5:54 LSA = 1;LSB = 0;LSC = 1;break;55case6:56 LSA = 0;LSB = 1;LSC = 1;break;57case7:58 LSA = 1;LSB = 1;LSC = 1;break;59 }60 }6162// 数码管显⽰数字,并以⼗进制递增63void DigDisplay()64 {65 u8 i1 = 0;66 u8 i2 = 0;67 u8 i3 = 0;68 u8 i4 = 0;69 u8 i5 = 0;70 u8 i6 = 0;71 u8 i7 = 0;72 u8 i8 = 0;7374757677for (i8 = 0; i8 < 10; i8++)78for (i7 = 0; i7 < 10; i7++)79for (i6 = 0; i6 < 10; i7++)80for (i5 = 0; i5 < 10; i5++)81for (i4 = 0; i4 < 10; i4++)82for (i3 = 0; i3 < 10; i3++)83for (i2 = 0; i2 < 10; i2++)84for (i1 = 0; i1 < 10; i1++)85 {86 u16 cnt = 10;87while (cnt--)88 {89 shumaguan(0); //选中第⼀个数码管90 P0 = smgduan[i1]; //给他送⼀个数字91 Delayms(1); //稍微延时⼀下下92 shumaguan(1); //然后切换到第⼆个数码管。
51单片机4×4矩阵按键程序汇编
51单片机4×4矩阵按键程序(汇编)ORG 0000HLJMP MAIN ;跳转至主程序ORG 0100HMAIN: LCALL KEY_INMOV P0,ALCALL DELAJMP MAIN;======================;判断有无按键,无按键直接返回;KEY_IN: MOV P1,#0F0H ;置行线为低电平,读列线状态(在高4位,无按键则全为1); MOV A,P1; ANL A,#0F0H ;屏蔽低四位; MOV B,A; MOV P1,#0FH ;置列线为低电平,读行线状态(在低4位,无按键则全为1); MOV A,P1; ANL A,#0FH; ORL A,B ;高四位与低四位重新组合; CJNE A,#0FFH,KEYSCAN ;0FFH为末按键; RET;==========================================;//=============键盘扫描程序============================================== ;KEYSCAN:KEY_IN: MOV R1,#0 ;初始化列地址MOV R3,#11110111B ;初始化扫描码LOOP:MOV A,R3RL AMOV R3,A ;保留扫描码MOV P1,A ;送扫描码MOV A,P1 ;读键盘ORL A,#0F0H ;屏蔽高四位CJNE A,#0FFH,NEXT31 ;A不等于FFH,说明该列有按键动作INC R1 ;列地址加1,准备扫描下一列CJNE R1,#4,LOOP ;列地址不等于4,扫描下一列SJMP EXIT ;没有按键,退出;//=============按键判断对应位等于零,说明该行有按键按下==================NEXT31:JB ACC.0,NEXT32MOV R2,#0 ;第0行有按键SJMP NEXT5NEXT32:JB ACC.1,NEXT33MOV R2,#1 ;第1行有按键SJMP NEXT5NEXT33:JB ACC.2,NEXT34MOV R2,#2 ;第2行有按键SJMP NEXT5NEXT34:MOV R2,#3 ;第3行有按键NEXT5: ;计算按键地址MOV A,R1RL ARL A ;列地址乘4(每列对应4行) ADD A,R2 ;加行地址MOV DPTR,#KEYTABMOVC A,@A+DPTREXIT:; MOV P1,#0FFH ;置键盘接口高电平RET;延时子程序,1s延时DEL: MOV R7,#10DEL1: MOV R6,#200DEL2: MOV R5,#248HERE: DJNZ R5,HEREDJNZ R6,DEL2DJNZ R7,DEL1RET;//=============按键名称表================================================ KEYTAB:DB 3fH ;扫描码0*****************************************DB 06H ;扫描码1 **DB 5bH ;扫描码2 I/O口 P1.0 P1.1 P1.2 P1.3 ** DB 4fH ;扫描码3 **DB 66H ;扫描码4 P1.4 0 1 2 3 **DB 6dH ;扫描码5 **DB 7dH ;扫描码6 P1.5 4 5 6 7 **DB 07H ;扫描码7 **DB 7fH ;扫描码8 P1.6 8 9 A B **DB 6fH ;扫描码9 **DB 77H ;扫描码A P1.7 C D E F **DB 7cH ;扫描码B **DB 39H ;扫描码C***************************************** DB 5eH ;扫描码DDB 79H ;扫描码EDB 71H ;扫描码FDB 00HDB 00HEND。
51单片机4×4矩阵式键盘识别汇编程序
;******************************************************;*标题: 51单片机4×4矩阵式键盘识别汇编程序;*******************************************************; 0 1 2 3 ---P20; 4 5 6 7 ---P21; 8 9 10 11 ---P22; 12 13 14 15 ---P23; | | | |; P24 P25 P26 P27;******************************************************************ORG 0000hAJMP MAINORG 0030hMAIN:MOV DPTR,#TAB ;将表头放入DPTRLCALL KEY;调用键盘扫描程序MOVC A,@A+DPTR ;查表后将键值送入ACCMOV P0,A;将Acc值送入P0口CLR P1.3 ;开显示LJMP MAIN ;返回调用子程序反复循环显示;----------------------------------------------------------------------KEY:LCALL KS ;调用检测按键子程序JNZ K1 ;有键按下继续LCALL DELAY2 ;无键按下调用延时去抖动程序AJMP KEY;返回继续检测有无按键按下K1:LCALL DELAY2LCALL DELAY2 ;有键按下继续延时去抖动LCALL KS ;再一次调用检测按键程序JNZ K2 ;确认有按下进行下一步AJMP KEY;无键按下返回继续检测K2:MOV R2,#0EFH ;将扫描值送入R2暂存MOV R4,#00H ;将第一列的列值00H送入R4暂存,R4用于存放列值。
K3:MOV P2,R2 ;将R2的值送入P1口L6:JB P2.0,L1 ;P1.0等于1跳转到L1MOV A,#00H ;将第一行的行值00H送入ACCAJMP LK ;跳转到键值处理程序JB P2.1,L2 ;P1.1等于1跳转到L2MOV A,#04H ;将第二行的行值送入ACCAJMP LK ;跳转到键值理程序进行键值处理L2:JB P2.2,L3 ;P1.2等于1跳转到L3MOV A,#08H ;将第三行的行值送入ACCAJMP LK ;跳转到键值处理程序L3:JB P2.3,NEXT ;P1.3等于1跳转到NEXT处MOV A,#0cH ;将第四行的行值送入ACCLK:ADD A,R4 ;行值与列值相加后的键值送入APUSH ACC ;将A中的值送入堆栈暂存K4:LCALL DELAY2 ;调用延时去抖动程序LCALL KS ;调用按键检测程序JNZ K4 ;按键没有松开继续返回检测POP ACC ;将堆栈的值送入ACCRETNEXT:INC R4 ;将列值加一MOV A,R2 ;将R2的值送入AJNB ACC.7,KEY;扫描完成跳至KEY处进行下一回合的扫描RL A;扫描未完成将A中的值右移一位进行下一列的扫描MOV R2,A;将ACC的值送入R2暂存AJMP K3 ;跳转到K3继续KS:MOV P2,#0FH ;将P1口高四位置0低四位值1MOV A,P2 ;读P1口XRL A,#0FH ;将A中的值与A中的值相异或RET ;子程序返回DELAY2: ;40ms延时去抖动子程序8*FA*2=40ms MOV R5,#08HL7:MOV R6,#0FAHL8:DJNZ R6,L8DJNZ R5,L7RETDB 0C0H;0DB 0F9H;1DB 0A4H;2DB 0B0H;3DB 099H;4DB 092H;5DB 082H;6DB 0F8H;7DB 080H;8DB 090H;9DB 088H;ADB 083H;bDB 0C6H;CDB 0A1H;dDB 086H;EDB 08EH;F END。
单片机驱动4X4矩阵式键盘输入程序
单片机驱动4X4矩阵式键盘输入程序用AT89S51单片机的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。
实现键盘输入的识别。
我将给大家提供c和汇编两个版本的4X4矩阵式键盘输入程序。
如果网页上不清楚点此处下载本键盘输入程序源代码汇编语言源程序:KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#2WAIT:MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1MOV KEYBUF,#0LJMP DK1NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1NK4: NOPDK1:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK1A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK1ANOKEY1:MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MS MOV A,P3ANL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2NK8: NOPDK2:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK2A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK2ANOKEY2:MOV P3,#0FFHCLR P3.6ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9MOV KEYBUF,#8LJMP DK3NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9LJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10LJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11LJMP DK3NK12: NOPDK3:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTRMOV P0,ADK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ANOKEY3:MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13MOV KEYBUF,#12LJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13LJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14LJMP DK4NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15LJMP DK4NK16: NOPDK4:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ADK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ANOKEY4:LJMP WAITDELY10MS:MOV R6,#10D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71HENDC语言源程序:#includeunsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char temp;unsigned char key;unsigned char i,j;//我的程序没有注释,不过很简单。
4X4矩阵键盘的测试程序
#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define LCDDATA P0 //数码管数据端口定义#define LCDCS P2 //数码管位选端口定义#define KEYDATA P1 //矩阵键盘接口定义uchar key; //定义键值为全局变量uchar dis_buf; //显示缓存uchar disp_num[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//显示数据列表0---9//功能:延时1毫秒//入口参数:x//出口参数:无void Delay_xms(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<112;j++);}//关闭数码管显示,当Q0~Q3均为高电平时,三极管均截止,无电流流过数码管,显示被关闭void tube_off(void){LCDCS|=0xf0;}//数码管数据显示//入口参数:x为需要显示的数据,addr为数码管地址即第几位数码管void tube_disp(uchar addr,uchar x){LCDDATA=disp_num[x];//将显示数据送P0口switch(addr){case 1: //选通第1位数码管LCDCS&=0xef;break;case 2: //选通第2位数码管LCDCS&=0xdf;break;case 3: //选通第3位数码管LCDCS&=0xbf;break;case 4: //选通第4位数码管LCDCS&=0x7f;break;}Delay_xms(2);tube_off();}//键扫描子程序void keyscan(void){uchar temp=0,key=0;KEYDATA=0xF0; //高四位输入行为高电平列为低电平Delay_xms(1);temp=KEYDA TA; //读P1口temp=temp&0xF0; //屏蔽低四位temp=~((temp>>4)|0xF0);if(temp==1) // P1.4 被拉低key=0;else if(temp==2) // P1.5 被拉低key=1;else if(temp==4) // P1.6 被拉低key=2;else if(temp==8) // P1.7 被拉低key=3;elsekey=16;KEYDATA=0x0F; //低四位输入列为高电平行为低电平Delay_xms(1);temp=KEYDA TA; //读P1口temp=temp&0x0F;temp=~(temp|0xF0);if(temp==1)key=key+12;else if(temp==2) // P1.1 被拉低key=key+8;else if(temp==4) // P1.2 被拉低key=key+4;else if(temp==8) // P1.3 被拉低key=key+0;elsekey=16;if(key<16){dis_buf = key; //键值入显示缓存}}//判断键是否按下uchar keydown(void){uchar key_flag;KEYDATA=0xf0;if(KEYDATA!=0xf0){key_flag=1;}else{key_flag=0;}return key_flag;}//定时器中断函数void Timer2() interrupt 5 //定时器2是5号中断{uchar shiwei,gewei;TF2=0;shiwei=dis_buf%100/10;tube_disp(3,shiwei);//第3位数码管显示"十位"gewei=dis_buf%10;tube_disp(4,gewei); //第4位数码管显示"个位"}//定时器2初始化void Init_timer2(void){RCAP2H=0xb1;//赋T2初始值0xb1e0,溢出50次为1秒,则每次溢出时间为1/50=0.02s RCAP2L=0xe0;TR2=1; //启动定时器2ET2=1; //打开定时器2中断EA=1; //打开总中断}//主函数void main(void){Delay_xms(50);//等待系统稳定Init_timer2();//定时器2初始化P2=0xFF; //置P2口tube_off(); //关闭数码管显示while(1){if(keydown()){Delay_xms(20);if(keydown()){keyscan();}}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4*4键盘程序readkeyboard:begin: acall key_onjnz delayajmp readkeyboard delay:acall delay10msacall key_onjnz key_numajmp beginkey_num:acall key_panl a,#0FFhjz beginacall key_ccodepush akey_off:acall key_onjnz key_offpop aretkey_on: mov a,#00horl a,#0fhmov p1,amov a,p1orl a,#0f0hcpl aretkey_p: mov r7,#0efhl_loop:mov a,r7mov p1,amov a,p1orl a,#0f0hmov r6,acpl ajz nextajmp key_cnext: mov a,r7jnb acc.7,errorrl amov r7,aajmp l_looperror:mov a,#00hretkey_c:mov r2,#00hmov r3,#00hmov a,r6mov r5,#04hagain1:jnb acc.0,out1rr ainc r2djnz r5, again1out1: inc r2mov a,r7mov r5,#04hagain2:jnb acc.4,out2rr ainc r3djnz r5,again2out2: inc r3mov a, r2swap aadd a,r3retkey_ccode:push aswap aanl a,#0fhdec arl a ;行号乘4rl amov r7,apop aanl a,#0fhdec aadd a,r7retdelay10ms:anl tmod,#0f0horl tmod,#01hmov th0,#0d8hmov tl0,#0f0hsetb tr0wait:jbc tf0,overajmp waitclr tr0over:ret单片机键盘设计(二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。
通常采用软件延时的方法:在第一次检测到有键按下时,执行一段延时10ms的子程序后,再确认电平是否仍保持闭合状态电平,如果保持闭合状态电平,则确认真正有键按下,进行相应处理工作,消除了抖动的影响。
(这种消除抖动影响的软件措施是切实可行的。
)2.采取串键保护措施。
串键:是指同时有一个以上的键按下,串键会引起CPU错误响应。
通常采取的策略:单键按下有效,多键同时按下无效。
3.处理连击。
连击:是一次按键产生多次击键的效果。
要有对按键释放的处理,为了消除连击,使得一次按键只产生一次键功能的执行(不管一次按键持续的时间多长,仅采样一个数据)。
否则的话,键功能程序的执行次数将是不可预知,由按键时间决定。
连击是可以利用的。
连击对于用计数法设计的多功能键特别有效。
三、键盘工作方式单片及应用系统中,键盘扫描只是CPU的工作内容之一。
CPU忙于各项任务时,如何兼顾键盘的输入,取决于键盘的工作方式。
考虑仪表系统中CPU任务的份量,来确定键盘的工作方式。
键盘的工作方式选取的原则是:既要保证能及时响应按键的操作,又不过多的占用CPU的工作时间。
键盘的工作方式有:查询方式(编程扫描,定时扫描方式)、中断扫描方式。
四、键盘电路结构(一)独立式按键接口设计优点:电路配置灵活,软件结构简单。
此键盘是用于按键较少或操作速度较高的场合。
也可以用扩展I/O口搭接独立式按键接口电路,可采用8255扩展I/O口,用三态缓冲器扩展。
这两种配接方式,都是把按键当作外部RAM某一工作单元的位来对待,通过读片外RAM 的方法,识别按键的工作状态。
上电路中独立式按键电路,各按键开关均采用了上拉电阻,是为了保证在按键断开时,各I/O有确定的高电平。
如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。
(二)矩阵式键盘接口设计矩阵式键盘适用于按键数量较多的场合,由行线和列线组成,按键位于行列的交叉点上。
节省I/O口。
矩阵键盘工作原理:行线通过上拉电阻接到+5V上。
无按键,行线处于高电平状态,有键按下,行线电平状态将由与此行线相连的列线电平决定。
列线电平为低,则行线电平为低;列线电平为高,则行线电平为高。
五、双功能及多功能键设计在单片机应用系统中,为简化硬件线路,缩小整个系统的规模,总希望设置最少的按键,获得最多的控制功能。
矩阵键盘与独立式按键键盘相比,硬件电路大大节省。
可通过软件的方法让一键具有多功能。
方法:选择一个RAM工作单元,对某一个按键进行按键计数,根据不同计数值,转到子程序。
这种计数多功能键最好与显示器结合用,以便知道当前计数值,同时配合一个启动键。
复合键是使用软件实现一键多功能的另一个途径。
所谓复合键,就是两个或两个以上的键的联合,当这些键同时按下时,才能执行相应的功能程序。
实际情况做不到“同时按下”,他们的时间差别可以长到50ms,解决策略是:定义一个或两个引导键,这些引导键按下时没什么意义,执行空操作。
引导键的例子:微机键盘上的CTRL、SHIFT、ALT。
缺点:一是操作变得复杂,二是操作时间变长。
多功能键的利用,应具体情况具体分析。
要求速度的场合最好做一键一功能。
如果系统功能很多,一键一功能不现实,可采取一键多功能。
六、功能开关及拨码盘接口设计设计原因:键盘输入灵活性大,操纵方便。
但某些重要功能或数据由键盘输入,误操作将产生一些不良后果。
因此常设定静态开关的方法来执行这些功能或输入数据。
静态开关一经设定,将不再改变,一直维持设定的开关状态。
通常这些开关状态是在单片机系统加电时由CPU读入内存RAM的,以后CPU将不再关注这些开关的状态,因此,即使加电后,这些开关的状态发生变化,也不会影响CPU的正常工作,只有在下一次加电时,这些新状态才能生效。
第一,功能开关:主要是根据开关的状态执行一些重要的功能。
第二,拨码盘:单片机应用系统中,有时要输入一些控制参数,这些参数一经设定,将维持不变,除非给系统断电后重新设定。
这时使用数字拨码盘既简单直观,又方便可靠。
七、按键介绍常用的按键有三种:机械触点式按键、导电橡胶式和柔性按键(又称触摸式键盘)。
机械触点式按键是利用弹性使键复位,手感明显,连线清晰,工艺简单,适合单件制造。
但是触点处易侵入灰尘而导致接触不良,体积相对较大。
导电橡胶按键是利用橡胶的弹性来复位,通过压制的方法把面板上所有的按键制成一块,体积小,装配方便,适合批量生产。
但是时间长了,橡胶老化而使弹力下降,同时易侵入灰尘。
柔性按键是近年来迅速发展的一种新型按键,可以分为凸球型和平面型两种。
凸球型动作幅度触感明显,富有立体感,但制造工艺相对复杂;平面型幅度微小,触感较弱,但工艺简单,寿命长。
柔性按键最大特点是防尘、防潮、耐蚀,外形美观,装嵌方便。
而且外形和面板的布局、色彩、键距可按照整机的要求来设计。
八、单片机系统键盘设计实例键盘工作方式采用定时扫描方式。
采用定时器T0定时,CPU每隔200ms扫描键盘一次,即通过读取573的输出数据,识别按键的工作状态。
对于重键(串键:指同时有一个以上的键按下),采用软件提供保护,当判断为一个以上的键按下,则不处理,返回重新进行监测。
只有监测到一个键按下时,才判断键值,执行相应键处理工作。
键盘对液晶显示的控制是通过显示画面的页码作为接口参数来完成的。
在每一页中,键盘对数据的修改是通过对按键次数的计算作为接口参数来实现的。
具体例程如下:void keyscan() /*键盘扫描*/{ucher data newz ,temp,pat;if(time_out){ACC=MJP; /*读取573数据*/temp=ACC&0x0f, /*取低四位*/if(temp!=0x0f) /*有键按下*/{msec(10); / *延时10MS*/ACC=MJP; /*读取573数据*/temp=ACC&0x0fif(temp=0x0f){newz=temp; /*读取新键值*/pat=newz^old; /*键值有无变化*/if(pat)>0) /*有变化*/{old=newz; /*原键值等于新键值*/keymana(); /*调键散转程序*/}else;}else;}elsr;old=temp; /*原键值不变*/time_out=0 /*标志位置零*/}esel;}4*4键盘程序; 0 1 2 3 --P30 ; 4 5 6 7 --P31 ; 8 9 A B --P32 ; C D E F --P33 ; P34 P35 P36 P37 ORG 0000hLJMP MAINORG 0030hMAIN:MOV DPTR,#TABLCALL KEYMOVC A,@A+DPTR MOV P0,A CLR P1.3LJMP MAINKEY: LCALL KSJNZ K1LCALL DELAY2 AJMP KEY K1: LCALL DELAY2LCALL KSJNZ K2AJMP KEYK2: MOV R2,#0EFHMOV R4,#00HK3: MOV P3,R2L6: JB P3.0,L1MOV A,#00HAJMP LKL1: JB P3.1,L2MOV A,#04HAJMP LKL2: JB P3.2,L3MOV A,#08HAJMP LKL3: JB P3.3,NEXTMOV A,#0cHLK: ADD A,R4PUSH ACCK4: LCALL DELAY2LCALL KSJNZ K4POP ACCRETNEXT:INC R4MOV A,R2JNB ACC.7,KEYRL AMOV R2,AAJMP K3KS: MOV P3,#0FHMOV A,P3XRL A,#0FHRETDELAY2: MOV R5,#08HL7: MOV R6,#0FAHL8: DJNZ R6,L8DJNZ R5,L7RETTAB:DB 0C0H;0DB 0F9H;1DB 0A4H;2DB 0B0H;3DB 099H;4DB 092H;5DB 082H;6DB 0F8H;7DB 080H;8DB 090H;9DB 088H;ADB 083H;bDB 0C6H;CDB 0A1H;dDB 086H;EDB 08EH;FEND4X4矩阵键盘扫描汇编程序PROC KEYCHKKEYNAME DATA40H;(b7-b5纪录按键状态,b4位为有效位, ;b3-b0纪录按键)KEYRTIME DATA 43H SIGNAL DATA 50H KEY EQU P3KEYPL EQU P0.6RTIME EQU 30KEYCHK: MOV KEY,#0FHMOV A,KEYCJNE A,#0FH,NE XT1; CLR CNEXT1:; SETB CMOV A,KEYNAM EANL KEYNAME, #1FHRRC AANL A,#0E0HORL KEYNAME, ACJNE A,#0C0H,N EXT2SJMP KEYSCAN NEXT2: CJNE A,#0E0H,NEXT3SJMP WAIT NEXT3:CJNE A,#0A0H,EXITORL KEYNAME,#0E0HWAIT: MOV A,KEYRTIMEJNZ EXITKEYSCAN:MOV R1,#0MOV R3,#11110111BLOOP: MOV A,R3RL AMOV R3,AMOV KEY,AMOV A,KEYORL A,#0F0HCJNE A,#0FFH,NEXT31INC R1CJNE R1,#4,LOOPSJMP EXITNEXT31: JB ACC.0,NEXT32MOV R2,#0SJMP NEXT5NEXT32:JB ACC.1,NEXT33MOV R2,#1SJMP NEXT5NEXT33:JB ACC.2,NEXT34MOV R2,#2SJMP NEXT5NEXT34:MOV R2,#3NEXT5: MOV A,R1RL ARL AADD A,R2MOV DPTR,#KEYTABMOVC A,@A+DPTRANL KEYNAME,#0E0HORL KEYNAME,AMOV KEYRTIME,#RTIMECLR KEYPLMOV SIGNAL,#10EXIT: MOV KEY,#0FFHRETKEYTAB: ;//=按键名称表=DB 1AH ;扫描码0,对应ADB 1BH ;扫描码1,对应BDB 1CH ;扫描码2,对应CDB 1DH ;扫描码3,对应DDB 11H ;扫描码4,对应1DB 14H ;扫描码5,对应4DB 17H ;扫描码6,对应7DB 1EH ;扫描码7,对应EDB 12H ;扫描码8,对应2DB 15H ;扫描码9,对应5DB 18H ;扫描码A,对应8DB 10H ;扫描码B,对应0DB 13H ;扫描码C,对应3DB 16H ;扫描码D,对应6DB 19H ;扫描码E,对应9DB 1FH ;扫描码F,对应FEND4×4矩阵式键盘org 0000h ljmp start org 0030hstart:mov dptr,#tablemov r3,#4mov p2,#00hlcall keyscanresponse:movca,@a+dptrmov p0,asetb p2.1keyscan:lcall keypress; jnz k1jmp keyscank1: lcall delaylcall keypressjnz k2jmp keyscank2: mov r0,#00hmov r1,#00hmov p1,#0efhmov a,p1anl a,#0fh;mov r2,axrl a,#0fhjnz k3mov p1,#0dfhmov r0,#01hmov a,p1anl a,#0fhmov r2,axrl a,#0fhjnz k3 mov p1,#0bfh;mov r0,#02hmov a,p1anl a,#0fh;mov r2,axrl a,#0fhjnz k3mov p1,#07fh;mov r0,#03h;mov a,p1anl a,#0fh;mov r2,axrl a,#0fhjnz k3jmp keyscank3: mov a,r2rrc a ;jnc k4 ;rrc ajnc k5 ;rrc ajnc k6 ;jnb p1.3,$mov r1,#03hmov a,r0mov b,r3mul abadd a,r1jmp responsek4: jnb p1.0,$ ;mov r1,#00hmov a,r0mov b,#4mul abadd a,r1jmp responsek5: jnb p1.1,$mov r1,#01hmov a,r0mov b,#4mul abadd a,r1jmp responsek6: jnb p1.2,$mov r1,#02hmov a,r0mov b,#4mul abadd a,r1jmp responsekeypress:mov p1,#0fhmov a,p1xrl a,#0fhretdelay: mov r7,#50d1: mov r6,#248djnz r6,$djnz r7,d1rettable: db3fh,06h,5bh,4fh;0 1 2 366h,6dh,7dh,07h;4 5 6 77fh,6fh,77h,7ch;8 9 a b39h,5eh,79h,71h;c d e fend ********* 4×4矩阵式键盘KEYNAME DATA 40HORG 0000HLJMP MAINORG 0030HMAIN:MOV SP, #80HCLR F0LOOP:LCALL KEYCHKLCALL KEYSCANSJMP LOOPKEYCHK:MOV P1, #0F0HMOV A, P1CJNE A, #0F0H, $+3LCALL DELAY_10MSMOV A, P1CJNE A, #0F0H, NEXT11CLR F0SJMP EXIT1NEXT11:SETB F0EXIT1:RETKEYSCAN:JNB F0, EXIT2MOV R7, #4MOV R5, #0MOV R6, #01111111BLOOP1:MOV A, R6RL AMOV R6, AMOV P1, AMOV A, P1ANL A, #0F0HXRL A, #0F0HJNZ NEXT21INC R5DJNZ R7, LOOP1SJMP EXIT2NEXT21:JNB Acc.4, NEXT22MOV R4, #0SJMP NEXT25NEXT22:JNB Acc.5, NEXT23MOV R4, #1SJMP NEXT25NEXT23:JNB Acc.6, NEXT24MOV R4, #2SJMP NEXT25NEXT24:MOV R4, #3NEXT25:MOV A, R5RL ARL AADD A, R4MOV DPTR, #KEYTABMOVC A, @A+DPTRMOV KEYNAME, AEXIT2:RETDELAY_10MS:SETB RS1SETB RS0MOV R2,#20DELAY0:MOV R3,#250DJNZ R3,$DJNZ R2,DELAY0RETKEYTAB:DB 0,1,2,3,4,5,6,7,8,9,10,11, 12,13,14,15 END4X4键盘输入数码管移位显示1#include <REG51.H>#include<intrins.h>#include<bin.h>uchar num,num1,temp;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,0x00};uchar keyscan();void delay(uchar z){ //10MS延时uint x;for(z;z!=0;z--)for(x=1250;x!=0;x--);}void main(){wela=1;dula=0;P0=0xc0;num=17;P0=0;wela=0; //所有数码管不亮dula=1;while(1){num1=keyscan();P0=table[num1-1];}}uchar keyscan(){P3=0xf0;temp=P3;while(temp!=0xf0){delay(1);temp=P3;while(temp!=0xf0){P3=0xfe; temp=P3&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=1,temp=0xf0; break; case 0xde:num=2,temp=0xf0; break; case 0xbe:num=3,temp=0xf0; break; case 0x7e:num=4,temp=0xf0; break;// default:temp=0xf0;}}P3=0xfd;temp=P3&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5,temp=0xf0;break;case 0xdd:num=6,temp=0xf0;break;case 0xbd:num=7,temp=0xf0;break;case 0x7d:num=8,temp=0xf0;break;// default:temp=0xf0;}}P3=0xfb;temp=P3&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9,temp=0xf0;break; case 0xdb:num=10,temp=0xf0;break; case 0xbb:num=11,temp=0xf0;break; case 0x7b:num=12,temp=0xf0;break;// default:temp=0xf0;}}P3=0xf7;temp=P3;temp&=0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13,temp=0xf0;break; case 0xd7:num=14,temp=0xf0;break;case 0xb7:num=15,temp=0xf0;break;case 0x77:num=16,temp=0xf0;break;// default:temp=0xf0;}}}}return (num);}4X4键盘输入数码管移位显示2#include <REG51.H>#include<intrins.h>#include<bin.h>uchar num,num1,num2,temp;uchar a,b,c,d,e,f;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,0x00};uchar code table1[]={0xdf,0xef,0xf7,0xfb, 0xfd,0xfe} ;uchar keyscan();void display();void delay(uchar z){uint x;for(z;z!=0;z--)for(x=625;x!=0;x--);}void inti(){num1=0;a=b=c=d=e=f=16;wela=0;dula=0;}void main(){inti();while(1){keyscan();switch(num1){case 1:a=num-1;break;case 2:b=num-1;break;case 3:c=num-1;break;case 4:d=num-1;break;case 5:e=num-1;break;case 6:f=num-1;break;// default:;}display();}}uchar keyscan(){P3=0xf0;temp=P3;while(temp!=0xf0){delay(1);temp=P3;while(temp!=0xf0){P3=0xfe;temp=P3&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=1,temp=0xf0; break;case 0xde:num=2,temp=0xf0; break;case 0xbe:num=3,temp=0xf0; break;case 0x7e:num=4,temp=0xf0; break;// default:temp=0xf0;}}P3=0xfd; //temp=P3&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5,temp=0xf0;break; case 0xdd:num=6,temp=0xf0;break; case 0xbd:num=7,temp=0xf0;break; case 0x7d:num=8,temp=0xf0;break; // default:temp=0xf0;}}P3=0xfb;temp=P3&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9,temp=0xf0;break; case 0xdb:num=10,temp=0xf0;break; case 0xbb:num=11,temp=0xf0;break; case 0x7b:num=12,temp=0xf0;break; // default:temp=0xf0;}}P3=0xf7;temp=P3;temp&=0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13,temp=0xf0;break; case 0xd7:num=14,temp=0xf0;break; case 0xb7:num=15,temp=0xf0;break; case 0x77:num=16,temp=0xf0;break; // default:temp=0xf0;}}P3=0xf0;while(P3!=0xf0);delay(1);while(P3!=0xf0);}if(num1==6){num1=0;}num1++;}return (num);}void display(){ //最右第1个数码管,下同。