如何怎么让按键精灵循环按后加一

21ic官方微信-->
一个按键两种功能,短按一个功能,长按一个功能.
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
刚学51一个月,学生想找个老师点拔一下谢谢了,想写一个按键两种功能,就是短按一下LED灯亮,再按一下灭,长按2秒另一个LED亮,再按一下灭,想了好久写不出来,下面是学生写的不完整程序#include&reg52.h&
#define uint unsigned int
sbit led1=P1^0;
sbit led2=P1^1;
sbit key1=P3^4;
void delay(uint xms)
& & & & uint i,j;
& & & & for(i=i&0;i--)
& & & & for(j=110;j&0;j--);
void main()
& & & & while(1)
& & & & & & & & if(key1==0)
& & & & & & & & {
& & & & & & & & & & & & delay(10);
& & & & & & & & & & & & if(key1==0)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & led1=~led1;
& & & & & & & & & & & & & & & & while(!key1);
& & & & & & & & & & & & }
& & & & & & & & }
& & & & }& & & &
资深工程师, 积分 12131, 距离下一级还需 7869 积分
资深工程师, 积分 12131, 距离下一级还需 7869 积分
资深工程师, 积分 12131, 距离下一级还需 7869 积分
资深工程师, 积分 12131, 距离下一级还需 7869 积分
监控按下时间,短按是释放执行,长按是到时间执行
助理工程师, 积分 1085, 距离下一级还需 915 积分
助理工程师, 积分 1085, 距离下一级还需 915 积分
助理工程师, 积分 1085, 距离下一级还需 915 积分
助理工程师, 积分 1085, 距离下一级还需 915 积分
楼主可以参考下这个帖子&&
写成按键状态机的形式吧。
高级技术员, 积分 994, 距离下一级还需 6 积分
高级技术员, 积分 994, 距离下一级还需 6 积分
高级技术员, 积分 994, 距离下一级还需 6 积分
高级技术员, 积分 994, 距离下一级还需 6 积分
加我Q,我给你个代码,你看看.或者我给你说说.呵呵
高级技术员, 积分 994, 距离下一级还需 6 积分
高级技术员, 积分 994, 距离下一级还需 6 积分
高级技术员, 积分 994, 距离下一级还需 6 积分
高级技术员, 积分 994, 距离下一级还需 6 积分
用延时消抖我认为是自欺欺人.哈哈.
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
我给你来个试试(已调试)
/*******************************************************
|一个按键两种功能,就是短按一下LED灯亮,
|再按一下灭,长按2秒另一个LED亮,再按一下灭
*******************************************************/
#include &reg52.h&
#include &intrins.h&
#define uint unsigned int //宏定义:unit=unsigned int
#define uchar unsigned char
sbit led1=P1^0;
sbit led2=P1^1;
sbit s=P3^5;
uchar flag1,flag2;
void delay(uint);
void keyscan();
void main()
& & & & while(1)
& & & & & & & & keyscan();
void keyscan()
& & & & j=0;
& & & & s=1;
& & & & if(flag1==1||flag2==1)
& & & & {& & & &
& & & & & & & & if(!s)
& & & & & & & & {
& & & & & & & & & & & & delay(5);
& & & & & & & & & & & & if(!s)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & while(!s);
& & & & & & & & & & & & & & & & flag1=0;
& & & & & & & & & & & & & & & & flag2=0;
& & & & & & & & & & & & & & & & led1=1;
& & & & & & & & & & & & & & & & led2=1;
& & & & & & & & & & & & }
& & & & & & & & }
& & & & else
& & & & & & & & if(!s)
& & & & & & & & {
& & & & & & & & & & & & delay(5);
& & & & & & & & & & & & if(!s)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & while(s==0 && j&30000)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & //& & & & delay(5);
& & & & & & & & & & & & & & & & & & & & j++;
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & if (j&=30000)
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & flag2=1;
& & & & & & & & & & & & & & & & & & & & & & & & led2=0;
& & & & & & & & & & & & & & & & & & & & & & & & while(!s);& & & &
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & else
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & flag1=1;
& & & & & & & & & & & & & & & & & & & & & & & & led1=0;
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & }
& & & & & & & & }
& & & & }& & & &
void delay(uint z)
& & & & //1ms延时
& & & & uint i,j;
& & & & for(i=z;i&0;i--)
& & & & & & & & for(j=110;j&0;j--);
资深工程师, 积分 15734, 距离下一级还需 4266 积分
资深工程师, 积分 15734, 距离下一级还需 4266 积分
资深工程师, 积分 15734, 距离下一级还需 4266 积分
资深工程师, 积分 15734, 距离下一级还需 4266 积分
2#正解,一般这个都是状态机形式的
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
谢谢sdwflzg,终于看明白怎么写了,太感谢了!以后有不懂的还要劳烦你了,非常感谢,我被这个程序困好几天了,睡都睡不着,现在感觉比中大奖都高兴,现在迷上单片机了,没办法啊.
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
caixiaojung 发表于
谢谢sdwflzg,终于看明白怎么写了,太感谢了!以后有不懂的还要劳烦你了,非常感谢,我被这个程序困好几天了,睡 ...
我也是刚上手,一起研究。:handshake
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
sdwflzg 发表于
我给你来个试试(已调试)
/*******************************************************
|一个按键两种功能, ...
如果上面的延时全部用定时器来延时那怎么写呢,是不是很麻烦
中级工程师, 积分 3368, 距离下一级还需 1632 积分
中级工程师, 积分 3368, 距离下一级还需 1632 积分
中级工程师, 积分 3368, 距离下一级还需 1632 积分
中级工程师, 积分 3368, 距离下一级还需 1632 积分
本帖最后由 ZG11211 于
17:46 编辑
定时扫描按键,如果有按键按下,开始计数。否则,判断计数值,少于i 视为抖动或没有按下按键,i&j&K视为短按,&k视为长按,执行相应操作,最后清计数值。
资深技术员, 积分 453, 距离下一级还需 47 积分
资深技术员, 积分 453, 距离下一级还需 47 积分
资深技术员, 积分 453, 距离下一级还需 47 积分
资深技术员, 积分 453, 距离下一级还需 47 积分
楼主还是看状态机吧,现在可能会麻烦点,以后会很爽,不要为了实现功能而去实现功能。
助理工程师, 积分 1027, 距离下一级还需 973 积分
助理工程师, 积分 1027, 距离下一级还需 973 积分
助理工程师, 积分 1027, 距离下一级还需 973 积分
助理工程师, 积分 1027, 距离下一级还需 973 积分
说句实话,不是打击7楼,如果按照那种思路写,会害死你自己,毕业后参加工作就知道了。还是先学好定时器中断吧,然后用定时器来实现
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
中级技术员, 积分 150, 距离下一级还需 150 积分
sfesdm 发表于
说句实话,不是打击7楼,如果按照那种思路写,会害死你自己,毕业后参加工作就知道了。还是先学好定时器中 ...
谢谢老师指导,用什么方式你要看你用单片机干什么,是吧!
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
监控按下时间,短按是释放执行,长按是到时间执行
非常感谢,用您说的方法我才实现了长按与短按的功能,没有用到延时,用定时器每隔一段时间来判断按键状态,并进行计数或者执行短按操作。一开始按照12楼的思路来写程序,一直写不出来,后来照着您的思路来,终于写出来了。再次感谢,我用的是读取按键扫描程序的值,这样的话就必须要按键扫描程序支持连按才可以。也许直接判断按键状态会更好些。
资深工程师, 积分 12131, 距离下一级还需 7869 积分
资深工程师, 积分 12131, 距离下一级还需 7869 积分
资深工程师, 积分 12131, 距离下一级还需 7869 积分
资深工程师, 积分 12131, 距离下一级还需 7869 积分
按键是慢速事件,用定时器扫描就很好。
中级工程师, 积分 3433, 距离下一级还需 1567 积分
中级工程师, 积分 3433, 距离下一级还需 1567 积分
中级工程师, 积分 3433, 距离下一级还需 1567 积分
中级工程师, 积分 3433, 距离下一级还需 1567 积分
void KeyScan()
& & & & static UINT32 u32Debounce=0;
& & & & static UINT32 u32KeyFlag=0;
& & & & UINT32 u32OldKeyR
& & & & static UINT32 u32LastKey=(KEY_IOI_MASK&&14)|(KEY_IOA_MASK&&1)|(0x03&&24)|(0x03&&26);
& & & & UINT32 u32KeyTmp = (~GetAllKeys())&KEY_MASK;
& & & & u32OldKeyRelease = ~DetectOldKeys_New2(g_u32KeyCode);
& & & & //u32OldKeyRelease= ~DetectOldKeys(g_u32KeyCode);
& & & & u32KeyTmp&=u32OldKeyR
& & & & g_u32KeyCode &=& & & & u32OldKeyR
& & & & if(u32KeyTmp !=u32LastKey)
& & & & & & & & /*if(u32KeyFlag ==1)
& & & & & & & & {
& & & & & & & & & & & & g_u32KeyCode =u32LastK
& & & & & & & & }*/
& & & & & & & & u32KeyFlag =1;
& & & & & & & & u32Debounce=0;
& & & & & & & & u32LastKey = u32KeyT
& & & & & & & &
& & & & else if(u32KeyFlag==1)
& & & & & & & & u32Debounce++;
& & & & & & & & if(C_DEBOUNCE &=u32Debounce)
& & & & & & & & {
& & & & & & & & & & & & u32Debounce = C_DEBOUNCE+1;
& & & & & & & & & & & & u32KeyFlag=2;
& & & & & & & & & & & & g_u32KeyCode = u32KeyT
& & & & & & & & }
& & & & }& & & &
简单的示例,长按,短按,你再联想一下就知道了
扫描二维码,随时随地手机跟帖
精英会员奖章
等级类勋章
奔腾之江水
发帖类勋章
技术领袖奖章
人才类勋章
时间类勋章
技术奇才奖章
人才类勋章
欢快之小溪
发帖类勋章
社区建设奖章
等级类勋章
沉静之湖泊
发帖类勋章
突出贡献奖章
等级类勋章
时间类勋章
甘甜之泉水
发帖类勋章
希望之星奖章
等级类勋章
技术新星奖章
人才类勋章
坚毅之洋流
发帖类勋章
时间类勋章
核心会员奖章
等级类勋章
湍急之河流
发帖类勋章
精华达人奖章
等级类勋章
技术高手奖章
人才类勋章
时间类勋章
时间类勋章
技术导师奖章
人才类勋章
您需要登录后才可以回帖
热门推荐 /6按键计数使一位数码管每次加一显示
代码段功能描述:分别用两个按键控制一位数码管和四个LED灯,每按一次键,实现数码管显示数字加一,LED灯循环点亮。
遇到的问题:1、按键控制以前没有接触过,找的红芯电子自带的例程。always @ (posedge
SYSCLK)KEY_REG &=
&KEY;&& assign
PRESS = (!KEY) && (KEY_REG);当PRESS为1时,即可实现按键控制。
&&&&&&&&&&&
2、一定要控制好计数时钟,不然会出现类似按键不灵敏的状况。
&&&&&&&&&&&
3、对阻塞和非阻塞赋值还是不太了解,目前只是照葫芦画瓢阶段。
//=============================================================================
//File Name : TUBE_COUNTER.v
//Module Name : TUBE_COUNTER
//Description : The data in the tube plus 1 when press the
//=============================================================================
module LED_COUNTER
&//Input ports
&//Output ports
&TUBE_SEL,
&TUBE_DATA,
//=============================================================================
//Input and output declaration
//=============================================================================
input SYSCLK; //system clock
input RST_B;& //system reset
input [1:0] KEY;&&
output [7:0] TUBE_SEL;& //select the tube
output [7:0] TUBE_DATA; //8 bits to show the data
output [3:0] LED;
//=============================================================================
//Wire and reg declaration
//=============================================================================
wire SYSCLK;
wire RST_B;
wire [1:0] KEY;
reg [3:0] LED;
wire [7:0] TUBE_SEL;
reg [7:0] TUBE_DATA;
//=============================================================================
//wire and reg in the module
//=============================================================================
reg [23:0] TIME_CNT;&&
//Count the time
reg [23:0] TIME_CNT_N;
TUBE_NUM_CNT;&&&&&
//Count the number when the key is
reg [3:0] TUBE_NUM_CNT_N;
reg [3:0] LED_N;
KEY_REG;&&&&&&&&&&
//save the key input one cycle
wire [1:0]
PRESS;&&&&&&&&&&&&
//low active
//=============================================================================
//=============================================================================
assign TUBE_SEL = ~8'h1;& //select the used
//=====================&
PRESS THE KEY&
=======================================
always @ (posedge SYSCLK)
&KEY_REG[0] &= KEY[0];
&KEY_REG[1] &= KEY[1];
assign PRESS[0] = (!KEY[0]) && (KEY_REG[0]);
assign PRESS[1] = (!KEY[1]) && (KEY_REG[1]);
//=====================&
COUNT THE TIME&
======================================
always @ (posedge SYSCLK or negedge RST_B)
&if(!RST_B)
&&TIME_CNT &= 24'h0;
&&TIME_CNT &=
TIME_CNT_N;
always @ (*)
&if(TIME_CNT == 24'hFF_FFFF)
&&TIME_CNT_N = 24'h0;
&else if(TIME_CNT != 24'h0)
&&TIME_CNT_N = TIME_CNT +
&else if((TIME_CNT == 24'h0) &&
(PRESS[0]))
&&TIME_CNT_N = TIME_CNT +
&&TIME_CNT_N = TIME_CNT;
//=====================&
COUNT THE NUMBER&
====================================
always @ (posedge SYSCLK or negedge RST_B)
&if(!RST_B)
&&TUBE_NUM_CNT = 4'h0;
&&TUBE_NUM_CNT =
TUBE_NUM_CNT_N;
always @ (*)
&if((TUBE_NUM_CNT == 4'h9) && (PRESS[0])
&& (TIME_CNT == 24'h0))
&&TUBE_NUM_CNT_N = 4'h0;
&else if((PRESS[0]) && (TIME_CNT ==
&&TUBE_NUM_CNT_N = TUBE_NUM_CNT +
&&TUBE_NUM_CNT_N =
TUBE_NUM_CNT;
//=====================&
CONFIGURE TUBE_DATA&
==================================
always @ (*)
&case(TUBE_NUM_CNT)
:&& TUBE_DATA = 8'hc0;
:&& TUBE_DATA = 8'hf9;
:&& TUBE_DATA = 8'ha4;
:&& TUBE_DATA = 8'hb0;
:&& TUBE_DATA = 8'h99;
:&& TUBE_DATA = 8'h92;
:&& TUBE_DATA = 8'h82;
:&& TUBE_DATA = 8'hf8;
:&& TUBE_DATA = 8'h80;
:&& TUBE_DATA = 8'h90;
default :&& TUBE_DATA =
//=====================&
CONFIGURE THE LED&
=======================================
always @ (posedge SYSCLK or negedge RST_B)
&if(!RST_B)
&&LED &= 4'b1110;
&&LED &= LED_N;
always @ (*)
&if((LED == 4'b0111) && (PRESS[1])
&& (TIME_CNT == 24'h0))
&&LED_N = 4'b1110;
&else if((PRESS[1]) && (TIME_CNT ==
{LED[2:0],LED[3]};
&&LED_N = LED;
//=============================================================================
//End of file
//=============================================================================&
下面开始写一个关于SDRAM的程序了,come on!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。怎么样在EXCEL表格中,做一个按钮,每按一下,数字加1,_百度知道
怎么样在EXCEL表格中,做一个按钮,每按一下,数字加1,
我按如下方式操作:
在主菜单点击&视图&,&工具栏&,&控件工具箱&后会跳出一个控件工具选择框。选择&命令按钮&后,鼠标会变为细的十字标。在工作表范围内按着鼠标左键,然后拉动就会出现控件按钮就放开鼠标左键。按钮键就完成了,把鼠标移到按钮键双击鼠标左键...
如何将上述结果落到指定的单元格内,请高手指点
我有更好的答案
在sheet1中,视图——窗体——画一个按钮就可以了指定宏。右键sheet1添加上面的代码。中文是注释最好是改一下代码Sub CommandButton1_Click()ActiveCell.Value = ActiveCell.Value + 1
'选定单元格内容+1ActiveCell.Offset(1).Select
'自动移到下个单元格End Sub
能否更详细一点呢!
Sub 按钮1_单击()Private Sub CommandButton1_Click()ActiveCell.Value = ActiveCell.Value + 1
'ActiveCell.Offset(1, 0).Select 'End Sub提示出现编译错误 ,缺少END
采纳率:46%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
excel表格的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。excel中制作个按钮,怎么实现按一下,让单元格的数值自动加1?_百度知道
excel中制作个按钮,怎么实现按一下,让单元格的数值自动加1?
hunter2k 能否给个具体的步骤?
我有更好的答案
在主菜单点击&视图&,&工具栏&,&控件工具箱&后会跳出一个控件工具选择框。选择&命令按钮&后,鼠标会变为细的十字标。在工作表范围内按着鼠标左键,然后拉动就会出现控件按钮就放开鼠标左键。按钮键就完成了,把鼠标移到按钮键双击鼠标左键就进入VBA编辑器。再把以下代码拷贝到编辑器中。Private Sub CommandButton1_Click()ActiveCell.Value = ActiveCell.Value + 1
'选定单元格内容+1ActiveCell.Offset(1,0).Select
'自动移到下个单元格End Sub
采纳率:45%
在主菜单点击&视图&,&工具栏&,&控件工具箱&后会跳出一个控件工具选择框。选择&命令按钮&后,鼠标会变为细的十字标。在工作表范围内按着鼠标左键,然后拉动就会出现控件按钮就放开鼠标左键。按钮键就完成了,把鼠标移到按钮键双击鼠标左键就进入VBA编辑器。再把以下代码拷贝到编辑器中。Private Sub CommandButton1_Click()ActiveCell.Value = ActiveCell.Value + 1
'选定单元格内容+1ActiveCell.Offset(1,0).Select
'自动移到下个单元格End Sub
本回答被网友采纳
用函数,另起一列,(例如数据在A1)在其中输入=A1+1,下面的往下托即可
Private Sub CommandButton1_Click()
'Cells(1, 1) = Cells(1, 1) + 1 '指定单元格一行一列内容加一
ActiveCell.Value = ActiveCell.Value + 1
'选定单元格内容+1End Sub
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
excel的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。汇编如何让按键按一下置1,再按一下置2_百度知道
汇编如何让按键按一下置1,再按一下置2
我有更好的答案
就是编程呗。最好说明一下:你用的是什么 CPU。按键,安放在什么地方。置一、置二,置在什么地方。参考:
采纳率:64%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 怎么让电脑自动按键 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信