按键C语言

按键C语言
按键C语言

四、矩阵式键盘及其接口电路

矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上。当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。然而,矩阵键盘中的行线、列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,因此,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。

2. 矩阵式键盘按键的识别

识别按键的方法很多,其中,最常见的方法是扫描法。下面以图7.5中8号键的识别为例来说明扫描法识别按键的过程。

按键按下时,与此键相连的行线与列线导通,行线在无键按下时处在高电平。显然,如果让所有的列线也处在高电平,那么,按键按下与否不会引起行线电平的变化,因此,必须使所有列线处在低电平。只有这样,当有键按下时,该键所在的行电平才会由高电平变为低电平。CPU根据行电平的变化,便能判定相应的行有键按下。8号键按下时,第2行一定为低电平。然而,第2行为低电平时,能否肯定是8号键按下呢?

回答是否定的,因为9、10、11号键按下,同样会使第2行为低电平。为进一步确定具体键,不能使所有列线在同一时刻都处在低电平,可在某一时刻只让一条列线处于低电平,其余列线均处于高电平,另一时刻,让下一列处在低电平,依此循环,这种依次轮流每次选通一列的工作方式称为键盘扫描。采用键盘扫描后,再来观察8号键按下时的工作过程,当第0列处于低电平时,第2行处于低电平,而第1、2、3列处于低电平时,第2行却处在高电平,由此可判定按下的键应是第2行与第0列的交叉点,即8号键。

3. 键盘的编码

对于独立式按键键盘,因按键数量少,可根据实际需要灵活编码。对于矩阵式键盘,按键的位置由行号和列号惟一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,高4位是行号,低4位是列号。如图9-15中的8号键,它位于第2行,第0列,因此,其键盘编码应为20H。采用上述编码对于不同行的键离散性较大,不利于散转指令对按键进行处理。因此,可采用依次排列键号的方式对按排进行编码。以图7.5中的4×4键盘为例,可将键号编码为:01H、02H、03H、…、0EH、0FH、10H等16个键号。编码相互转换可通过计算或查表的方法实现。

#include //包含头文件

#define uchar unsigned char

#define uint unsigned int

unsigned char const

dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F,显示按下键的值。

uchar keyscan(void); //主要的矩阵键盘扫描函数。

void delay(uint i);

void main()

{

uchar key;

P2=0x00;// 按相应的按键,会显示按键上的字符

while(1)

{

key=keyscan();//调用键盘扫描,

switch(key)

{

case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值原理就是高四位一列低四位一列的组

//合。0111 1110 7e 0表示按键后为0,1表示没有按键按下的。即P3.7与P3.1连接为低电平,为S1键

//其他类推。

case 0x7d:P0=dofly[1];break;//1

case 0x7b:P0=dofly[2];break;//2

case 0x77:P0=dofly[3];break;//3

case 0xbe:P0=dofly[4];break;//4

case 0xbd:P0=dofly[5];break;//5

case 0xbb:P0=dofly[6];break;//6

case 0xb7:P0=dofly[7];break;//7

case 0xde:P0=dofly[8];break;//8

case 0xdd:P0=dofly[9];break;//9

case 0xdb:P0=dofly[10];break;//a

case 0xd7:P0=dofly[11];break;//b

case 0xee:P0=dofly[12];break;//c

case 0xed:P0=dofly[13];break;//d

case 0xeb:P0=dofly[14];break;//e

case 0xe7:P0=dofly[15];break;//f

}

}

}

uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法比如:行为低电位,列为高四位

{

uchar cord_h,cord_l;//行列值

P3=0x0f; //行线输出全为0

cord_h=P3&0x0f; //读入列线值

if(cord_h!=0x0f) //先检测有无按键按下

{

delay(100); //去抖

if(cord_h!=0x0f)

{

cord_h=P3&0x0f; //读入列线值

P3=cord_h|0xf0; //输出当前列线值

cord_l=P3&0xf0; //读入行线值

return(cord_h+cord_l);//键盘最后组合码值

}

}return(0xff); //返回该值

}

void delay(uint i)//延时函数

{

while(i--);

}以上为51单片机矩阵键盘扫描显示程序。

电子琴C程序代码,四乘四矩阵键盘输入

电子琴C程序代码,四乘四矩阵键盘输入#include #define uchar unsigned char #define uint unsigned int sbit duan=P 2八6; sbit wei=P 2八7; sbit bee=P 2八3; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code tablewe[]={ 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe}; uchar disp[16]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; // 在里面输入按下键值为0~15 对应要显示的第一位码值uchar disp1[16]={0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x3f}; // 在里面输入按下键值为0~15 对应要显示的第二位码值unsigned char temp; unsigned char key; unsigned char i,j;

unsigned char STH0; unsigned char STL0; unsigned int code tab[]={ //63625, 63833, 64019, 64104, 64260, 64400, 64524 ,// 低音区:1 2 3 4 64580, 64685, 64778, 64820, 64898, 64968, 65030 ,// 中音区:1 2 3 4 5 65058, 65110, 65157, 65178, 65217, 65252, 65283 ,// 高音区:1 2 3 4 5 65297 ,// 超高音:1 }; // 音调数据表可改 void delay(uchar x) uchar y,z; for(y=x;y>0;y--) for(z=0;z<110;z++); void init() TMOD=0x01; ET0=1; EA=1; void display() { for(i=0;i<2;i++)

C语言课程设计报告——贪吃蛇源程序

C 语言课程设计(小游戏贪吃蛇的程序设计报告) 设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一. 概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C语言技术为基础,使用Turbo C++3、0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1、1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正就是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的与那个发,技术与工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法与步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习与将来实际软件开发打下坚实的基础。 1、2 设计的任务与需要的知识点 1、2、1 课程设计主要完成的任务 1)、通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解与掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题与解决问题的能力。 1、2、2需要掌握与运用的知识点 1、2、3本次课程设计需要掌握与运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐与动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。 8) 结构化,模块化的设计方法。

MSP430单片机的4X4矩阵键盘C语言程序

MSP430单片机的4X4矩阵键盘C语言程序 #include #define uchar unsigned char#define uint unsigned int uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(unsigned int i) //延时子程序{while(i--);} uchar keyvalue(){ uchar key; uchar np10,np11,np12,np13; P1DIR=0x0f;//第一排P1OUT=~BIT3; delay(10); np10=P1IN&BIT4; if(np10==0) { key=0; } np11=P1IN&BIT5; if(np11==0) { key=1; } np12=P1IN&BIT6; if(np12==0) { key=2; } np13=P1IN&BIT7; if(np13==0) { key=3; } //第二行P1OUT=~BIT2; delay(10); np10=P1IN&BIT4; if(np10==0) { key=4; } np11=P1IN&BIT5; if(np11==0) { key=5; } np12=P1IN&BIT6; if(np12==0) { key=6; } np13=P1IN&BIT7; if(np13==0) { key=7; } //第三行P1OUT=~BIT1; delay(10); np10=P1IN&BIT4; if(np10==0) { key=8; } np11=P1IN&BIT5; if(np11==0) { key=9; } np12=P1IN&BIT6; if(np12==0) { key=10; } np13=P1IN&BIT7; if(np13==0) { key=11; } //第四行P1OUT=~BIT0; delay(10); np10=P1IN&BIT4; if(np10==0) { key=12; } np11=P1IN&BIT5; if(np11==0) { key=13; } np12=P1IN&BIT6; if(np12==0) { key=14; } np13=P1IN&BIT7; if(np13==0) { key=15; } P1OUT=0X00; return key; while(1) { if((P1IN&0X0F)==0x0f) break; }} void main(){ uchar key_value; WDTCTL=WDTPW+WDTHOLD; P1DIR=0X0F; P2DIR=0XFF; P2OUT=0XFF; while(1) { if((P1IN&0XF0)!=0XF0) { delay(100); if((P1IN&0XF0)!=0XF0) { delay(100); if((P1IN&0XF0)!=0XF0) { key_value=keyvalue(); } } } P2OUT=~key_value; }} tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

C语言源代码

剪刀石头布源代码 #include #include main() { int d,x; { printf("请输入:1是剪刀,2是石头,3是布"); scanf("%d",&d); x=rand()%3; if(d==x) printf("双方平局"); else if((d==1&&x==2)||(d==2&&x==3)||(d==3&&x==1)) printf("你赢了"); else printf("电脑赢了"); } }

简单计算器 #include main() { int a,b,d=0; char c; while(d==0) { printf("请开始计算,请输入需要运算的数字和运算法则,数字符号数字:"); scanf("%d%c%d",&a,&c,&b); switch(c) { case'+': printf("%d+%d=%d\n",a,b,a+b); break; case'-': printf("%d-%d=%d\n",a,b,a-b); break; case'*': printf("%d*%d=%d\n",a,b,a*b); break; case'/': if(0==b) printf("除法被除数不能为零!\n") ; else printf("%d/%d=%d\n",a,b,a/b); break; } } }

加油站加油问题 #include int main() { double a = 3.25, b = 3.00, c= 2.75; double d = 0.05, e = 0.10, m; int x,y,z; printf("请输入您要的加油量:"); scanf("%d",&x); printf("请输入您要的汽油种类,1-a型汽油售价3.25元/千克,2-b型汽油售价3.00元/千克,3-c型汽油售价2.75元/千克:"); scanf("%d",&y); printf("请输入您要的服务类型,1-自己加服务优惠0.05,2-协助加服务优惠0.10:"); scanf("%d",&z); switch(y) { case 1: y = a;break; case 2: y = b;break; case 3: y = c;break; } if(z == 1) m = (1 - d) * y * x; else if(z == 2) m = (1 - e) * y * x; printf("您需要支付:%f 元,谢谢惠顾,欢迎下次再来",m); return 0; }

51单片机矩阵键盘的C语言程序与分析

51单片机矩阵键盘的C语言程序与分析 2009-10-17 19:25 学习51单片机矩阵键盘时,我有点迷乱了,不知道是怎样处理的,经过仔细分析电路,然后终于明白其中的原理,这样的话,再看程序,就是那样的简单了。。 首先看一下电路图是怎样连接的,我买的开发板上是AT89S52单片机,矩阵键盘在P3口。接法如下图: 当然上面的图的意思是P3.1~P3.3 跟P3.4~P3.7不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。

如果给P3一个扫描初值的话:如0x0F ,则没有键按下时为: P3.1~P3.3为1,P3.4~P3.7为0。 如果有键按下,则情况发生变化:高电平接入低电平:如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。 则P3此时为:0000 0111,这时如果用P3&0x0F,则高四位为0,低四位保留,可以得到低四位的内容了。 通过去抖操作,即一个delay,可以得到低四位内容。这里设为:h=P3&0x0F; 如果再得到高四位内容,则可以组成一个数,来定位哪个键了。 用P3=h|0xF0;这会出现什么情况呢?1|0=1 1| 1 =1,这里难道高四位全置1 吗?不是的,当赋值后,如果有键按下的话,P3高四位不会全为1111,被拉到0了。如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。即:0111 0111,&F0之后,得到0111 0000,这样的话,我们得到高四位的值了, 用高四位+低四位,就可以得到一个数值,确定一个键。 下面看看人家编写的程序,相信不是太难了吧。 //keyboard.c 这里的行与列的扫描,也就是把字节的8位,高四位与低四位分开来,从而确定坐标。 //行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍 #include //包含头文件 #define uchar unsigned char #define uint unsigned int unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F,数码管来显示按下键的值。 uchar keyscan(void); //主要的矩阵键盘扫描函数。 void delay(uint i); void main() { uchar key; P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符 while(1) { key=keyscan();//调用键盘扫描,

矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 */ /*******************************************************/ /*********************************包含头文件********************************/ #include /*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E}; /**************************************************************************** 函数功能:延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay(void) { unsigned char i,j; for(i=0;i<20;i++) for(j=0;j<250;j++); } /**************************************************************************** 函数功能:LED显示子程序 入口参数:i 出口参数: ****************************************************************************/ void display(unsigned char i) { P2=0xfe; P0=table[i]; } /**************************************************************************** 函数功能:键盘扫描子程序 入口参数: 出口参数: ****************************************************************************/ void keyscan(void) { unsigned char n; //扫描第一行 P1=0xfe;

单片机矩阵键盘检测程序并用数码管显示c语言程序

#include #define uint16 unsigned int #define uint8 unsigned char //控制数码管段选锁存口 sbit P3_7=P3^7; //共阴数码管显示 uint8 code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0}; uint8 temp; uint16 num; //延时子函数 void delay(uint16 z) { uint16 x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //子函数声明 uint8 keyscan(); void display(uint8);

void main() { num=17; while(1) { display(keyscan()); } } void display(uint8 num1) { P2=0xf8; P3_7=1; P0=table[num1-1]; P3_7=0; } uint8 keyscan() { P1=0xfe; temp = P1;

temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:num=1;break; case 0xde:num=2;break; case 0xbe:num=3;break; case 0x7e:num=4;break; default:break; } while(temp!=0xf0)//检测按键是否放开 { temp=P1; temp=temp&0xf0; }

基于C51单片机矩阵键盘控制蜂鸣器的应用

学校代码 10126 学号科研创新训练论文 题目基于C51单片机的蜂鸣器和流水灯的 应用 院系内蒙古大学鄂尔多斯学院 专业名称自动化 年级 2013 级 学生姓名高乐 指导教师高乐奇 2015年06月20日

基于C51单片机的蜂鸣器和流水灯的应用 摘要 当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。本文介绍了单片机的发展及应用,和基于单片机的蜂鸣器和流水灯的知识及应用,还介绍了此次我所设计的课题。 关键词:C-51单片机,控制系统,流水灯,蜂鸣器,程序设计

The application of buzzer and flowing water light based on C51 MCU Author:GaoLe Tutor:GaoLeQi Abstract This age is a new technology emerge in endlessly era, in the electronic field especially automation intelligent control field, the traditional schism components or digital logic circuit, is composed of control system with unprecedented speed was replaced by micro-controller intelligent control system. SCM has small, strong function, low cost, etc, it can be said that wide application, intelligent control and automatic control core is the micro-controller.This article introduces the MCU development and application,the knowledge and application of buzzer and flowing water light based on MCU,then introduces the task I have designed this time. Keyword:C51 micro-controller,control system,flowing water light,buzzer ,programming

C语言课程设计报告——贪吃蛇源程序

C 语言课程设计 (小游戏贪吃蛇的程序设计报告)

设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点 3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试 1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一.概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C 语言技术为基础,使用Turbo C++3.0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1.1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的和那个发,技术和工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法和步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习和将来实际软件开发打下坚实的基础。 1.2 设计的任务和需要的知识点 1.2.1 课程设计主要完成的任务 1). 通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解和掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题和解决问题的能力。 1.2.2需要掌握和运用的知识点 1.2.3本次课程设计需要掌握和运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐和动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。

STM32-矩阵键盘程序4×4

/*--------------------------------------------------------------------------------------* 矩阵键盘驱动 * 文件: keyboard.c * 编写人:LiuHui * 描述:扫描4x4 矩阵键盘输入,并返回键值 * 适用范围:驱动采用ST3.5 库编写,适用于STM32F10x 系列单片机 * 所用引脚:PA0-PA7 * 编写时间:2014 年5 月20 日 --------------------------------------------------------------------------------------*/ #include "stm32f10x.h" #include "keyboard.h" #include "dealy.h" /*--------------------------------矩阵键盘初始化----------------------------------------* 功能:初始化stm32 单片机GPIO //PA0-PA7 * 参数传递: * 输入:无 * 返回值:无 --------------------------------------------------------------------------------------*/ void KeyBoard_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); } /*------------------------------矩阵键盘扫描--------------------------------------------* 功能:扫描矩阵键盘,并返回键值 * 参数: * 输入:无 * 返回:有键按下返回该键值 * 无键按下时则返回0 --------------------------------------------------------------------------------------*/ u8 Read_KeyValue(void) { u8 KeyValue=0; if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f) {

矩阵键盘单个数码管显示C语言程序

#include #define uchar unsigned char #define uint unsigned int uchar code_h,code_l; //定义行扫描码,列检测数据uchar tmp,keyvalue; //定义接收键值 /*函数说明*/ void delay(void); uchar keyscan(); /*主函数*/ void main () //键值处理 { while(1) { tmp=keyscan();//调用键盘扫描程序 switch(tmp) { case 0x11: P0=0x3f; break; //0 case 0x12: P0=0x06; break; //1 case 0x14: P0=0x5b; break; //2 case 0x18: P0=0x4f; break; //3 case 0x21: P0=0x66; break; //4 case 0x22: P0=0x6d; break; //5 case 0x24: P0=0x7d; break; //6 case 0x28: P0=0x07; break; //7 case 0x41: P0=0x7f; break; //8 case 0x42: P0=0x67; break; //9 case 0x44: P0=0x77; break; //a case 0x48: P0=0x7c; break; //b case 0x81: P0=0x39; break; //c case 0x82: P0=0x5c; break; //d case 0x84: P0=0x79; break; //e case 0x88: P0=0x71; break; //f case 0x00: ; break; default:P0=0x00; } delay(); } } /*延时函数*/ void delay(void) {uchar i; for(i=0;i<200;i++){} } /*键盘扫描函数*/ uchar keyscan(void)

用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循环,

C语言按键代码

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

} } 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 { // 没有双击标志,看时间是否超过双击等待间隔

矩阵键盘编程

矩阵键盘编程 键盘结构与类型 独立式按键键盘由若干独立式按键组成。独立式按键指每个按键作为一位占用一根I/O口线,直接用I/O口线构成单个按键电路。独立式按键键盘可分为中断方式和查询方式两种。独立式按键键盘优点是配置灵活,软件结构简单,操作速度快;缺点是按键多时I/O口浪费较大,故只在按键数目不多时采用。 行列式键盘(矩阵式键盘)用I/O口线组成行、列结构,按键设置在行列的交点上。在按键较多时可节省I/O口线,如4×8行列结构可构成32个键的键盘。 行列式键盘键输入过程及接口软件应解决的任务 键开关状态的可靠输入主要应解决抖动问题。 对按键编码以便识别对按键编码,使不同的按键有不同的键值或键号。 按键状态的输入方式有中断方式与查询方式两种。 编制键盘程序检测有无按键按下、去抖动、按键信息的逻辑处理、 输出确定的键号等。 行列式键盘(矩阵式键盘)及接口程序设计 行列式键盘的结构及键值赋值方法 键盘行线的一端经上拉电阻接+5v电源,另一端接单片机的输入口(因而各输入口均被钳位于高电平)。各列线的一端接单片机的输出口,另一端悬空。按键设置在行列线的交点上,行、列线分别连接到按键的两端,按键按下则相应交点的行列线接通。由图可见,矩阵式键盘接口的设计思想是把键盘既作为输入设备又作为输出设备对待的。 为了让CPU能识别是哪个按键被按下,必须给每个按键都分配一个键号(一般以十进制数表示)。例如,4×4列矩阵式键盘共16个按键,键号依次按顺序排列为0~15。 对行列式键盘的每个按键,还有一个更重要的概念:键值或者说键码。键值是一个可表征按键状态的8位数据,不同的按键有不同的键值。按键后根据键值便能转到相应的键处理子程序,实现键盘的数据输入功能或命令处理功能。 同一个按键的键值和键号可以相同,也可以不相同,这主要取决于键盘的结构与采用的编码方法。 对行列式键盘来说,识别被按键的位置也就是找出被按键所在行和列的坐标值。对于4行×4列行列式键盘,被按键所在行和列的坐标值为两个4位数据;

一些比较简c语言程序源代码

/**返回的long型的最大值是startLongValue+count-1(产生一个随机数) * param needCount * param count * param startLongValue * return */ public static List randomNoRepeatLongArray(int needCount,int count,long startLongValue){ //这种情况会出现无限循环的 if(needCount>count) return null; Random random = new Random(); int[] ints = new int[count]; for(int i=0;i list = new ArrayList(); while(list.size() #include #include

电子琴C程序代码,四乘四矩阵键盘输入

电子琴C程序代码,四乘四矩阵键盘输入#include #define uchar unsigned char #define uint unsigned int sbit duan=P2^6; sbit wei=P2^7; sbit bee=P2^3; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code tablewe[]={ 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe}; uchar disp[16]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; // 在里面输入按下键值为0~15对应要显示的第一位码值 uchar disp1[16]={0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x3f}; // 在里面输入按下键值为0~15对应要显示的第二位码值 unsigned char temp; unsigned char key; unsigned char i,j;

unsigned char STH0; unsigned char STL0; unsigned int code tab[]={ //63625, 63833, 64019, 64104, 64260, 64400, 64524 ,//低音区:1 2 3 4 5 6 7 64580, 64685, 64778, 64820, 64898, 64968, 65030 ,//中音区:1 2 3 4 5 6 7 65058, 65110, 65157, 65178, 65217, 65252, 65283 ,//高音区:1 2 3 4 5 6 7 65297 ,//超高音:1 }; //音调数据表可改 void delay(uchar x) { uchar y,z; for(y=x;y>0;y--) for(z=0;z<110;z++); } void init() { TMOD=0x01; ET0=1; EA=1; } void display() { for(i=0;i<2;i++)

51单片机的矩阵按键扫描的设计C语言程序

//-----------------------函数声明,变量定义 -------------------------------------------------------- #include #define KEY P1 //-----------------------变量声明 ---------------------------------------------------------------------void program_SCANkey(); //程序扫描键盘,供主程序调用 void delay(unsigned int N) ;//延时子程序,实现(16*N+24)us的延时bitjudge_hitkey(); //判断是否有键按下,有返回1,没有返回0 unsigned char scan_key(); //扫描键盘,返回键值(高四位代表行,低四位代表列) void key_manage(unsigned char keycode); //键盘散转 void manage_key1(void); //按键1处理程序 void manage_key2(void); //按键2处理程序 void manage_key3(void); //按键3处理程序 void manage_key4(void); //按键4处理程序 //...........每个按键对应一个处理程序,这里 //-------------------------------- ------------------------------------------------------------------//函数名称: program_SCANkey

相关文档
最新文档