
#include <reg51h>
#define uchar unsigned char
#define uint unsigned int
sbit led1 = P2^0;//定义管脚;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit key = P1^0;
uchar tcount=0,count=0;//定义时间变量和按键计数变量;
void Delay(uchar i)//机械延时;
{
while(--i);
}
void LedLight(void)//LED控制函数;
{
switch(count)
{
case 3 : led1 = 0;break;//3下时,LED1亮;
case 5 : led2 = 0;break;//5下时,LED2亮;
case 7 : led3 = 0;break;//7下时,LED3亮;
case 9 : led4 = 0;break;//9下时,LED4亮;
case 11: led5 = 0;break;//11下时,LED5亮;
case 13: led6 = 0;break;//13下时,LED6亮;
default: P2 = 0xff;break;//其余的都不亮;
}
}
void InitTimer0(void)//定时器0初始化;
{
TMOD = 0x00;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
TR0 = 1;
}
void main(void)//主函数
{
InitTimer0();
while(1)//无限循环;
{
if(key==0)//检查按键是否按下;
{
Delay(10);//机械延时;
if(key==0){count++;}//按键计数;
while(key==0);
}
if(TF0==1)//复位定时器0;
{
TF0=0;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
tcount++;
if(tcount==20)//1秒的时间;
{
LedLight();
Delay(100);
count=0;//复位按键计数变量;
}
}
}
}
*** 作系统,有两个层次,第一个层次是对组装起电脑的各个硬件的驱动程序;第二个是建立在驱动程序上的各项应用程序,比如桌面显示、键盘监听后的处理程序等等。如果想要进行监听键盘,那么就需要获取到所使用 *** 作系统给出的api接口,以windows系统为例,是用c和c++进行编写的,所以他们提供的api都是c和c++的api接口。于是用java的话就需要用到java的native方法,一个Native Method就是一个java调用非java代码的接口。所以3个步骤:
1、引用java native方法。
2、研究windows api。
3、调用windows api中的键盘监听接口,完成程序。
单片机程序是基于硬件基础上开发的,你至少添加注释和硬件环境说明,不然大家都不知道怎么帮你。
你直接给出代码,也不清楚需要指正什么,这里也没有设置时间/闹钟的代码,发文前应该清楚表达要问的内容。
1)假设你的晶振是12MHz,那一个机器周期是1MHz,定时器的最长定时周期是(65535/10^6)你想要1/6秒触发一次中断就必须结合软件计时,为了尽量精确:硬件计时40000次,软件计时25次那么定时器的设这应该是TH1=(65535-40000)%256;TL1=(65535-40000)%256,(注意计数器大部分是加法计数)
2)按键监听没有给出思路,也没有处理按键抖动,我只能分析程序:
有一个外部中断触发时间设置,P34设置小时、P35设置分钟,但是调整时间后没有进行显示,你至少要让数码管显示结果才能知道怎么调整。
参照窗口程序的设计,检测按键就是用个while来不断检测是不是按到了某个键,至于要做什么就塞循环里
难道要搞机票预订系统么寒……
C是面向过程的只能这样,否则微软早就改进窗口程序代码了
有独立键盘和距阵键盘的 独立键盘的很简单我就不写了 距阵的我给你写一个
//键盘扫描
uchar Keys_Scan()
{
uchar sCode,kCode,i,k;
//低4 位置0,放入4 行
P1=0xf0;
//若高4 位出现0,则有键按下
if((P1&0xf0)!=0xf0)
{
DelayMS(2);
if((P1&0xf0)!=0xf0)
{
sCode=0xfe; //行扫描码初值
for(k=0;k<4;k++) //对4 行分别进行扫描
{
P1=sCode;
if((P1&0xf0)!=0xf0)
{
kCode=~P1;
for(i=0;i<16;i++) //查表得到按键序号并返回
if(kCode==KeyCodeTable[i])
return(i);
}
else
sCode=_crol_(sCode,1);
}
}
}
return(-1);
#include <biosh>
#include <stdioh>
main()
{
int key;
for(;;)
{
if (bioskey(1)) /有键按下,读取键值/
key=bioskey(0);
else /无键按下,返回0/
key=0;
switch(key)
{case 0: /无按键,执行该 *** 作/
case 0xXXXXH:/不同键值,做不同处理/
。。。。。
}
}
}
该程序段功能:
判断是否有键按下,若有进行不同 *** 作,若无进行其他 *** 作。
相关原理:
函数名: bioskey
功 能: 直接使用BIOS服务的键盘接口
函数原型:int bioskey (int cmd)
说明:bioskey()的函数原型在biosh中
bioskey()完成直接键盘 *** 作,cmd的值决定执行什么 *** 作。
cmd = 1:
当cmd是1,bioskey()查询是否按下一个键,若按下一个键则返回非零值,否则返回0。
键盘有按键时,会把键值(扫描码)存入缓冲区,当需要判断是否有键按下时,扫描缓冲区,为空则无键按下,不为空则有键按下。注意:该功能并不清空缓冲区。
cmd = 0:
当cmd是0,bioskey()返回键盘键入的值。它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的低8位数存放该字符的ASCII码,高8位存放该键的扫描码;对于特殊键(如方向键、F1~F12等等),低8位为0,高8位字节存放该键的扫描码。
其 *** 作步骤为:
1检测缓冲区是否有数据;
2没有则继续第一步;
3读取缓冲区第一个单元中的键盘输入
4读取的扫描码
5将已读取的键盘输入从缓冲区删除
呵呵,这倒是有个函数的!!!
kbhit(),这个函数是你可以随便按一个按键就是1,如果你没有按下任何的按键,那就是0;所以就可以把这个函数用在某个循环上面,比如:
while(!kbhit())
{
}
当你不按按键的时候,kbhit()函数就是0,!kbhit()就是1;所以就一直循环下去,直到你按下按键的时候kbhit()就为1了,!kbhit()就为0了;循环就结束了,但这必须是你按键的时候不是给某个输入函数输入!!!
还是给你个例子吧,下面是一个在TC中获取系统时间的程序,直到你按下按键就不再更新时间了!!!
#include <stdioh>
#include <biosh>
#include <timeh>
#include <conioh>
int main()
{struct tm aa;
int year,month,days,sec,min,hour,tian,xingqi;
long bios_time,t1;
while(!kbhit())
{
bios_time = biostime(0, 0L);
sec=(long)(bios_time / CLK_TCK)%60;
min=(long)(bios_time / CLK_TCK / 60)%60;
hour=(long)(bios_time/ CLK_TCK / 3600);
time(&t1);
aa=gmtime(&t1);
year=aa->tm_year+1900;
month=aa->tm_mon+1;
days=aa->tm_mday;
tian=aa->tm_yday+1;
xingqi=(aa->tm_wday)%7;
gotoxy(5,6);
printf("%d/%2d/%2d %2d:%2d:%2d\t xing qi %d\t\t ben nian di %d tian\n",year,month,days,hour,min,sec,xingqi,tian);
}
getch();
}
以上就是关于我想设计一个c语言 按键检测 如果按下就执行测温程序 如果没按下就一直循环直到检测按下 怎呢弄全部的内容,包括:我想设计一个c语言 按键检测 如果按下就执行测温程序 如果没按下就一直循环直到检测按下 怎呢弄、如何实现java在后台监听键盘、51单片机 c语言写的电子时钟程序 请帮忙指正!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)