单片机,按键一次,4灯从左向右依次亮,按键两次,4灯从右向左亮,谢谢

大家好,是要单片机的 汇编程序的

您的问题我已经解决,外加一张电路图。实现的主要功能为:按一次按键开关,二极管实现左到右的点亮;再按一次按键开关,二极管实现右到左的点亮;再按一次按键开关,又实现二极管做到右的点亮.........即:若按奇数次开关时,二极管实现左到右点亮;若按偶数次开关时,二极管实现右到左点亮。

电路图:

程序如下:

#include <reg51.h>

#define uint  unsigned int

#define uchar unsigned char

uchar code table_1[]={

0xf7,0xfb,0xfd,0xfe};

uchar code table_2[]={

0xfe,0xfd,0xfb,0xf7};

sbit key=P2^0;

uint num;

//延时子程序

void relay(uint xm)

{

uint i,j; 

for(i=xm;i>0;i--)

for(j=110;j>0;j--);

}

//实现左移

void left_shift()

{

uint i;

while(1)

{

for(i=0;i<4;i++)

{

P1=table_1[i];

relay(500);

}

}

}

//实现右移

void right_shift()

{

uint i;

for(i=0;i<4;i++)

{

P1=table_2[i];

relay(500);

}

}

void main()

{

while(1)

{

if(key==0)

{

relay(5);  //防抖延时

if(key==0)

{

while(key)   //按键是否起来

{

num++;

switch(num%2)

{

case 1:left_shift();break;

case 0:right_shift();break;

}

}

}

}

}

}

                                                                                                                 芯芯之火2011/6/13

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-13
你要如何区分是单击还是双击呢,是通过对第一次击键后的延时等待判断第二次有无击键并做出响应吗.
第2个回答  2011-06-19
级数不够 就没有图片了
接一个按键到P1口,并接到int0口(p3.2口),就可以了
灯接p0口,要上拉电阻(330欧)
新手,时间紧,写的不是很好

WELE EQU 0X20
CNT EQU 0X21
ORG 0
AJMP MAIN
ORG 0X03
AJMP KEYSCAN
MAIN:
MOV P0 ,#0
MOV IE ,#0X81
MOV TCON ,#0X01
AJMP MAIN
RET
BUTTON:
PUSH PSW
PUSH ACC
AJMP KEYSCAN
KEYEND:
POP ACC
POP PSW
RETI
KEYSCAN:
MOV A ,P1
CJNE A ,#0XFF ,KEYSCAN
MOV CNT ,#0X4A
CHECK_LOOP:
MOV A ,P1
CJNE A ,#0XFF ,D_P_OUT
ACALL DELAY
DJNZ CNT ,CHECK_LOOP
AJMP S_P_OUT
RET

S_P_OUT:
ACALL R_LIGHT
RET
D_P_OUT:
MOV A ,P1
CJNE A ,#0XFF ,D_P_OUT
MOV IE ,#0
ACALL L_LIGHT
RET

R_LIGHT:
MOV WELE ,#0X01
LOOP1:
MOV A ,WELE
CJNE A ,#0X1F ,LOOP2
AJMP KEYEND
LOOP2:
MOV P0 ,A
ACALL DELAY1
RL A
INC A
MOV WELE ,A
AJMP LOOP1
RET

L_LIGHT:
MOV WELE ,#0X08
LOOP3:
MOV A ,WELE
CJNE A ,#0X8F ,LOOP4
AJMP KEYEND
LOOP4:
MOV P0 ,WELE
ACALL DELAY1
RR A
ADD A ,#8
MOV WELE ,A
AJMP LOOP3
RET

DELAY:
MOV R0 ,#0X14
D2:
MOV R1 ,#0
DJNZ R1 ,$
DJNZ R0 ,D2
RET
DELAY1:
MOV R2 ,#2

D_LOOP0:
MOV R4 ,#0
D_LOOP1:
MOV R3 ,#0
DJNZ R3 ,$
DJNZ R4 ,D_LOOP1
DJNZ R2 ,D_LOOP0
RET

END本回答被提问者采纳
相似回答