找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1113|回复: 4
收起左侧

清翔的51单片机开发板,矩阵键盘和lcd1602是不是不能同时使用?

[复制链接]
ID:1138180 发表于 2024-12-2 19:45 来自触屏版 | 显示全部楼层 |阅读模式
矩阵键盘和lcd1602的接口一样导致按矩阵键盘时改变了lcd1602液晶的读写状态,有解决的方法吗?
Screenshot_20241202_192846.jpg
Screenshot_20241202_192852.jpg
回复

使用道具 举报

ID:940483 发表于 2024-12-3 08:11 | 显示全部楼层
按键在按和松会产生抖动,加消抖,确保按键的识别。会有按键去重问题。可通过一定的延时或使用状态标志来解决。
回复

使用道具 举报

ID:161164 发表于 2024-12-3 09:25 | 显示全部楼层
可以,但要有技巧
读键盘前 要P0=0;
读完键盘后 P34=0;
回复

使用道具 举报

ID:961114 发表于 2024-12-3 09:26 | 显示全部楼层
  1. #include "ai8051u.h"              //调用头文件
  2. #include "stc32_stc8_usb.h"       //调用头文件
  3. #include "intrins.h"               //调用头文件


  4. #define u8 unsigned char    //8位无符号变量(0-255)
  5. #define u16 unsigned int    //16位无符号变量(0-65535)

  6. u8  state = 0;      //初始状态

  7. char *USER_DEVICEDESC = NULL;
  8. char *USER_PRODUCTDESC = NULL;
  9. char *USER_STCISPCMD = "@STCISP#";

  10. void Delay20ms(void)        //@24.000MHz Delay20ms();
  11. {
  12.         unsigned long edata i;

  13.         _nop_();
  14.         _nop_();
  15.         i = 119998UL;
  16.         while (i) i--;
  17. }


  18. void main(void)      //主函数
  19. {
  20.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  21.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  22.     CKCON = 0; //提高访问XRAM速度

  23.        
  24.         P0M1 = 0x00;   P0M0 = 0x00;
  25.     P1M1 = 0x00;   P1M0 = 0x00;
  26.     P2M1 = 0x00;   P2M0 = 0x00;
  27.     P3M1 = 0x00;   P3M0 = 0x00;
  28.     P4M1 = 0x00;   P4M0 = 0x00;
  29.     P5M1 = 0x00;   P5M0 = 0x00;
  30.     P6M1 = 0x00;   P6M0 = 0x00;
  31.     P7M1 = 0x00;   P7M0 = 0x00;
  32.        

  33.         usb_init();                                     //USB CDC 接口配置
  34.    
  35.     IE2 |= 0x80;                                    //使能USB中断
  36.     EA = 1;                                         //
  37.        
  38.         P40 = 0;
  39.     while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  40.        
  41.         while(1)
  42.         {
  43.                  if (bUsbOutReady)                    //如果接收到了数据
  44.         {
  45.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  46.    
  47.             usb_OUT_done();
  48.         }
  49. //                //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
  50. //                if( P32 == 0 )
  51. //                {
  52. //                        P00 = 0;
  53. //                }
  54. //                 else
  55. //                 {
  56. //                         P00 = 1;
  57. //          }
  58.                
  59. //                //任务1:按下P32按钮灯灭,松开P32按钮灯亮;
  60. //                if( P32 == 0 )
  61. //                {
  62. //                        P00 = 1;
  63. //                }
  64. //                 else
  65. //                 {
  66. //                         P00 = 0;
  67. //          }
  68.                 //任务1:按一下灯亮,按一下灯灭;
  69.                 if( P32 == 0 )           //判断P32是否按下
  70.                 {
  71.                      Delay20ms();       //延时20ms消抖
  72.                         if ( P32 == 0 )
  73.                         {
  74.                            state = !state;       //  变量取反 0 1 0  1
  75.                            P00 = state;
  76.                                
  77.                            printf("state:%d\r\n",(int)state);
  78.                        
  79.                           while( P32 == 0);        //等待P32松开
  80.                        
  81.              }
  82.               }
  83.           }
复制代码
回复

使用道具 举报

ID:92781 发表于 2024-12-3 10:24 | 显示全部楼层
不修改电路的话,基本没有办法,这个电路相当于用按键给lcd发送数据了,最简单就是把1602的CE使能要独立出去,也可以增加一个iic的1602驱动模块,不过需要改程序。你也可以试试楼上通过改变P0和P34状态的方法,这种方法仍然接受数据的输入,读写状态仍然改变,只不过输入的值为0,LCD接受的是无效指令。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表