/******************************************************************************功能:数码管显示矩阵按键键值******************************************************************************/#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitL1=P1^4;//定义列sbitL2=P1^5;sbitL3=P1^6;sbitL4=P1^7;uchardis[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极0—F对应的段码值voiddelay10ms(uintc)//延时10ms,误差0us{unsignedchara,b;for(;c0;c--)for(b=38;b0;b--)for(a=130;a0;a--);}voidmain(){uchartemp;chari;/***********若定义为unsigned型,i=0即00000000在执行循环时,******************i--后变为-1,无符号后i变成11111111即2^8-1=256***********/while(1)//死循环一直扫描{P1=0xf7;//行扫描初值,第四行P1.3,P1.0=0,P1.0~P1.0=1for(i=3;i=0;i--){if(L1==0)P0=dis[i*4+0];//判断第1列有无键按下,可能为0,4,8,C,送显示if(L2==0)P0=dis[i*4+1];//判断第2列有无键按下,可能为1,5,9,D,送显示if(L3==0)P0=dis[i*4+2];//判断第3列有无键按下,可能为2,6,A,E,送显示if(L4==0)P0=dis[i*4+3];//判断第4列有无键按下,可能为3,7,B,F,送显示delay10ms(1);/******单行扫描时间不能太长***********///temp=P1;//读入当前P1口的行状态11111110//temp=temp|0xf0;//或‘|’屏蔽行P1.0~P1.3,使保留原值;P1.4~P1.7初始化高电平//为P1.0~P1.3左移、扫描下一行做准备//temp=temp1;//P1.0~P1.3左移1位,准备下一行扫描//temp=temp|0xf0;//屏蔽P1.0~P1.3保原值,列P1.4~P1.7初始化高电平//P1=temp;//下一行的行扫描值送P1口,为下一行扫描做准备/***********************************************************************************以上从第一行(P1.0)扫描开始,初值11111110左移一位时,低位自动补0,难保证低位值为1;故以下从第四行(P1.3)扫描开始,初值11110111,通过右移保证高位值为1;另外,P1=_crol_(P1,1)这种方式,只有在高四位没有按键按下时,才能正确换行扫描。**********************************************************************************/temp=P1;temp=temp|0xf0;temp=temp1;temp=temp|0xf0;P1=temp;}}}