怎么用C语言写出一个让程序自动按键的,只要按两个键就够了

怎么用C语言写出一个让程序自动按键的,只要按两个键就够了,第1张

c语言完成这个有点难,用按键精灵吧,实现这个很简单的。

退出程序的话,用编程来说,你可以先选定你程序的窗口句柄,然后直接关掉这个窗口,你要是想纯模拟键盘 *** 作的话,你还得考虑当前焦点在不在你的程序窗口上。

因为vbShiftMask,vbCtrlMask,vbAltMask是按位排列的,即2^n(n=0,1,2),分别为1,2,4,像这种情况,程序处理的时候就要用到位运算符(And)来处理这种数据。这个程序可以简化,你看看下面的。组合键情况显示在窗体Caption里。

代码如下。

=====================

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

Dim s As String

If (Shift And vbShiftMask) = vbShiftMask Then s = s & "SHIFT" & " "

If (Shift And vbCtrlMask) = vbCtrlMask Then s = s & "CTRL" & " "

If (Shift And vbAltMask) = vbAltMask Then s = s & "ALT" & " "

Caption = s

End Sub

这个程序是AVR单片机的,看下可能对你有用

#include

<ioavrh>

#include

<intrinsicsh>

#define

duanseg

PORTC

#define

uchar

unsigned

char

#define

uint

unsigned

int

uchar

table[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0};

uchar

table1[]={0x08,0xce,0x12,0x82,0xc4,0x81,0x01,0xca,0x00,0x80};

void

display(uint

num)

//数码管显示

{

PORTA=0x7f;

duanseg=table1[num/1000];

delay_nms(2);

PORTA=0xf0;

PORTA=0xbf;

duanseg=table[num%1000/100];

delay_nms(2);

PORTA=0xf0;

PORTA=0xdf;

duanseg=table[num%100/10];

delay_nms(2);

PORTA=0xf0;

PORTA=0xef;

duanseg=table[num%10];

delay_nms(2);

PORTA=0xf0;

}

void

keyscan()//键盘扫描

{

if((PINB&0x40)==0)

{

delay_nms(5);

if((PINB&0x40)==0)

{

while((PINB&0x40)==0);

//按键释放

flag++;

}

}

if(flag==6)

flag=0;

if(flag==3)

{

if((PINB&0x80)==0)

//切换通道

{

delay_nms(5);

if((PINB&0x80)==0)

{

while((PINB&0x80)==0);

//按键释放

flag1++;

}

}

if(flag1==4)

flag1=0;

}

}

void

set()

//设置上下限

{

if(flag==0)

display(ADHandler());

if(flag==1)

//设置上限

只能加

没有设置减

{

display(high);

if((PINB&0x20)==0)

{

delay_nms(5);

if((PINB&0x20)==0)

{

while((PINB&0x20)==0)

{

display(high);

}

high=high+100;

if(high>4900)

high=2000;

display(high);

}

EEPROM_write(1,

high/100);

}

}

if(flag==2)

//设置下限

只能加

没有设置减

{

display(low);

if((PINB&0x20)==0)

{

delay_nms(5);

if((PINB&0x20)==0)

{

while((PINB&0x20)==0)

{

display(low);

}

low=low+10;

if(low>1000)

low=50;

display(low);

}

EEPROM_write(2,

low/10);

}

}

}

是linux系统吗?

系统的调度单位一般为10ms(HZ=100,每秒100次),即处理器切换任务的最小单位是10ms,也就是2次键盘中断的间隔最少10ms(有更高优先级中断同时发生时,这个值会是10ms的倍数)。

;P1口接键盘进行扫描,P2口接数码管的位码,P0口接数码管的段码

ORG 0000H

LJMP START

ORG 0030H

START:

MOV 30H,#10H ;第8个数码管显示数据缓存寄存器

MOV 31H,#10H ;第7个数码管显示数据缓存寄存器

MOV 32H,#10H ;第6个数码管显示数据缓存寄存器

MOV 33H,#10H ;第5个数码管显示数据缓存寄存器

MOV 34H,#10H ;第4个数码管显示数据缓存寄存器

MOV 35H,#10H ;第3个数码管显示数据缓存寄存器

MOV 36H,#10H ;第2个数码管显示数据缓存寄存器

MOV 37H,#10H ;第1个数码管显示数据缓存寄存器

MAIN:

LCALL SAOMIAO ;调用键盘扫描寄存器

LCALL DISPLAY ;调用显示寄存器

LJMP MAIN

SAOMIAO:

MOV P1,#11111110B ;将P14-P17口做为输入检测口,屏蔽P10-P13三行按键,扫描P00行的按键

JNB P14,A0 ;第一行第一个按键被按下,则跳至A0

JNB P15,A1 ;第一行第二个按键被按下,则跳至A1

JNB P16,A2 ;第一行第三个按键被按下,则跳至A2

JNB P17,A3 ;第一行第四个按键被按下,则跳至A3

MOV P1,#11111101B ;扫描P01接的第二行

JNB P14,A4 ;第二行第一个按键被按下,则跳至A4

JNB P15,A5

JNB P16,A6

JNB P17,A7

MOV P1,#11111011B

JNB P14,A8

JNB P15,A9

JNB P16,A10

JNB P17,A11

MOV P1,#11110111B

JNB P14,A12

JNB P15,A13

JNB P16,A14

JNB P17,A15

RET

A0:

LJMP AN0 ;由于JNB指令的跳转范围仅为8位,所以用LJMP跳入按键处理子程序

A1:

LJMP AN1

A2:

LJMP AN2

A3:

LJMP AN3

A4:

LJMP AN4

A5:

LJMP AN5

A6:

LJMP AN6

A7:

LJMP AN7

A8:

LJMP AN8

A9:

LJMP AN9

A10:

LJMP AN10

A11:

LJMP AN11

A12:

LJMP AN12

A13:

LJMP AN13

A14:

LJMP AN14

A15:

LJMP AN15

AN0:

LCALL DISPLAY

MOV P1,#11111110B

JNB P14,AN0 ;按键消抖

MOV 3FH,#0 ;将按键值送入按键缓存寄存器

LJMP YIDONG ;调用移动子程序

AN1:

LCALL DISPLAY

MOV P1,#11111110B

JNB P15,AN1

MOV 3FH,#1

LJMP YIDONG

AN2:

LCALL DISPLAY

MOV P1,#11111110B

JNB P16,AN2

MOV 3FH,#2

LJMP YIDONG

AN3:

LCALL DISPLAY

MOV P1,#11111110B

JNB P17,AN3

MOV 3FH,#3

LJMP YIDONG

AN4:

LCALL DISPLAY

MOV P1,#11111101B

JNB P14,AN4

MOV 3FH,#4

LJMP YIDONG

AN5:

LCALL DISPLAY

MOV P1,#11111101B

JNB P15,AN5

MOV 3FH,#5

LJMP YIDONG

AN6:

LCALL DISPLAY

MOV P1,#11111101B

JNB P16,AN6

MOV 3FH,#6

LJMP YIDONG

AN7:

LCALL DISPLAY

MOV P1,#11111101B

JNB P17,AN7

MOV 3FH,#7

LJMP YIDONG

AN8:

LCALL DISPLAY

MOV P1,#11111011B

JNB P14,AN8

MOV 3FH,#8

LJMP YIDONG

AN9:

LCALL DISPLAY

MOV P1,#11111011B

JNB P15,AN9

MOV 3FH,#9

LJMP YIDONG

AN10:

LCALL DISPLAY

MOV P1,#11111011B

JNB P16,AN10

MOV 3FH,#10

LJMP YIDONG

AN11:

LCALL DISPLAY

MOV P1,#11111011B

JNB P17,AN11

MOV 3FH,#11

LJMP YIDONG

AN12:

LCALL DISPLAY

MOV P1,#11110111B

JNB P14,AN12

MOV 3FH,#12

LJMP YIDONG

AN13:

LCALL DISPLAY

MOV P1,#11110111B

JNB P15,AN13

MOV 3FH,#13

LJMP YIDONG

AN14:

LCALL DISPLAY

MOV P1,#11110111B

JNB P16,AN14

MOV 3FH,#14

LJMP YIDONG

AN15:

LCALL DISPLAY

MOV P1,#11110111B

JNB P17,AN15

MOV 3FH,#15

LJMP YIDONG

YIDONG: ;移动子程序,将数码管数字向左移动一位

MOV 37H,36H

MOV 36H,35H

MOV 35H,34H

MOV 34H,33H

MOV 33H,32H

MOV 32H,31H

MOV 31H,30H

MOV 30H,3FH

RET

DISPLAY:

MOV DPTR,#TAB

MOV A,30H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11101111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,31H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11011111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,32H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#10111111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,33H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#01111111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,34H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11111110B

LCALL DELAY

MOV DPTR,#TAB

MOV A,35H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11111101B

LCALL DELAY

MOV DPTR,#TAB

MOV A,36H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11111011B

LCALL DELAY

MOV DPTR,#TAB

MOV A,37H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11110111B

LCALL DELAY

RET

TAB:

DB 03H 9FH 25H 0DH 99H 49H 41H 1FH ;03H到071H是表示0到F

DB 01H 19H 11H 0C1H 0E5H 85H 21H 71H

DB 0FFH ;“0”——“F”再加上不显示,一共十七个代码

DELAY:

MOV R6,#5

D1:

MOV R7,#255

DJNZ R7,$

DJNZ R6,D1

RET

这个太简单了吧,记住写程序定时器要一直跑,建立一个时基,像个手表的时间一样要一直跑,即有time_125us,time_1ms,time_100ms,time_1s,time_1min,time_1hour等时间变量建立时基一直走。其它程序可以分时扫描也可以轮流扫描,不能停留死等,像电脑里的程序一样表面看起来各个程序是一直运行的,即各个程序中不能有delay_1ms之类的函数,如果要定时应该申请一个变量在时基里处理,如等待2s可以这么写

if(step==0){

time=2,time_100ms=0,step=1;}

if((step==1)&&(time==0)){//2s到

//等待2s后要执行的代码

}

在时基时每1s把time减1,减到0为止即if(time)time--;

对按键的写法一般用采集的方法如按键后IO为低

if(!IO){

//低电平,有按键

key_time++;

if((key_time==100)&&(!key_flag)){

//已经赋值了就不再赋值了

key_flag=1;

key_flag_bak=1;

}

else{

//无按键

key_time=0;

key_flag_bak=0;

}

if(key_flag&&(!key_flag_bak)){

//有按键并松开,即松开响应

time=2;

//亮2s

key_flag=0;//把键值清0

}

if(time){

LED_ON;//灯亮

}

else

LED_OFF;

以上就是关于怎么用C语言写出一个让程序自动按键的,只要按两个键就够了全部的内容,包括:怎么用C语言写出一个让程序自动按键的,只要按两个键就够了、VB一个简单的键盘按键响应程序、求助:51单片机按键C程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9390110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存