单片机矩阵键盘数码管_51单片机矩阵键盘静态控制数码管显示 - CSDN
  • 矩阵键盘控制数码管 //四列按键每按下一个分别显示一个数 #include<stc15f2k60s2.h> #define uchar unsigned char #define uint unsigned int uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0...

    矩阵键盘控制数码管

    //四列按键每按下一个分别显示一个数

    #include<stc15f2k60s2.h>

    #define uchar unsigned char
    #define uint unsigned int

    uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X90,0XBF,0XFF};//定义按键数组0,1,2,3,4,5,6,7,8,9,-,灭
    uchar num=0;

    void delayms(int ms); //延时
    void keyscan16(); //按键

    void main()
    {
    P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //关闭蜂鸣器
    P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF; //一个数码管亮

    while(1)
    {
    	keyscan16();
    	P0=tab[num];
    }
    

    }

    //矩阵按键

    void keyscan16()
    {
    uchar temp;

    P44=0;P42=1;P3=0X7F;        //只第一列按键作用0111 1111
    temp=P3;
    temp=temp&0X0F;        //0111 1111 & 0000 1111= 0000 1111
    if(temp!=0X0F)
    {
    	delayms(5);         //消抖
    	temp=P3;
    	temp=temp&0X0F;
    	if(temp!=0X0F)
    	{
    		temp=P3;
    	switch(temp)
    	{
    		case 0X7E: num=0;break;   //0111 1110  按下第一列第一个键数码管显示0
    		case 0X7D: num=1;break;   //0111 1101  按下第一列第二个键数码管显示1
    		case 0X7B: num=2;break;   //0111 1011   按下第一列第三个键数码管显示2
    		case 0X77: num=3;break;   //0111 0111  按下第一列第四个键,数码管显示3
    	}
    	while(temp!=0X0F)          //退出循环,temp重新赋值
    	{
    		temp=P3;
    		temp=temp&0X0F;
    	}
    }
    

    }
    P44=1;P42=0;P3=0XBF; //1011 1111 第二列按键作用
    temp=P3;
    temp=temp&0X0F;
    if(temp!=0X0F)
    {
    delayms(5);
    temp=P3;
    temp=temp&0X0F;
    if(temp!=0x0f)
    {
    temp=P3;
    switch(temp)
    {
    case 0XBE: num=4;break;
    case 0XBD: num=5;break;
    case 0XBB: num=6;break;
    case 0XB7: num=7;break;
    }
    while(temp!=0X0F)
    {
    temp=P3;
    temp=temp&0X0F;
    }
    }
    }
    P3=0XDF;P44=1;P42=1; //1101 111 第三列按键作用
    temp=P3;
    temp=temp&0X0F;
    if(temp!=0X0F)
    {
    delayms(5);
    temp=P3;
    temp=temp&0X0F;
    if(temp!=0X0F)
    {
    temp=P3;
    switch(temp)
    {
    case 0XDE: num=8;break;
    case 0XDD: num=9;break;
    case 0XDB: num=10;break;
    case 0XD7: num=11;break;
    }
    while(temp!=0X0F)
    {
    temp=P3;
    temp=temp&0X0F;
    }
    }
    }
    P3=0XEF;P44=1;P42=1; //1110 111 第四列按键作用
    temp=P3;
    temp=temp&0X0F;
    if(temp!=0X0F)
    {
    delayms(5);
    temp=P3;
    temp=temp&0X0F;
    if(temp!=0X0F)
    {
    temp=P3;
    switch(temp)
    {
    case 0XEE: num=2;break;
    case 0XED: num=4;break;
    case 0XEB: num=6;break;
    case 0XE7: num=8;break;
    }
    while(temp!=0X0F)
    {
    temp=P3;
    temp=temp&0X0F;
    }
    }
    }
    }
    void delayms(int ms)
    {
    int i,j;
    for(i=ms;i>0;i–)
    for(j=845;j>0;j–);
    }

    展开全文
  • 使用4*4的矩阵键盘和一个数码管 在4*4的矩阵键盘上编码0-F的字符,和一个数码管显示每个键盘上输入的字符。 //4*4键盘检测程序,按下键后相应的代码显示在数码管上 #include typedef unsigned char UINT8; UINT8 i...

    使用4*4的矩阵键盘和一个数码管

    在4*4的矩阵键盘上编码0-F的字符,和一个数码管显示每个键盘上输入的字符。

    
    //4*4键盘检测程序,按下键后相应的代码显示在数码管上
    #include<reg51.h>
    typedef unsigned char UINT8;
    UINT8 i=100;
    UINT8 j,k,temp,key;
    void delay(unsigned char i)
    {
      for(j=i;j>0;j--)
        for(k=125;k>0;k--);
    }
    UINT8 code table[]=
    {
    	0x3f,0x06,0x5b,0x4f,
    	0x66,0x6d,0x7d,0x07,
    	0x7f,0x6f,0x77,0x7c,
    	0x39,0x5e,0x79,0x71
    };
    
    void display(unsigned char num)
    {
         P0=table[num];
    }
    
    void init_led()
    {
    	P0 = 0x00;
    }
                                                                                                         
    void main()
    {
    	while(1)
    	{  
    		P1 = 0xef;
    		temp = P1;
    		temp = temp&0xf0;
    		if (temp != 0xf0)
    		{
    			temp = P1;
    			switch(temp)
    			{
    				  case 0xee:
    					   key=0;
    					   break;
    				  case 0xed:
    					   key=1;
    					   break;
    				  case 0xeb:
    					   key=2;
    					   break;
    				  case 0xe7:
    					   key=3;
    					   break;
    				  default:					  
    					  break;
    			}
    			display(key);
    			P1=0xfe;
    		}
    		P1 = 0xdf;
    		temp = P1;
    		temp = temp&0x0f;
    		if(temp != 0x0f)
    		{
    			temp = P1;
    			switch(temp)
    			{
    				  case 0xde:
    					   key = 4;
    					   break;
    				  case 0xdd:
    					   key = 5;
    					   break;
    				  case 0xdb:
    					   key = 6;
    					   break;
    				  case 0xd7:
    					   key = 7;
    					   break;
    				  default:
    					  break;
    			 }
    			 display(key);
    		}
    		P1=0xbf;
    		temp=P1;
    		temp=temp&0x0f;
    		if(temp != 0x0f)
    		{
    			temp=P1;
    			switch(temp)
    			{
    				  case 0xbe:
    					   key=8;
    					   break;
    
    				  case 0xbd:
    					   key=9;
    					   break;
    
    				  case 0xbb:
    					   key=10;
    					   break;
    
    				  case 0xb7:
    					   key=11;
    					   break;
    				  default:
    					   break;
    			}
    			display(key);
    		}
    		P1=0x7f;
    		temp=P1;
    		temp=temp&0x0f;
    		if(temp!=0x0f)
    		{		  
    			temp=P1;
    			switch(temp)
    			{
    				  case 0x7e:
    					   key=12;
    					   break;
    
    				  case 0x7d:
    					   key=13;
    					   break;
    
    				  case 0x7b:
    					   key=14;
    					   break;
    
    				  case 0x77:
    					   key=15;
    					   break;
    				  
    				  default:
    					  break;
    			}
    			display(key);
    		}
    	}	
    }
    
    这个上面有一个bug就是每进入的时候数码管不是空的而是现实“0”这个没有解决。



    展开全文
  • /******************************************************************************* * 标题: 矩阵键盘显示数字到静态数码管 * * 时间 2018年7月17日00:45:03 ...
    /*******************************************************************************
    *  标题:                  矩阵键盘显示数字到静态数码管                         *
    *  时间                      2018年7月17日00:45:03					           *
    *																			   *
    *  实验说明:用矩阵键盘上的16个按键,分别为0、1、3、4、5、6、7、8、9、a、b、c  *
    d、e、f显示到静态数码管上				   *                                   *
    ********************************************************************************
    * 实验心得:															       *
    1.测试行(row)的时候就是线是竖着的的那一列为1,测试列(col)的时候就是		   *
    线是横着的那几行为1															   *
    2.调用函数void KeyScan(void);时,调用的时候只需要写KeyScan就行,不然调试不成功 *
    ********************************************************************************/
    
    
    #include <reg52.h>
    
    #define GPIO_KEY P1
    #define GPIO_SHOW P2
    
    unsigned char code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
                                     0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
    void KeyScan(void);
    void Delay10ms(unsigned int c);
    unsigned int KeyValue=-1;
    void main()
    {
    
       while(1)
      {
         
        KeyScan();
    	switch(KeyValue)
    	{
    		 case(0):
    		 P2=~DIG_CODE[0];
    		 break;	
    		 case(1):
    		 P2=~DIG_CODE[1];
    		 break;
    		 case(2):
    		 P2=~DIG_CODE[2];
    		 break;	
    		 case(3):
    		 P2=~DIG_CODE[3];
    		 break;	
    		 case(4):
    		 P2=~DIG_CODE[4];
    		 break;	
    		 case(5):
    		 P2=~DIG_CODE[5];
    		 break;	
    		 case(6):
    		 P2=~DIG_CODE[6];
    		 break;	
    		 case(7):
    		 P2=~DIG_CODE[7];
    		 break;	
    		 case(8):
    		 P2=~DIG_CODE[8];
    		 break;	
    		 case(9):
    		 P2=~DIG_CODE[9];
    		 break;	
    		 case(10):
    		 P2=~DIG_CODE[10];
    		 break;	
    		 case(11):
    		 P2=~DIG_CODE[11];
    		 break;	
    		 case(12):
    		 P2=~DIG_CODE[12];
    		 break;	
    		 case(13):
    		 P2=~DIG_CODE[13];
    		 break;	
    		 case(14):
    		 P2=~DIG_CODE[14];
    		 break;	
    		 case(15):
    		 P2=~DIG_CODE[15];
    		 break;	
    		 default:
    		 P2=~DIG_CODE[1];
    		 break;
    	}
    
        
    
    
    	/******************************************************
    	*******************************************************
    	if语句的算法
    	 if(KeyValue==0)
    	 P2=~DIG_CODE[0];
    	 if(KeyValue==1)
    	 P2=~DIG_CODE[1];
    	 if(KeyValue==2)
    	 P2=~DIG_CODE[2];
    	 if(KeyValue==3)
    	 P2=~DIG_CODE[3];
    	 if(KeyValue==4)
    	 P2=~DIG_CODE[4];
    	 if(KeyValue==5)
    	 P2=~DIG_CODE[5];
    	 if(KeyValue==6)
    	 P2=~DIG_CODE[6];
    	 if(KeyValue==7)
    	 P2=~DIG_CODE[7];
    	 if(KeyValue==8)
    	 P2=~DIG_CODE[8];
    	 if(KeyValue==9)
    	 P2=~DIG_CODE[9];
    	 if(KeyValue==10)
    	 P2=~DIG_CODE[10];
    	 if(KeyValue==11)
    	 P2=~DIG_CODE[11];
    	 if(KeyValue==12)
    	 P2=~DIG_CODE[12];
    	 if(KeyValue==13)
    	 P2=~DIG_CODE[13];
    	 if(KeyValue==14)
    	 P2=~DIG_CODE[14];
    	 if(KeyValue==15)
    	 P2=~DIG_CODE[15];
    	*************************************************/
       }
    }
    
     void KeyScan(void)	  //测试行(row)的时候就是线是竖着的的那一列为1,测试列(col)的时候就是线是横着的那几行为1 
    {
    	char a = 0;
    	GPIO_KEY=0x0f;
    	if(GPIO_KEY!=0x0f)//读取按键是否按下
    	{
    		Delay10ms(1);//延时10ms进行消抖
    		if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
    		{
    			
    			//测试列
    			GPIO_KEY=0X0F;
    			switch(GPIO_KEY)
    			{
    				case(0X07):	KeyValue=0;break;
    				case(0X0b):	KeyValue=4;break;
    				case(0X0d): KeyValue=8;break;
    				case(0X0e):	KeyValue=12;break;
    			}
    			//测试行
    			GPIO_KEY=0XF0;
    			switch(GPIO_KEY)
    			{
    				case(0X70):	KeyValue=KeyValue+3;break;
    				case(0Xb0):	KeyValue=KeyValue+2;break;
    				case(0Xd0): KeyValue=KeyValue+1;break;
    				case(0Xe0):	KeyValue=KeyValue;break;
    			}
    			while((a<50) && (GPIO_KEY!=0xf0))	 //检测按键松手检测
    			{
    				Delay10ms(1);
    				a++;
    			}
    		}
    	}
    }
    
    /*******************************************************************************
    * 函 数 名         : Delay10ms
    * 函数功能		   : 延时函数,延时10ms
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    
    void Delay10ms(unsigned int c)   //误差 0us
    {
        unsigned char a, b;
    
    	//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
        for (;c>0;c--)
    	{
    		for (b=38;b>0;b--)
    		{
    			for (a=130;a>0;a--);
    		}          
    	}       
    }
    
    

     

     

     

    展开全文
  • 1.掌握矩阵键盘工作原理。 2.掌握矩阵键盘驱动方法。 3.配置单片机显示模块,实现具备键盘功能的应用程序。 设计程序把按键键码(0-F)显示在八位数码管上。 要求:启动时八位数码管的八个段全显示,每次按键时...
  • 基于51单片机矩阵键盘+数码管电路及c代码
  • 矩阵键盘 数码管

    2014-07-16 21:13:28
    开始时数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示0~F,6个数码管同时静态显示。  数码管矩阵键盘 首先关闭所有的数码管的段选不让数码管显示任何数字,然后位选中所有的数码管,接下来只需要选中...

    开始时数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示0~F,6个数码管同时静态显示。

     数码管和矩阵键盘

    首先关闭所有的数码管的段选不让数码管显示任何数字,然后位选中所有的数码管,接下来只需要选中所有的数码管,以后的操作的只需要送段选数据就行了,接着进入while()大循环不停的扫描键盘是否有被按下

    #include<reg52.h>
    #define uchar unsigned char 
    #define uint unsigned int 
    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
    };
    void delayms(uint xms)
    {
    uint i,j;
    for(i=xms;i>0;i--)
    for(j=110;j>0;j--);
    }
    void display(uchar num)
    {
    P0=table[num];
    dula=1;
    dula=0;
    }
    void matrixkeyscan()
    {
    uchar temp,key;
    P3=0xfe;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    temp=P3;
    switch(temp)
    {
    case 0xee:
    key=0;
    break;
    case 0xde:
    key=1;
    break;
    case 0xbe:
    key=2;
    break;
    case 0x7e:
    key=3;
    break;
    }
    while(temp!=0xf0)
    {
    temp=P3;
    temp=temp&0xf0;
    }
    display(key);
    }
    }
    P3=0xfd;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    temp=P3;
    switch(temp)
    {
    case 0xed:
    key=4;
    break;
    case 0xdd:
    key=5;
    break;
    case 0xbd:
    key=6;
    break;
    case 0x7d:
    key=7;
    break;
    }
    while(temp!=0xf0)
    {
    temp=P3;
    temp=temp&0xf0;
    }
    display(key);
    }
    }
    P3=0xfb;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    temp=P3;
    switch(temp)
    {
    case 0xeb:
    key=8;
    break;
    case 0xdb:
    key=9;
    break;
    case 0xbb:
    key=10;
    break;
    case 0x7b:
    key=11;
    break;
    }
    while(temp!=0xf0)
    {
    temp=P3;
    temp=temp&0xf0;
    }
    display(key);
    }
    }
    P3=0xf7;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    temp=P3;
    switch(temp)
    {
    case 0xe7:
    key=12;
    break;
    case 0xd7:
    key=13;
    break;
    case 0xb7:
    key=14;
    break;
    case 0x77:
    key=15;
    break;
    }
    while(temp!=0xf0)
    {
    temp=P3;
    temp=temp&0xf0;
    }
    display(key);
    }
    }
    }


    void main()
    {
    P0=0;
    dula=1;
    dula=0;
    P0=0;
    wela=1;
    wela=0;
    while(1)
    {
    matrixkeyscan();
    }
    }


    这里有几个

    P3=0xfe;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {  .........

    P3=0xfe 将第1 行线置低电平,其余的行线全部为高电平

    temp=P3 读取P3口当前的状态值赋值给临时变量temp

    temp=temp&0xf0 将temp与0xf0进行与运算 然后再将结果赋值给temp,主要是判断temp的高4位是否有0,如果temp的高4位没有0,那么他与0xf0“与”运算后的结果仍然等于0xf0.temp的高4位数据实际上就是矩阵键盘的4个列线,从而我们可通过判断temp与“0xf0运算后的结果是否为0xf0来判断出第一行按键是否有按键被按下。

    if(temp!=0xf0) 表示temp是上面P3口数据与0xf0“与”运算后的结果,如果结果temp不等于0xf0来判断出有按键被按下。

    另外

    P3口所有引脚

    其余的想复位引脚RES\VPD

    还有EA\VPP

    ALE\PROG

    这是所有的了,我的是AT89S52(51系列)


    展开全文
  • #include &lt;REGX51.H&gt; #define uchar unsigned char #define uint unsigned int //宏定义 sbit P20= P2^0; //端口位定义 //数码管段码定义 ...uchar SMG_CODE[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x...
  • 在以往的32博客中,见过了数码管矩阵键盘,今天就将他们结合起来,如何用矩阵键盘去控制数码管。 我们都知道数码管可以显示从0-9十位数字,也可以显示从A-F的字母,将数码管和2*2矩阵键盘结合起来也就是使用四个...
  • WELA BIT P2.7 DULA BIT P2.6 DIOLA BIT P2.5 FM BIT P2.3 ORG 0000H SETB DIOLA MOV SP,#0E0H LOOP0: LCALL key_Scan JZ LOOP0 LCALL DELAY20MS LCALL key_Scan JZ LOOP0 MOV P1,A ...HERE
  • c51单片机实现矩阵键盘数码管动态依次显示键值 //4*4矩阵按键0-F4位LED轮流显示,按键从左到右从上到下0-F #include&lt;reg51.h&gt; #include&lt;intrins.h&gt; #define uchar unsigned char #...
  • 任务简述:通过按下4X4矩阵键盘实现数码管对应显示数字 实现方式:通过行列分接法,可以节省使用单片机的I/O口,扫描矩阵键盘是否有按下,判断P2端口得到的值。 protues 硬件系统 单片机晶振复位电路: 锁存...
  • 上上周实验室学长学姐出题考察我们对STM32的掌握程度,题目是实现用矩阵键盘控制数码管输出。因为关系到自己在嵌入式小组的去留问题(学姐就那么一说,我们也就那么一听
  • 单片机中级项目13丨矩阵按键数码管移位显示 /******************************************************************************* * 实 验 名 : 动态显示数码管...* 实验效果 : 按矩阵键盘分别显示在数码管上面显...
  • 用FPGA实现16位矩阵键盘键值在数码管的显示,按下按键时对应的键值会显示在数码管上。包含了所需要的所有源代码。
  • 我把矩阵键盘数码管动态显示综合起来写了个程序。这个代码的意思是在一开始8个数码管什么也不显示,因为p0的初始值是0x00,当我们按下矩阵按键里的按键时,8个数码管动态显示该按键的键值,直到按下了下一个按键,8...
  • 将51单片机矩阵键盘程序移植到stm32F4系列板子上,学习轮询并减少IO口的使用。在硬件上,通过4*4矩阵键盘控制1位数码管的显示。软件上,通过串口调试助手观察4*4键盘的输出
  • 电子设计,本程序为汇编语言编译的实现8为数码管显示和键盘输入程序,属于单片机入门级练习
  • 51单片机矩阵键盘响应程序 #include // P0端口接LED // P0端口接数码管 // P3端口接矩阵键盘 #define LED P0 #define KEY P3 #define DIG P0 unsigned char GetKey(void); void delay10ms(void); /...
  • 内含51单片机程序主要包含矩阵键盘、独立按键、数码管以及PWM输出的程序,独立按键消抖,矩阵键盘控制8位静态数码管矩阵键盘控制8位动态数码管。很适合于51单片机的学习。
  • 51单片机矩阵键盘

    2019-05-16 21:28:15
    单片机系统中I/O口资源往往比较宝贵,当用到多个按键时为了节省I/O口口线,我们引入矩阵键盘。 我们以4X4矩阵键盘为例讲解其工作原理和检测方法。将16个按键排成4行4列,第一行将每个按键的一端连接在一起构成行线...
1 2 3 4 5 ... 20
收藏数 935
精华内容 374
关键字:

单片机矩阵键盘数码管