C中关于pic单片机按键程序的

51单片机C语言编程如何实现长按按键实现数值的累加_百度知道
51单片机C语言编程如何实现长按按键实现数值的累加
这个可以用定时器来做,比如检查某键,按键时间超过2秒后一个变量开始累加知道键释放为止。实现方法如下:#include&reg51.h&#define uint unsigned int#define uchar unsigned charuint v=0,time=0;sbit key=P1^0;void t0isr() interrupt 1{TH0=()/256;TL0=()%256;time++;if((key==0)&&(time&40)v++;
//如果按键时间超过2秒且键未释放,变量+1if(key==1)time=0;
//如果键释放,时间复位}main(){TMOD=0x01;TH0=()/256;TL0=()%256;TR0=1;ET0=1;EA=1;while(1);}
其他类似问题
为您推荐:
提问者采纳
关键是设置定时器,再设置一个标志位,在中端程序检验按键的电位,当加数达到一个标准值时,定时器定时改为更短时间,标志位先设置一定时器,比如定时0.5s加一
提问者评价
谢谢,感觉你的思路很正确,再问个小白的问题:设置定时器,标志位,在中端程序检验按键的电位。有没有例程?
其他2条回答
}if (k2==0){ a--; 延时你可以这样去试试;
延时:if (k1==0){ a++
您可能关注的推广回答者:
51单片机的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁求51单片机4×4键盘LED显示C程序 - c51编程(单片机的c语言) -
51单片机学习论坛
- Powered by Discuz!
求51单片机4×4键盘LED显示C程序
单片机小学生
求51单片机4×4键盘LED显示C程序
如题,求51单片机4×4键盘LED显示C程序
矩阵键盘数码管显示键值&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *&&& *&&&&&&&& 矩阵键盘定义:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& **&&&&&&&& P1.0-P1.3为列线,P1.4-P1.7为行线&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *&&& *&&&&&&& 喇叭接P3.7口& 矩阵键盘P1口, 数码管数据P0口,数码管控制P2口&&&&&&&&&& *&&& #include &reg51.h&#include &intrins.h&&&&&&&&&&&&&&&&& #define uchar unsigned char#define uint& unsigned intuchar table[17]= {0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1};//数码管代码sbit BEEP = P3^7;&&&&&&&& //蜂鸣器驱动线uchar dis_&&&&&&&&&&& //显示缓存uchar&uchar&&&&&&&&&&&&&&& //键顺序吗void beep();&&&&&&&&&&&&& //蜂鸣器void delay0(uchar x);&&&&& //x*0.14MS//--------------------------------------------------/* 延时子程序*/void& delay(uchar x){&&& while((x--)!=0)&&& { for(j=0;j&125;j++)&&&&&&&& {;}&&& }}//--------------------------------------------------&/*键扫描子程序*/&void& keyscan(void)&{ &&& P1=0x0F;&&&&&&&& //低四位输入& &&& delay(1);&temp=P1;&&&&&&&& //读P1口 &&& temp=temp&0x0F;&&& temp=~(temp|0xF0);&&& if(temp==1)&&&&&&& key=0;&&& else if(temp==2)&&&&&&& key=1;&&& else if(temp==4)&&&&&&& key=2;&&& else if(temp==8)&&&&&&& key=3;&&& else&&&&&&& key=16;&&&&&&& &&& P1=0xF0;&&&&&&& //高四位输入&&& delay(1);&temp=P1;&&&&&&&&& //读P1口&&&&&& &&& temp=temp&0xF0;&&& temp=~((temp&&4)|0xF0);&&& if(temp==1)&&&&&&& key=key+0;&&& else if(temp==2)&&&&&&& key=key+4;&&& else if(temp==4)&&&&&&& key=key+8;&&& else if(temp==8)&&&&&&& key=key+12;&&& else&&&&&&& key=16;&&& &&&&& dis_buf=table[key];&//查表得键值&}//--------------------------------------------------/*判断键是否按下*/&void& keydown(void)&{& & &nbsp1=0xF0;&if(P1!=0xF0)&{&& keyscan();&& beep();&&&& // while(P1!=0xF0);& //等待键释放&}&} //--------------------------------------------------void beep(){&& for (i=0;i&100;i++)&& {&& delay0(4);&& BEEP=!BEEP;&&&&&& //BEEP取反&& } && BEEP=1;&&&&&&&&&& //关闭蜂鸣器&& delay(250);&&&&&& //延时&&&& }//--------------------------------------------------void delay0(uchar x)&&& //x*0.14MS{&& while(x--)&{& for (i = 0; i&13; i++) {}&}}//-------------------------------------------------- &&& main()&{&&& P0=0xFF;&&&&&&& //置P0口&&& P2=0xFF;&&&&&&& //置P2口& &&& dis_buf=0xBF;&&& &&& while(1)&&& { &&&&&& keydown();&&& P0 = dis_&& //键值送显示&&&&&& delay(2);&&&&&& P2 = 0x7F;&&& }& }&& //--------------------------------------------------&&&
新人报道注意事项:
1 给大家送一个见面礼, 比如自己收藏的程序代码资料等
2 如果有可能请认真回复5个贴子 活跃本论坛的气氛
3 不要发类似: 请给编一个***代码发到***邮箱的贴子,天下没有免费午餐
单片机初中生
楼上的,程序规划不好..看我的键盘程序列出主要部分#include&reg51.h&#include&defi.h&/* 用于键消抖的延时函数 */void delay(){&&for (t=400;t&0;t--);}/* 键扫描函数 */uchar keyscan(void){&uchar scancode,&nbsp2 = 0xf0;&&& &&& // 发全0行扫描码&if ((P2&0xf0)!=0xf0)&&&&&// 若有键按下&{&&delay();&&&&&&&// 延时去抖动&&if ((P2&0xf0)!=0xf0)&&&&// 延时后再判断一次,去除抖动影响&&{&&&scancode = 0&&&while((scancode&0x10)!=0)&&// 逐行扫描&&&{&&&&nbsp2 =&&&&// 输出行扫描码&&&&if ((P2&0xf0)!=0xf0)&&// 本行有键按下&&&&{&&&&&tmpcode = (P2&0xf0)|0x0f;&&&&&/* 返回特征字节码,为1的位即对应于行和列 */&&&&&return((~scancode)+(~tmpcode));&&&&}&&&&else scancode = (scancode&&1)|0x01;&&// 行扫描码左移一位&&&}&&}&}&return(0);&&&&&&&&// 无键按下,返回值为0}/* 主程序 */void main(){&& &while(1)&&& {&&key = keyscan();&&&&&&& // 调用键盘扫描函数&&delay();&&switch(key)&& &&{&&&&& &&case 0x11:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& NUM0=1;&&&&&&& // 第1行第1列,选择正弦波输出&&&&&&&case 0x21:&&&&// 第1行第2列,选择矩形波输出&&&&LIGHTA = 0;&&&&LIGHTB = 0;&&&&&&&case 0x41:&&&&// 第1行第3列,选择三角波输出&&&&LIGHTA = 1;&&&&LIGHTB = 0;&&&&&&&default:&& }&&&&&&&&&&&& if(NUM0)&&&&&&&&&&&&& {& NUM0=0;&&&&&&&&&&&&&&& LIGHTA = 0;&&&&&&& &LIGHTB = 1;&&&&&&&&&&&&& }& &}}
单片机初中生
上面的看键盘那段就行了,其他的看不懂没关系.
单片机小学生
我也有一个,请高手门不要见笑[em07]#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit P0_0=P0^0;sbit P0_1=P0^1;sbit P0_2=P0^2;sbit P0_3=P0^3;sbit P0_4=P0^4;sbit P0_5=P0^5;sbit P0_6=P0^6;sbit P0_7=P0^7;char code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //1,2,...Fuchar scanf();&& //键盘扫描void dlms();&& //延时void dlms()&&{for(k=200;k&0;k--){}}void main(){for(;;)&{int i,j,x,y,z,s,t;P0=0xF0;&&& P2=0xFF;&&//使灯灭if((P0&0xF0)!=0xF0) //有键按下吗?&&{dlms();&&& //延时,去抖动 & if((P0&0xF0)!=0xF0) //有键按下吗? & {&if(P0_4==0) i=0;&& //第0行有键按下&if(P0_5==0) i=1;&& //第1行有键按下&if(P0_6==0) i=2;&& //第2行有键按下&if(P0_7==0) i=3;&& //第3行有键按下&s=0xFE;&&&&& //列扫描&for(j=0;j&4;j++)&{P0=s;&if((P0&0xF0)!=0xF0)&& //该列有键按下吗?&t=j;&&&&s=(s&&1)|0x01;}&&& //左称&z=4*i+t;&&& //第i行,第j列&nbsp2=tab[z];//显示for(x=0;x&600;x++)&&&& //延时for(y=0;y&100;y++) ;}}}&}&
单片机达人
单片机高中生
4*4键盘部分C程序
我用4*4键盘控制4位数码管,想用扫描的方法实现4位都亮且数字不同,当最后一位输入数字时,以前的数字都向前移动一位显示.我的电路做好了,用汇编可以实现上述功能,但我用C只做出了扫描,做不出上述的显示功能;希望高手指点;p0.0~p0.3通过7447形显,p0.4~p0.7是最后一位数码管到第4个数码管的位选位.键盘的行接p2.7~p2.4,列接p2.3~p2.0.部分程序如下:#include&reg51.h&#define uchar unsigned char#define uint undigned intvoid delay(void);uchar keyscan();uchar been();void main(void){ uchar key;uchar code xianshi[]={0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9};&while(1)&&&& {&& key=keyscan();&& switch(key)&&&& {case 0x18:xkey=0;&&  case 0x28:xkey=1;&&  case 0x48:xkey=2;&&  case 0x88:xkey=3;&&  case 0x14:xkey=4;&&  case 0x24:xkey=5;&&  case 0x44:xkey=6;&&  case 0x84:xkey=7;&&  case 0x12:xkey=8;&&  case 0x22:xkey=9;&&  default:&&&&&&& ;&& }&&& && && P0=xianshi[xkey];&& delay();&& delay();& && }&&&}&&void delay(void)&{& for(i=1;i&200;i++){}& }uchar keyscan(void){&uchar code_h;&uchar code_l;&nbsp2=0x0f;&if((P2&0x0f)!=0x0f)&& { delay();&&&& if((P2&0x0f)!=0x0f)&&&&&& {&&&&& been();&&&&& code_h=0x7f;&&&&&&&& while((code_h&0xf7)!=0xf7)&&&&&&&&&&&& {P2=code_h;&&&&&&&&&&&&& if((P2&0x0f)!=0x0f)&&&&&&&&&&&&&&& {code_l=(P2&0x0f|0xf0);&&&&&&&&&&&&&&&& return((~code_h)+(~code_l));&&&&&&&&&&&&&&&& }&&&&& else&&&&&&&&&&&&&&&&&& code_h=(code_h&&1)|0x80;&&&&&&&&&&&&& }&& }& }& &return(0);&}uchar been(){ P1=0x00;& delay();& return(P1=0xff);&}
单片机高中生
哪位高手帮我完成一下上面的显示功能的
单片机初中生
正在寻找!@!!第5章 单片机C语言C51按键_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
第5章 单片机C语言C51按键
单​片​机​C​语​言
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:1.93MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢设计技术&&
|||||||||||||||
|||||||||||
> 基于AT89C51的操控键盘的设计
基于AT89C51的操控键盘的设计
Time: 13:36:00&&Author:&&Source:单片机与嵌入式系统应用
关键字:,,,,,
华中光电技术研究所 张咏梅 引& 言在一些自动化测量或智能设备中,微机作为控制中枢,对多个功能单元进行控制与管理,以实现仪器设备的系统功能。键盘是人机通信的基本设备,操作者通过它完成对设备的操控。PC机通用键盘是与主机分开的独立设备,其结构外形已经固定,需要较大的安装空间。但在所研制的产品设备中,系统上电运行后,往往只需通用键盘中的少量按键即可完成人机通信或控制,如数字键O~9、→、←、↑、↓、Esc等按键。在这种情况下,因为结构尺寸的限制,并为了使操控方便、设备简化等,不便采用通用键盘,而需使通用键盘小型化,并且与产品设备融为一体。因此需要研制小型一体化专用键盘。采用小型一体化专用键盘不但可完成按键的功能,而且要求根据仪器外形进行一体化优化设计,使产品外型美观、布局合理。小型一体化专用键盘不仅适用于一般的仪器控制系统,而且可以用于军工加固计算机系统中。军工产品中的微机多为加固PC类计算机,其采用PC机通用键盘。本文以PC机通用键盘为例,阐述研制小型一体化专用键盘的方法。1& 设计原理PC机通用键盘通过“PS/2”5芯电缆与主机相连。该5芯电缆是键盘与主机之间信息与数据传输的路径,定义如下:1端,RESET;2端,+5 V;3端,CLOCK;4端,地;5端,按键波形。其中1、2、4端的信号由主机内部确定;3端为时钟信号CLOCK;5端为按键波形,此波形随按下按键的不同而变化。采用本文介绍的单片机控制系统和软件编程的方法,可以准确模拟按键波形,使小型专用键盘的按键波形与PC机通用键盘对应按键波形一致。具体方法如下:首先用示波器测出PC机通用键盘各按键按下时的波形,并保存起来;然后用单片机控制系统和软件编程模拟出各按键的CLOCK波形和按键波形,并确保各按键的CLOCK波形和按键波形时序匹配、形状逼真,再将按键信息通过5芯电缆传输给主机。所选按键可根据需要安装在产品的面板上等易于操作的地方。当操作者按下某键时,单片机控制系统产生相应的CLOCK波形与按键波形送给主机,实现按键功能。这样就完成了小型专用键盘的设计。2硬件电路及软件2.1& 单片机控制电路采用单片机系统实现小型专用键盘的硬件电路,如图1所示,设计完成的小型专用键盘的按键有18枚,排成6行×3列的矩阵。单片机可根据需要安装在主机内部的接口板上,按键则安装在产品的面板等易操作的地方。当按下某按键时,单片机控制系统将产生的CLOCK信号与按键信号通过“PS/2”5芯电缆传送给主机。此硬件电路简单,可充分利用软件编程来模拟按键波形,实现键盘功能。系统要判断某一按键是否按下,可以利用软件逐一查询6行×3列矩阵中的按键,然后输出相应的按键模拟波形,从而实现按键功能。2.2& 举& 例下面以按键“8”为例,说明如何从PC机通用键盘中“取出”所需按键,并保持各按键功能,形成小型专用键盘。首先用示波器测出在PC机通用键盘上按下“8”键时,5芯键盘通信电缆的3端和5端的波形。按键“8”的波形测量波形如图2所示。示波器通道1指示信号电缆3端的CLOCK波形,通道2为电缆5端的按键“8”的波形。用单片机软件编程模拟图2所示波形。按照图1所示硬件电路,编程使单片机89C51的P2.4端产生CLOCK波形,P2.6端产生按键波形;P2.4端与5芯键盘电缆的3端相连,P2.6端与电缆的5端相连。当操作者按下产品面板上的“8”键时,程序执行模拟“8”键波形的子程序,并将模拟出的波形传送给主机,这样就完成了按键“8”的设计。用同样的方法,可以设计出小型专用键盘上其他按键。3设计中要注意的问题3.1& 准确地模拟按键波形每一枚按键的波形包括电缆3端的CLOCK波形与电缆5端的按键波形。各按键的CLOCK波形相同,如图2所示通道1的波形,由10个脉宽为40μs且间隔也为40μs的脉冲和1个脉宽为500 μs的脉冲形成CLOCK波形;而5端的按键波形则因按键的不同而各异。要准确地模拟按键波形并使之时序匹配,即准确地计算出脉冲的宽度,必须精确地计算出时间常数,做好延时程序。如果单片机控制电路采用12 MHz晶振,则一个机器周期为1μs,时间常数X的计算公式为:(循环体字节数)×机器周期×时间常数X=延时时间在上式中,循环体字节数、机器周期、延时时间都已知,则时间常数x易求得。例如,延时1 ms程序如下:利用上面公式可得到:(1+1+2)×1×X一1 000 μs则X=250μs,将其带入上面的程序段中,执行该段程序,能实现1 ms精确延时。准确地计算出时问常数,精确地实现延时,就能确保模拟波形的准确性。3.2按键的抖动问题凡有按键操作的系统,在设计中一般都要考虑按键的去抖。由于按键的机械触点有弹性作用,在闭合及断开瞬间均有抖动过程,抖动的时间长短与开关的机械特性有关,一般为5~lO ms。为了保证按键的1次闭合仅作1次按键输入处理,就必须消除按键抖动对系统的影响。采用软件编程消除按键抖动影响的方法是:当检测到某一按键按下时,执行相应模拟按键波形的子程序后,应再判断该键是否弹起,若没有弹起则等待,直至按键弹起;按键弹起后,延时20 ms再继续执行后面的程序,以消除按键抖动现象。3.3& 同行多个按键同时有效的问题当有按键操作,按下某一键时,可能出现该键同一行线上的其他多个按键同时有效的现象。采用屏蔽非当前列线的方法可解决这一问题:当检测有无键按下时,须对列线和行线依次扫描,当扫描至某一列线时,该列线置“O”,同时其他列线置“1”,这样就屏蔽了非当前列线,从而准确地判断出某键是否按下。3.4& 按键波形被吃掉的问题有些按键的波形只有1段,如图2所示“8”键的波形;而有些按键的波形有2段或2段以上,如图3所示“十”上移键的波形。2段波形间隔1.6 μs,用单片机仿真按键波形时,可看到第1段波形形成后,其后3 ms的时间内时钟CLOCK保持低电平,导致按键第2段波形被吃掉。为了解决这一问题,在模拟具有2段以上波形的按键时,在2段波形之间应加入3 ms的延时,使按键的第2段波形脱离时钟CLOCK的低电平区。这样按键的第2段波形就不会被吃掉,从而保证了按键波形的完整,实现按键功能。结& 语采用本文介绍的设计方法制作的小型一体化加固机专用键盘,已应用到产品中,其功能稳定可靠,取得了良好效果。实际工作中,可根据产品的结构特点和需要,应用该设计方法研制小型一体化专用键盘,具有推广意义。
尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
您发表的作品,本网有权在网站内保留、转载、引用或者删除
参与本评论即表明您已经阅读并接受上述条款
Loading...
Loading...
Loading...在51单片机中用c语言keil写程序实现用一个按键控制8个灯的亮和灭(按下按键全部灯亮,按下按键全_百度知道
在51单片机中用c语言keil写程序实现用一个按键控制8个灯的亮和灭(按下按键全部灯亮,按下按键全
在51单片机中用c语言keil写程序实现用一个按键控制8个灯的亮和灭(按下按键全部灯亮,按下按键全部灯灭)单片机芯片at80c51
P1 口放一个按键
P2口放8个灯
sbit key = P1^0;按键void delay(unsigned int time){
unsigned int i,j;reg52;
if(key == 0)
delay(20);/ i++)
for(j=0; j++)
{; j&1000.h&gt,自己看实际情况修改时间
if(key == 0)
temp = ~/适当延时,消除按键抖动;//}}void mian(){
unsigned int temp =0x00; i&lt#include&lt
其他类似问题
为您推荐:
51单片机的相关知识
其他2条回答
我做单片机设计的可以
读取P1口值,判断按键状态,从P2口输出0x00,或0xff。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 单片机按键编程 的文章

 

随机推荐