单片机 用汇编语言怎么编写两个按键控制一个LED自加自减的程序

单片机 用汇编语言怎么编写两个按键控制一个LED自加自减的程序,第1张

;共阳数码管

COUNT EQU 30H

SP1 EQU P36

SP2 EQU P37

ORG 0

AJMP MAIN

ORG 30H

MAIN: MOV COUNT,#0

MAIN1: MOV A,COUNT

MOV B,#10

DIV AB

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P2,A

MOV A,B

MOVC A,@A+DPTR

MOV P1,A

K1:   JB SP1,K2

JB SP1,$

LCALL DLY

JNB SP1,$

INC COUNT

MOV A,COUNT

CJNE A,#100,MAIN1

LJMP MAIN

K2: JB SP2,K1

JB SP2,$

LCALL DLY

JNB SP2,$

MOV A,COUNT

CJNE A,#0,DEC1

MOV COUNT,#100

DEC1:  DEC COUNT

MOV A,COUNT

CJNE A,#100,MAIN1

LJMP MAIN

DLY: MOV R7,#20

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,$-4

RET

TAB: DB  0C0H,0F9H,0A4H,0B0H,99H,092H,82H,0F8H,080H,090H

END

我用过AD9850 是8根数据线,3根控制线(不是地址线),程序如下

#define AD9850 P1OUT //数据

#define W_CLK_H P6OUT|=BIT4 //时钟线

#define W_CLK_L P6OUT&=~BIT4

#define FQ_UP_H P6OUT|=BIT5

#define FQ_UP_L P6OUT&=~BIT5

#define RSET_H P6OUT|=BIT6 //复位线

#define RSET_L P6OUT&=~BIT6

long unsigned int f=1000,A9850temp=0;

uchar sendon=1;

uchar Mdata[5]=;

void Deal()

{

double pinlv;

uchar i;

pinlv=f;

pinlv=1073742; //系数要根据实际的外接晶振频率而定 本设计有源晶振40M

A9850temp=(long unsigned)pinlv;

Mdata[4]=A9850temp&0x000000ff;

Mdata[3]=(A9850temp>>8)&0x000000ff;

Mdata[2]=(A9850temp>>16)&0x000000ff;

Mdata[1]=(A9850temp>>24)&0x000000ff;

FQ_UP_L;

_NOP();

FQ_UP_H;

_NOP();

FQ_UP_L;

_NOP();

W_CLK_L;

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

{

AD9850=Mdata[i];

W_CLK_H;

delay(200);

W_CLK_L;

}

delay(200);

FQ_UP_H;

}

void AD9850Init()

{ W_CLK_L;

delay(200);

FQ_UP_L;

delay(200);

RSET_H;

delay(200);

RSET_L;

f=100000;

}

void AD9850fun()

}

loop: lcall key ;无键按下

jz loop ;

cjne a,#16,loop_next1 ;看看是否是需要的键值,不是就跳走,是就继续

setb flag_2s ;启动定时器2秒定时开始

mov 1dh,#0 ;2秒寄存器清0

loop_2: lcall read_data ;等待期间可以做些其他的事

lcall nibtd_ymd ;等待期间可以做些其他的事

lcall nibtd_hms ;等待期间可以做些其他的事

lcall nibtd_run ;等待期间可以做些其他的事

lcall key ;扫描键盘

jz loop ;无键按下跳走

cjne a,#16,loop ;有键按下 看看是否是需要的键值

jb flag_2s,loop_2 ;还没按住保持2秒,继续等待

loop_1: 2秒已到,继续

一、图貌似有点问题:\x0d\1、用的是共阴极数码管,如果用单片机直接驱动的话,应该用共阳极的;\x0d\2、所有LED(包括数码管)都未接限流电阻,建议串接470欧左右的;\x0d\3、单片机直接驱动“sounder”,估计驱动电流不够,建议接三极管后再输出\x0d\二、程序可以借鉴楼上的,但需要修改:\x0d\\x0d\SETB P10\x0d\JNB P10,$\x0d\\x0d\在这2句之间需要加入:\x0d\JB 10 LP0\x0d\LCALL DELAY_50MS\x0d\另:加入子程序DELAY_50MS\x0d\DELAY_50MS:\x0d\MOV R7,#0C3H\x0d\LP_DL:\x0d\MOV R6,#00H\x0d\DJNZ R6,$\x0d\DJNZ R7,LP_DL\x0d\RET\x0d\\x0d\如果换成共阳极数码管后,数据表换成以下的:\x0d\TABLE: ;表:共阳数码管 0-9 A-F\x0d\DB 0C0H,0F9H,0A4H,0b0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH\x0d\以上意见供参考

你这没有给出原理图,数码管和按键是怎么接的?是仿真实现吗,下图是仿真图,用了四位一体的共阴数码管,4个按键在P34~P37上。

仿真结果,你要是仿真,就按这个仿真图画,程序就完全适用。如果是实物开发板,就是根据开发板,适当修改程序了。

汇编程序如下

S1  BIT P34

S2  BIT P35

S3  BIT P36

S4  BIT P37

DISM1 EQU  31H

DISM2 EQU  32H

DISM3 EQU  33H

DISM4 EQU  34H

START:MOV  R0,#7FH

CLEAR:MOV  @R0,#0

DJNZ R0,CLEAR

MAINP:ACALL DISUP;主程序

TEST1:JB   S1,TEST2

ACALL DELK4

JB   S1,TEST2

INC  DISM1

MOV  A ,DISM1

CJNE A ,#10,CMPM1

CMPM1:JC   WAIT1

MOV  DISM1,#0

WAIT1:JNB  S1 ,$

AJMP MAINP

TEST2:JB   S2,TEST3

ACALL DELK4

JB   S2,TEST3

INC  DISM2

MOV  A ,DISM2

CJNE A ,#10,CMPM2

CMPM2:JC   WAIT2

MOV  DISM2,#0

WAIT2:JNB  S2 ,$

AJMP MAINP

TEST3:JB   S3,TEST4

ACALL DELK4

JB   S3,TEST4

INC  DISM3

MOV  A ,DISM3

CJNE A ,#10,CMPM3

CMPM3:JC   WAIT3

MOV  DISM3,#0

WAIT3:JNB  S3 ,$

AJMP MAINP

TEST4:JB   S4,MAINP

ACALL DELK4

JB   S4,MAINP

INC  DISM4

MOV  A ,DISM4

CJNE A ,#10,CMPM4

CMPM4:JC   WAIT4

MOV  DISM4,#0

WAIT4:JNB  S4 ,$

AJMP MAINP

DISUP:MOV DPTR,#TABLE;显示子程序

MOV R0  ,#DISM1

MOV R2  ,#0FEH

DISB1:MOV P2  ,R2

MOV A   ,@R0

MOVC A  ,@A+DPTR

MOV P0  ,A

MOV A   ,R2

RL  A

MOV R2  ,A

ACALL DELAY

INC R0

CJNE R0 ,#DISM4+1,DISB1

RET

DELK4:MOV  R6 ,#10

SJMP DELA1

DELAY:MOV  R6 ,#2

DELA1:MOV  R7 ,#150

DJNZ R7 ,$

DJNZ R6 ,DELA1

RET

TABLE:DB 3FH,06H,5BH,4FH,66H;共阴段码表

DB 6DH,7DH,07H,7FH,6FH

END

DAT EQU 30H

SCANLED EQU 32H

FSDAT EQU 33H

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV SP,#5FH

MOV TMOD,#01H

MOV TH0,#0F4H

MOV TL0,#048H

MOV P2,#00H

MOV SCANLED,#0

MOV 30H,#5

MOV 31H,#0

MOV FSDAT,#50

SETB EA

SETB ET0

SETB TR0

LOOP:

JB P30,LOOP1

JNB P30,$

INC FSDAT

MOV A,FSDAT

CJNE A,#100,LOOP01

LOOP01:

JC LOOP02

MOV FSDAT,#99

LOOP02:

MOV A,FSDAT

MOV B,#10

DIV AB

MOV 30H,A

MOV 31H,B

SJMP LOOP

LOOP1:

JB P31,LOOP2

JNB P31,$

MOV A,FSDAT

JZ LOOP11

DEC FSDAT

LOOP11:

MOV A,FSDAT

MOV B,#10

DIV AB

MOV 30H,A

MOV 31H,B

SJMP LOOP

LOOP2:

JB P32,LOOP

JNB P32,$

MOV FSDAT,#50

MOV 30H,#5

MOV 31H,#0

SJMP LOOP

;--------------------

T0ISR:

PUSH ACC

CLR TR0

MOV TH0,#0F4H

MOV TL0,#48H

SETB TR0

MOV DPTR,#LEDTAB1

T000:

MOV R0,#DAT

MOV A,SCANLED

ADD A,R0

MOV R0,A

MOV A,SCANLED

JNZ T001

MOV P2,#02H

SJMP T0DIS

T001:

MOV P2,#01H

T0DIS:

MOV A,@R0

MOVC A,@A+DPTR

CPL A

MOV P0,A

INC SCANLED

MOV A,SCANLED

ANL A,#01H

MOV SCANLED,A

POP ACC

RETI

;--------------------

LEDTAB1:

DB 0C0H ;"0" 00H

DB 0F9H ;"1" 01H

DB 0A4H ;"2" 02H

DB 0B0H ;"3" 03H

DB 99H ;"4" 04H

DB 92H ;"5" 05H

DB 82H ;"6" 06H

DB 0F8H ;"7" 07H

DB 80H ;"8" 08H

DB 90H ;"9" 09H

DB 88H ;"A" 0AH

DB 83H ;"B" 0BH

DB 0C6H ;"C" 0CH

DB 0A1H ;"D" 0DH

DB 86H ;"E" 0EH

DB 8EH ;"F" 0FH

DB 0FFH ;" " 10H

;--------------------

END

以上就是关于单片机 用汇编语言怎么编写两个按键控制一个LED自加自减的程序全部的内容,包括:单片机 用汇编语言怎么编写两个按键控制一个LED自加自减的程序、想要一个80C51单片机控制ad9850的汇编程序,能用按键调节的·最好能加显示、求AT89C51 单片机的按钮长按2秒的汇编程序!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9301464.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存