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程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)