C语言按键代码

合集下载

俄罗斯方块C语言代码

俄罗斯方块C语言代码

>include <>include <>include <>__cplusplusdefine __CPPARGS ...elsedefine __CPPARGSdefine MINBOXSIZE 15 / 最小方块的尺寸 /define BGCOLOR 7 / 背景着色 /define GX 200define GY 10define SJNUM 10000 / 每当玩家打到一万分等级加一级/ / 按键码/define VK_LEFT 0x4b00define VK_RIGHT 0x4d00define VK_DOWN 0x5000define VK_UP 0x4800define VK_HOME 0x4700define VK_END 0x4f00define VK_SPACE 0x3920define VK_ESC 0x011bdefine VK_ENTER 0x1c0d/ 定义俄罗斯方块的方向我定义他为4种/define F_DONG 0define F_NAN 1define F_XI 2define F_BEI 3define NEXTCOL 20 / 要出的下一个方块的纵坐标/ define NEXTROW 12 / 要出的下一个方块的横从标/ define MAXROW 14 / 游戏屏幕大小/define MAXCOL 20define SCCOL 100 /游戏屏幕大显示器上的相对位置/ define SCROW 60int gril2216; / 游戏屏幕坐标/int col=1,row=7; / 当前方块的横纵坐标/int boxfx=0,boxgs=0; / 当前寺块的形壮和方向/int nextboxfx=0,nextboxgs=0,maxcol=22;/下一个方块的形壮和方向/ int minboxcolor=6,nextminboxcolor=6;int num=0; /游戏分/int dj=0,gamedj10={18,16,14,12,10,8,6,4,2,1};/ 游戏等级// 以下我用了一个3组来纪录方块的最初形状和方向/int boxstr7416={{{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},{{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},{{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0}, {1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0}, {1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0}, {0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}}, {{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0}, {1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}, {0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0}, {1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}}, {{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}, {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}, {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}, {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}}, {{1,1,0,0,1,1,0,0,0,0,0,,0,0,0}, {1,1,0,0,1,1,0,0,0,0,0,,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,,0,0,0}},{{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{0,1,0,0,1,1,1,0,0,0,0,,0,0,0},{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}};/ 随机得到当前方块和下一个方块的形状和方向/void boxrad{minboxcolor=nextminboxcolor;boxgs=nextboxgs;boxfx=nextboxfx;nextminboxcolor=random14+1;ifnextminboxcolor==4||nextminboxcolor==7||nextminboxcolor==8 nextminboxcolor=9;nextboxfx=F_DONG;nextboxgs=random7;}/初始化图形模试/void initint gdrive,int gmode{int errorcode;initgraph&gdrive,&gmode,"e:\\tc";errorcode=graphresult;iferrorcode=grOk{printf"error of: %s",grapherrormsgerrorcode; exit1;}}/ 在图形模式下的清屏 /void cls{setfillstyleSOLID_FILL,0;setcolor0;bar0,0,640,480;}/在图形模式下的高级清屏/void clscrint a,int b,int c,int d,int color{ setfillstyleSOLID_FILL,color;setcolorcolor;bara,b,c,d;}/最小方块的绘制/void minboxint asc,int bsc,int color,int bdcolor{int a=0,b=0;a=SCCOL+asc;b=SCROW+bsc;clscra+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color; ifcolor=BGCOLOR{setcolorbdcolor;linea+1,b+1,a-1+MINBOXSIZE,b+1;linea+1,b+1,a+1,b-1+MINBOXSIZE;linea-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE; linea+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE;}}/游戏中出现的文字/void txtint a,int b,char txt,int font,int color{ setcolorcolor;settextstyle0,0,font;outtextxya,b,txt;}/windows 绘制/void winint a,int b,int c,int d,int bgcolor,int bordercolor{ clscra,b,c,d,bgcolor;setcolorbordercolor;linea,b,c,b;linea,b,a,d;linea,d,c,d;linec,b,c,d;}/ 当前方块的绘制/void funboxint a,int b,int color,int bdcolor{int i,j;int boxz44;fori=0;i<16;i++boxzi/4i%4=boxstrboxgsboxfxi;fori=0;i<4;i++forj=0;j<4;j++ifboxzij==1minboxj+row+aMINBOXSIZE,i+col+bMINBOXSIZE,color,bdcolor; }/下一个方块的绘制/void nextfunboxint a,int b,int color,int bdcolor{int i,j;int boxz44;fori=0;i<16;i++boxzi/4i%4=boxstrnextboxgsnextboxfxi;fori=0;i<4;i++forj=0;j<4;j++ifboxzij==1minboxj+aMINBOXSIZE,i+bMINBOXSIZE,color,bdcolor; }/时间中断定义/define TIMER 0x1cint TimerCounter=0;void interrupt oldhandler__CPPARGS;void interrupt newhandler__CPPARGS{ TimerCounter++;oldhandler;}void SetTimervoid interrupt IntProc__CPPARGS{ oldhandler=getvectTIMER;disable;setvectTIMER,IntProc;enable;}/由于游戏的规则,消掉都有最小方块的一行/void delcolint a{int i,j;fori=a;i>1;i--forj=1;j<15;j++{minboxjMINBOXSIZE,iMINBOXSIZE,BGCOLOR,BGCOLOR; grilij=grili-1j;ifgrilij==1minboxjMINBOXSIZE,iMINBOXSIZE,minboxcolor,0; }}/消掉所有都有最小方块的行/void delete{int i,j,zero,delgx=0;char nm="00000";fori=1;i<21;i++{zero=0;forj=1;j<15;j++ifgrilj==0zero=1;ifzero==0{delcoli;delgx++;}}num=num+delgxdelgx10;dj=num/10000; sprintfnm,"%d",num;clscr456,173,500,200,4;txt456,173,"Number:",1,15; txt456,193,nm,1,15;}/时间中断结束/void KillTimer{disable;setvectTIMER,oldhandler; enable;}/ 测试当前方块是否可以向下落/ int downok{int i,j,k=1,a44;fori=0;i<16;i++ai/4i%4=boxstrboxgsboxfxi;fori=0;i<4;i++forj=0;j<4;j++ifaj && grilcol+i+1row+jk=0;returnk;}/ 测试当前方块是否可以向左行/ int leftok{int i,j,k=1,a44;fori=0;i<16;i++ai/4i%4=boxstrboxgsboxfxi;fori=0;i<4;i++forj=0;j<4;j++ifaj && grilcol+irow+j-1k=0;returnk;}/ 测试当前方块是否可以向右行/ int rightok{int i,j,k=1,a44;fori=0;i<16;i++ai/4i%4=boxstrboxgsboxfxi;fori=0;i<4;i++forj=0;j<4;j++ifaj && grilcol+irow+j+1k=0;returnk;}/ 测试当前方块是否可以变形/ int upok{int i,j,k=1,a44;fori=0;i<4;i++fori=0;i<16;i++ai/4i%4=boxstrboxgsboxfx+1i;fori=3;i>=0;i--forj=3;j>=0;j--ifaj && grilcol+irow+jk=0;returnk;}/当前方块落下之后,给屏幕坐标作标记/ void setgril{int i,j,a44;funbox0,0,minboxcolor,0;fori=0;i<16;i++ai/4i%4=boxstrboxgsboxfxi;fori=0;i<4;i++forj=0;j<4;j++ifajgrilcol+irow+j=1;col=1;row=7;}/游戏结束/void gameover{int i,j;fori=20;i>0;i--forj=1;j<15;j++ minboxjMINBOXSIZE,iMINBOXSIZE,2,0;txt103,203,"",3,10;}/按键的设置/void call_keyint keyx{switchkeyx{case VK_DOWN: { /下方向键,横坐标加一;/ ifdownok{col++;funbox0,0,minboxcolor,0;}else{funbox0,0,minboxcolor,0;setgril;nextfunboxNEXTCOL,NEXTROW,4,4;boxrad;nextfunboxNEXTCOL,NEXTROW,nextminboxcolor,0; delete;}break;}case VK_UP: { /上方向键,方向形状旋转90度/ ifupokboxfx++;ifboxfx>3boxfx=0;funbox0,0,minboxcolor,0;break;}case VK_LEFT:{ /左方向键,纵坐标减一/ifleftokrow--;funbox0,0,minboxcolor,0;break;}case VK_RIGHT:{ /右方向键,纵坐标加一/ ifrightokrow++;funbox0,0,minboxcolor,0;break;}case VK_SPACE: /,直接落到最后可以落到的们置/ whiledownokcol++;funbox0,0,minboxcolor,0;setgril;nextfunboxNEXTCOL,NEXTROW,4,4;boxrad;nextfunboxNEXTCOL,NEXTROW,nextminboxcolor,0; delete;break;default:{txt423,53,"worng key",1,4;txt428,80,"Plese Enter Anly Key AG",1,4;;clscr420,50,622,97,BGCOLOR;}}}/时间中断开始/void timezdvoid{int key;SetTimernewhandler;boxrad;nextfunboxNEXTCOL,NEXTROW,nextminboxcolor,0; for;;{ifbioskey1{key=bioskey0;funbox0,0,BGCOLOR,BGCOLOR;ifkey==VK_ESCbreak;call_keykey;}ifTimerCounter>gamedjdj{TimerCounter=0;ifdownok{funbox0,0,BGCOLOR,BGCOLOR;col++;funbox0,0,minboxcolor,0;}else {ifcol==1{gameover;;break;}setgril;delete;funbox0,0,minboxcolor,0;col=1;row=7;funbox0,0,BGCOLOR,BGCOLOR; nextfunboxNEXTCOL,NEXTROW,4,4;boxrad;nextfunboxNEXTCOL,NEXTROW,nextminboxcolor,0; }}}}/主程序开始/void mainvoid{int i,j;char nm="00000"; initVGA,VGAHI;cls;/屏幕坐标初始化/fori=0;i<=MAXCOL+1;i++ forj=0;j<=MAXROW+1;j++ grilij=0;fori=0;i<=MAXCOL+1;i++ { grili0=1;grili15=1;}forj=1;j<=MAXROW;j++{ gril0j=1;gril21j=1;}clscr0,0,640,480,15;win1,1,639,479,4,15;winSCCOL+MINBOXSIZE-2,SCROW+MINBOXSIZE-2,SCCOL+15MINBOXSIZE+2,SCROW+21MINBOXSI ZE+2,BGCOLOR,0;nextboxgs=random8;nextboxfx=random4;sprintfnm,"%d",num;txt456,173,"Number:",1,15;txt456,193,nm,1,15;txt456,243,"Next Box:",1,15;timezd;KillTimer;closegraph;;}。

用C语言编写程序实现通过按键使LED灯周期闪烁

用C语言编写程序实现通过按键使LED灯周期闪烁

用C语言编写程序实现通过按键使LED灯周期闪烁(2010-02-24 21:12:44)标签:循环闪烁周期led灯按键杂谈一、设计题目二、程序功能:开机复位后,LED0到LED7全部点亮,所有LEDPort持续2S后熄灭,然后等待按键,按0键LED7以0.8S周期闪烁,按1键LEDPort以1S周期闪烁。

三、总体设计思想用中断方式实现定时器的定时,然后通过键盘中断程序实现通过对按键的操作来实现相应的周期闪烁。

在我编写的实验程序中我用到了定时器中断和外部中断。

程序共分为两个模块,一个为定时器模块,一个为键盘中断程序模块,在主函数中,首先实现所有LEDPort点亮,然后通过中断方式实现定时2S,在定时器num==20时,设定全局变量为标志位flag=1,然后再主函数中设定条件,通过标志位的变化实现所有LEDPort持续2S后熄灭。

然后进入循环,等待按键,在按键中断服务程序中使用switch语句实现通过改变num1的值来实现LED7的闪烁周期。

设定标志位b=0,在主函数中使用if语句通过判断b的值来改变LED7的亮灭情况,同时相应的b值会取反。

四、程序具体实现实验要求开机复位后,LED0到LED7全部点亮2S后熄灭。

在主函数中使用LEDPort=0x00;这条语句实现所有灯都亮,使用中断方式实现定时器定时2S,因为实验要求20ms溢出,所以设定num=100,在定时器中断服务程序中使用if语句判断条件,当num加到100,也就是说2S时间到时,执行flag=1;语句(先设定全局变量flag=0)。

然后在主函数中使用while语句规定只有在flag=0时才执行所有LEDPort点亮的操作。

2S时间到后,所有灯熄灭。

然后进入while循环,等待用户按键。

用户按键后,通过使用switch语句,实验按0键,num1=20,按1键,num1=50,。

而在主函数中,当按下0键或者1键时,num1就有了固定的值,通过if语句判断是否到达所要求的时间后,执行相应操作。

极其简单好用的按键扫描程序(C语言)

极其简单好用的按键扫描程序(C语言)

不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。
同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。
原理么?可能你也会想到,对于点触开关,按照上面的办法处理一次按下和长按,对于开关型,我们只需要处理Cont就OK了,为什么?很简单嘛,把它当成是一个长按键,这样就找到了共同点,屏蔽了所有的细节。程序就不给了,完全就是应用2的内容,在这里提为了就是说明原理~~
好了,这个好用的按键处理算是说完了。可能会有朋友会问,为什么不说延时消抖问题?哈哈,被看穿了。果然不能偷懒。下面谈谈这个问题,顺便也就非常简单的谈谈我自己用时间片轮办法,以及是如何消抖的。
}
完了。有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!
下面是程序解释:
Trg(triger) 代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
{
SysInit();
while(1) // 每20ms 执行一次大循环
{
KeyRead(); // 将每个子程序都扫描一遍
KeyProc();
Func1();
(1) 没有按键的时候
端口为0xff,ReadData读端口并且取反,很显然,就是 0x00 了。

俄罗斯方块C语言代码

俄罗斯方块C语言代码

#include <stdio.h>#include <dos.h>#include <conio.h>#include <graphics.h>#include <stdlib.h>#ifdef__cplusplus#define __CPPARGS ...#else#define __CPPARGS#endif#define MINBOXSIZE 15 /* 最小方块的尺寸*/#define BGCOLOR 7 /* 背景着色*/#define GX 200#define GY 10#define SJNUM 10000 /* 每当玩家打到一万分等级加一级*/ /* 按键码*/#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x4800#define VK_HOME 0x4700#define VK_END 0x4f00#define VK_SPACE 0x3920#define VK_ESC 0x011b#define VK_ENTER 0x1c0d/* 定义俄罗斯方块的方向(我定义他为4种)*/#define F_DONG 0#define F_NAN 1#define F_XI 2#define F_BEI 3#define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/#define NEXTROW 12 /* 要出的下一个方块的横从标*/#define MAXROW 14 /* 游戏屏幕大小*/#define MAXCOL 20#define SCCOL 100 /*游戏屏幕大显示器上的相对位置*/#define SCROW 60int gril[22][16]; /* 游戏屏幕坐标*/int col=1,row=7; /* 当前方块的横纵坐标*/int boxfx=0,boxgs=0; /* 当前寺块的形壮和方向*/int nextboxfx=0,nextboxgs=0,maxcol=22;/*下一个方块的形壮和方向*/ int minboxcolor=6,nextminboxcolor=6;int num=0; /*游戏分*/int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* 游戏等级*//* 以下我用了一个3维数组来纪录方块的最初形状和方向*/int boxstr[7][4][16]={{{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},{{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},{{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0},{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}},{{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}},{{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}},{{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}},{{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0},{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}};/* 随机得到当前方块和下一个方块的形状和方向*/void boxrad(){minboxcolor=nextminboxcolor;boxgs=nextboxgs;boxfx=nextboxfx;nextminboxcolor=random(14)+1;if(nextminboxcolor==4||nextminboxcolor==7||nextminboxcolor==8) nextminboxcolor=9;nextboxfx=F_DONG;nextboxgs=random(7);}/*初始化图形模试*/void init(int gdrive,int gmode){int errorcode;initgraph(&gdrive,&gmode,"e:\\tc");errorcode=graphresult();if(errorcode!=grOk){printf("error of: %s",grapherrormsg(errorcode));exit(1);}}/* 在图形模式下的清屏*/void cls(){setfillstyle(SOLID_FILL,0);setcolor(0);bar(0,0,640,480);}/*在图形模式下的高级清屏*/void clscr(int a,int b,int c,int d,int color){setfillstyle(SOLID_FILL,color);setcolor(color);bar(a,b,c,d);}/*最小方块的绘制*/void minbox(int asc,int bsc,int color,int bdcolor){int a=0,b=0;a=SCCOL+asc;b=SCROW+bsc;clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color);if(color!=BGCOLOR){setcolor(bdcolor);line(a+1,b+1,a-1+MINBOXSIZE,b+1);line(a+1,b+1,a+1,b-1+MINBOXSIZE);line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE); line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE); }}/*游戏中出现的文字*/void txt(int a,int b,char *txt,int font,int color){setcolor(color);settextstyle(0,0,font);outtextxy(a,b,txt);}/*windows 绘制*/void win(int a,int b,int c,int d,int bgcolor,int bordercolor){clscr(a,b,c,d,bgcolor);setcolor(bordercolor);line(a,b,c,b);line(a,b,a,d);line(a,d,c,d);line(c,b,c,d);}/* 当前方块的绘制*/void funbox(int a,int b,int color,int bdcolor){int i,j;int boxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor); }/*下一个方块的绘制*/void nextfunbox(int a,int b,int color,int bdcolor){int i,j;int boxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[nextboxgs][nextboxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,bdcolor);}/*时间中断定义*/#define TIMER 0x1cint TimerCounter=0;void interrupt ( *oldhandler)(__CPPARGS);void interrupt newhandler(__CPPARGS){TimerCounter++;oldhandler();}void SetTimer(void interrupt (*IntProc)(__CPPARGS)){oldhandler=getvect(TIMER);disable();setvect(TIMER,IntProc);enable();}/*由于游戏的规则,消掉都有最小方块的一行*/void delcol(int a){int i,j;for(i=a;i>1;i--)for(j=1;j<15;j++){minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR);gril[i][j]=gril[i-1][j];if(gril[i][j]==1)minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor,0);}/*消掉所有都有最小方块的行*/ void delete(){int i,j,zero,delgx=0;char *nm="00000";for(i=1;i<21;i++){zero=0;for(j=1;j<15;j++)if(gril[j]==0)zero=1;if(zero==0){delcol(i);delgx++;}}num=num+delgx*delgx*10;dj=num/10000;sprintf(nm,"%d",num);clscr(456,173,500,200,4);txt(456,173,"Number:",1,15);txt(456,193,nm,1,15);}/*时间中断结束*/void KillTimer(){disable();setvect(TIMER,oldhandler); enable();}/* 测试当前方块是否可以向下落*/ int downok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i]; for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i+1][row+j])k=0;return(k);/* 测试当前方块是否可以向左行*/int leftok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i][row+j-1])k=0;return(k);}/* 测试当前方块是否可以向右行*/int rightok(){int i,j,k=1,a[4][4];for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j] && gril[col+i][row+j+1])k=0;return(k);}/* 测试当前方块是否可以变形*/int upok(){int i,j,k=1,a[4][4];for(i=0;i<4;i++)for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx+1][i];for(i=3;i>=0;i--)for(j=3;j>=0;j--)if(a[j] && gril[col+i][row+j])k=0;return(k);}/*当前方块落下之后,给屏幕坐标作标记*/ void setgril(){int i,j,a[4][4];funbox(0,0,minboxcolor,0);for(i=0;i<16;i++)a[i/4][i%4]=boxstr[boxgs][boxfx][i];for(i=0;i<4;i++)for(j=0;j<4;j++)if(a[j])gril[col+i][row+j]=1;col=1;row=7;}/*游戏结束*/void gameover(){int i,j;for(i=20;i>0;i--)for(j=1;j<15;j++)minbox(j*MINBOXSIZE,i*MINBOXSIZE,2,0);txt(103,203,"Game Over",3,10);}/*按键的设置*/void call_key(int keyx){switch(keyx){case VK_DOWN: { /*下方向键,横坐标加一。

T8:编制并运行按键测试程序

T8:编制并运行按键测试程序

int main(void) { int buttons_fd; char buttons[6] = {'0', '0', '0', '0', '0', '0'}; buttons_fd = open("/dev/buttons", 0); if (buttons_fd < 0) { perror("open device buttons"); exit(1); }
}
3 Linux read函数说明
功能描述: 从文件读取数据。 用法: #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 参数: fd:将要读取数据的文件句柄。 buf:存放读取到的数据的内存缓冲区。 count:需要读取的数据量。 返回说明: 成功执行时,返回所读取的数据量;失败返回-1。
5.1 makefile介绍
详细介绍见文档“gcc,gdb,makefile.pdf”
5.2 buttons_test.c Makefile
代码清单: CROSS=arm-linux all: buttons buttons: buttons_test.c $(CROSS)gcc -o buttons buttons_test.c clean: @rm -vf buttons *.o *~ 要编译buttons_test.c,可以执行以下命令: make 要删除目标文件和中间文件,则执行以下命令: make clean
misc /dev/buttons /opt/FriendlyARM/mini2440/exa mples/buttons

ds1302+ds18b20+闹钟按键可调万年历c语言程序

ds1302+ds18b20+闹钟按键可调万年历c语言程序

#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuint nian,yue,ri,week,shi,fen,miao,shuju,naoshi,naofen;uchar ds1302_addr,ds1302_data,temp,temp1,bz=0,shanshuo=0;uchar r0,r1,nh,nl,yh,yl,rh,rl,sh,sl,fh,fl,mh,ml,wh,wl,nsh,nsl,nfh,nfl; uchar moshibz,jiabz,jianbz,kaishibz,naobz,speek;uchartab[11]={0Xc0,0Xf9,0Xa4,0Xb0,0X99,0X92,0X82,0Xf8,0X80,0X90,0xff}; sbit rst=P1^0;sbit clk=P1^1;sbit io=P1^2;sbit DQ=P1^3;sbit zz=P1^7;sbit moshi=P1^6;sbit jia=P1^5;sbit jian=P1^4;sbit kaishi=P3^1;sbit nao=P3^0;sbit led=P2^7;sbit ACC0=ACC^0;sbit ACC7=ACC^7;/*****************延时函数*********************/void d elay(uchar k) //延时程序,约0.1ms{uchar n,m;for(n=0;n<k;n++){for(m=0;m<120;m++);}}/*****************写地址子函数*********************/void w rit_addr(uchar ds1302_addr) //读ds1302 函数{ACC=ds1302_addr;rst=1;for(r1=8;r1>0;r1--){io=ACC0;clk=0;clk=1;ACC=ACC>>1;}}/*****************写数据子函数*********************/void w rit_data(uchar ds1302_data){ACC=ds1302_data;rst=1;for(r1=8;r1>0;r1--){io=ACC0;clk=0;clk=1;ACC=ACC>>1;}rst=0;}/*****************写入ds1302函数*********************/ void write(uchar add,ss) {clk=0;_nop_();rst=0;_nop_();rst=1;_nop_();writ_addr(add);_nop_();writ_data(ss);_nop_();clk=1;_nop_();rst=0;_nop_();}uchar read_data(void) {for(r1=8;r1>0;r1--){ACC7=io;clk=1;clk=0;ACC=ACC>>1;}return ACC;}/*****************读ds1302函数*********************/ void read(uchar addc) { uchar kk;clk=0;_nop_();_nop_();rst=1;_nop_();writ_addr(addc);_nop_();kk=read_data();_nop_();clk=1;_nop_();rst=0;_nop_();ds1302_data=(kk/16)*10+(kk%16); }/*****************//读ds1302 函数*********************/void r ed_dsl302(void){read(0x8d);nian=ds1302_data;read(0x8b);week=ds1302_data;read(0x89);yue=ds1302_data;read(0x87);ri=ds1302_data;read(0x85);shi=ds1302_data;read(0x83);fen=ds1302_data;read(0x81);miao=ds1302_data;}/*****************//写ds1302函数*********************//*void writl302(void){write(0x8e,0x00);write(0x8c,nian);write(0x8a,week);write(0x88,yue);write(0x86,ri);write(0x84,shi);write(0x82,fen);write(0x80,miao);*//*****************初始化函数*********************/void t0_init(void){IE=0X82;TMOD=0X01;TH0=0x3c;TL0=0XB0;TR0=1;r0=0;}/*****************定时器0函数*********************/void t imer() interrupt 1 {TH0=0x3c; //TL0=0XB0;r0++;if(r0==10){r0=0;shanshuo=~shanshuo;}}/*****************闹钟显示函数*********************/void n aozhong(void){P2=0xff;P2=tab[nsh];P0=0xfb;delay(2);P0=0xFF;P2=0xff;P2=tab[nsl];P0=0xF7;delay(2);P0=0xFF;P2=0xff;P2=tab[nfh];P0=0xfe;delay(2);P0=0xFF;P2=tab[nfl];P0=0xFd;delay(2);P0=0xFF;P2=0xff;P2=tab[wh];P0=0xbf;delay(2);P0=0xFF;P2=0xff;P2=tab[wl];P0=0x7f;delay(2);P0=0xFF;P2=0xff;P2=tab[mh];P0=0xef;delay(2);P0=0xFF;P2=0xff;P2=tab[ml];P0=0xdf;delay(2);P0=0xFF;}/*****************全部显示函数************************/ void d isplay(void){if(speek==1){naozhong();}else{P2=0xff;P2=tab[mh];P0=0xef;delay(2);P0=0xFF;P2=0xff;P2=tab[ml];P0=0xdf;delay(2);P2=0xff;P2=tab[fh]; P0=0xfb; delay(2);P0=0xFF;P2=0xff;P2=tab[fl]; P0=0xF7; delay(2);P0=0xFF;P2=0xff;P2=tab[sh]; P0=0xfe; delay(2);P0=0xFF;P2=0xff;P2=tab[sl]; P0=0xFd; delay(2);P0=0xFF;P2=0xff;P2=tab[rh]; P3=0xbf; delay(2);P3=0xFF;P2=0xff;P2=tab[rl]; P3=0x7f; delay(2);P3=0xFF;P2=0xff;P2=tab[yh]; P3=0xef; delay(2);P3=0xFF;P2=0xff;P2=tab[yl]; P3=0xdf; delay(2);P3=0xFF;P2=0xff;P2=tab[nh];delay(2);P3=0xFF;P2=0xff;P2=tab[nl];P3=0xF7;delay(2);P3=0xFF;P2=0xff;zz=0;P2=tab[week];delay(2);zz=1;P2=0xff;P2=tab[wh];P0=0xbf;delay(2);P0=0xFF;P2=0xff;P2=tab[wl];P0=0x7f;delay(2);P0=0xFF;}P2=0xff;P2=tab[wh];P0=0xbf;delay(2);P0=0xFF;P2=0xff;P2=tab[wl];P0=0x7f;delay(2);P0=0xFF;}/*****************闹钟切换函数*********************/ void n aokey(void){if(nao==0){if(naobz==0){naobz=1;speek=!speek;}}if(nao!=0){naobz=0;}}/*****************按键函数*********************/ void k ey(void){if(kaishi==0){if(kaishibz==0){kaishibz=1;bz=7;}}if(kaishi!=0){kaishibz=0;}if(moshi==0){if(moshibz==0){moshibz=1;if(bz==7){bz=0;}else{bz++;}}}if(moshi!=0){moshibz=0;}}/*****************按键加函数*********************/ void s hangtiao(void){if(jia==0){if(jiabz==0){jiabz=1;if(shuju==59){shuju=0;}else{shuju++;}}}if(jia!=0){jiabz=0;}}/*****************按键减函数*********************/void x iatiao(void){if(jian==0){if(jianbz==0){jianbz=1;if(shuju==0){shuju=20;}else{shuju--;}}}if(jian!=0){jianbz=0;}}/*****************分离函数*********************/void f enli(void){if(fen==59&miao==56){led=0;}else{led=1;}if(speek==1){if(bz==1){shuju=naoshi; //先用十进制家,加完后必须转化成十六进制写入shangtiao();xiatiao();naoshi=shuju;if(shanshuo==1){nsh=10;nsl=10;}else{nsh=naoshi/10;nsl=naoshi%10;}}else{nsh=naoshi/10;nsl=naoshi%10;if(bz==2){shuju=naofen;shangtiao();xiatiao();naofen=shuju;if(shanshuo==1){nfh=10;nfl=10;}else{nfh=naofen/10;nfl=naofen%10;}}else{bz=0;nfh=naofen/10;nfl=naofen%10;}}}else{if(bz==1){shuju=nian; //先用十进制家,加完后必须转化成十六进制写入shangtiao();xiatiao();nian=shuju;nian=(nian/10)*16+(nian%10);write(0x8c,nian);nian=(nian/16)*10+(nian%16);if(shanshuo==1){nh=10;nl=10;}else{nh=nian/10;nl=nian%10;}}else{nh=nian/10;nl=nian%10;if(bz==2){shuju=yue;shangtiao();xiatiao();yue=shuju;yue=(yue/10)*16+(yue%10);write(0x88,yue);yue=(yue/16)*10+(yue%16);if(shanshuo==1){yh=10;yl=10;}else{yh=yue/10;yl=yue%10;}}else{yh=yue/10;yl=yue%10;if(bz==3){shuju=ri;shangtiao();xiatiao();ri=shuju;ri=(ri/10)*16+(ri%10);write(0x86,ri);ri=(ri/16)*10+(ri%16);if(shanshuo==1){rh=10;rl=10;}else{rh=ri/10;rl=ri%10;}}else{rh=ri/10;rl=ri%10;if(bz==4){shuju=shi;shangtiao();xiatiao();shi=shuju;shi=(shi/10)*16+(shi%10);write(0x84,shi);shi=(shi/16)*10+(shi%16);if(shanshuo==1){sh=10;sl=10;}else{sh=shi/10;sl=shi%10;}}else{sh=shi/10;sl=shi%10;if(bz==5){shuju=fen;shangtiao();xiatiao();fen=shuju;fen=(fen/10)*16+(fen%10);write(0x82,fen);fen=(fen/16)*10+(fen%16);if(shanshuo==1){fh=10;fl=10;}else{fh=fen/10;fl=fen%10;}}else{fh=fen/10;fl=fen%10;if(bz==6){shuju=week;shangtiao();xiatiao();week=shuju;week=(week/10)*16+(week%10);write(0x82,week);week=(week/16)*10+(week%16);if(shanshuo==1){week=10;}else{;}}else{;}}}}}}}mh=miao/10;ml=miao%10;wh=temp/10;wl=temp%10;}/***********ds18b20延迟子函数(晶振12MHz)*******/void delay_18B20(unsigned int i){while(i--);}/**********ds18b20初始化函数**********************/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(14);x = DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat=0;for (i=8;i>0;i--){DQ=0; //给脉冲信号dat>>=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat>>=1;}}/**************读取ds18b20当前温度************/void wendu(void){uchar a=0;uchar b=0;uchar flag; //初始化是否成功标志位0,成功1,失败Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换delay_18B20(100); // this message is very importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar();//读取温度值低8位b=ReadOneChar();//读取温度值高8位if(flag)//初始化失败{a=0x00;b=0x00;}temp1=b<<4;temp1+=(a&0xf0)>>4;//小数点前的数据// temp2=a&0x0f;//小数点后的数据temp=temp1;//temp=((b*256+a)>>4);//当前采集温度值除16得实际温度值//temp1 = t/100%10;//温度值十位// temp2 = t/10%10; //温度值个位// temp3 = t%10; //温度值十分位}/*****************比较函数*********************/void b ijiao(void){if(shi==naofen&fen==naoshi){led=0;if(naofen==naofen+1){led=1;}}else{led=1;}}/**********************主函数**********************/void m ain(void){bz=0;shanshuo=1;nian=0x13;yue=0x8;ri=0x11;shi=0x20;fen=0x44;miao=0x10;week=0x07;// writl302(); //因为ds1302只须写入一次,所以将此处屏蔽。

俄罗斯方块C语言代码

俄罗斯方块C语言代码

俄罗斯方块C语言代码#include#include#include#include#ifdef uuuucplusplus#define__cppargs...#else#定义_ucpargs#endif#defineminboxsize15/*最小方块的尺寸*/#definebgcolor7/*背景着色*/#定义200#定义10#definesjnum10000/*每当玩家打到一万分等级加一级*//*按键码*/#定义左0x4B00#定义右0x4D00#定义下0x5000#定义上0x4800#definevk_home0x4700#definevk_end0x4f00#definevk_space0x3920#definevk_esc0x011 b#definevk_enter0x1c0d/*定义俄罗斯方块的方向(我把它定义为4)*/#definef_uuu0#definef_uu1#definef_u2#definef_3#definenextcol20/*要出的下一个方块的纵坐标*/#definenextrow12/*要出的下一个方块的横从标*/#definemaxrow14/*游戏屏幕大小*/#definemaxcol20#definesccol100/*游戏屏幕大显示器上的相对位置*/#definescrow60intgril[22][16];/*游戏屏幕坐标*/intcol=1,row=7;/*当前方块的横纵坐标*/intboxfx=0,boxgs=0;/*当前庙宇块的形状和方向*/intnextboxfx=0,nextboxgs=0,maxcol=22;/*下一个方块的形壮和方向*/intminboxcolor=6,nextminboxcolor=6;intnum=0;/*游戏分*/intdj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/*在游戏级别之下*//*我使用了一个三维组来记录盒子的初始形状和方向*/intboxstr[7][4][16]={{{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0 ,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},{{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,1,0,1 ,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},{{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1 ,0,0,0,1,1,0,0,0,0,0,0},{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}},{{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,0 ,1,0,0,1,1,0,0,0,0,0,0},{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}},{{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0 ,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}},{{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1 ,1,0,0,0,0,0,0.0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}},{{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0},{0,1,0,0,1 ,1,0,0,0,1,0,0,0,0,0,0}}};/*随机得到当前方块和下一个方块的形状和方向*/voidboxrad(){minboxcolor=nextminboxcolor;boxgs=nextboxgs;boxfx=nextboxfx;nextminboxcolor=random(14)+1;如果(nextminboxcolor==4 | | nextminboxcolor==7 | | nextminboxcolor==8)nextminboxcolor=9;nextboxfx=f_2;dong;nextboxgs=random(7);}/*初始化图形模试*/voidinit(intgdrive,intgmode){interrocode;initgraph(&gdrive,&gmode,\errorcode=graphresult();如果(错误代码!=grok){printf(\exit(1);}}/*图形模式下的屏幕清除*/void CLS(){setfillstyle(solid_fill,0);setcolor(0);巴(0,0640480);}/*在图形模式下的高级清屏*/voidclscr(inta,intb,intc,intd,intcolor){setfillstyle(solid_fill,color);setcolor(color);bar(a,b,c,d);}/*最小正方形的绘制*/voidminbox(intasc,intbsc,intcolor,intbdcolor){inta=0,b=0;a=sccol+asc;b=scrow+b sc;clscr(a+1、b+1、a-1+minboxsize、b-1+minboxsize、颜色);如果(color!=bgcolor){setcolor(bdcolor);line(a+1,b+1,a-1+minboxsize,b+1);线路(a+1、b+1、a+1、b-1+minboxsize);line(a-1+minboxsize,b+1,a-1+minboxsize,b-1+minboxsize);line(a+1,b-1+minboxsize,a-1+minboxsize,b-1+minboxsize);}}/*游戏中的文字*/voidtxt(inta,intb,char*txt,intfont,intcolor){setcolor(color);settextstyle(0,0,字体);outtextxy(a,b,txt);}/*windows绘制*/voidwin(inta,intb,intc,intd,intbgcolor,intbordercolor){clscr(a,b,c,d,bgcolor);setcolor(bordercolor);line(a,b,c,b);line(a,b,a,d);line(a,d,c,d);line(c,b,c,d);}/*当前方块的绘制*/voidfunbox(inta,intb,intcolor,intbdcolor){inti,j;intboxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[boxgs][boxfx][i];对于(i=0;i<4;i++)对于(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+row+a)*minboxsize,(i+col+b)*minboxsize,color,bdcolor);}/*下一个方块的绘制*/voidNextFunbX(inta,intb,intcolor,intbdcolor){inti,j;intboxz[4][4];for(i=0;i<16;i++)boxz[i/4][i%4]=boxstr[nextboxgs][nextboxfx][i];对于(i=0;i<4;i++)for(j=0;j<4;j++)if(boxz[i][j]==1)minbox((j+a)*minboxsize,(i+b)*minboxsize,color,bdcolor);}/*时间中断定义*/#definetimer0x1cinttimercounter=0;voidinterrupt(*oldhandler)(__cppargs);voidinterruptnewhandler(__cppargs){timer counter++;oldhandler();}voidsettimer(voidinterrupt(*intproc)(__cppargs)){oldhandler=getvect(timer);dis able();setvect(定时器,intproc);启用();}/*由于游戏的规则,消掉都有最小方块的一行*/voiddelcol(inta){因蒂,j;for(i=a;i>1;i--)for(j=1;j<15;j++){minbox(j*minboxsize,i*minboxsize,bgcolor,bgcolor);gril[i][j]=gril[i-1][j];if(gril[i][j]==1)minbox(j*minboxsize,i*minboxsize,minboxcolor,0);}。

极其简单好用的按键扫描程序C语言

极其简单好用的按键扫描程序C语言

极其简单好用的按键扫描程序(C语言)不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。

我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。

同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。

对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。

因为这是实际项目中总结出来的经验,学校里面学不到的东西。

以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。

当然,我自己也是在多个项目用过,效果非常好的。

好了,工程人员的习惯,废话就应该少说,开始吧。

以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。

用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。

核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1Trg = ReadData &amp; (ReadData ^ Cont); // 2Cont = ReadData; // 3}完了。

有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。

1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。

2:算法1,用来计算触发变量的。

一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

unsigned int Key2Process()
{
if (KEY2==1)
{
// 有按键
if (startkey2flag==0)
{
// 是新的按键按下startkey2flag=1;
key2downtime=G_timebase;
shortkey2flag=0;
return NOKEY;
}
else
{
// 已经开始按键计时, 当检测按键计时超过长按时间则不管释放没有,一次长按, 并清除标志
if (G_timebase-key2downtime>LONGKEYTIME)
{
// 大于长按时间, 判断为长按startkey2flag=0;
return LONGKEY;
}
else
{
// 判断是否是双击第二次按下
if (key2doubleflag==2)
{
if (G_timebase-key2doublewaittime<WAITDOUBLETIME)
{
// 在没有超过双击等待时间内检测到再次按键,把标志改为并设置时间等待释放
key2doubleflag=1; key2downtime=G_timebase; return NOKEY;
}
else
{
// 超了时间,属于新的一次按键startkey2flag=1;
key2doubleflag=0; key2downtime=G_timebase;
shortkey2flag=0;
return NOKEY;直接判断
1,
}
}
else
{
// 没事做
return NOKEY;
}
}
}
}
else
{
// 无按键, 或是按键抖动或是按键释放
if (startkey2flag==1)
{
// 当前有按键待决
if (G_timebase-key2downtime>LONGKEYTIME)
{
// 大于长按时间, 判断为长按
startkey2flag=0;
return LONGKEY;
}
else
{
// 不到长按时间, 可能是短按或是长按的抖动
if (G_timebase-key2downtime>SHORTKEYTIME)
{
// 大于短按时间, 下面开始计时, 判断是抖动还是真正释放
if (shortkey2flag==1)
{
if (G_timebase-key2uptime>JITTERTIME)
{
// 大于抖动时间, 判断是真正的短按释放
if (key2doubleflag==1)
{
// 有双击标志,说明是双击的第二次释放key2doubleflag=0;
startkey2flag=0;
shortkey2flag=0;
return DOUBLEKEY;
}
else
{
// 没有双击标志,看时间是否超过双击等待间隔
if (G_timebase-key2uptime>WAITDOUBLETIME) {
// 大于双击间隔,说明是单击
startkey2flag=0;
key2doubleflag=0;
shortkey2flag=0;
return SHORTKEY;
}
else
{
// 可能是双击第一次释放,也可能是单击释放, 先做2 标志,表示待定,如果在规定时间又按下,说明是双击
key2doubleflag=2;
key2doublewaittime=G_timebase;
return NOKEY;
}
}
}
else
{
// 时间短, 是抖动,继续检测, 啥事都不做
return NOKEY;
}
}
else
{
// 第一次碰到释放, 做标志, 开始记录释放时间
shortkey2flag=1;
key2uptime=G_timebase;
return NOKEY;
}
}
}
}
else
{
// 当前没有按键, 啥事都不做
return NOKEY;
}
}
return NOKEY;
}。

相关文档
最新文档