|
protues仿真图:
- /*******************************************************************************
- * 标题: 矩阵键盘显示数字到静态数码管 *
- * 时间 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;
- void main()
- {
- while(1)
- {
-
- KeyScan();
- GPIO_SHOW=DIG_CODE[KeyValue];
-
- /******************************************************
- *******************************************************
- 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--);
- }
- }
- }
复制代码
|
|