SendKeys string[, wait]
其中,string 是指定要发送的按键消息;Wait 是指定等待方式的 Boolean 值,如果为 False(缺省值),则控件在按键发送出去之后立刻返回到过程;如果为 True,则按键消息必须在控件返回到过程之前加以处理。
按键消息由一个或多个字符序列表示:键盘字符按字符本身的键表示(如对于字母 A,string="A",对连续字母 win98,string="win98"),对其它一些特殊字符,如 + 号用{+}表示,Shift 键用 + 表示,Alt 键用 % 表示,F1 键用 {F1} 表示等等,更多的按键与代码的对应关系,可参考 MSDN 的帮助信息。
明白了这些“规则”之后,我们首先来编写一个用 SendKeys *** 控计算器的程序,程序代码如下:
Option Explicit
Private Sub Form_Load()
Dim ReturnValue, I
ReturnValue = Shell("CALCEXE", 1) ' 运行计算器
AppActivate ReturnValue ' 激活计算器
For I = 1 To 100 ' 设置计数循环
SendKeys I & "{+}", True ' 按下按键给计算器
Next I ' 将所有 I 值相加
SendKeys "=", True ' 取得总和
SendKeys "%{F4}", True ' 按 ALT+F4 关闭计算器
End Sub
程序中 AppActivate ReturnValue 语句用来激活计算器,使其窗口获得焦点。程序运行后,我们会看到计算器的按键自动动作起来,最后计算出 1+2+3+…+100 的结果。这可不是病毒,也不是黑客啊!
怎么样,神奇吧?想没想到这可是制做演示程序的好方法!只要熟悉了某程序的键盘 *** 作序列,就可以用程序模拟它的运行过程。下面的程序用来模拟运行安装在 D: 盘的 Word 程序,自动打出 4 行文字后,然后退出。程序中为了能仔细观察演示过程,设计了 waittime 函数来进行延时。
Option Explicit
Private Sub Form_Load()
Dim x
x = Shell("D:/Program Files/Microsoft Office/Office/winwordexe", vbNormalFocus)
'启动 Word97
SendKeys "This is a demo program for Microsoft Word97", True ' 模拟输入英文字符串
SendKeys "{Enter}{Enter}", True ' 两次回车
waittime (2) ' 延时 2 秒
SendKeys "Some letters keyin automatically", True
SendKeys "{Enter}{Enter}", True
waittime (2)
SendKeys "Not virus,and not hackers!", True
SendKeys "{Enter}{Enter}", True
waittime (2)
SendKeys "Being Exit Look the MenuBar File{(}F{)}", True
SendKeys "%", True 'Alt 键激活菜单条
waittime (1)
SendKeys "(F)", True '按字母 "F",选择"文件(F)"菜单
waittime (1)
SendKeys "(X)", True '按字母 "X", 选择"退出(X)"
waittime (2)
SendKeys "(N)", True 'Word d出一个对话框,询问文件是否存盘,按 "N" 不存盘
End '结束本模拟程序
End Sub
Private Sub waittime(delay As Single)
Dim starttime As Single
starttime = Timer
Do Until (Timer - starttime) > delay
Loop
End Sub
一. 安装单片机程序编译软件KEIL。
1.点击图标 运行直至安装完成。
2.点击图标 运行KEIL,然后选择菜单“project”点击“new……”点击“ ”建立新的工程。填写好工程文件名选择保存路径后按“保存”,此时d出一个窗口如下图所示
点击Atmel左边的+号展开CPU的型号,选择“AT89C51”按“确定”再生成一个对话框如下图,再按“是”即可。
这时在工程左边的文件指示栏中多了一个 这样的图标,点其左边的+号可展开当前所包含的文件。
选择菜单“File”“new”新建一个文本编辑器,按保存按钮,在d出的窗口填入文件名后缀为C ,然后按保存即把这个C文本文件保存到这个工程的目录下。
再在工程左边的文件指示栏中指着 点击右键选择 选项把刚才建立的C文件加入来,按“Add”即可加入,这时就可以在C文本编辑器里编号程序了。
写好程序后选择菜单“project”选择“ ”打开的对话框如下图所示
如果d出来的不是这个对话框时可以重复一次“project”选择“ ”便可以打开,打开后在 这个方框里打上勾然后按“确定”才可以编译生成单片机的烧写文件HEX文件。这些选项都设置好并写好源程序后就可以在菜单选项project选项中选择 选项对源程序进行编译,生成的HEX文件就在工程的目录下。
本文章后面附带的是HJSMSY-V10开发板的测试源程序,读者可以将其复制到编译器里编译。此程序为一个简单的计算器功能程序,数写键依次对应电路板上的数字0--9,“A”键功能为清除,“B”键功能为等于,“C”键功能为+,“D”键功能为-,“E”键功能为,“F”键功能为除。
二. 把单片机开发板用9针串口线与电脑连接好,用配套的USB供电线将单片机开发板供电,并关闭电路板上的电源开关。运行STC芯片烧写软件,
点击图标
打开下载界面如下图
按这个图里面的设置设好参数后,点击“Open File/打开文件”打开HEX文件,在打开的对话框中找到刚才所建立工程的目录,在此目录下可以找到刚才编译得到的HEX文件,如果找不到则是还没有在 这个方框里打上勾,回到工程里打上勾并按 编译一次就行了。打开HEX文件确定后就点击下载软件的 ,再打开单片机开发板上的电源开关,这时电脑便自动与单片机连接并把程序下载到单片机里,下载完成后会有声音提示的,或者可以在软件界面上看得到。注:STC系列单片机是在开机的瞬间下载程序的,如果还未能连接成功可以关掉电源再开一次即可。
//HJSMSY-V10单片机开发板测试程序C
//-----------------------------------------------
// <<计算器>>
//-----------------------------------------------
//编写人:李春起
//编定日期:20100626
//修改日期:
//============================================================
#include <AT89X52H>
#define uchar unsigned char
#define uint unsigned int
uint comdata,vardata,dispdata;
unsigned char flag=0,incflag=0,maxflag=10,maxvar=1;
//===========共阳数码管段码表==================================
uchar code SEG7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code ACT[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//================引脚定义=======================================
sbit yy=P3^2;
sbit jk=P3^4;
sbit k1=P2^3;
sbit k2=P2^2;
sbit k3=P2^1;
sbit k4=P2^0;
//=====子函数声明======================================
void init(void);
void delay1(uint z);
void kk(void);
//===========程序初始化===============================
void init(void)
{
TMOD=0x01;
TH0=0xf4;
TL0=0x48;
ET0=1;
TR0=1;
EA=1;
}
//=====空 *** 作延时子程序=======================
void delay1(uint z)
{
uint j,y;
yy=0;
for(j=0;j<z;j++)
{for(y=0;y<100;y++){;}}
yy=1;
for(j=0;j<z;j++)
{
for (y=0;y<3422;y++);
}
}
//========键盘扫描子程序===================
void kk(void)
{ P2=0xf0;
if(P2!=0xf0)
{
P2=0xef;
if(!k1){delay1(15);comdata=vardata;vardata=0;incflag=1;} //k13
if(!k2){delay1(15);comdata=vardata;vardata=0;incflag=2;} //k14
if(!k3){delay1(15);comdata=vardata;vardata=0;incflag=3;} //k15
if(!k4){delay1(15);comdata=vardata;vardata=0;incflag=4;} //k16
P2=0xdf;
if(!k1){delay1(15);if(vardata>6553){goto ab1;};vardata=((vardata10)/maxflag+8maxvar);dispdata=vardata;} //k9
ab1:if(!k2){delay1(15);if(vardata>6553){goto ab2;};vardata=((vardata10)/maxflag+9maxvar);dispdata=vardata;} //k10
ab2:if(!k3){delay1(15);vardata=0;dispdata=vardata;} // k11
if(!k4){delay1(15);switch (incflag){
case 1:{vardata=(comdata+vardata);dispdata=vardata;}break;
case 2:{vardata=(comdata-vardata);dispdata=vardata;}break;
case 3:{vardata=(comdatavardata);dispdata=vardata;}break;
case 4:{vardata=(comdata/vardata);dispdata=vardata;}break;
default:break;
}
}//k12
P2=0xbf;
if(!k1){delay1(15);if(vardata>6553){goto ab3;};vardata=((vardata10)/maxflag+4maxvar);dispdata=vardata;} //k5
ab3:if(!k2){delay1(15);if(vardata>6553){goto ab4;};vardata=((vardata10)/maxflag+5maxvar);dispdata=vardata;} //k6
ab4:if(!k3){delay1(15);if(vardata>6553){goto ab5;};vardata=((vardata10)/maxflag+6maxvar);dispdata=vardata;} //k7
ab5:if(!k4){delay1(15);if(vardata>6553){goto ab6;};vardata=((vardata10)/maxflag+7maxvar);dispdata=vardata;} //k8
ab6:P2=0x7f;
if(!k1){delay1(15);if(vardata>6553){goto ab7;};vardata=((vardata10)/maxflag+0maxvar);dispdata=vardata;} //k1
ab7:if(!k2){delay1(15);if(vardata>6553){goto ab8;};vardata=((vardata10)/maxflag+1maxvar);dispdata=vardata;} //k2
ab8:if(!k3){delay1(15);if(vardata>6553){goto ab9;};vardata=((vardata10)/maxflag+2maxvar);dispdata=vardata;} //k3
ab9:if(!k4){delay1(15);if(vardata>6553){goto ab10;};vardata=((vardata10)/maxflag+3maxvar);dispdata=vardata;} //k4
ab10:;
}
}
//======定时器0中断服务子程序================
void time0(void) interrupt 1
{
TH0=0xf4;
TL0=0x48;
P0=0xff;P1=0xff;
// 时钟显示子程序
switch(flag)
{
case 0:{P0=SEG7[dispdata%10];P1=ACT[0];flag=1;}break;
case 1:{P0=SEG7[(dispdata/10)%10];P1=ACT[1];flag=2;}break;
case 2:{P0=SEG7[(dispdata/100)%10];P1=ACT[2];flag=3;}break;
case 3:{P0=SEG7[(dispdata/1000)%10];P1=ACT[3];flag=4;}break;
case 4:{P0=SEG7[dispdata/10000];P1=ACT[4];flag=5;}break;
case 5:{P0=SEG7[0];P1=ACT[5];flag=0;}
default:break;
}
}
//=========主函数======================================
void main()
{
init();
yy=1;
jk=0;
while(1)
{
if((vardata/1000)>=9){maxflag=10;maxvar=0;}
else {maxflag=1;maxvar=1;}
kk();
}
}
液晶显示屏是不停闪烁的,而且一次只能显示一个图案。显示屏上显示12345也是每次在一个位置上显示一个数字,不停的显示五次,由于计算速度快,及人眼暂留现象,使人感觉上显示的是12345。现在,你如果需要动画效果,需要从底层做起。一,写函数,完成指定位置显示指定字符。二,写延时函数,三,写延时显示字符函数,四,再写main中动画。
假设你用的12M晶振,IT单片机;
参照STC的数据手册“26 指令系统分类总结及与普通8051 指令执行时间对比”
可查出: 机器周期
L1:CLR A 1
MOV R6,A 2
L2:INC R6 3
CJNE R6,#0X09,L2 4
DJNZ R7,L1 4
RET 4
你的延时=((1+2+9(3+4)+4)n+4)/12000000秒=(70n+4)/12us;
n取1的话=74/12=6167us;
ORG0000HSTART:MOV78H,#0;初始化:78H放0的段码,其余放熄灭码MOV79H,#10MOV7AH,#10MOV7BH,#10MOV7CH,#10MOV7DH,#10MOVR5,#0;R5是按键次数,初始置0MOV30H,#0;30H是功能键存放单元,置为0MOV40H,#0;40H单元初始置为0MOV41H,#0;41H单元初始置为0LOOP:LCALLDIRLCALLKEYINCR5;散转程序,判断按下的是哪个键S1:CJNEA,#10,S2;不是"+"键,跳到S2LJMPFUN;是"+"键,跳到FUNS2:CJNEA,#11,S3;不是"-"键,跳到S3LJMPFUN;是"-"键,跳到FUNS3:CJNEA,#12,S4;不是""键,跳到S4LJMPFUN;是""键,跳到FUNS4:CJNEA,#13,S5;不是"/"键,跳到S5LJMPFUN;是"/"键,跳到FUNS5:CJNEA,#14,S6;不是"="键,跳到S6LJMPFUN;是"="键,跳到FUNS6:CJNEA,#15,N1;不是"CL"键,跳到N1LJMPSTART;是"CL"键,跳到STARTN1:CJNER5,#1,N2;判断第几次按键LJMPD11N2:CJNER5,#2,N3LJMPT2N3:CJNER5,#3,N4LJMPT3N4:CJNER5,#4,N5LJMPT4N5:CJNER5,#5,N6LJMPT5N6:CJNER5,#6,STARTLJMPT6D11:MOVR4,AMOV78H,A;输入值送显示个位缓存MOV79H,#10MOV7AH,#10MOV7BH,#10MOV7CH,#10MOV7DH,#10LJMPLOOPT2:MOVR7,AMOVB,#10MOVA,R4MULABADDA,R7MOVR4,AMOV7AH,#10MOV7BH,#10MOV7CH,#10MOV7DH,#10MOV79H,78H;个位到十位MOV78H,R7;新数为个位LJMPLOOPT3:MOVR7,AMOVB,#10MOVA,R4MULABADDA,R7MOVR4,AMOV7BH,#10MOV7CH,#10MOV7DH,#10MOV7AH,79H;十位到百位MOV79H,78H;个位到十位MOV78H,R7;新数为个位LJMPLOOPT4:MOVR7,AMOVB,#10MOVA,R4MULABADDA,R7MOVR4,AMOV7CH,#10MOV7DH,#10MOV7BH,7AHMOV7AH,79HMOV79H,78HMOV78H,R7LJMPLOOPT5:MOVR7,AMOVB,#10MOVA,R4MULABADDA,R7MOVR4,AMOV7DH,#10MOV7CH,7BHMOV7BH,7AHMOV7AH,79HMOV79H,78HMOV78H,R7LJMPLOOPT6:MOVR7,AMOVB,#10MOVA,R4MULABADDA,R7MOVR4,AMOV7DH,7CHMOV7CH,7BHMOV7BH,7AHMOV7AH,79HMOV79H,78HMOV78H,R7LJMPLOOPMOV7CH,7BHMOV7BH,7AHMOV7AH,79HMOV79H,78HMOV78H,R7LJMPLOOPFUN:MOV78H,#10MOV79H,#10MOV7AH,#10MOVR0,30H;与上次功能键交换MOV30H,AMOVA,R0CJNEA,#10,FUN1;判断功能键LJMPADDY;"+"FUN1:CJNEA,#11,FUN2LJMPSUBT;"-"FUN2:CJNEA,#12,FUN3LJMPMULT;""FUN3:CJNEA,#13,FUN4LJMPDIVI;"/"FUN4:CJNEA,#14,FUN5;首次按功能键,即A=#0LJMPEQUA;"="FUN5:MOV40H,R4;保存第一个数MOVR5,#0;按键次数清零LJMPBCD;将其拆为bcd码,以便后来将其显示OF:LJMPSTART;溢出处理ADDY:MOVA,40H;第一个数送累加器ADDA,R4;第一个数加第二个数JBCY,OF;溢出MOV40H,A;存本次结果MOVR5,#0;按键次数清零LJMPBCDSUBT:MOVA,40HSUBBA,R4JBCY,OFMOV40H,AMOVR5,#0LJMPBCDMULT:MOVA,40HMOVB,AMOVA,R4MULABJBOV,OFMOV40H,AMOVR5,#0LJMPBCDDIVI:MOVA,R4MOVB,AMOVA,40HDIVABJBOV,OFMOV40H,AMOVR5,#0LJMPBCDEQUA:MOVR5,#0LJMPBCDBCD:MOVB,#10MOVA,40H;结果送累加器DIVAB;结果除10MOV41H,A;暂存"商"MOVA,B;取个位数MOV78H,A;个位数送显示缓存MOVA,41HJZRETURN;结果是一位数,返回LOOPMOVB,#10MOVA,41HDIVABMOV41H,AMOVA,BMOV79H,A;十位送显示缓存MOVA,41HJZRETURN;结果是二位数,返回LOOPMOV7AH,A;百位数送显示缓存RETURN:LJMPLOOP;动态显示子程序DIR:MOVDPTR,#TAB;数码管译码表首址MOVR0,#78H;待显缓冲区个位地址MOVA,#0FEH;个位位选信号MOVR1,ALD1:MOVA,@R0MOVCA,@A+DPTR;查表MOVP2,R1;共阳极管字位选择送到P2口MOVP0,A;字段码送P0口LCALLDELAY1ms;调延时1ms子程序INCR0;R0指向下一模块MOVA,R1;JNBACC5,LD2;判断是否发完6个数RLA;指向下一个位MOVR1,A;位选信号存回R3SJMPLD1;跳去再显示下一个数LD2:RET;发完6个数就返回TAB:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,80H,90H,0FFH;共阳极译码表DELAY1ms:MOVR6,#2LOOP1:MOVR7,#248NOPLOOP2:DJNZR7,LOOP2DJNZR6,LOOP1RETKEY:LCALLKS;调用检测按键子程序JNZK1;有键按下继续LCALLDELAY2;无键按调用延时去抖ACALLDIR;调用动态显示AJMPKEY;返回继续检测按键K1:LCALLDELAY2;有键按下延时去抖动LCALLKS;再调用检测按腱子程序JNZK2;确认有按键进行下一步ACALLDIR;调用动态显示AJMPKEY;无键按下返回继续检测K2:MOVR2,#0EFH;将扫描值送入R2暂存MOVR3,#00H;将第一列值送入R3暂存K3:MOVP1,R2;将R2值送入P1口L0:JBP10,L1;P10等于1跳转到L1MOVA,#00H;将第一行值送入ACCAJMPLK;跳转到键值处理程序L1:JBP11,L2;P11等于1跳转到L2MOVA,#04H;将第二行的行值送入ACCAJMPLK;跳转到键值处理程序L2:JBP12,L3;P12等于1跳转到L3MOVA,#08H;将第三行行值送入ACCAJMPLK;跳转到键值处理程序L3:JBP13,NEXT;P13等于1跳转到NEXT处MOVA,#0CH;将第四行行值送入ACCLK:ADDA,R3;行值与列值相加后的键值送入APUSHACC;将A中的值送入堆栈暂存K4:LCALLDELAY2;调用延时去抖程序LCALLKS;调用按键检测程序JNZK4;按键没有松开继续返回检测POPACC;将堆栈值送入ACCMOVDPTR,#KEYTABMOVCA,@A+DPTRRETNEXT:INCR3;列值加一MOVA,R2;R2值送入AJNBACC7,KEY;扫描完至KEY处进行下一扫描RLA;扫描未完将值左移一位进行下一列扫描MOVR2,A;将ACC值送入R2暂存AJMPK3;跳转到K3继续KS:MOVP1,#0FH;将P1口高四位置0低四位置1MOVA,P1;读P1口XRLA,#0FH;将A中的值与A中的值相异或RET;子程序返回KEYTAB:DB1,2,3,10,4,5,6,11,7,8,9,12,15,0,14,13;键值表DELAY2:MOVR6,#2H;延时去抖动子程序LP1:MOVR7,#0FAHLP2:DJNZR7,LP2DJNZR6,LP1RETEND
以上就是关于VB中的sendkeys用法全部的内容,包括:VB中的sendkeys用法、请问如何将C或汇编源程序或烧到自己制作的PCB板上 谢谢···、计算器显示器数字12345后面c什么意思怎么去掉等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)