精华内容
下载资源
问答
  • 前言:由于自己post传输json的需要,需要自己往json串中添加数据没想到一个小小的json居然能那么让我头疼 如下(这里只截取部分数据,因为我的json串有点长): ...#以下便是哪个愚蠢的办法,并且只能...

    前言:由于自己post传输json的需要,需要自己往json串中添加数据没想到一个小小的json居然能那么让我头疼
    如下(这里只截取部分数据,因为我的json串有点长):
    在这里插入图片描述
    我想往其中插入数据,结果百度半天,各种转格式,其种最坑的字典格式,大家都知道,字典key唯一,不能重复结果疯狂报错。
    还发现了以下方法,能够定位到相应位置,但是由于是字典格式不能重复,放弃了

    #以下便是哪个愚蠢的办法,并且只能赋值,遇到列表直接报错,并不能添加数据
    data['YML_Contaiers']['ContainerNo']['YML_ContainerTracks']={
                        "Date":"string",
                        "Event":"string",
                        "AtFacility":"string",
                        "ToFacility":"string",
                        "Mode":"string"
                    }
    

    我找呀找,真的找不到关于这个问题的答案,气死我了,全都是什么loads,dumps啊,什么的方法,百度真的要凉了??。。。
    但是我发现了一个dumps与loads结合的方(zhen)法(xiang)

    #这里的json只添加了一个,而且位置是在外面的层级
    json_data='{"BLNO": "string","NoOfPackages": "string","GrossCargoWeight": "string","Measurement": "string","LeaveRouting": "string","ReachRouting": "string","ETD": "string","ETA": "string","YML_Contaiers": [{"Id": 0,"ContainerNo": "string","MoveType": "string","Date": "string","LatestEvent": "string","Place": "string","VGM": "string","YML_ContainerTracks": [{"Date": "string","Event": "string","AtFacility": "string","ToFacility": "string","Mode": "string"}]}]}'
    new = json.dumps({**json.loads(json_data), **{"YML_ContainerTracks": [{"Date": "string", "Event": "string", "AtFacility": "string", "ToFacility": "string", "Mode": "string"}]}})
    

    这方法可以让数据和它爷爷肩并肩,上生成同一辈分,简直违背伦理道德~那怎么行!!!
    在这里插入图片描述
    转出字典格式也不行,字符串也不好操作,那咋办呀???我很想和经理说sorry…像朱丹姐一样~~
    突然灵机一动,这不是还有列表嘛??美滋滋!枚举是个好东西!!!

    json_data='{"BLNO": "string","NoOfPackages": "string","GrossCargoWeight": "string","Measurement": "string","LeaveRouting": "string","ReachRouting": "string","ETD": "string","ETA": "string","YML_Contaiers": [{"Id": 0,"ContainerNo": "string","MoveType": "string","Date": "string","LatestEvent": "string","Place": "string","VGM": "string","YML_ContainerTracks": [{"Date": "string","Event": "string","AtFacility": "string","ToFacility": "string","Mode": "string"}]}]}'
    list_i = list(json_data)#把他变成列表格式
    #由于我是需要循环往json串指定位置中添加数据,有需要索引做一下判断,使用枚举,枚举真的是个好东西~~~~~
    #然后使用列表的insert来指定位置添加重复数据
    for index,content in enumerate(contents):
                if index==0:
                    list_json.insert(-4,'{"Date": "%s","Event": "%s","AtFacility": "%s","ToFacility": "%s","Mode": "%s"}' % (item['xxtime'], item['Event'], item['At_Facility'], item['To_Facility'],item['Delivery_mode']))
                else:
                    list_json.insert(-4,',{"Date": "%s","Event": "%s","AtFacility": "%s","ToFacility": "%s","Mode": "%s"}'%(item['xxtime'],item['Event'],item['At_Facility'], item['To_Facility'],item['Delivery_mode']))
    #然后在转换成json格式,就可以了。美滋滋
    json.dumps(str_i, ensure_ascii=False)
    

    以下我成功的亚子~但是没开心几分钟。。。。。。。。IP就被封了。。。。。
    在这里插入图片描述
    还有不明白的,或者有爬虫需求的小伙伴可以给我留言~~嘻嘻嘻。不准转载哟~

    展开全文
  • 要实现的效果:类似桌面打开记事本,按下键盘后有输入,按住按键不放的话就连续输入。 环境:嵌入式Linux系统,键盘有...QT里面继承keyPressEvent()即可判断按下的是哪个键。 要注意的有一些,说说心得: 1

    要实现的效果:类似桌面打开记事本,按下键盘后有输入,按住按键不放的话就连续输入。

    环境:嵌入式Linux系统,键盘有GPIO扫描实现,模拟成标准键盘,界面用QT4的LineEdit显示。

     

    键盘的驱动我就不多说了,参考input/keyboard的omap方面代码即可;QT里面继承keyPressEvent()即可判断按下的是哪个键。

    要注意的有一些,说说心得:

    1、键盘要注意防抖动

    2、如果确认有键盘就input_report_key(&va->kb_dev,key_got,1);然后重复扫描,这一步很重要,重复扫描的时间要小于33ms。为什么?看下input.c就知道了,input.c的input_repeat_key会隔rep[REP_PERIOD]调用一次,但是如果我们在驱动里释放了按键,则input_repeat_key不会再调用(此函数前面有判断)。

    因此扫描的时间一定要少于rep[REP_PERIOD],不这样做的话,就会出现你本来想按一次按键,结果多了几个尾巴。

    例如,你确认按键后200ms再开始扫描是否还按下,则input_repeat_key已经调用好几次了,所以多了几个尾巴,这样就不是只按下一次键盘了。

    3、千万不要因手按键盘的重复时间的固定思路迷惑了程序的编写。只要驱动指定了EV_REP,则驱动上层会自动启动上述的timer,本驱动只要判断按键是否抬起然后input_report_key(x,x,0);即可!

     

    不对之处欢迎指正!

    转自:blog.csdn.net/lanmanck

    展开全文
  • 【js学习笔记-098】-------键盘事件

    千次阅读 2014-03-17 16:17:02
    【js学习笔记-------键盘事件】 当用户在键盘上按下或释放按键时,会发生keydown和keyup事件。它们由辅助键、功能键和...指定了按下的键是哪个。对不动产生的可打印字符的按键,keyCode值是按键上出现的主要字符的Unic

    【js学习笔记-------键盘事件】


    当用户在键盘上按下或释放按键时,会发生keydown和keyup事件。它们由辅助键、功能键和字母数字键产生,如果用户按时间足够长会导致它开始重复,那么在keyup事件到达之前会收到多个keydown事件。

    这些事件相关的事件对象都有数字属性keyCode。指定了按下的键是哪个。对不动产生的可打印字符的按键,keyCode值是按键上出现的主要字符的Unicode编码。无论Shift键处于什么状,字母键总是产生大写keyCode值,这是因为它们出现在物理键盘上,类似地,即使为了输入标点字符而按下shift键,但数字键产生的keyCode值就是出现在对应键上的数字。对于不可打印键,keyCode属性将是一些其它值。keyCode值尚未标准化,但适当的跨浏览器兼容是可行的。

    类似鼠标事件对象,键盘事件对象有altKey、ctrlKey、metakey和shiftKey属性,当事件发生时,如果对应辅助键按下,那么它们会被设置为true。

    3级DOM事件规范草案标准化了keydown和keyup事件类型。但没尝试标准化keyCode。相反,它定义了新属性key,它会以字符串的形式包含键名。如果按键对应的是一个可打印字符,那么key属性将仅仅是这个可打印字符。哪按F2 会产生”F2”

     

    functionKeymap(bindings){

              this.map = {};

              if(bindings){

                   for(name in bindings) this.bind(name,bindings[name]);

               }

     }

     

    //绑定指定的按键标识符和指定的处理程序函数

    Keymap.prototype.bind= function(key,func){

          this.map[Keymap.normalize(key)] = func;

     }

     

    Keymap.prototype.unbind= function(key,func){

          delete this.map[Keymap.normalize(key)];

     }

    //在指定html元素上配置keymap

    keymap.prototype.install= function(element){

          var keymap = this;

           function handler(event){returnkeymap.dispatch(event,element);}

           //现在安装它

           if(element.addEventListener)

                  element.addEventListener(“keydown”,handler,false);

           else

                   element.attachEvent(“onkeydown”,handler);

     }

    //这个方法基于绑定分派按键事件

    Keymap.prototype.dispatch= function(event,element){

          var modifiers = “”;

          var keyname = null;

          //按照标准的小写字母构建辅助键字符串

          if(event.altKey) modifiers+=”alt_”;

          if(event.ctrlKey) modifiers+=”ctrl_”;

          if(event.metaKey) modifiers+=”meta_”;

          if(event.shiftKey) modifiers+=”shift_”;

          //如果实现3级DOM规范的key属性,获取keyname很容易

         if(event.key) keyname = event.key;

         else if(event.keyIdentifier &&event.keyIdentifier.substring(0,2)!==”U+”)

                  keyname = event.keyIdentifier;

         else keyname = Keymap.keyCodeToKeyName[event.keyCode];

          //如果不能找出键名,只能返回并忽略这个事件

          if(!keyname)return ;

          //标准的按键id是辅助键加上小写键名

          var keyid =modifiers+keyname.toLowerCase();

           //现在查看按键标识符是否绑定任何东西

          var handler = this.map[keyid];

           if(handler){

                var retval =handler.call(element,event,keyid);

                //如果处理程序返回false,取消默认操作并阻止冒泡

               if(retval===false){

                   if(event.stopPropagation) event.stopPropagation()

                    else event.cancelBubble = true;

                   if(event.preventDefault)event.preventDefault();

                   else event.returnValue = false;

               }

                   return retval;

           }

     }

     

    Keymap.normalize =function(keyid){

             keyid = keyid.toLowerCase();

            var words = keyid.split(/\s+|[\-+_]/);//分割辅助键和键名

            var keyname = words.pop();

            keyname = Keymap.aliases[keyname] ||keyname;

            words.sort();

            words.push(keyname);

            return words.join(“_”);

     }

     

    Keymap.aliases = {

            “escape”:”esc”

            ,“delete”:”del”

            ,“return”:”enter”

            ,“ctrl”:”control”

            ,“space”:”spacebar”

            ,“ins”:”insert”

     }

     

    Keymap.keyCodeToKeyName= {

         :”Backspace”,9:”Tab”,13:”Enter”,16:”Shift”,17:”Control”,18:”Alt”,19:”Pause”,20:”CapsLock”,27:”Esc”,32:”Spacebar”,33:”PageUp”,34:”PageDown”,35:”End”,36:”Home”,37:”Left”,38:”Up”,39:”Right”,40:”Down”,45:”Insert”,46:”Del”,

         //主键盘(非数字键盘)上的数字

         48:”0”,49:”1”,50:”2”,51:”3”,52:”4”,53:”5”,54:”6”,55:”7”,56:”8”,57:”9”,

        //字母按键,注意我们不区分大小写

        65:”A”,66:”B”,67:”C”,68:”D”,69:”E”,70:”F”,71:”G”,72:”H”,73:”I”,74:”J”,75:”K”,76:”L”,77:”M”,78:”N”,79:”O”,80:”P”,81:”Q”,82:”R”,83:”S”,84:”T”,85:”U”,86:”V”,87:”W”,88:”X”,89:”Y”,90:”Z”,

       //数字小键盘的数字和标点符号按键(opera不支持)

       96:”0”,97:”1”,98:”2”,99:”3”,100:”4”,101:”5”,102:”6”,103:”7”,104:”8”,105:”9”,106:”Multiply”,107:”Add”,109:”Subtract”,110:”Decimal”,111:”Divide”,

       //功能键

    112:”F1”,113:”F2”,114:”F3”,115:”F4”,116:”F5”,117:”F6”,118:”F7”,119:”F8”,120:”F9”,121:”F10”,122:”F11”,123:”F12”,124:”F13”,125:”F14”,126:”F15”,127:”F16”,128:”F17”,129:”F18”,130:”F19”,131:”F20”,132:”F21”,133:”F22”,134:”F23”,135:”F24”,

       //不需要按Shift键的标点符号键

       //连字符不兼容,FF返回的编码和减号一样

       59:”;”,61:”=”,186:”;”,187:”=”,

       188:”,”,190:”.”,191:”/”,192:”`”,219:”[“,220:”\\”,221:”]”,222:”’”

     

     }

    展开全文
  • 那些可以被shift的按键,比如大小写字母和可以代表符号的数字,它的扫描码后面会跟着shift码,FPGA需要根据这个来决定用哪个ASCII字符。有些按键,比如Ctrl和Alt被按下时,会在扫描码前先发一个E0,当它们被松开时...

    上一篇教程挖了个USB键盘的坑,这一篇来填它,教你做硬核键盘侠

    FPGA基础入门【13】开发板USB键盘控制

    键盘控制信号

    和USB接口有关的引脚连接和PS/2接口协议在上一篇教程介绍过,这里重复一次:
    PS/2 Control

    connection
    具体可以参考NEXYS 4开发板文档

    时钟信号和数据信号都是双向的,没人去驱动它们的时候就被电阻拉高成高电平。

    接收键盘传来的数据相对简单,host保持侦测时钟和数据,当时钟Clock的下降沿时,侦测到数据Data也拉低,代表一个数据包传送出来,之后的10个时钟下降沿,分别收到从最低位LSB到MSB的八位数据,1位的奇偶校验(1表示八位数据中1的位数为偶数,0是奇数),最后1位高电平表示数据包结束。

    PS2 detail
    从Host发送指令到键盘的步骤如下

    1. 一般时钟Clock信号都是由键盘驱动的,只有Host发送指令出去的时候要拉低一次,就是标为1的位置,Host驱动时钟成低电平,并保持大约60us
    2. 在时钟拉低时,也就是标为2的位置,把数据Data信号也拉低
    3. 60us结束后把时钟Clock信号的控制权交回,开启侦测时钟,这时键盘侦测到标为3的时钟上升沿,数据Data位0,准备接受指令
    4. 键盘开始驱动时钟Clock,每个上升沿读取一位数据,Host可以在侦测到时钟下降沿时把数据位准备好,数据包顺序和读取时一样,1位起始低电位,8位LSB到MSB数据,1位奇偶校验,1位结尾高电位
    5. 把数据Data信号控制权交还

    键盘

    对键盘来说,它用的是扫描码,每个按键对应一个代码,当一个按键被按下,每100ms会重复发送一次;当这个按键被松开,一个0xF0被发出,跟着是那个被松开的按键。那些可以被shift的按键,比如大小写字母和可以代表符号的数字键,它的扫描码后面会跟着shift码,FPGA需要根据这个来决定用哪个ASCII字符。有些按键,比如Ctrl和Alt被按下时,会在扫描码前先发一个E0,当它们被松开时,会发E0 F0,并跟随着相应按键的扫描码。

    这部分比较复杂,需要写相应代码来确定使用哪个ASCII码,相应按键的扫描码如下:
    keyboard
    有一个网站把这部分写的比较清楚:PS2 controller
    其中就包含了一张键盘字符表,每个按键KEY都有对应按下(MAKE)的代码,和松开(BREAK)的代码:
    character table

    键盘的一些其他特殊指令如下,我们可以用Echo回声测试指令,看键盘是否会返回相应数据
    keyboard command

    逻辑设计

    这个逻辑结构计划基本照搬上一篇教程中用串口控制USB鼠标的逻辑,因为两者用的都是PS/2控制协议,只需要调用之前写的ps2_transmitter.v,并对顶层做少量的修改即可。

    修改后的顶层代码usb_keyboard.v如下:
    引脚基本不变,只是去掉了不必要的LED

    module usb_keyboard(
        input             clk,
        input             rst,
        
        // UART port
        inout             USB_CLOCK,
        inout             USB_DATA,
        
        // UART port
        input             RXD,
        output reg        TXD,
        output reg        CTS,
        input             RTS
    );
    
    // USB ports control
    wire   USB_CLOCK_OE;
    wire   USB_DATA_OE;
    wire   USB_CLOCK_out;
    wire   USB_CLOCK_in;
    wire   USB_DATA_out;
    wire   USB_DATA_in;
    assign USB_CLOCK = (USB_CLOCK_OE) ? USB_CLOCK_out : 1'bz;
    assign USB_DATA = (USB_DATA_OE) ? USB_DATA_out : 1'bz;
    assign USB_CLOCK_in = USB_CLOCK;
    assign USB_DATA_in = USB_DATA;
    
    wire       PS2_valid;
    wire [7:0] PS2_data_in;
    wire       PS2_busy;
    wire       PS2_error;
    wire       PS2_complete;
    reg        PS2_enable;
    (* dont_touch = "true" *)reg  [7:0] PS2_data_out;
    

    PS2控制模块不变

    // Controller for the PS2 port
    // Transfer parallel 8-bit data into serial, or receive serial to parallel
    ps2_transmitter ps2_transmitter(
        .clk(clk),
        .rst(rst),
        
        .clock_in(USB_CLOCK_in),
        .serial_data_in(USB_DATA_in),
        .parallel_data_in(PS2_data_in),
        .parallel_data_valid(PS2_valid),
        .busy(PS2_busy),
        .data_in_error(PS2_error),
        
        .clock_out(USB_CLOCK_out),
        .serial_data_out(USB_DATA_out),
        .parallel_data_out(PS2_data_out),
        .parallel_data_enable(PS2_enable),
        .data_out_complete(PS2_complete),
        
        .clock_output_oe(USB_CLOCK_OE),
        .data_output_oe(USB_DATA_OE)
    );
    

    串口输出逻辑不变,一样是把PS/2收到的8位数转化成2个十六进制符号传回,并且把PC端输出的指令传回

    // Output the data to uart
    reg [15:0] tx_count;
    reg [19:0] tx_shift;
    reg [19:0] CTS_delay;
    
    always @(posedge clk or posedge rst) begin
        if(rst) begin
            tx_count <= 16'd0;
            TXD <= 1'b1;
    		tx_shift <= 20'd0;
            CTS <= 1'b1;
            CTS_delay <= 20'hFFFFF;
        end
        // When get data from PS2, transfer and buffer it into register
        else if(PS2_valid) begin
            case(PS2_data_in[3:0])
            4'h0: begin tx_shift[9:0] <= 10'b0000011001; end
            4'h1: begin tx_shift[9:0] <= 10'b0100011001; end
            4'h2: begin tx_shift[9:0] <= 10'b0010011001; end
            4'h3: begin tx_shift[9:0] <= 10'b0110011001; end
            4'h4: begin tx_shift[9:0] <= 10'b0001011001; end
            4'h5: begin tx_shift[9:0] <= 10'b0101011001; end
            4'h6: begin tx_shift[9:0] <= 10'b0011011001; end
            4'h7: begin tx_shift[9:0] <= 10'b0111011001; end
            4'h8: begin tx_shift[9:0] <= 10'b0000111001; end
            4'h9: begin tx_shift[9:0] <= 10'b0100111001; end
            4'hA: begin tx_shift[9:0] <= 10'b0100000101; end
            4'hB: begin tx_shift[9:0] <= 10'b0010000101; end
            4'hC: begin tx_shift[9:0] <= 10'b0110000101; end
            4'hD: begin tx_shift[9:0] <= 10'b0001000101; end
            4'hE: begin tx_shift[9:0] <= 10'b0101000101; end
            4'hF: begin tx_shift[9:0] <= 10'b0011000101; end
            endcase
            
            case(PS2_data_in[7:4])
            4'h0: begin tx_shift[19:10] <= 10'b0000011001; end
            4'h1: begin tx_shift[19:10] <= 10'b0100011001; end
            4'h2: begin tx_shift[19:10] <= 10'b0010011001; end
            4'h3: begin tx_shift[19:10] <= 10'b0110011001; end
            4'h4: begin tx_shift[19:10] <= 10'b0001011001; end
            4'h5: begin tx_shift[19:10] <= 10'b0101011001; end
            4'h6: begin tx_shift[19:10] <= 10'b0011011001; end
            4'h7: begin tx_shift[19:10] <= 10'b0111011001; end
            4'h8: begin tx_shift[19:10] <= 10'b0000111001; end
            4'h9: begin tx_shift[19:10] <= 10'b0100111001; end
            4'hA: begin tx_shift[19:10] <= 10'b0100000101; end
            4'hB: begin tx_shift[19:10] <= 10'b0010000101; end
            4'hC: begin tx_shift[19:10] <= 10'b0110000101; end
            4'hD: begin tx_shift[19:10] <= 10'b0001000101; end
            4'hE: begin tx_shift[19:10] <= 10'b0101000101; end
            4'hF: begin tx_shift[19:10] <= 10'b0011000101; end
            endcase
            
            CTS_delay <= 20'h00000;
        end
        // When receiving data, output the same thing in the meantime
        else if((~RXD) || rx_start) begin
            TXD <= RXD;
            CTS <= 1'b0;
        end
        // Shift out the received data
        else begin
    		if(tx_count < 16'd867) begin
    			tx_count <= tx_count + 16'd1;
    		end
    		else begin
    			tx_count <= 16'd0;
    		end
    		
    		if(tx_count == 16'd0) begin
    			TXD <= tx_shift[19];
    			tx_shift <= {tx_shift[18:0], 1'b1};
                CTS <= CTS_delay[19];
                CTS_delay <= {CTS_delay[18:0], 1'b1};
    		end
        end
    end
    

    把用来控制鼠标的指令修改一下,0是复位指令0xFF,1是LED等配置0xED,用来控制键盘上大写锁定、滚动锁定、小键盘锁定LED,跟随着2的最低3位分别指定这三个LED都亮起,3是回声测试0xEE,4是重传指令0xFE

    // Input from uart
    (* dont_touch = "true" *)reg [7:0]  RXD_delay;
    reg [15:0] rx_count;
    (* dont_touch = "true" *)reg [3:0]  rx_bit_count;
    reg        rx_start;
    
    always @(posedge clk or posedge rst) begin
        if(rst) begin
            RXD_delay <= 8'h00;
            rx_count <= 16'd0;
            rx_bit_count <= 4'd0;
            PS2_enable <= 1'b0;
            rx_start <= 1'b0;
        end
        else if(~RTS) begin
            if(rx_count < 16'd867) begin
    			rx_count <= rx_count + 16'd1;
    		end
    		else begin
    			rx_count <= 16'd0;
    		end
            
            if( (rx_count == 16'd0) && (~RXD) && (~rx_start) ) begin
                RXD_delay <= 8'h00;
                rx_bit_count <= 4'd0;
                rx_start <= 1'b1;
            end
            else if( (rx_count == 16'd0) && rx_start && (rx_bit_count != 4'd8)) begin
                rx_bit_count <= rx_bit_count + 4'd1;
                RXD_delay <= {RXD_delay[6:0], RXD};
            end
            else if( (rx_count == 16'd0) && rx_start) begin
                rx_start <= 1'b0;
                rx_bit_count <= 4'd0;
                PS2_enable <= 1'b1;
                case(RXD_delay[7:0])
                8'b00001100: begin PS2_data_out <= 8'hFF; end // Reset
                8'b10001100: begin PS2_data_out <= 8'hED; end // Set status LED
                8'b01001100: begin PS2_data_out <= 8'h07; end // LED byte
                8'b11001100: begin PS2_data_out <= 8'hEE; end // Echo
                8'b00101100: begin PS2_data_out <= 8'hFE; end // Resend
                default: begin PS2_data_out <= 8'hEE; end
                endcase
            end
            else begin
                PS2_enable <= 1'b0;
            end
        end
    end
    
    endmodule
    

    编译烧写测试

    由于代码是基于上一篇USB鼠标的教程,已经实际测试过,因此这里跳过仿真步骤,如果需要的话可以仿照前几篇教程中的仿真进行。

    在Vivado中新建名为usb_keyboard的工程,选择NEXYS 4 DDR 作为配置,并加入修改好的顶层代码usb_keyboard.v和上一篇教程中写好的ps2_transmitter.v。

    加入由官方约束文件NEXYS4.xdc修改成的引脚约束文件usb_keyboard.xdc:

    ## This file is a general .xdc for the Nexys4 DDR Rev. C
    ## To use it in a project:
    ## - uncomment the lines corresponding to used pins
    ## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project
    
    ## Clock signal
    set_property -dict {PACKAGE_PIN E3 IOSTANDARD LVCMOS33} [get_ports clk]
    create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports clk]
    
    
    ##Switches
    
    set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports rst]
    
    
    ##USB HID (PS/2)
    
    set_property -dict {PACKAGE_PIN F4 IOSTANDARD LVCMOS33} [get_ports USB_CLOCK]
    set_property -dict {PACKAGE_PIN B2 IOSTANDARD LVCMOS33} [get_ports USB_DATA]
    
    ##USB-RS232 Interface
    
    set_property -dict {PACKAGE_PIN C4 IOSTANDARD LVCMOS33} [get_ports RXD]
    set_property -dict {PACKAGE_PIN D4 IOSTANDARD LVCMOS33} [get_ports TXD]
    set_property -dict {PACKAGE_PIN D3 IOSTANDARD LVCMOS33} [get_ports CTS]
    set_property -dict {PACKAGE_PIN E5 IOSTANDARD LVCMOS33} [get_ports RTS]
    

    开始编译综合生成bitstream,为开发板连上USB烧写线,并烧写进bitstream。复位后打开Putty串口控制窗口,配置方式如下:
    uart1
    uart2
    为开发板上连上USB键盘,如果你只有一个键盘,可以在PC端开启一个虚拟键盘On-Screen Keyboard。先后输入几个指令,看到串口控制窗口如下:
    console

    • AA是接上键盘后传回的自测试完成信号0xAA
    • 0FAAA,发出0复位指令0xFF,键盘传回0xFA确认Acknowledge,重新自测试并传回自测试完成信号0xAA
    • 1FA2,发出1配置LED指令0xED,键盘返回0xFA确认,然后在发出2具体LED信息0x07,最低3位都是1,将全部三个LED都亮起,如下面的图片所示,键盘上两盏LED都亮起,还有一个大写锁定在另一边没拍下来
    • 3EE,发出3回声测试0xEE,键盘返回0xEE
    • 58F058EBF02B3CF03C21F02142F042,“随便”在键盘上打了几个字母,比如0x58是大写锁定,0xF058是松开大写锁定,其他几个字母都可以通过查上方的字符表得到
    • 442,发出4重传指令0xFE,把键盘中最后发出的数据0x42重传了一遍

    keyboard

    总结

    硬核键盘侠教程结束,下一篇讲VGA视频接口控制,不过VGA是给以前的电子管电视机使用的,希望能在下一篇开始前找到一个VGA转HDMI的转接口,不然我手上还真没有能用的VGA显示器。。。

    展开全文
  • 当出现以上错误时,说明数据表中有重复的数据存在,我们要做的就是要先找出重复的记录看是哪个字段,一般可能是ID字段,找到记录然后再删除它(推荐使用查询分析器执行语句)。 删除完成后,推荐还是在表中字段...
  • 程序员不是打字员,靠的思想,不是击次数。 个人觉得,相对于 CV 大法,使用模板更能让让专注于代码书写,更好地理清思路,更专心。 摸板?```没用过,在哪个地方? 怎么用,请指教~ ...
  • map集合

    2019-05-09 14:20:17
    所以说Map的键是不能重复的 list:列表 set:集合 map:映射 作业: HashTable和 HashMap的区别 Map的常用方法 添加:put(key,value); 得到某个键对应的值:get(key) 拿到所有值:values() 用Map的时候 一旦要确定好...
  • -值(key-value)这种方式存储用法字典名={'名': '键值','名': '键值','名': '键值'} 整型键值无需加引号需要注意的:后面有一个空格具体用法字典允许重复的,但是键值会取最后赋值的哪个键值例:...
  • 第二个:检测到重复键:'[object object]'。这可能会导致更新错误。 发现出错的位置一样的,可以推测由一个原因导致的,既然人家不让用非基本值做为键那咱就不用呗 修改: 完工!!! ...
  • 如果键是一个对象的话,不同的对象就是不同的key 但是如果一个对象内相同的值看做是同一个对象的话就在model里面重写HashCode()和equals()方法,map是先从key的hashcode()来决定在存入map哪个地方的哪个链,...
  • 第12章 事件 (五)

    2012-03-15 14:52:30
    12.4.3 键盘事件 用户在使用键盘时会触发键盘事件。“DOM2级事件” 最初规定了键盘事件,但在最终定稿之前又删除了相应的内容。...keydown: 当用户按下键盘上的任意时触发,而且如果按住不放的话,会重复触发此事
  • Map添加相同的key

    万次阅读 2018-09-09 10:37:12
    如果键是一个对象的话,不同的对象就是不同的key 但是如果一个对象内相同的值看做是同一个对象的话就在model里面重写HashCode()和equals()方法,map是先从key的hashcode()来决定在存入map哪个地方的...
  • 哈希表

    2021-04-24 12:09:28
    概述 哈希表一种使用哈希函数...当我们插入一个新时,哈希函数将决定该应该分配到哪个桶中,并将该存储在相应的桶中; 当我们想要搜索一个时,哈希表将使用相同的哈希函数来查找对应的桶,并只在特定的桶
  • 做了一个mfc的外挂程序,连接了多个扫描枪以及一个键盘,需要区分哪些内容是哪个设备输入的。 网上找了很多资料,大多是在扫描枪中设置前后缀,然后使用Hook回调函数获取键盘输入,再根据前后缀判断是哪一把扫描枪。...
  • 窗口切换快捷键

    2019-09-24 03:38:43
    重复按下Tab,就会在各个已经打开的窗口间转换,要将哪个窗口激活,只要将方框移动到这个图标上,然后松开这两个,这样这个窗口就打开了。2. Alt+Esc同样按下Alt不松开,然后通过按Esc,...
  • python中的哈希

    2020-07-04 12:09:54
    (1)当我们插入一个新的时,哈希函数将决定该应该分配到哪个桶中,并将该存储在相应的桶中; (2)当我们想要搜索一个时,哈希表将使用相同的哈希函数来查找对应的桶,并只在特定的桶中进行搜索。 在python...
  • vscode快速生成html模板文件的方法

    千次阅读 2020-09-30 12:29:36
    此时创建的空白的html,但是html里面有很多重复标签我们不想每次都手动敲,怎么办? 不慌,看下去 第二步,打开刚刚新的空白html,在html页面内输入英文感叹号!,就会有智能提醒,按下Tab即可 注意下面的三个...
  • 哪种编程语言最适合你

    千次阅读 2014-10-13 11:07:06
    收集总结了关于每种编程语言的特点,来看一下,哪个是你想要的菜。 Java 喜欢Java的人肯定喜欢打字。我指的就是敲打键盘上的。你得不断地重复重复。 设计Java系统的人个疯子,他解
  • linux第五天

    2020-07-10 16:31:04
    今日重要知识点: 1.HISTFILE这个变量控制着历史命令保存到哪个文件中。默认历史命令存在于.bash_history这个文件中。 2.HISTTIMEFORMAT这个变量控制着历史命令...之后按向上的只能调出重复命令的一个,例如之前输入
  • 笔记本出现开不了机的故障,具体表现为第一次按下电源后3秒左右关机,然后如此循环重复按下电源大概20次后,可以看见进入windows进度条了,但还是倒在了欢迎界面前,接着试了几次大都在进度条运行完后2,3秒未...
  • 谈谈Activity管理

    2020-05-12 19:43:34
    关于栈的概念和启动模式 1、为什么需要四种启动模式?池复用,因为按默认情况启动...4、不管当前显示哪个栈,按home,再次进入,显示默认栈。 5、onNewIntent和onRestart的区别?前者Intent方式重复启动回调,后者
  • VBA学习笔记1-VBA集合Collection

    千次阅读 2019-12-28 14:08:43
    VBA集合Collection创建集合集合常用属性和方法添加集合大小读取集合特定元素内容集合删除办法 创建集合 Dim c As New Collection 集合常用属性和方法 ...before:插入位置,在哪个位置前面,可以索引(...
  • id主键的创建及作用

    千次阅读 2020-04-15 22:14:42
    然后这些字段只是理论上唯一的,例如使用图书编号为主键,这个图书编号只是理论上来说唯一的,但实践中可能会出现重复的 情况。所以还是设置一个与业务无关的自增ID作为主键,然后增加一个图书编号的唯一性...
  • Linux使用makefile的用法

    千次阅读 2018-01-08 18:10:42
    一、明白使用makefile的原因 有时候我们在写命令的时候要写很多命令,有一些命令还是...注意一些格式:冒号前面想生成的文件,冒号后面的它所依赖的文件,就是从哪个文件才能变过来,然后找到之后回车按一下tab
  • 为什么要使用自增ID作为主键

    千次阅读 2018-12-27 15:20:00
    然后这些字段只是理论上唯一的,例如使用图书编号为主键,这个图书编号只是理论上来说唯一的,但实践中可能会出现重复的 情况。所以还是设置一个与业务无关的自增ID作为主键,然后增加一个图书编号的唯一性...
  • Redis 实现分布式锁,思路使用 setnx 命令在 Redis 上创建相同的 Key,因为 Key 值不允许重复哪个客户端能够创建成功,就能获取到锁,否则,就会进行等待,当释放锁后,就会通知客户端去争夺锁资源。 和 set ...
  • 报这个错呢,就是导入...现在知道是哪个重复了(Error:com.android.dex.DexException: Multiple dex files define Lcom/ta/utdid2/b/a/d;),那么来找到它的位置:双击shift,输入utdid:可以看到,这里有两个jar...
  • isomagic-template-源码

    2021-05-20 06:22:46
    我们将id属性用作,然后将其删除,这样,无论在DOM中使用模板的哪个位置,它都不会创建重复的id。 中间件 不包括在内 TLC格式 template#translate --templateid :必填 --data :可选,默认为{}。 用给定的数据...
  • 如果接着按第二个则对modify进行加 加到第几个后再按第一个 显示modify值 显示input NO.* ,按下号码 (只能11位的号码) (液晶显示不准确 除第一次外会重复显示上一次的值) 按下够11位后液晶显示修改后的...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 130
精华内容 52
关键字:

重复键是哪个