数码管显示矩阵键盘和独立键盘

#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned char uint;

sbit WE = P2^7;
sbit DU = P2^6;

uchar code ledata[]={ 
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //ϨÃð
                0x00  //×Ô¶¨Òå
 
                         };
void delay_ms(uint n)
{
   uint x,y;
	for(x = n;x > 0;x--)
		for(y = 114;y > 0;y--);
}
//º¯ÊýÃû£ºÉ¨Ã躯Ê
//º¯Êý¹¦ÄÜ£ºÅжÏ20¸ö°´¼üÄǸö±»°´ÏÂÁË
uchar Keyscan()
{
	uchar dat_l,dat_h;//l ÐÐ h ÁÐ
	P3 = 0xf0;// 1111 0000 ¸ßλÊÇÁÐ µÍλÊÇÐÐ
	if((P3 & 0xf0)!= 0xf0)
	{
		delay_ms(10);
		if((P3 & 0xf0) != 0xf0)
		{
		   dat_l = P3 & 0xf0;//´¢´æÁеÄÖµ ¸ßËÄλ µÍËÄλʼÖÕΪÁã
			 P3 = P3 | 0x0f;//µÍËÄλȫΪһ ÅжÏÄÄÒ»ÐÐ
			 dat_h = P3 & 0x0f;// ¸ßËÄλΪ0 µÍËÄλΪÐÐÖµ ´¢´æÐÐÖµ
			while((P3 & 0x0f) != 0x0f)//Åжϰ´¼üÊÇ·ñËÉ¿ª ²»³ÉÁ¢Ìø³öÑ­»·
				return(dat_l+dat_h);//·µ»Ø¼üÂëÖµ
			}
	}
}
//º¯ÊýÃû³Æ£»Êä³öº¯Êý
//º¯Êý¹¦ÄÜ£»Êä³öÿ¸ö¼üËù´ú±íµÄÊý×Ö
void  keypro()
{
	    
      switch(Keyscan())
			{
				//µÚÒ»ÐмüÅÌ
				case 0xee: P0 = ledata[0];  break;
			  case 0xde: P0 = ledata[1];  break;
				case 0xbe: P0 = ledata[2];  break;
				case 0x7e: P0 = ledata[3];  break;
				//µÚ¶þÐмüÅÌ
				case 0xed: P0 = ledata[4];  break;
				case 0xdd: P0 = ledata[5];  break;
				case 0xbd: P0 = ledata[6];  break;
				case 0x7d: P0 = ledata[7];  break;
				//µÚÈýÐмüÅÌ
				case 0xeb: P0 = ledata[8];  break;
				case 0xdb: P0 = ledata[9]; break;
				case 0xbb: P0 = ledata[10]; break;
				case 0x7b: P0 = ledata[11]; break;
				//µÚËÄÐмüÅÌ
				case 0xe7: P0 = ledata[12]; break;
				case 0xd7: P0 = ledata[13]; break;
				case 0xb7: P0 = ledata[14]; break;
				case 0x77: P0 = ledata[15]; break;
				
				//¶ÀÁ¢¼üÅÌ
				case 0xfe: P0 = ledata[16]; break;
				case 0xfd: P0 = ledata[11]; break;
				case 0xfb: P0 = ledata[17]; break;
				case 0xf7: P0 = ledata[18]; break;
		    default: P0 = ledata[23];break;
			}
}
void main()
{
    WE = 1;
	  P0 = 0;
	  WE = 0;//Ñ¡¶¨ËùÓÐÊýÂë¹Ü
	
	 DU = 1;
	P0 = ledata[22];
	while(1)
	{
		
	  keypro();
		
	}
}

矩阵键盘的扫描函数 :当储存列的值时 列的值为高四位 把低四位的值 & 0xf0把低四位变成0000;

                                      P3 = P3 | 0x0f 把低四位变更成1111 当按键按着时 由于高四位 之中有一个数值为零 所以低四位变成1111 后其中也会有个数值为零 然后下条指令 把高位变0 储存行值;

                                      当储存行的值时  行的值为为第四位 把高四位的值 & 0x0f把高四位变成0000;

                                     返回行值与列值的和;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值