汇编语言的单片机程序设计.ppt
单片机接口技术及应用,单片机接口技术及应用 汇编语言的单片机程序设计,*,应用电子系,3,汇编语言的单片机程序设计,课程目录,一、程序设计概述二、汇编语言的伪指令三、汇编语言的典型程序结构四、汇编语言的子程序设计五、汇编语言实用子程序举例六、几个端口实验的任务书,*,1.延时子程序设计,例:编写10ms延时子程序。(假设晶振频率为12MHZ)D10ms:MOV R5,#10;1usD1ms:MOV R4,#249;1us DL:NOP NOP DJNZ R4,DL;4x249=996us DJNZ R5,D1ms;2us,总循环共(1+996+2)10=9990us RET;2us,*,延时子程序设计要点:,初始化:循环次数赋值循环体次数计算:晶振频率机器周期循环体时间循环次数精确计算:考虑赋值次数与时间,还要考虑进入与返回时间进入时,应注意子程序使用到的寄存器的保护;返回时,无参数带出。多时间延时子程序如何设计?外循环次数参数带入,内循环时间固定。,*,子程序:DLnms:NOPD1ms:MOV R4,#249 DL:NOP NOP DJNZ R4,DL DJNZ R5,D1ms RET;,主程序:MOV R5,#n CALL DLnms,多时间延时子程序调用,*,2.输入设备子程序设计,拨码开关电路设计,拨码开关状态的读取?,设置输入端口,读输入端口,保存输入值,KEYRD:MOV P3,#0FFH MOV A,P3 MOV R5,A RET,*,轻触开关电路设计,轻触开关状态的读取?,设置输入端口,读输入端口,去抖动,保存输入值,*,ANYKEY:MOV P3,#0FFHNOKEY:MOV A,P3 CPL A JZ NOKEY;无键按下 MOV TEMP,P3;有键按下,TEMP为存储器单元,保存结果 CALL D10ms MOV A,P3 CJNE A,TEMP,NOKEY;去抖 MOV R5,A;保存按键 SETB 00H;有键标志 RET,*,例:有二个轻触开关,分别控制二个计数器,每按一次,计数器加1,最大分别加到5与9,又从0开始。编写其子程序。,寄存器资源分配:R3、R4:保存计数值 R5:保存开关值,设计关键点:是否有按键?有按键,是什么键?是否同一次按下的键?,*,按键判断、去抖,ANYKEY:MOV P3,#03HNOKEY:MOV A,P3 ORL A,#0FCH CPL A JZ NOKEY MOV TEMP,A CALL D10MS MOV A,P3 ORL A,#0FCH CPL A CJNE A,TEMP,NOKEY MOV R5,A RET,KEYAGIN:MOV P3,#03HKEYTA:MOV A,P3 ORL A,#0FCH CPL A CJNE A,TEMP,KEYCH SJMP KEYTAKEYCH:NOP RET,按键释放判断,*,计数控制,COUNTER:MOV A,R5 CJNE A,#01,KEY2CON CJNE R3,#05,CON1ADD MOV R3,#00H SJMP CONOVERCON1ADD:INC R3 SJMP CONOVERKEY2CON:CJNE R4,#09H,CON2ADD MOV R4,#00H SJMP CONOVERCON2ADD:INC R4CONOVER:NOP RET,*,主程序引用:TEMP EQU 30H ORG 0000H LJMP MAIN ORG 00100HMAIN:MOV R3,#00HMOV R4,#00HLOOP:LCALL DISPLCALL ANYKEYLCALL COUNTERLCALL KEYAGIN SJMP LOOP,DISP:MOV A,R3 SWAP A ORL A,R4 MOV P1,A RET,*,问题:1.分析程序工作过程多个子程序调用关系2.如何分解任务(判键去抖计数键盘再次判断显示)3.显示从P1口输出,用发光二极管代替,也可以用带译码的数码实现4.修改程序,将程序修改为二键,先选择需要调整的计数位(可以闪烁显示),再用相同二键分别实现加减功能改变计数值。,*,3.信号处理(运算)子程序设计,例:编写多字节无符号数的减法子程序。设2个多字节无符号数的低字节地址分别存于R0和R1中,低字节在高地址单元。相减后的差存放在减数原来的位置。子程序入口:(R0)=被减数低字节地址;(R1)=减数的低字节地址;(R7)=字节数子程序出口:(R1)=差的高字节地址;,*,程序:ORG 0000H ljmp MAIN ORG 0040HMAIN:MOV R0,#37H MOV R1,#3FH ACALL NSUB SJMP$,NSUB:MOV R7,#3 CLR CNSUB1:MOV A,R0 SUBB A,R1 MOV R1,A DEC R0 DEC R1 DJNZ R7,NSUB1 INC R1 RET END,*,例:利用子程序实现c=a2+b2。设a,b,c分别存于内部RAM的30H,31H,32H三个单元中。子程序入口:(A)=预平方数;子程序出口:(A)=平方值;,*,SQR:MOV DPTR,#TAB MOVC A,A+DPTR RETTAB:DB 0,1,4,9,16,25,36,49,64,81 END,ORG 0000H LJMP MAIN ORG 0040HMAIN:MOV 30H,#4 MOV 31H,#5 MOV A,30H ACALL SQR MOV R1,A MOV A,31H ACALL SQR ADD A,R1 MOV 32H,A SJMP$,*,例:将1位十六进制数转换成相应的ASCII码。设十六进制数存放在R0中,转换后的ASCII码存放于R2中。,ORG 0000H ljmp MAINORG 0040H MAIN:MOV R0,#0BH ACALL HASC SJMP$,HASC:MOV A,R0 ANL A,#0FH PUSH ACC CLR C SUBB A,#0AH POP ACC JC LOOP ADD A,#07HLOOP:ADD A,#30H MOV R2,A RET END,*,例:双字节二进制数转换成BCD码。设(R2R3)为双字节二进制数,(R4R5R6)为转换完的压缩型BCD码。,ORG 0000H ljmp MAIN ORG 0040HMAIN:MOV R2,#0B2H MOV R3,#1BH ACALL DCDTH SJMP$,*,DCDTH:CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,#16LOOP:CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A,MOV A,R6 ADDC A,R6 DA A MOV R6,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ R7,LOOP RET END,*,4.输出设备子程序设计,例:数据端与P0口正序连接。编写程序,实现功能:上电后数码管显示“P”,1秒后,显示从“0”开始每隔1秒加1,加至“F”后,数码管显示“P”,重新开始。,*,ORG 0000H JMP START ORG 0100HSTART:MOV SP,#5FH MOV P0,#8CH;显示P MOV P3,#0FFH CALL D_1S CALL DISP JMP START,*,DISP:MOV R7,#16 MOV R2,#0LOOP:MOV A,R2 MOV DPTR,#CODE_P0 MOVC A,A+DPTR MOV P0,A INC R2 SETB RS0;切换组 CALL D_1S CLR RS0 DJNZ R7,LOOP RET,D_1S:(子程序),CODE_P0:DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H,DB 0C6H,0A1H,86H,8EH,*,有时为方便走线而采用逆序连接,显示段码要进行调整:CODE_P2:DB 03H,9FH,25H,0DH,99H,49H,40H,1FH DB 01H,09H,11H,0C1H,63H,85H,61H,71H,CODE_P0:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,试比较:,*,1.本章总结,2.编程思路,3.端口输入出与编程验证,*,例:P1口与开关及LED发光二极管的接口电路如图所示,其中,P1.7P1.4作并行输出口,分别与LED3LED0连接。当输出为1,即高电平时,LED不发光;输出为0,即低电平,LED发光。P1.3P1.0作并行输入口,分别接开关K3K0,通过开关的不同位置向P1.3P1.0输入“0”或“1”开关信号。要求读入P1.3P1.0引脚上的开关K3K0的预置状态,再经P1.7P1.4输出驱动LED3LED0发光二极管,使发光二极管显示开关状态。,*,*,编写程序如下:ORG0000HMAIN:MOV A,#0FFH MOV P1,A;置P1低4位为输入,高4位输出灭显示 MOV A,P1;输入P1低4位的开关状态 SWAP A;将低4位输入的数据转到高4位 MOV P1,A;将开关状态输出驱动相应的LED显示HERE:SJMP HEREEND,*,用一个准备好状态标志来表示每当开关状态K3K0设置完成后,将准备好状态标志置“1”,否则此标志为“0”,用一个开关S表示,当按钮按下P2.3引脚为“1”,说明开关设置完成。S开关不下压,P2.3=0,未准备好。那么,CPU就查询这个“S”,一直查到S=1为止。输入过程如图:,*,*,程序如下:TEST:MOV P2,#0FFH MOV A,P2 ANLA,#01H JZTEST MOV P1,#0FH MOV A,P1 SWAP A MOV P1,A,修改程序,用一个主程序+2个子程序实现,*,例:用一片74LS4(BCD-七段数码转换器)可外接一只共阳极七段数码管。要求不用延时的方法看到显示内容。欲显示的数据事先放在片内RAM30H起始的数据区内,共10个显示内容。,*,*,思考与实践,1、数据端与P0口正序连接。编写程序,分别实现功能:上电后数码管显示“P”,按下任何键后,显示从“0”开始每隔1秒加1,加至“F”后,数码管显示“P”,进入等待按键状态。2、数据端与P0口逆序连接,有二个轻触开关与P3连接。编写程序,分别实现功能:上电后数码管显示“P”闪烁,按下其中一键后,变化字符,字符有16种变化;按下另一键,变化闪烁频率,有10种明显的频率变化。,*,谢谢大家!,*,*,思考与实践,*,