
;共阳数码管
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秒的汇编程序!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)