键盘输入显示

键盘输入显示
键盘输入显示

摘要:

键盘是最常用人机接口设备之一,在嵌入式系统中有着相当广泛的应用。一般自行设计的简易矩阵键盘仅仅是按行、列排列起来的矩阵开关。当需要较多的按键时,则会占用较多的I/O 端口,在软件上则要进行上电复位按键扫描及通信处理,而且还要加上按键的去抖动处理,增大了软硬件开销。而PS/2 键盘,内嵌自动去除按键抖动设计,自动地识别键的按下与释放,软硬件开发简便,价格便宜,稳定可靠,将PS/2 键盘作为嵌入式系统的输入设备已经成为可行的方案。

本设计是以现场可编程逻辑器件(FPGA)为核心的PS/2接口键盘的输入识别电路。利用QuartusⅡ软件编写verilog HDL硬件描述语言程序以实现键盘部分简单键值的识别与输出。本设计主要以程序为核心,硬件电路的搭建使用FPGA实验箱,将程序顶层文件里定义的输入输出端口与实验箱管脚进行相应的配置,除实验箱上的reset键以外,外设是一个与实验箱通过PS/2接口相连的键盘和VGA接口相连的显示屏。当系统上电后,按下键盘上的按键,实验箱上的数码管可以依次显示从键盘上输入的键值,同时VGA显示屏显示键值。

关键字:

Ps/2接口键盘、FPGA 、Quartus Ⅱ、Verilog HDL、 VGA接口

键盘输入显示

?课程设计目的

(1)巩固和加深所学电子技术课程的基本知识,提高综合运用所学知识的能力;

(2)培养学生根据课题需要选用参考书、查阅手册、图表和文献资料的能力,提高学生独立解决工程实际问题的能力.

(3)通过设计方案的分析比较、设计计算、元件选绎及电路安装调试等环节.初步掌握简单实用电路的工程设计方法.

(4)提高学生的动手能力.掌握常用仪器设备的正确使用方法,学会对简单实用电路的实验调试和对整机指标的测试方法,

(5)了解与课题有关的电路以及元器件的工程技术规范,能按课程设计任务书的要求编写设计说明书,能正确反映设计和实验成果,能正确绘制电路固等.

?设计任务与要求

1.任务:设计一个键盘输入显示控制电路

2.要求和指标:

(1)由键盘输入0~F,总计16个字符,由开发板上的数码管显示;

(2)该字符同时能在VGA上显示输出;

3. 扩展要求:

(A)能在VGA显示屏上切换字符显示的大小。

(B)能连续显示输入字符;

三、方案设计与论证

本电路总共分为分频模块、PS/2键盘输入模块、字符码转换模块、VGA驱动模块。各模块之间的关系如下图所示:

使用现场可编程逻辑器件(FPGA)制作,利用Verilog HDL硬件描述语言编程进行控制,然后下载至实验箱实现。利用QuartusⅡ软件编写verilog HDL 硬件描述语言程序以实现键盘部分简单键值的识别与输出。硬件电路的搭建使用FPGA实验箱,将程序顶层文件里定义的输入输出端口与实验箱管脚进行相应

的配置,除实验箱上的reset键以外,外设是一个与实验箱通过PS/2接口相连的键盘。

工作原理:对键盘按键进行扫描,采集按键的扫描码,然后字符码转换分为两路传送:一条送入数码显示管进行字符显示;另一条通过字模软件获取键盘输入字的字模数据,送入VGA驱动,进行字符的VGA显示。

四.单元电路设计与参数计算

设计分为三部分。分别为键盘数据接收部分、数码管显示部分和VGA

显示部分。模块电路设计及说明:

1.键盘数据接收部分

键盘PS/2的接口简介:

接口的六个脚中,只有四个脚有意义,分别是:时钟脚、数据脚、电源脚、电源地。其余为保留脚。PS/2靠系统的PS/2端口提供+5V电源。这里需要用到

的即是:时钟脚和数据脚。这两个脚都是集电极开路,所以必须接大阻值的上

拉电阻。他们平时保持高电平,有输出时才被拉到低电平,之后自动上浮到高

电平。

PS/2设备的clock和data平时都是高电平。当设备等待发送数据时,它首

先检查clock是否为高。如果为低,则认为PC抑制了通讯,此时它缓冲数据知

道获得总线的控制权。如果clock为高电平,PS/2设备则开始向PC发送数据。

数据位在clock为高电平时准备好,在clock下降沿被PC读入。

数据从键盘发送到主机或从主机发送到键盘,时钟都是PS/2设备产生,主

机对时钟控制有优先权,即主机想发送控制指令给PS/2设备时,可以拉低时钟

线至少100us。然后再下拉数据线,最后释放时钟线为高。PS/2设备的时钟线

和数据线都是集电极开路的,容易实现拉低电平。

其数据发送时序如下:

键盘发送时序

键盘接收时序

因为我们的功能只涉及到键盘的数据发送,所以对接收不做具体说明。现在

的PC机使用的PS/2键盘都默认采用第二套扫描码集,扫描码有两种不同的类型:通码和断码。当一个键被按下或持续按住时,键盘会将改键的通码发送给

主机;而当一个键被释放时,键盘会将该键的断码发送给主机。

我们做的比较简单,因此只用到了第一类按键。(返回值见附录)

第一类按键:通码为1字节,断码为0xF0+通码形式。如1键,其通码为0x16,断码为0xF0 0x1C.

在具体的实验过程中,PS/2键盘通过Clock管脚来控制通信方向并且充当

本次实验的一个时钟管脚,在键盘时钟下,数据段进行收发数据,本次实验只

是使用它来发送数据,未设计键盘接收数据。每按下一个键,data管脚发送一

个数据帧,具体格式如下:

PS/2键盘扫描码

此模块的功能说明:当按下一个键时,FPGA在时钟信号下接受来自PS/2

键盘的数据(8个数据位),接收完毕后锁存并转化为十六进制数据,例如4’ha。当按键放开时,发出信号change。这时开始识别按键,如果接收到8’d102,则

表示接收到按键Backspace,则清空显示数据。否则,数码管进行译码后则显示

键盘的键值。

总体来说,此部分分为接收数据模块、数据判断与锁存模块、键值转化模块。

2.数码管显示部分

此模块的功能说明:这部分内容较简单,由于已经得到了键盘信息,在接

收到change信号后,且十六进制数据不是8’d102时(即不是Backspace清零信号),则根据数字对应的通码反过来找数字,经过8段数码管的译码后显示键盘键值。可显示的键值有:0~9,a~f。

此部分总体分为数据接收模块、分频模块、位选信号模块、译码模块。之

所以有分频主要是为了提供数码管动态扫描的扫描频率,频率要适中。否则数

码管不能正常工作。

3.VGA显示部分

VGA时序控制模块是整个显示控制器的关键部分,最终的输出信号行、场同步信号必须严格按照VGA时序标准产生相应的脉冲信号。对于普通的VGA显示器,其引出线的共含5个信号:G,R,B(三基色信号),HS(行同步信号)VS (场同步信号)。在五个信号时序驱动时,VGA显示器要严格遵循“VGA工业标准”,即640×480×25MHz模式或800×600×40MHz模式,本次字符显示试验采用800×600×40MHz模式。

五.程序设计

程序代码见附录

六.程序调试

1、运行Quartus II软件,新建工程和命名顶层文件。

2、建立文件Verilog HDL File。命名为ps2.v。在文件中写入程序,保存,编译。

3、分配管脚。保存,编译。

4、先下载简单的程序,已确定实验箱可用。

5、之后将生成的.sof文件下载至FPGA实验箱中。

6、在键盘上一次输入0~9,a~f。观察数码管显示的数据是否与键盘的输入键值相同。

7、若不相同或不完全相同,则分模块调试。

调试现象:

1、分别输入0~9和a~f,数码管上均能正确显示,VGA正确显示。

2、输入其他的键值,数码管显示0,VGA显示0。

七.遇到的问题及解决方法

1.不会使用Quartus II软件及verilog HDL语言编写程序。

学习老师给的资料,并在图书馆借阅资料,尝试编写一些简单的verilog HDL程序,熟悉Quartus II软件及verilog HDL语言编写程序的方法。

2. 数码管显示不正确。

不会连接DE0的管脚,管脚配置不正确导致数码管显示异常。查看老师给的文件DE0_User_manual.pdf,学习DE0管脚接法。

3.VGA显示时,屏幕无显示,且出现‘闪屏’。

VGA的时钟控制信号要求为25M Hz,编程时为编写分频器模块,因此时钟输入为50M Hz。解决办法是利用DE0的锁相环二分频得到25M Hz 输入信号。八.结论与心得

通过本次课程设计,让我对FPGA有了进一步的了解,虽然我们只做了一些最底层、最基本的设计,也只接触了那么一些小小的内容,但通过整个设计过程使我深深地了解了FPGA的强大功能,认识了一些单元的工作原理。

我们小组做的是键盘输入显示,能在DE0的七段数码显示管上显示,也能在VGA上显示键盘输入的字符,从头到尾让我对PS/2键盘、VGA显示原理都有了深刻的认识。在此过程中我们也遇到了许多困难,最开始不会使用Quartus II软件及verilog HDL语言编写程序,我们就开始学习老师给的资料,并在图书馆借阅资料,尝试编写一些简单的verilog HDL程序,熟悉Quartus II软件及verilog HDL语言编写程序的方法,但是对所选的题没有思路,于是我们就看老师所给的程序,理解它的功能,从而得到编程的“灵感”。通过不断地努力,我们初步编写出程序。

在调试程序时出现了不少语法错误,在看了verilog HDL语言的书后,我们发现了这些错误。总之,设计过程中困难是多种多样的,但我们没放弃,通过查阅资料、询问老师、小组讨论、商量都一一解决了。在此过程中也让我们提高了真正地去发现问题、分析问题、解决问题的能力,获益匪浅。本次课程设计也让认识到只有真正的理解一个东西的工作原理过后,才知道如何下手去解决问题,盲目地写程序,摘抄别人的东西最终还是一无所获。

九.参考文献

【1】崔葛瑾.基于FPGA的数字电路系统设计.西安电子科技大学出版社.2008 【2】郭永贞.数字电路实验与EDA技术.东南大学出版.2010

附录一:

扫描码表:

附录二:

键盘数据接收部分:

`timescale 1ns / 1ps

///////////////////////////////////////////////////////////////////////////

module

ps2(clk,rst_n,ps2k_clk,ps2k_data,oSEG,hsync,vsync,vga_r,vga_g,vga_b);

input clk; //50M时钟信号

input rst_n; //复位信号,active_low

input ps2k_clk; //PS2接口时钟信号

input ps2k_data; //PS2接口数据信号

output [6:0] oSEG; //数码管显示值

output hsync; //行同步信号

output vsync; //场同步信号

output[2:0] vga_r;

output[2:0] vga_g;

output[1:0] vga_b;

reg [6:0] oSEG;

reg[7:0] ps2_asci; //1byte键值,只做简单的按键扫描,以ASCII码保存。

//------------------------------------------

reg ps2k_clk_r0,ps2k_clk_r1,ps2k_clk_r2; //ps2k_clk状态寄存器

wire pos_ps2k_clk; // ps2k_clk上升沿标志位

wire neg_ps2k_clk; // ps2k_clk下降沿标志位

always @ (posedge clk or negedge rst_n)

begin //去抖动

if(!rst_n) begin

ps2k_clk_r0 <= 1'b0;

ps2k_clk_r1 <= 1'b0;

ps2k_clk_r2 <= 1'b0;

end

else begin //锁存状态,sequential execution

ps2k_clk_r0 <= ps2k_clk;

ps2k_clk_r1 <= ps2k_clk_r0;

ps2k_clk_r2 <= ps2k_clk_r1;

end

end

assign neg_ps2k_clk = ~ps2k_clk_r1 & ps2k_clk_r2; //下降沿

//------------------------------------------

reg[7:0] ps2_byte_r; //接收来自PS2的一个字节数据存储器

reg[7:0] temp_data; //当前接收数据寄存器

reg[3:0] num; //计数寄存器

always @ (posedge clk or negedge rst_n)

begin

if(!rst_n) begin

num <= 4'd0;

temp_data <= 8'd0;

end

else if(neg_ps2k_clk) begin //检测到ps2k_clk的下降沿case (num)

4'd0: num <= num+1'b1;

4'd1: begin

num <= num+1'b1;

temp_data[0] <= ps2k_data;

//bit0

end

4'd2: begin

num <= num+1'b1;

temp_data[1] <= ps2k_data;

//bit1

end

4'd3: begin

num <= num+1'b1;

temp_data[2] <= ps2k_data;

//bit2

end

4'd4: begin

num <= num+1'b1;

temp_data[3] <= ps2k_data;

//bit3

end

4'd5: begin

num <= num+1'b1;

temp_data[4] <= ps2k_data;

//bit4

end

4'd6: begin

num <= num+1'b1;

temp_data[5] <= ps2k_data;

//bit5

end

4'd7: begin

num <= num+1'b1;

temp_data[6] <= ps2k_data;

//bit6

end

4'd8: begin

num <= num+1'b1;

temp_data[7] <= ps2k_data;

//bit7

end

4'd9: begin

num <= num+1'b1;//odd-even check bit

end

4'd10: begin

num <= 4'd0; // num清零

end

default: ;

endcase

end

end

reg key_f0; //松键标志位,置1表示接收到键盘断码数据8'hf0,再接收到下一个数据后清零

reg ps2_state_r; //键盘当前状态,ps2_state_r=1表示有键被按下

always @ (posedge clk or negedge rst_n) begin//接收数据的相应处理,这里只对1byte的键值进行处理

if(!rst_n) begin

key_f0 <= 1'b0;

ps2_byte_r <= 8'h45;

end

else if(num==4'd10)//刚传送完一个字节数据

begin

if(temp_data == 8'hf0)

key_f0 <= 1'b1;

else begin

if(!key_f0) begin //说明有键按下

ps2_state_r <= 1'b1;

ps2_byte_r <= temp_data;//锁存当前键

end

else begin

ps2_state_r <= 1'b0;

key_f0 <= 1'b0;

end

end

end

end

数码管显示部分:

always @ (ps2_byte_r) begin

case (ps2_byte_r) //键值转换为ASCII码,只处理十六进制数字

8'h24: ps2_asci <= 8'h45; //E

8'h1c: ps2_asci <= 8'h41; //A

8'h23: ps2_asci <= 8'h44; //D

8'h2b: ps2_asci <= 8'h46; //F

8'h21: ps2_asci <= 8'h43; //C

8'h32: ps2_asci <= 8'h42; //B

8'h45: ps2_asci <= 8'h30; //0

8'h16: ps2_asci <= 8'h31; //1

8'h1e: ps2_asci <= 8'h32; //2

8'h26: ps2_asci <= 8'h33; //3

8'h25: ps2_asci <= 8'h34; //4

8'h2e: ps2_asci <= 8'h35; //5

8'h36: ps2_asci <= 8'h36; //6

8'h3d: ps2_asci <= 8'h37; //7

8'h3e: ps2_asci <= 8'h38; //8

8'h46: ps2_asci <= 8'h39; //9

default: ps2_asci <= 8'h30;

endcase

end

always @(ps2_asci)

begin //oSEG的7位和数码管的7段的code

case(ps2_asci)

8'd14: oSEG <= 7'b0000110; // ---t-- //reference:DE0 demonstration default

8'h41: oSEG <= 7'b0001000; // | |

8'h44: oSEG <= 7'b0100001; // lt rt

8'h46: oSEG <= 7'b0001110; // | |

8'h43: oSEG <= 7'b1000110; // ------

8'h42: oSEG <= 7'b0000011; // | |

8'h30: oSEG <= 7'b1000000; // lb rb

8'h31: oSEG <= 7'b1111001; // | |

8'h32: oSEG <= 7'b0100100; // ---b--

8'h33: oSEG <= 7'b0110000;

8'h34: oSEG <= 7'b0011001;

8'h35: oSEG <= 7'b0010010;

8'h36: oSEG <= 7'b0000010;

8'h37: oSEG <= 7'b1011000;

8'h38: oSEG <= 7'b0000000;

8'h39: oSEG <= 7'b0010000;

endcase

end

/*

clk PIN_G21

rst_n PIN_H2 //BUTTON0

ps2k_clk PIN_P22

ps2k_data PIN_P21

oSEG[0] PIN_E11

oSEG[1] PIN_F11

oSEG[2] PIN_H12

oSEG[3] PIN_H13

oSEG[4] PIN_G12

oSEG[5] PIN_F12

oSEG[6] PIN_F13 */

VGA显示部分:

reg [1:0] c;

wire clk_25m;

pll u1

(.inclk0(clk),

.c0(clk_25m));

//--------------------------------------------------

// 坐标计数

reg[9:0] x_cnt; //行坐标

reg[9:0] y_cnt; //列坐标

reg[7:0]

char_line0,char_line1,char_line2,char_line3,char_line4,char_line5;

reg[7:0] char_line6,char_line7,char_line8,char_line9,char_linea;

reg[7:0] char_lineb,char_linec,char_lined,char_linee,char_linef;

always @ (posedge clk_25m or negedge rst_n)

if(!rst_n) x_cnt <= 10'd0;

else if(x_cnt == 10'd799) x_cnt <= 10'd0;

else x_cnt <= x_cnt+1'b1;

always @ (posedge clk_25m or negedge rst_n)

if(!rst_n) y_cnt <= 10'd0;

else if(y_cnt == 10'd524) y_cnt <= 10'd0;

else if(x_cnt == 10'd799) y_cnt <= y_cnt+1'b1;

//--------------------------------------------------

// VGA场同步,行同步信号

reg hsync_r,vsync_r; //同步信号

always @ (posedge clk_25m or negedge rst_n)

if(!rst_n) hsync_r <= 1'b1;

else if(x_cnt == 10'd0) hsync_r <= 1'b0; //产生hsync信号

else if(x_cnt == 10'd96) hsync_r <= 1'b1;

always @ (posedge clk_25m or negedge rst_n)

if(!rst_n) vsync_r <= 1'b1;

else if(y_cnt == 10'd0) vsync_r <= 1'b0; //产生vsync信号

else if(y_cnt == 10'd2) vsync_r <= 1'b1;

assign hsync = hsync_r;

assign vsync = vsync_r;

//--------------------------------------------------

//有效显示标志位产生

reg valid_yr;//行显示有效信号

always @ (posedge clk_25m or negedge rst_n)

if(!rst_n) valid_yr <= 1'b0;

else if(y_cnt == 10'd32) valid_yr <= 1'b1;

else if(y_cnt == 10'd512) valid_yr <= 1'b0;

wire valid_y = valid_yr;

reg valid_r; // VGA有效显示区标志位

always @ (posedge clk_25m or negedge rst_n)

if(!rst_n) valid_r <= 1'b0;

else if((x_cnt == 10'd141) && valid_y) valid_r <= 1'b1;

else if((x_cnt == 10'd781) && valid_y) valid_r <= 1'b0;

wire valid = valid_r;

//wire[9:0] x_dis; //横坐标显示有效区域相对坐标值0-639 wire[9:0] y_dis; //竖坐标显示有效区域相对坐标值0-479

//assign x_dis = x_cnt - 10'd142;

assign y_dis = y_cnt - 10'd33;

//--------------------------------------------------

//--------------------------------------------------

// VGA色彩信号产生

/*

RGB = 000 黑色RGB = 100 红色

= 001 蓝色= 101 紫色

= 010 绿色= 110 黄色

= 011 青色= 111 白色

*/

/*EDN字模参数*/

always @(ps2_asci)

begin

if(ps2_asci==8'h30)

begin

char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'h18;

char_line4 <= 8'h24;

char_line5 <= 8'h42;

char_line6 <= 8'h42;

char_line7 <= 8'h42;

char_line8 <= 8'h42;

char_line9 <= 8'h42;

char_linea <= 8'h42;

char_lineb <= 8'h42;

char_linec <= 8'h24;

char_lined <= 8'h18;

char_linee <= 8'h00;

char_linef <= 8'h00; //0

end

else if(ps2_asci==8'h31)

begin

char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h10;

char_line3 <= 8'h70;

char_line4 <= 8'h10;

char_line5 <= 8'h10;

char_line6 <= 8'h10;

char_line7 <= 8'h10;

char_line8 <= 8'h10;

char_line9 <= 8'h10;

char_linea <= 8'h10;

char_lineb <= 8'h10;

char_linec <= 8'h7C;

char_lined <= 8'h00;

char_linef <= 8'h00; //1

end

else if(ps2_asci==8'h32) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h3C;

char_line3 <= 8'h42;

char_line4 <= 8'h42;

char_line5 <= 8'h42;

char_line6 <= 8'h04;

char_line7 <= 8'h04;

char_line8 <= 8'h08;

char_line9 <= 8'h10;

char_linea <= 8'h20;

char_linec <= 8'h42;

char_lined <= 8'h7E;

char_linee <= 8'h00;

char_linef <= 8'h00; //2

end

else if(ps2_asci==8'h33) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'h3C;

char_line4 <= 8'h42;

char_line5 <= 8'h42;

char_line7 <= 8'h18;

char_line8 <= 8'h04;

char_line9 <= 8'h02;

char_linea <= 8'h02;

char_lineb <= 8'h42;

char_linec <= 8'h44;

char_lined <= 8'h38;

char_linee <= 8'h00;

char_linef <= 8'h00; //3

end

else if(ps2_asci==8'h34) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'h04;

char_line4 <= 8'h0C;

char_line5 <= 8'h14;

char_line6 <= 8'h24;

char_line7 <= 8'h24;

char_line8 <= 8'h44;

char_line9 <= 8'h44;

char_linea <= 8'h7E;

char_lineb <= 8'h04;

char_linec <= 8'h04;

char_lined <= 8'h1E;

char_linee <= 8'h00;

char_linef <= 8'h00; //4

end

else if(ps2_asci==8'h35) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'h7E;

char_line4 <= 8'h40;

char_line5 <= 8'h40;

char_line6 <= 8'h40;

char_line7 <= 8'h58;

char_line8 <= 8'h64;

char_line9 <= 8'h02;

char_linea <= 8'h02;

char_lineb <= 8'h42;

char_linec <= 8'h44;

char_lined <= 8'h38;

char_linef <= 8'h00; //5

end

else if(ps2_asci==8'h36)begin char_line0 <= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'h1C;

char_line4 <= 8'h24;

char_line5 <= 8'h40;

char_line6 <= 8'h40;

char_line7 <= 8'h58;

char_line8 <= 8'h64;

char_line9 <= 8'h42;

char_linea <= 8'h42;

char_lineb <= 8'h42;

char_linec <= 8'h24;

char_lined <= 8'h18;

char_linee <= 8'h00;

char_linef <= 8'h00; //6

end

else if(ps2_asci==8'h37) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'h7E;

char_line4 <= 8'h44;

char_line5 <= 8'h44;

char_line6 <= 8'h08;

char_line7 <= 8'h08;

char_line8 <= 8'h10;

char_line9 <= 8'h10;

char_linea <= 8'h10;

char_lineb <= 8'h10;

char_linec <= 8'h10;

char_lined <= 8'h10;

char_linee <= 8'h00;

char_linef <= 8'h00; //7

end

else if(ps2_asci==8'h38) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'h3C;

char_line5 <= 8'h42;

char_line6 <= 8'h42;

char_line7 <= 8'h24;

char_line8 <= 8'h18;

char_line9 <= 8'h24;

char_linea <= 8'h42;

char_lineb <= 8'h42;

char_linec <= 8'h42;

char_lined <= 8'h3C;

char_linee <= 8'h00;

char_linef <= 8'h00; //8

end

else if(ps2_asci==8'h39) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'h18;

char_line4 <= 8'h24;

char_line5 <= 8'h42;

char_line6 <= 8'h42;

char_line7 <= 8'h42;

char_line8 <= 8'h26;

char_line9 <= 8'h1A;

char_linea <= 8'h02;

char_lineb <= 8'h02;

char_linec <= 8'h24;

char_lined <= 8'h38;

char_linee <= 8'h00;

char_linef <= 8'h00; //9

end

else if(ps2_asci==8'h41) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'h10;

char_line4 <= 8'h10;

char_line5 <= 8'h18;

char_line6 <= 8'h28;

char_line7 <= 8'h28;

char_line8 <= 8'h24;

char_line9 <= 8'h3C;

char_linea <= 8'h44;

char_lineb <= 8'h42;

char_lined <= 8'hE7;

char_linee <= 8'h00;

char_linef <= 8'h00;//A

end

else if(ps2_asci==8'h42) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'hF8;

char_line4 <= 8'h44;

char_line5 <= 8'h44;

char_line6 <= 8'h44;

char_line7 <= 8'h78;

char_line8 <= 8'h44;

char_line9 <= 8'h42;

char_linea <= 8'h42;

char_lineb <= 8'h42;

char_linec <= 8'h44;

char_lined <= 8'hF8;

char_linee <= 8'h00;

char_linef <= 8'h00; //B

end

else if(ps2_asci== 8'h43) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'h3E;

char_line4 <= 8'h42;

char_line5 <= 8'h42;

char_line6 <= 8'h80;

char_line7 <= 8'h80;

char_line8 <= 8'h80;

char_line9 <= 8'h80;

char_linea <= 8'h80;

char_lineb <= 8'h42;

char_linec <= 8'h44;

char_lined <= 8'h38;

char_linee <= 8'h00;

char_linef <= 8'h00; //C

end

else if(ps2_asci==8'h44) begin char_line0<= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'hF8;

char_line4 <= 8'h44;

char_line5 <= 8'h42;

char_line6 <= 8'h42;

char_line7 <= 8'h42;

char_line8 <= 8'h42;

char_line9 <= 8'h42;

char_linea <= 8'h42;

char_lineb <= 8'h42;

char_linec <= 8'h44;

char_lined <= 8'hF8;

char_linee <= 8'h00;

char_linef <= 8'h00; //D

end

else if(ps2_asci==8'h45) begin char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'hFC;

char_line4 <= 8'h42;

char_line5 <= 8'h48;

char_line6 <= 8'h48;

char_line7 <= 8'h78;

char_line8 <= 8'h48;

char_line9 <= 8'h48;

char_linea <= 8'h40;

char_lineb <= 8'h42;

char_linec <= 8'h42;

char_lined <= 8'hFC;

char_linee <= 8'h00;

char_linef <= 8'h00;//E

end

else begin

char_line0<= 8'h00;

char_line1 <= 8'h00;

char_line2 <= 8'h00;

char_line3 <= 8'hFC;

char_line4 <= 8'h42;

char_line5 <= 8'h48;

char_line6 <= 8'h48;

char_line7 <= 8'h78;

char_line8 <= 8'h48;

C语言程序设计中键盘输入数据的方法分析

Computer Science and Application 计算机科学与应用, 2019, 9(2), 323-327 Published Online February 2019 in Hans. https://www.360docs.net/doc/df13898872.html,/journal/csa https://https://www.360docs.net/doc/df13898872.html,/10.12677/csa.2019.92037 Method Analysis of Keyboard Input Data in C Language Programming Kui Gao, Xiaocui Fu, Weiyan Li Information Science and Engineering, Shandong Agricultural University, Tai’an Shandong Received: Jan. 28th, 2019; accepted: Feb. 6th, 2019; published: Feb. 13th, 2019 Abstract In C language programming, it is often necessary to input the required data from the keyboard, which can be achieved by different input functions. In this paper, some examples and analysis are given for the use of these input functions; through comparison, usage and considerations of each function have been analyzed, to achieve the purpose of correct use. Keywords Scanf, Getchar, Gets, Separator, Keyboard C语言程序设计中键盘输入数据的方法分析 高葵,付晓翠,李蔚妍 山东农业大学信息科学与工程学院,山东泰安 收稿日期:2019年1月28日;录用日期:2019年2月6日;发布日期:2019年2月13日 摘要 在C语言程序设计中经常需要从键盘输入所需要的数据,可以通过不同的输入函数来实现。本文对这几个输入函数的使用举例并进行分析说明,通过比较,分析出每种函数的使用方法和注意事项,达到正确使用的目的。 关键词 Scanf,Getchar,Gets,分隔符,键盘

LED显示屏控制软件操纵使用说明(灵信V3.3)

第一章概述 1.1 功能特点 《LED Player V3.3》是本公司新推出的一套专为LED显示屏设计的功能强大,使用方便,简单易学的节目制作、播放软件,支持多种文件格式:文本文件,WORD文件,图片文件(BMP/JPG/GIF/JPEG...),动画文件(SWF /Gif)。 2.2 运行环境 操作系统 中英文Windows/7/NT/XP 硬件配置 CPU: 奔腾600MHz以上 内存:128M 相关软件 OFFICE2000--如需WORD文件必须安装

第二章安装与卸载 2.1 安装 《LED Player》软件安装很简单,操作如下:将LED Player播放软件的安装光盘插入电脑光驱,即可显示LED Player播放软件的安装文件,双击LED Player,即可实现轻松安装。 《LED Player》软件安装成功后,在【开始】/【程序】里将出现“LED软件”程序组,然后进入该程序组下的“LED Player”,单击即可运行,如图所示, opyright ? 2005-2007 Listen tech. All Rights Reserved 灵感设计诚信 同时,桌面上也出现“LED Player”快捷方式:如右图所示,双击它同样可以启动程序。

2.2 卸载 《LED Player》软件提供了自动卸载功能,使您可以方便地删除《LED Player》的所有文件、程序组和快捷方式,用户可以在“LED软件”组中选择“卸载LED Player”,也可在【控制面板】中选择【添加/删除程序】快速卸载. 第三章使用详解 3.1 节目组成 每块显示屏由一个或多个节目页组成。节目页是用来显示用户所要播放的文本、图片、动画等内容。区域窗口有十一种:图文窗、文本窗、单行文本窗、静止文本窗、时间窗、正计时窗、倒计时窗、模拟时钟窗、表格窗、动画窗、温度窗。 文件窗:可以播放各种文字、图片、动画、表格等几十种文件。 文本窗:用于快速输入简短文字,例如通知等文字。 单行文本窗:用于播放单行文本,例如通知、广告等文字。 静止文本窗:用于播放静止文本,例如公司名称、标题等文字。 时间窗:用于显示数字时间。 计时窗:用于计时,支持正/倒计时显示。

51单片机数码管显示矩阵键盘键入值

51单片机实现数码管显示矩阵键盘键入值 #include #define uchar unsigned char uchar code decode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; void delay(uchar); uchar temp,b,c,d,num; void display(uchar); void main() { while(1) { P0=0xfe; temp=P0; temp=temp&0xf0; if(temp!=0xf0) { delay(100); if(temp!=0xf0) { switch(temp)

case 0xe0:num=0;break; case 0xd0:num=1;break; case 0xb0:num=2;break; case 0x70:num=3;break; } } } P0=0xfd; temp=P0; temp=temp&0xf0; if(temp!=0xf0) { delay(100); if(temp!=0xf0) { switch(temp) { case 0xe0:num=4;break; case 0xd0:num=5;break; case 0xb0:num=6;break; case 0x70:num=7;break;

} } P0=0xfb; temp=P0; temp=temp&0xf0; if(temp!=0xf0) { delay(100); if(temp!=0xf0) { switch(temp) { case 0xe0:num=8;break; case 0xd0:num=9;break; case 0xb0:num=10;break; case 0x70:num=11;break; } } } P0=0xf7; temp=P0;

通过键盘输入一组数字

一、通过键盘输入一组数字,并用单链表形式存储,输入完成后分别按顺序和逆序输出所输 入的数字。(作者:缪海涛) 解: #include #include #include typedef struct node { int c; struct node *link; }Node; Node *head; Node *first() { Node *h2; h2=(Node *)malloc(sizeof(Node)); h2->c='\0'; h2->link=NULL; return h2; } Node *create(Node *h2) { Node *p,*h,*s,*r; int x; char y; h=(Node *)malloc(sizeof(Node)); h->link=NULL; p=h; printf("请输入一组数字,以空格间隔:\n"); scanf("%d",&x); for(;;) { if(y!='\n') { s=(Node *)malloc(sizeof(Node)); p->link=s; s->c=x; s->link=NULL; p=s; r=(Node *)malloc(sizeof(Node)); r->c=x; r->link=h2->link; h2->link=r; scanf("%d",&x);

scanf("%c",&y); } else { s=(Node *)malloc(sizeof(Node)); p->link=s; s->c=x; s->link=NULL; p=s; r=(Node *)malloc(sizeof(Node)); r->c=x; r->link=h2->link; h2->link=r; break; } } return h; } void main() { Node *h=NULL,*h2; h2=first(); head=create(h2); h=head; printf("您输入的数字组正序为:\n"); while(h->link!=NULL) { printf("%d",h->link->c); h=h->link; if(h->link!=NULL) { printf("->"); } } printf("\n\n"); printf("您输入数字组的倒序为:\n"); while(h2->link!=NULL) { printf("%d",h2->link->c); h2=h2->link; if(h2->link!=NULL) { printf("->"); }

从键盘输入一串字符,分别统计其中的字母(不区分大小写)、数字字符和其他

; 题目名称:分类统计字符 ; 题目来源:https://www.360docs.net/doc/df13898872.html,/question/131013276.html ; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。 Code Segment Assume CS:Code,DS:Code ; -------------------------------------; 功能:显示指定地址(Str_Addr)的字符串 ; 入口: ; Str_Addr=字符串地址(要求在数据段) ; 用法: Output Str_Addr ; 用法举例:Output PromptStr Output MACRO Str_Addr lea dx,Str_Addr mov ah,9 int 21h EndM ; -------------------------------------; 功能:在当前光标位置显示一个字符 ; 入口:dl=要显示的字符 Output_Chr proc Near push ax mov ah,02h int 21h pop ax ret Output_Chr Endp ; -------------------------------------; 功能:显示、输出一个回车、换行 Output_CTLF proc Near push ax push dx mov ah,02h mov dl,0dh int 21h mov dl,0ah int 21h pop dx pop ax ret Output_CTLF Endp ; -------------------------------------; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示

关于汇编实验 屏幕窗口程序

实验五 屏幕窗口程序 一、 实验的目的与要求 (一)实验目的:掌握显示器IO 程序设计的方法,掌握宏的相关概念,以及运用方法。 (二)实验要求:在屏幕上开出三个窗口,它们的行列坐标如下页图所示,光标首先定位在右窗口最下面一行的行首(15, 50),如果从键盘输入字符,则显示在右窗口,同时也显示在下窗口的最下面一行。若需要将字符显示于左窗口,则先按下左键,接着再从键盘输入字符,字符就会从左窗口的最下行开始显示,同时下窗口也显示左窗口的内容。当一行字符显示满后,窗口自动向上卷动一行,输入字符继续显示于最低一行,窗口最高一行向上卷动后消失。编写屏幕窗口程序时,要求将一些功能程序段定义成宏指令,如向上卷动、清屏、 接受字符并判断、在屏幕上显示字符、光标定位。 二、实验正文 实验分析:实验思路比较简单,主要是运用BIOS 调用,这些查表可得,实验要求要用宏来定义一些基本功能,宏调用比较简单,把一些基本功能编写成宏,能高效率的执行程序,但是宏也存在着一些缺点,在宏调用时,要宏展开,这样会占用一定的空间,所以宏是一种以空间换时间的策略,像一些复杂的操作不宜编写成宏。BIOS 10号调用提供了大量的屏幕、光标显示格式,要注意参数的意义,以便正确的显示结果。 三、流程图如下: (5,10) (15,30) (5,50) (15,70) (18,15) (22,65)

四、实验结果 附录:程序源代码如下: ;**************************************************************** datas segment cury db 15 ;光标初始位置 curx db 50

键盘输入显示程序

#include #define uchar unsigned char #define uint unsigned int uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00};//0-f-最后一个空uchar j=1; sbit p37=P3^7; void delay(uint z) { uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void display(ucharshu) { P1=table[shu]; delay(5); } ucharkeyscan() {

uchartemp,num; P2=0xfe; temp=P2; temp=temp&0xf0; if(temp!=0xf0) { p37=0; delay(5); temp=P2; temp=temp&0xf0; while(temp!=0xf0) { temp=P2; switch(temp) { case 0xee:num=1;break; case 0xde:num=2;break; case 0xbe:num=3;break; default:break; } while(temp!=0xf0)//**********松手检测松手后显示{ j=0;

temp=P2; temp=temp&0xf0; } } }p37=1; P2=0xfd; temp=P2; temp=temp&0xf0; if(temp!=0xf0) { p37=0; delay(5); temp=P2; temp=temp&0xf0; while(temp!=0xf0) { temp=P2; switch(temp) { case 0xed:num=4;break; case 0xdd:num=5;break; case 0xbd:num=6;break; }

键盘输入原理

基础知识 1. 键盘的基本原理 键盘是一组按键的组合,它是最常用的输入设备,操作人员可以通过键盘输入数据或命令,实现简单的人机对话。 键盘是一种常开型的开关,通常键的两个触点处于断开状态,按下键时它们才闭合。键盘的识别有两种方案:一是采用现有的一些芯片实现键盘扫描;再就是用软件实现键盘扫描。目前有很多芯片可以用来实现键盘扫描,如有Intel8279、CH451、ICM7218、PCF8574等。但是键盘扫描的软件实现方法有助于缩减系统的重复开发成本,且只需要很少的CPU 开销。嵌入式控制器的功能很强,可以充分利用这一资源,这里就介绍一下用软件实现键盘扫描的方案。 键盘从结构上分为独立式键盘与矩阵式键盘。一般按键较少时采用独立式键盘,按键较多时采用矩阵式键盘。 (1)独立式键盘。在由单片机组成的测控系统及智能化仪器中,用的最多的是独立式键盘。这种键盘具有硬件与软件相对简单的 特点,其缺点是按键数量较多时,要占用大量口线。当按键没 按下时,CPU对应的I/O接口由于内部有上拉电阻,其输入为

高电平;当某键被按下后,对应的I/O接口变为低电平。只要 在程序中判断I/O接口的状态,即可知道哪个键处于闭合状态。 (2) 矩阵式键盘。矩阵式键盘使用于按键数量较多的场合,它由行线与列线组成,按键位于行、列的交叉点上。一个3*3的行列结构可以构成一个有9个按键的键盘。同理,一个4*4的行列可以构成一个16按键的键盘。很明显,在按键数量较多的场合,与独立式键盘相比,矩阵式键盘要节省很多I/0接口。

2、键盘按键识别方法 (1)扫描法。扫描法有行扫描和列扫描两种,无论采用哪种,其效果是一样的,只是在程序中的处理方法有所区别。下面以行扫描法为例来介绍扫描法识别按键的方法。先向键盘4根行线输出其中某一行为低电平,其它行为高电平,然后读取列值,若某一列值为低电平,则表明同时为低电平的行和列的交叉处按键被按下,如果没有某列为低电平,则继续扫描下一行。因为输入低电平的行是从第一行开始逐行遍历的,故称为行扫描法。行与列是相对的,可以将行按列对待,同时将列按行对待,所实现的扫描法效果是一样的。

运行窗口打开程序

开始菜单中的“运行”是通向程序的快捷途径,输入特定的命令后,即可快速的打开Windows的大部分程序,熟练的运用它,将给我们的操作带来诸多便捷。winver 检查Windows版本 wmimgmt.msc 打开Windows管理体系结构(wmi) wupdmgr Windows更新程序 wscript Windows脚本宿主设置 write 写字板 winmsd 系统信息 wiaacmgr 扫描仪和照相机向导 winchat xp自带局域网聊天 mem.exe 显示内存使用情况 msconfig.exe 系统配置实用程序 mplayer2 简易widnows media player mspaint 画图板 mstsc 远程桌面连接 mplayer2 媒体播放机 magnify 放大镜实用程序 mmc 打开控制台 mobsync 同步命令 dxdiag 检查directx信息 drwtsn32 系统医生 devmgmt.msc 设备管理器 dfrg.msc 磁盘碎片整理程序 diskmgmt.msc 磁盘管理实用程序 dcomcnfg 打开系统组件服务 ddeshare 打开dde共享设置 dvdplay dvd播放器 net stop messenger 停止信使服务 net start messenger 开始信使服务 notepad 打开记事本 nslookup 网络管理的工具向导 ntbackup 系统备份和还原 narrator 屏幕“讲述人” ntmsmgr.msc 移动存储管理器

ntmsoprq.msc 移动存储管理员操作请求 netstat -an (tc)命令检查接口 syncapp 创建一个公文包 sysedit 系统配置编辑器 sigverif 文件签名验证程序 sndrec32 录音机 shrpubw 创建共享文件夹 secpol.msc 本地安全策略 syskey 系统加密,一旦加密就不能解开,保护Windows xp系统的双重密码services.msc 本地服务设置 sndvol32 音量控制程序 sfc.exe 系统文件检查器 sfc /scannow windows文件保护tsshutdn 60秒倒计时关机命令 tourstart xp简介(安装完成后出现的漫游xp程序) taskmgr 任务管理器 eventvwr 事件查看器 eudcedit 造字程序 explorer 打开资源管理器 packager 对象包装程序 perfmon.msc 计算机性能监测程序 progman 程序管理器 regedit.exe 注册表 rsop.msc 组策略结果集 regedt32 注册表编辑器 rononce -p 15秒关机 regsvr32 /u *.dll 停止dll文件运行 regsvr32 /u zipfldr.dll 取消zip支持 cmd.exe cmd命令提示符 chkdsk.exe chkdsk磁盘检查 certmgr.msc 证书管理实用程序 calc 启动计算器 charmap 启动字符映射表 cliconfg sql server 客户端网络实用程序 clipbrd 剪贴板查看器

从键盘输入数据并显示实验

实验四从键盘输入数据并显示实验 【实验目的】 1.掌握键盘输入字符的方法和十六进制数字字符的ASCII码转换为二进制数的原理。 2.掌握子程序定义和调用的方法。 3.掌握循环移位指令的用法和无符号数比较大小的方法。 【实验性质】 验证性实验(学时数:2H) 【实验内容】 从键盘上输入4位十六进制数,将其转换为16位二进制数并在显示器上显示出来。要求输入的数字字符串以回车键结束。如果输入的数字超过4个,则以最后输入的4个为准。若按下的键不是十六进制数字字符,则显示出错信息。 参考程序: 【实验提示】 从键盘上输入的十六进制数字字符进入计算机后并不是相应的十六进制数或二进制数,而是与字符对应的ASCII码,现要找出ASCII码与该数字对应的二进制数之间的关系。关系如下: 十六进制数字字符字符对应的ASCII码数字对应的二进制数 0 ~930H ~39H ASCII码- 30H A ~F41H ~46H ASCII码- 37H a ~f61H ~66H ASCII码- 57H 【报告要求】 1.给出该问题的程序设计流程图。 2.给出该程序的全部代码,并加上注释。 3.总结实验体会。 CRLF MACRO MOV AH,02H MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H ENDM DATA SEGMENT

MARK DB MESS DB '输入四位十六进制数,按回车键转化为二进制数,空格键结束!',0DH,0AH,'输入:$' ERROR DB 0DH,0AH, '输入错误!',0DH,0AH,'$' DATA ENDS STACK SEGMENT STA DW 32 DUP() TOP DW STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SP,TOP HEAD: CRLF MOV MARK,0 MOV AH,09H LEA DX,MESS INT 21H ;显示提示输入的信息 CALL GETNUM ;接收键入数值送DX CMP MARK,01H JE HEAD MOV CX,0010H ;16位 MOV BX,DX TTT: ROL BX,1 ;循环左移1位 MOV DL,BL AND DL,01H ;屏蔽掉高7位 ADD DL,30H MOV AH,02H INT 21H ;显示二进制位对应的ASCII字符 LOOP TTT JMP HEAD FINI: MOV AX,4C00H INT 21H ;返回DOS GETNUM PROC NEAR ;子程序,接收键入数值送DX PUSH CX XOR DX,DX GGG: MOV AH,01H INT 21H CMP AL,0DH ;输入为回车,则进行转换 JE PPP CMP AL,20H ;输入为空格,则退回DOS JE FINI CMP AL,30H JB KKK SUB AL,30H

键盘输入

4.2 键盘 4.2.1键盘概念 键盘是最常用也是最主要的输入设备,通过键盘,可以将英文字母、数字、标点符号等输入到计算机中,从而向计算机发出命令、输入数据等。 4.2.2键盘的分类 按照键盘的工作原理和按键方式的不同,可以划分为四种: (1)机械式键盘(Mechanical) 采用类似金属接触式开关,工作原理是使触点导通或断开,具有工艺简单、噪音大、易维护的特点。 (2)塑料薄膜式键盘(Membrane)键盘内部共分四层,实现了无机械磨损。其特点是低价格、低噪音和低成本,已占领市场绝大部分份额。 (3)导电橡胶式键盘(Conductive Rubber)触点的结构是通过导电橡胶相连。键盘内部有一层凸起带电的导电橡胶,每个按键都对应一个凸起,按下时把下面的触点接通。这种类型键盘是市场由机械键盘向薄膜键盘的过渡产品。(4)无接点静电电容式键盘(Capacitives)使用类似电容式开关的原理,通过按键时改变电极间的距离引起电容容量改变从而驱动编码器。特点是无磨损且密封性较好。 按其结构形式可分为以下两种: (1)编码键盘 编码键盘采用硬件方法产生键码。每按下一个键,键盘能自动生成键盘代码,键数较多,且具有去抖动功能。这种键盘使用方便,但硬件较复杂,PC机所用键盘即为编码键盘。 (2)非编码键盘 非编码键盘仅提供按键开关工作状态,其键码由软件确定,这种键盘键数较少,硬件简单,广泛应用于各种单片机应用系统,本次设计使用非编码键盘。 按照键盘与单片机的连接方式可分为一下两种: (1)独立式键盘 独立式键盘,顾名思义,即各按键相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他按键的工作状态。这种按键软件程序简单,但占用I/O口线较多(一根口线只能接一个键),适用于键盘应用数量较少的系统中。 (2)矩阵式键盘 矩阵式键盘又称行列式键盘,在其行、列交汇点接有若干个按键。当需要较多按键时,与独立式键盘相比,单片机口线资源利用率大幅提高了。但若需要更多的键盘,需采用接口扩展技术,如8155等。 综上所述,结合实际情况,本次设计选用非编码矩阵式键盘。 4.2.3非编码矩阵式键盘工作原理 非编码矩阵式键盘,作为单片外围电路,应具有如下功能:

如何控制其他程序窗体上的窗口控件

如何控制其他程序窗体上的窗口控件 回调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows 操作系统,比如其他的程序等等之类的。但是什么时候被调用却不知道了。回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你提供的地址调用这个函数通知你,并按照预先规定好的形式传递参数。所以很多人打比方,说回调函数还真有点像您随身带的BP 机:告诉别人号码,在它有事情时Call您! 所以一个回调函数写出来之后,一定有个注册的动作,就是告诉调用者,你怎么样找到我写的函数。某些Windows API 函数会要求以回调函数地址作为其参数之一,例如SetTimer 、LineDDA 、EnumObjects,以及我们下面要用到的EnumWindows。 在Delphi里声明一个回调函数的格式很简单,例如: function EnumWindowsProc(AhWnd:LongInt;lParam:LongInt):boolean;stdcall; 首先是函数名称可以随便乱取,但函数参数的类型一般不得乱来,其顺序,数据类型等都有规定的,因为这些都是让其他程序调用的,他们已经规定好了的,但参数名称可以随便乱叫。注意后面一定要带上“stdcall”, stdcall是标准调用,也就是说采用标准windows参数传递方式来调用函数。 编写函数体就很简单了,利用传递过来的参数就可以了,只要记住,这些参数是别人送给你的,你只要知道这些参数代表了什么意思。 再看个向调用者注册回调函数入口地址的函数。 function EnumWindows(lpEnumFunc: TFNWndEnumProc; lParam: LPARAM): BOOL; stdcall; TFNWndEnumProc其实就是指针类型。其中的lpEnumFunc就是回调函数的入口地址了。 下面是调用EnumWindows的格式: EnumWindows(@EnumWindowsProc,0); 通过向系统注册回调函数的入口地址,系统就能在需要的时候,调用回调函数,传递参数给它,也许这些参数就是我们想要的。 EnumWindows函数的功能是:枚举屏幕上所有程序中的顶层窗口,将窗口句柄以参数的形式传递给回调函数。找到一个窗口,就调用一次回调函数。枚举结束的条件是:要么枚举完所有的窗口,要么回调函数返回False。 lParam: LPARAM参数是程序定义的值,这个值被传递到回调函数。 回过头来再看一下EnumWindowsProc: function EnumWindowsProc(AhWnd:LongInt;lParam:LongInt):boolean;stdcall; 当系统找到了一个窗口后,就开始调用这个回调函数,将窗口的句柄作为第一个参数传递过来,将在EnumWindows中lParam: LPARAM这个程序定义的值作为第二个参数传递过来。 所以我们可以在EnumWindowsProc函数中利用传递过来的两个参数来做某些处理了。 下面我们新建一个程序列举系统中所有程序的顶层窗口,我们要得到窗口的标题,要得到窗口类名称。 得到窗口标题用: function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer; stdcall; 该函数功能是将窗口句柄为hWnd的窗口的标题拷入到一个缓冲区lpString。nMaxCount

通过scanf函数从键盘输入数据

通过scanf函数从键盘输入数据 1)当调用scanf函数从键盘输入数据时,最后一定要按下回车键,scanf函数才能接受键盘输入的数据。 2)输入数据值 当键盘输入数据时,输入的数值数据之间用间隔符隔开。列<间隔符>10<间隔符>20 <间隔符> 此处间隔符可以是空格符、制表符(Tab)、回车符。 3)跳过输入数据的方法 可以在格式字符和%之间加上一个*,它的作用是跳过对应的输入数据。列 Int a1,a2, a3; Scanf("%d%d*%d%d%d",&a1,&a2,&a3); 当输入如下数据时:10 20 30 40 将把10赋给a1,跳过20,把30赋给a2,把10赋给a3 4)在格式字符串中插入其他字符 如果想在屏幕上输入字符串来提示,应该使用printf函数,如果在scanf的格式控制字符串中插入其他字符,则在输入时要求按一对一的位置原样输入这些字符 列1 Int a1,a2,a3; Scanf(“inpat a1,a2,a3:%d%d%d”,&a1,&a2,&a3); 要求按以下形式进行输入 Input a1,a2,a3:102030 列1 以下程序由终端出入两个整数给变量x和y,在交换x和y的值后,在输出x和y,验证两个变量中的数是否正确的进行了交换。 #inclube "stdio.h" Main() {int x,y,t; Printf("enter x&y:\n"); Scanf("%d %d",&x,&y); Printf9("x=%d y=%d\n",x,y); T=x;x=y;y=t; Printf("x=%d y=%d\n",x,y); } 列2 输入一个doulbe类型的数,使该数保留小数点后两位,对第三位小数进行四舍五入后处理,然后输出此数,以便验证处理是否正确。

键盘使用说明书完整版

一、键盘简介键盘是计算机使用者向计算机输入数据或命令的最基本的设备。常用的键盘上有101个键或103个键,分别排列在四个主要部分:打字键区、功能键区、编辑键区、小键盘区。 现将键盘的分区以及一些常用键的操作说明如下: (一)打字键区 它是键盘的主要组成部分,它的键位排列与标准英文打字机的键位排列一样。该键区包括了数字键、字母键、常用运算符以及标点符号键,除此之外还有几个必要的控制键。 下面对几个特殊的键及用法作简单介绍。 键的名称 主要功能说明 空格键 键盘上最长的条形键。每按一次该键,将在当前光标的位置上空出一个字符的位置。 [Enter↙] 回车键 (1)每按一次该键,将换到下一行的行首输入。就是说,按下该键后,表示输入的当前行结束,以后的输入将另起一行。 (2)或在输入完命令后,按下该键,则表示确认命令并执行。[CapsLock]大写字母锁定键 在打字键区右边。该键是一个开关键,用来转换字母大小写状态。每按一次该键,键盘右上角标有CapsLock的指示灯会由不亮变成发亮,或由发亮变成不亮。这时: (1)如果CapsLock指示灯发亮,则

键盘处于大写字母锁定状态:1)这时直接按下字母键,则输入为大写字母;2)如果按住[Shif]键的同时,再按字母键,输入的反而是小写字母。 (2)如果这时CapsLock指示灯不亮,则大写字母锁定状态被取消。 [Shift]换档键 换档键在打字键区共有两个,它们分别在主键盘区(从上往下数,下同)第四排左右两边对称的位置上。 (1)对于符号键(键面上标有两个符号的键,例如:等,这些键也称为上下档键或双字符键)来说,直接按下这些键时,所输入的是该键键面下半部所标的那个符号(称为下档键); 如果按住[Shift]键同时再按下双字符键,则输入为键面上半部所标的那个符号(称为上档键)。如: [Shift] +=% (2)对于字母键而言:当键盘右上角标有CapsLock的指示灯不亮时,按住[Shift]键的同时再按字母键,输入的是大写字母。例如:CapsLock指示灯不亮时,按[Shift] +S键会显示大写字母S [←BackSpace]退格删除键 在打字键区的右上角。每按一次该键,将删除当前光标位置的前一个字符。 [Ctrl]控制键 在打字键区第五行,左右两边各一个。该键必须和其它键配合才能实现各种功能,这些功能是在操作系统或其他应用软件中进行设定的。例如:

用单片机实现PC键盘输入

用单片机实现PC键盘输入.txt跌倒了,爬起来再哭~~~低调!才是最牛B的炫耀!!不吃饱哪有力气减肥啊?真不好意思,让您贱笑了。我能抵抗一切,除了诱惑……老子不但有车,还是自行的……串行口和键盘口通讯接口的单片机实现 摘要:在某些特殊控制场合,需要通过主控机的串行口和受控机的PS/2键盘口,实现主控机对受控机的模拟键盘输入。本文介绍了串行口和键盘口的通讯接口的软、硬件设计方法。 关键词:串行口 PS/2键盘口通讯单片机 键盘作为微机的基本输入设备,是微机不可缺的一部分。但在某些特殊的场合,我们要对受控机进行程序设计的特殊输入控制,则需要一接口实现串行口和PS/2键盘口通讯,这样在主控机上通过对串行口的编程就能实现对受控机的模拟键盘输入。笔者开发的该接口以MCS-51单片机为核心,原理图如图1所示,利用MCS-51的全双工异步串行I/O口实现与主控机的异步串行通讯,而和受控机PS/2键盘口的同步串行通讯则通过双向数据I/O口控制同步时钟和数据位。 .1.和主控机的异步串行通讯 异步通讯按帧传送数据,它利用每一帧的起、止信号来建立发送与接受之间的同步,每帧内部各位均采用固定的时间间隔,但帧与帧之间的时间间隔是随机的。其基本特征是每个字符必须用起始位和停止位作为字符开始和结束的标志,它是以字符为单位一个个发送和接收的。 1.1硬件接口设计 与主控机的异步串行通讯基于RS-232总线标准。为了使接口具有更好的兼容性和工作稳定性,我们用MAX232E作为数据传送器。MAX232E是专为RS-232通讯而设计,低功耗,外接电容小,抗干扰能力强,管脚有ESD保护并且能支持到120k波特率的数据传输,能很好地解决PC机和单片机电平不匹配问题。同时它增强了数据驱动能力,能支持12米的串行线。 1.2软件接口设计 异步通讯必须在字符格式中设置起始位和结束位,以使收发双方取得同步。其数据格式为1位起始位+8位数据位+奇偶校验位+1位或2位的停止位。其中起始位为低电平,数据位传送时先低后高,停止位为高电平。笔者在电路板上设计了异步串行通讯跳线,可设置通讯的波特率、奇偶校验位和停止位,在单片机软件的开始读取跳线设置值而后初始化串行口,从而支持多种通讯数据格式。 PC机启动时将向串行口发送两个字节的00H以检测串行口,同时防止主控机上的串行口其他的干扰信息,通讯时笔者设计的报文以A0H,CDH作为联络信息开头,第三字节为数据长度,之后为我们要传送的数据,这样有效地过滤掉干扰信息。单片机按串行口中断方式接收主控机的数据,收到有效格式的数据后,解析报文,提取出真实的数据,传送给受控机的PS/2口。

在java中如何用键盘输入一个数

在java中如何用键盘输入一个数 一、java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象。常用的类有BufferedReader,Scanner。 实例程序: 一,利用Scanner 实现从键盘读入integer或float 型数据 import java.util.*; //import java.io.*; class Abc { public static void main(String args[]) { Scanner in=new Scanner(System.in); //使用Scanner类定义对象 System.out.println("please input a float number"); float a=in.nextFloat(); //接收float型数据 System.out.println(a); System.out.println("please input a integer number"); int b=in.nextInt(); //接收整形数据 System.out.println(b); } } 二,利用BufferedReader实现从键盘读入字符串并写进文件abc.txt中 import java.io.*; public class Test1 { public static void main(String[] args) throws IOException { BufferedReaderbuf = new BufferedReader (new InputStreamReader(System.in)); BufferedWriter buff = new BufferedWriter(new FileWriter("abc.txt")); String str = buf.readLine(); while(!str.equals("exit")) { buff.write(str); buff.newLine(); str = buf.readLine(); } buf.close(); buff.close(); } } 关于JDK1.5 Scanner类的说明 Scanner是SDK1.5新增的一个类,可是使用该类创建一个对象. Scanner reader=new Scanner(System.in);

LED显示屏-软件操作说明(精)

第一章前言 感谢您选择使用我公司研制生产的显示屏控制系统, 我们竭诚为广大用户服务。 为了使本系统屏能完美地为您服务, 请您在使用前仔细查阅本说明书, 以便于正确操作,并请您在使用后妥善保存它。 我公司开发研制的 LED 显示屏控制系统, 支持单色或双色 LED 显示屏。本系统具有如下功能: 1、系统支持 TXT 、 BMP 等文件, 可显示 16×16至 72×72点阵的宋、隶、草、行、楷等汉字,及英文、数字、符号等,也可显示简单的平面图画。 2、本系统具备脱机运行功能,即在显示内容编辑制作完成并发送至显示屏之后,即可关闭控制机。下次打开显示屏前,如果显示内容不更改,可不打开控制机,直接打开屏体电源即可。 3、有三十九种显示方式。 立即显示:信息整体立即出现于显示屏。 从右向左移入← :信息整体从右向左逐列移动进入显示屏。 从左向右移入→:信息整体从左向右逐列移动进入显示屏。 从下向上卷入↑:信息从下向上逐行进入显示屏。 从上向下卷入↓:信息从上向下逐行进入显示屏。 从左向右展开→:信息从左向右逐列显示于显示屏。 从右向左展开←:信息从右向左逐列显示于显示屏。 从下向上展开↑:信息从下向上逐行显示于显示屏。

从上向下展开↓:信息从上向下逐行显示于显示屏。 等等 4、显示内容停留时间可在 0-255秒之间任意调节。 5、可自动循环显示用户所要显示的不同内容。 第二章软件运行环境 ◆操作系统 中英文 Windows98/me/2000/NT/XP ◆硬件配置 CPU: 奔腾 300MHz 以上 内存 :64M 串口 :有一空闲的串口 相关软件 OFFICE 办公软件 --如需播放 WORD 、 EXCEL 文件必须安装 第三章安装与卸载 本软件是绿色软件,只需将 Project.exe 文件夹拷贝到硬盘就可以运行, 运行前将文件只读属性去掉 第四章 Project 使用说明 操作界面如下图所示:

键盘及LED显示实验

实验三键盘及LED显示实验 一、实验内容 利用8255可编程并行接口控制键盘及显示器,当有按键按下时向单片机发送外部中断请求(INT0,INT1),单片机扫描键盘,并把按键输入的键码一位LED 显示器显示出来。 二、实验目的及要求 (一)实验目的 通过该综合性实验,使学生掌握8255扩展键盘和显示器的接口方法及C51语言的编程方法,进一步掌握键盘扫描和LED显示器的工作原理;培养学生一定的动手能力。 (二)实验要求 1.学生在实验课前必须认真预习教科书与指导书中的相关内容,绘制流程图,编写C51语言源程序,为实验做好充分准备。 2.该实验要求学生综合利用前期课程及本门课程中所学的相关知识点,充分发挥自己的个性及创造力,独立操作完成实验内容,并写出实验报告。 三、实验条件及要求 计算机,C51语言编辑、调试仿真软件及实验箱50台套。 四、实验相关知识点 1.C51编程、调试。 2.扩展8255芯片的原理及应用。 3.键盘扫描原理及应用。 4.LED显示器原理及应用。 5.外部中断的应用。 五、实验说明 本实验仪提供了8位8段LED显示器,学生可选用任一位LED显示器,只要按地址输出相应的数据,就可以显示所需数码。 六、实验原理图

P1口桥接。 八、实验参考流程图 1.主程序流程图

2.外中断服务程序流程图 外部中断0 外部中断1 定时器0中断程序,用于消抖动:

3.LED显示程序流程图 九、C51语言参考源程序 #include "reg52.h" unsigned char KeyResult; //存放键值 unsigned char buffer[8]; //显示缓冲区 bit bKey; //是否有键按下 xdata unsigned char P_8255 _at_ 0xf003; //8255的控制口 xdata unsigned char PA_8255 _at_ 0xf000; //8255的PA口 xdata unsigned char PB_8255 _at_ 0xf001; //8255的PB口 xdata unsigned char PC_8255 _at_ 0xf002; //8255的PC口 code unsigned char SEG_TAB[] = { //段码 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x0}; sbit bLine0 = P3^2; sbit bLine1 = P3^3; //延时1ms void Delay1ms() { unsigned char i;

相关文档
最新文档