• 专业师傅

  • 全国服务

  • 质量保障

欢迎进入啄木鸟问答频道,这里提供最专业的问答知识
搜索答案
我要提问

4x4矩阵键盘的工作原理是什么?

2720人浏览 2023-08-21
我来答
    取消
    提交回答
5个回答
  • novak0807
    novak0807

    2023-08-21

    最优回答

    不好说 多的很

    0
  • 1804365688Q
    1804365688Q

    2023-08-21

    #define LCD1602_FLAG#define LCD1602_PORT P0#includereg51.h#includestddef.h#define uchar unsigned charsbit lcd1602_rs=P2^0;sbit lcd1602_e=P2^2;sbit lcd1602_rw=P2^1;sbit lcd1602_busy=P0^7;uchar str[]=This is Key Test;uchar keyval,keystr[16];void delay(uchar a){uchar i;while(a--)for(i=0;i120;i++);}/************************************* * 函数名称:lcd1602_CheckBusy() * 函数功能:状态查询*************************************/void lcd1602_CheckBusy(){ do { lcd1602_busy=1; lcd1602_rs=0; lcd1602_rw=1; lcd1602_e=0; lcd1602_e=1; } while(lcd1602_busy);}/**************************************** * 函数名称: lcd1602_WriteCmd() * 函数功能:写命令 * 入口参数:命令字 * 出口参数:无****************************************/void lcd1602_WriteCmd(const uchar cmd){ lcd1602_CheckBusy(); lcd1602_rs=0; lcd1602_rw=0; lcd1602_e=1; LCD1602_PORT=cmd; lcd1602_e=0;}/******************************************** * 函数名称:lcd1602_WriteData() * 函数功能:写数据 * 入口参数:c--待写数据 * 出口参数:无**********************************************/void lcd1602_WriteData(const uchar c){ lcd1602_CheckBusy(); lcd1602_rs=1; lcd1602_rw=0; lcd1602_e=1; LCD1602_PORT=c; lcd1602_e=0;}/************************************************ * 函数名称:lcd1602_Init() * 函数功能:初始化LCD * 入口参数:无 * 出口参数:无************************************************/void lcd1602_Init(){ lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵 lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable, lcd1602_WriteCmd(0x06); //flag move to right,screen don't move lcd1602_WriteCmd(0x01); //clear screen}/************************************************* * 函数名称:lcd1602_Display() * 函数功能: 字符显示 * 入口参数:ptr--字符或字符串指针 * 出口参数:无 * 说 明:用户可通过以下方式来调用: * 1)lcd1602_Display(Hello,world!); * 2) INT8U 存储类型 txt[]=要显示的字符串; * 或者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'}; * INT8U *ptr; * ptr=&txt * lcd1602_Display(ptr); * 或 lcd1602_Display(txt); * 或 lcd1602_Display(&txt);*************************************************/void lcd1602_Display(const uchar *ptr,uchar line){ uchar data i=0; uchar *data q; q=ptr; switch(line) { case 0: lcd1602_WriteCmd(0x80); while(q!=NULL && (*q!='\0') && i16) { lcd1602_WriteData(*q); q++; i++; } break; case 1: lcd1602_WriteCmd(0xc0); while(q!=NULL && (*q!='\0') && i16) { lcd1602_WriteData(*q); q++; i++; } break; }}uchar kbscan(void){ unsigned char sccode,recode; P3=0x0f; //发0扫描,列线输入 if ((P3 & 0x0f) != 0x0f) //有键按下 { delay(20); //延时去抖动 if ((P3&0x0f)!= 0x0f) { sccode = 0xef; //逐行扫描初值 while((sccode&0x01)!=0) { P3=sccode; if((P3&0x0f)!=0x0f) { recode=(P3&0x0f)|0xf0; while((P3&0x0f)!=0x0f);//等待键抬起 return((~sccode)+(~recode)); } else sccode=(sccode1)|0x01; } } } return 0; //无键按下,返回0}uchar getkey(void){ uchar key; key=kbscan(); if(key==0){keyval=0xff;return(0);} switch(key) { case 0x11:keyval=7;break; case 0x12:keyval=4;break; case 0x14:keyval=1;break; case 0x18:keyval=10;break; case 0x21:keyval=8;break; case 0x22:keyval=5;break; case 0x24:keyval=2;break; case 0x28:keyval=0;break; case 0x41:keyval=9;break; case 0x42:keyval=6;break; case 0x44:keyval=3;break; case 0x48:keyval=11;break; case 0x81:keyval=12;break; case 0x82:keyval=13;break; case 0x84:keyval=14;break; case 0x88:keyval=15;break; default:keyval=0xff;break; } if(keyval!=0xff)return(1); else return(0);}main(){uchar num;lcd1602_Init();lcd1602_Display(str,0);while(1) { if(getkey()) { if(keyval10)keystr[num]=keyval+0x30; else keystr[num]=keyval-10+'A'; lcd1602_Display(keystr,1); num++; num%=16; } }}

    回答:

    0
  • 531182560a
    531182560a

    2023-08-21

    内容太多了,你就说哪些你不会吧,减少下工作量吧。/***********************************************************/#define LCD XBYTE[0xffff] // 定义LCD显示的数组,这边用0xffff浪费 // 只要32就可以了#define uint unsigned int // 宏定义“短表示”,方便书写#define uchar unsigned char // 同上void lcd_mwc(uchar i) // 这个函数是用来写命令的:如启动液晶 // 锁定液晶等,可以查看液晶控制字就知道 // 0xb8和0x40是什么命令了,估计是启动/*********************************************/// 属于函数void lcd_clear(void) 要查看液晶的规格书uchar i; // 定义液晶每页的地址个数,用来清0uchar page; // 定义液晶的Page地址(page=0xb8;page0xc0;page++) // 循环清零/*********************************************/uchar i; // 定义传送数据的个数for (i=16;i32;i++) lcd_mwd(*(hz+i)); // lcd_mwd函数的作用是通过给LCD // 数组初始化地址,然后根据地址 // 递增将数组QING[32]等的对应地 // 数据传送到液晶数据口;这边是 // 循环传送后面16个数据for (i=0;i16;i++) lcd_mwd(*(hz+i)); // 同上,传送前面的16个数据/*****************************************************************/从你的程序上看,液晶应该由上下两块显示Page组成,然后上面的Page显示4个汉字的上半段,下面显示4个汉字的下半段,所以有8个Page,和你的void lcd_clear(void) 函数也就对应了。void dispm_hz_down(uchar code * hz)

    回答:

    0
  • leo_lang
    leo_lang

    2023-08-21

    temp等于0x0e时,键值key等于7 : 这个键值是你自己定义的,就是起一个标志位的作用,然后用程序判断键值,当键值等于7时,该进行什么动作,这就相当于当你那个按键按下时执行什么动作写单片机C程序 一定要活用标志位还有你好像都大四了,怎么这样普通的矩阵键盘程序还看不懂,该好好学习呀 兄弟I和J 只是一个变量 用来决定延时时间的长短 延时是为了消除按键的抖动毕竟机械按键存在抖动(按下去并不是电平直接就跳变并稳定下来了)延时是软件消抖 增强系统的稳定性

    回答:

    0
  • jingsl123
    jingsl123

    2023-08-21

    您好,楼主工作的原理是:用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上,设置一个按键。而这样的按键中按键的个数是4 X 4个。这样的行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。

    回答:

    0
推荐维修服务:若未解决您的问题,请您直接联系客服或拨打电话: 为你解忧
正规家庭维修哪家好?

·找啄木鸟家庭维修

·人才库累计注册数十万维修工程师

·信息严格加密,放心预约

·预约只需6秒快速完成!

请选择分类
      获取验证码
      维修服务推荐
      特别推荐

      友链交换:
      手机维修