scpcw 发表于 2025-2-24 07:30:13

矩阵键盘
我的矩阵键盘模块,请指正!




#include "MatrixKey.h"
u8 key_num=0xff;
void MatrixKey(void)
{
      bit m,n,o,p;
      ROW1 = 1;                //先判断横,所以先置高电平先让她稳定
      ROW2 = 1;
      COL1 = 0;
      COL2 = 0;
      COL3 = 0;
      COL4 = 0;

      m=ROW1;                                                //添加中间变量是为了稳定性
      n=ROW2;                                                //实测没有中间变量,再切换电平后,电平未稳定,下面的按键扫描有误
      if( m != n)
      {
               
                if( m )      key_num = 4;                //如果1行高电平,就是按了2行,所以为2行第一个键码4
                if( n)key_num = 0;               

               
      
                COL1 = 1;                //下面是扫描纵列,所以先改纵列电平
                COL2 = 1;
                COL3 = 1;
                COL4 = 1;
                ROW1 = 0;
                ROW2 = 0;
                m=COL1;
                n=COL2;
                o=COL3;
                p=COL4;
                //if( m==0 )key_num=key_num;
                if( n == 0 ) key_num = key_num + 1;
                if( o == 0 ) key_num = key_num + 2;
                if( p == 0 ) key_num = key_num + 3;
               

      }else key_num=0xff;
}      


scpcw 发表于 2025-3-7 09:53:01

流程图是很有必要的!!

scpcw 发表于 2025-3-17 21:14:13

第21集 eeprom
研究了一下,数据只能1改写为0.
如果下发程序后,eeprom是全写了0XFF的.也就是全擦除过了,但只验证了前面10几个字节,没有全部验证.
下面就是验证第0字节被写了4次.

               test=0xff;                                    //第0个字节0xff
                EEPROM_write_n(0,test,1);                        //写入第0个字节
                EEPROM_read_n(0,test,4);                         //读出4个字节
                printf("%s\r\n",test);                           //串口打印读出的4个字节
               
                test=0xfe;                                    //第0个字节0xfe
                EEPROM_write_n(0,test,1);                        //写入第0个字节
                EEPROM_read_n(0,test,4);                         //读出4个字节第
                printf("%s\r\n",test);                           //串口打印读出的4个字节第


                test=0xfc;                                    //第0个字节0xfc
                EEPROM_write_n(0,test,1);                        //写入第0个字节
                EEPROM_read_n(0,test,4);                         //读出4个字节
                printf("%s\r\n",test);                           //串口打印读出的4个字节
               
                test=0xf8;                                    //第0个字节0xf8
                EEPROM_write_n(0,test,1);                        //写入第0个字节
                EEPROM_read_n(0,test,4);                         //读出4个字节
                printf("%s\r\n",test);                           //串口打印读出的4个字节

所以eeprom某一个字节也是可以反复改写8次的.


scpcw 发表于 2025-3-27 15:11:10


业务经理联系我测试了AiCube.

实然发现他们这一群人在搞这么一个奇妙的东东.{:qiang:}
创建工程后一次性编译成功.
这样子方便太多了.
我见证了1.00,希望她变得越来越完善.



scpcw 发表于 2025-3-27 15:28:23

前几天都没更新了,我在学习HID协议.太多要记忆的东西了,对创建这些协议的人太仰视了.
我也在努力一句一句拨demo程序包第52-USB鼠标-键盘复合设备例程.希望能看懂这些句子.
应该我想做一个键盘与电脑间的宏定义过滤器.
普通键盘只要插上就可以执行宏定义键,
我计划用数字键盘的编辑键来当宏定义键,Ctrl+cCtrl+v不就方便了吗?

我想用ch9350+ai8051来拦截键盘.

大家有没有指点用更好的办法?

scpcw 发表于 2025-3-28 23:53:37

逐字逐句的啃何老师的书,再问DEEPSEEK验证理解,逐步开朗了.
AI8051手册的附录里面有这些知识,同学们可以这样学.

scpcw 发表于 2025-4-25 08:55:54

冲哥没更新了!期待更新!!
第17集学习了串口
主要是对原理需要了解一下,其实只靠这些工具就把所有的寄存器理规矩了.
还要在实际使用中多熟悉这些寄存器就行了.

https://www.stcaimcu.com/forum.php?mod=image&aid=95254&size=300x300&key=1462be3c2aa0c115&nocache=yes&type=fixnone

scpcw 发表于 2025-4-25 20:22:26

这几天搞了一个红外接收和发送.


//*******************************************************************
//*********************** IR Remote Module **************************
//*********************** By(Coody) 2002-8-24 *********************
//*********************** IR Remote Module **************************
//this programme is used for Receive IR Remote (NEC Code).

NEC码接受,发现官方也是移植的这个函数,我也移植到冲哥这个简化多任务里来.
其实单片机编程就是移植,只要掌握原理即可,代码多移植就熟练了.
如果你自己编程,也要考虑方便移植,多学一些编程经验,多看长远一点.

编写好后,发现很多品牌电视,空调,都不是用的标准NEC码.反面一些杂牌家电是标准NEC码.



scpcw 发表于 2025-4-25 20:36:37

红外接收搞好了,再来移植红外发送.
按一个实验箱上的一个按,就发送一个NEC码,接收模块收到就printf出来.
自发 自收,打印串口.

void IR_TX_NEC(u16 UserCode_TX,u8IR_code_TX)
        {       
            TxTime = 0;
                              //一帧数据最小长度 = 9 + 4.5 + 0.5625 + 24 * 1.125 + 8 * 2.25 = 59.0625 ms
                              //一帧数据最大长度 = 9 + 4.5 + 0.5625 + 8 * 1.125 + 24 * 2.25 = 77.0625 ms
            IR_TxPulse(342);    //对应9ms,同步头       9ms
            IR_TxSpace(171);    //对应4.5ms,同步头间隔 4.5ms
            IR_TxPulse(21);   //开始发送数据          0.5625ms

            IR_TxByte(UserCode_TX%256);   //发用户码低字节
            IR_TxByte(UserCode_TX/256);   //发用户码高字节
            IR_TxByte(IR_code_TX);         //发数据
            IR_TxByte(~IR_code_TX);      //发数据反码
            
            if(TxTime < 56)   //一帧按最大77ms发送, 不够的话,补偿时间   108ms
            {
                TxTime = 56 - TxTime;
                TxTime = TxTime + TxTime / 8;
                Delay_ms(TxTime);
            }
//            Delay_ms(31);
//            while(key_num != 0xff) //键未释放
//            {
//                                                        printf("ok IR%d",key_num);
//                IR_TxPulse(342);    //对应9ms,   同步头      9ms
//                IR_TxSpace(86);   //对应2.25ms,同步头间隔    2.25ms
//                IR_TxPulse(21);   //开始发送数据            0.5625ms
//                Delay_ms(96);

//            }
      
}


但是按键不放NEC会发重复码,由于我这个是伪多任务.重复按键有问题,先注释掉这个功能,后面再研究解决方案.


scpcw 发表于 2025-4-25 20:46:41

今天改进一下接收函数,让他能记录非标准NEC的时序.后面让程序有遥控板学习功能.
页: 1 2 3 [4] 5 6 7 8 9
查看完整版本: 我学AI8051U | 确实是实战派,建议送强大的 AI8051U实验箱