单片机 一个按钮设置按一下加1 另一个按键按一下减1 求帮忙编写程序

作者&投稿:幸冉 (若有异议请与网页底部的电邮联系)
单片机 c语言 一个按键按一下加一 一个按键按一下减一 一个按键an'yi'x切换~

#include
sbit key1=P2^5;
sbit key2=P2^6;
sbit key3=P2^7;
main()
{
bit flag=0;
unsigned char a;
while(1)
{
if(key1==0)
{
while(key1==0);
if(flag==0)a++;
else a--;
P0=a;
}
if(key2==0)
{
while(key2==0);
if(flag==0)a--;
else a++;
P0=a;
}
if(key3==0){while(key1==0);flag=~flag;}
}
}

很简单
比如你定义的数是AA,
汇编的是这样写的:
MAIN;JB P3.0 ,S1
MOV A, AA
INC A
MOV AA,A
S1:JB P3.1 ,MAIN
MOV A, AA
DEC A
MOV AA,A
JMP MAIN
C语言的
if(P3^0==0){
delay(50);
if(P3^0==1){
aa++;
if(aa>=10)aa=0;
}}
if(P3^1==0){
delay(50);
if(P3^1==0){
aa++;
if(aa<=0)aa=9;
}}

#include<reg52>
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P1^4;
sbit K2 = P1^5;
uchar data K1state;
uchar data K2state;
uint  data num,ntmp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x06f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;
uchar data showIndex,indexTmp;
uchar data  W[8];
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);//能使之延时接近1毫秒就成 无需精确
}
void main()
{
  K1state = 0xFF;
  K2state = 0xFF;
  num = 0;
  while(1)
  {
    delay(1);//每毫秒轮询一回
    //移位法,延时防抖
    K1state = (K1state<<1);
    K2state = (K2state<<1);
    if(K1) K1state++;
    if(K2) K2state++;
    //检查开关状态
    if(K1state==0x80) num++;
    if(K2state==0x80) num--;
    for(indexTmp=0,ntmp = num;indexTmp<=7;indexTmp++)
    {
      W[indexTmp] = num%10;
      num /=10;
    }
    P0 = (0x01<<showIndex);//位选
    P2 = table[W[showIndex]];//段选
    showIndex++;
    if(showIndex>=8)
      showIndex=0;
  }
}

看了你的全图,修改后了,用Keil uVision 3或4都可以,编译后可以查看对应的汇编代码

程序稍大一点的,不会有人用汇编来给你蘑菇,汇编设计写编码太慢了,开发代价不值得



学单片机 先学C语言 学深了 再学汇编 这样更好上手

sbit k=P1^5;
sbit m=P1^6;
int p=0;
while(1)
{
if(k==0)
p++;
else if(m==0)
p--;
}

求剩余下面的图 做边接到什么了???


德兴市15085862121: 单片机C语言如何实现按键按一下的时候加一,长按的时候连加. -
潮时曲纳: 这个可以通过定时器来实现,比如当按键时间小于2秒时,按一次加1,当超过2秒时,没50毫秒加1实现连加功能.例程如下: #include<reg51.h> unsigned int a; unsigned char times; sbit key=P1^0; void t0isr() interrupt 1 { TH0=(65536-50000)/...

德兴市15085862121: 单片机按键按一下,数字只加一. -
潮时曲纳: 这样不是很好吗,按下只要没放就在那等待,如果不等待,又会进入下一次按键的判断,这样可能不是我们想要要的结果,如果你不想在那等,就不用while(!KEY),程序执行完这个Key的过程后,可能会立马又进入了Key函数,那么,你本来想...

德兴市15085862121: 怎么让单片机按一下按键执行一个程序,再按一下马上执行另一个程序 -
潮时曲纳: call key jmp loop key:jnb p3.0,rel ret rel:call delay20MS jnb p3.0,rel 第一次这里标志位为0,则执行,第一次按下功能.

德兴市15085862121: 单片机怎么用键盘中断实现按住按键,使内部RAM中的一个数据不停加1? -
潮时曲纳: 你既能够实现按一下,数据加1的话,那就差一点就可以实现你所说的功能了. 不过还要看你的中断是边沿触发呢,还是电平触发? 如果是边沿触发呢,每次进入中断的时候把一个位变量置1,并且保存外部中断口的电平.然后我们在主程序中读取这个位变量,如果位变量为1说明已经有铵键被按下.然后开如计时,并将位变量清零.当时间达到某一个值(如:200ms)我们就让计数寄存器加1,以此类推,当时间达到另一个值时(如:400ms),再将计数据器加1.不过,当主程序中再次读到位变量被置1时,我们要停止计时.并判断时间是否达到设定值,如果比设定值小的话,就视为干扰信号.这时清除计时器.这样就能实现连续加1的功能. 希望能让你得到启发.祝你好运!

德兴市15085862121: 单片机 c语言 一个按键按一下加一 一个按键按一下减一 一个按键an'yi'x切换 -
潮时曲纳: #include<reg51.h> sbit key1=P2^5; sbit key2=P2^6; sbit key3=P2^7; main() { bit flag=0; unsigned char a; while(1) { if(key1==0) { while(key1==0); if(flag==0)a++; else a--; P0=a; } if(key2==0) { while(key2==0); if(flag==0)a--; else a++; P0=a; } if(key3==0){while(key1==0);flag=~flag;} } }

德兴市15085862121: 单片机 按键 按一下加一,长按自加 的程序怎么写? 是这样么? if(s2==0) { delay1ms(5); if(s2==0) delay
潮时曲纳: if(s2==0) { delay1ms(5); //按键去抖动 if(s2==0) { Ldata++;//加一 for(i=0;i&lt;1000;i++)//此处为等待键释放,每个循环都看键是否释放,在这段时间内释放则算一次按键,此处i的大小根据需要确定 if(!s2==0) break; //如果键释放则退出 else {if(i=...

德兴市15085862121: 单片机如何用8个LED灯按ASCII码表示0~99,用一个按钮控制,按一下就加1. -
潮时曲纳: 8个LED灯代表一个char型数据的8位?如果是 很简单 a=key_scan(); if(a==0) {b++; if(b>99)b=0; P0=b;}

德兴市15085862121: 怎么用单片计C语言编出两个按键控制一位数码管,一个按健控制0至9就是按一下加1.另一个按键控制归零,... -
潮时曲纳: 很简单啊.按键中断控制标志位加一或清零就行了.

德兴市15085862121: avr单片机中如何实现按下1次按键计数加1求代码
潮时曲纳: 1种简单的方法是,把这个按键放到单片机的1个中断口上(降落沿触发),然后建1个变量,放到该中断函数中,进行加1运算主函数voidmain(void){unsignedcharnum=0;KEY_ADD=1;//按键输入端口电平置高KEY_DEC=1;while(1)//主循环{if(!...

德兴市15085862121: c51单片机按键加1,保持 -
潮时曲纳: if(key==1) //根据你按键连接方式 { delay() //消抖 if(key==1) { delay() //等待按键释放 num++; if(num==10) num=0; //把NUM的值送出去显示就可以了 } }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网