第四章汇编语言程序设计★汇编语言程序设计●顺序结构程序设计●分支结构程序设计●循环结构程序设计●查表程序设计●子程序设计★综合应用举例●算术运算类程序●逻辑运算类程序●代码转换运算类程序●输入输出类程序(I/O端口程序)解:R0、R1:连续16次累加的16位工作寄存器MOVR0,#00H;累加和低字节清零MOVR1,#00H;累加和高字节清零MOVR2,#10H;累加次数16送入R2MOVA,#0FFH;P1口置输入方式MOVP1,AAD1:MOVA,P1;读入P1口的数据ADDA,R0;加入中间寄存器(累加和)低8位JNCAD2;相加无进位转AD2INCR1;相加有进位中间寄存器(累加和)高8位加1AD2:MOVR0,A;存累加和低字节DJNZR2,AD1累加次数未到转AD1例:用P1口作为数据读入口,为了读取稳定的值,连续读16次取平均值。一、算术运算类程序MOVR2,#04HAD3:CLRCMOVA,R1RRCAMOVR1,AMOVA,R0RRCAMOVR0,ADJNZR2,AD3END对累加和除以16,即右移4次二、逻辑运算类程序例:单片机片内RAM有两个数据段分别从地址20H和40H开始,每个数据段数据个数相同,为16个,编写程序实现两个数据段中相同数据的个数统计,结果放入60H中。ORG3000HMOVR0,#20H;设置地址指针MOVR1,#40HMOVR2,#10H;数据段长度MOVR3,#00H;存放结果LP1:MOVA,@R0XRLA,@R1INCR0INCR1JNZLP2INCR3LP2:DJNZR2,LP1MOV60H,R3END三、代码转换运算类程序在计算机内部的运算中一般采用二进制,而在与外设的数据传送中常采用BCD码、ASCII码等,为此经常需要各种代码之间进行转换。在程序设计中常采用如下两种方法:(1)算法处理根据待转换的两种代码的某种数学上的关系,通过算法进行转换,例如字符0~9对应ASCII码30H~39H;(2)查表方法将两种待转换的代码对应列表,用查表指令进行转换。二进制与BCD码转换,二进制(十六进制)与ASCII码转换BB:MOVB,#100DIVAB;A中为百位数,B中为余数MOV@R0,AINCR0;修改地址指针MOVA,#10XCHA,BDIVAB;A中为十位数,B中为个位数SWAPA;十位数移到高半字节ADDA,B;在A中形成十位和个位数的压缩BCD码MOV@R0,ARET例:8位二进制转换为压缩的BCD数。解:8位二进制数的范围是0~255,因此需要两个字节存放,一个字节存放个位、十位,另外一个字节存放百位。例:将十六进制数转换为ASCII码的子程序。解:0~9的ASCII码值为30H~39H,各自对应相差30H;字符A、B、C、D、E、F的ASCII码值为41H~46H,它们各自减去37H恰好为10~15,即0AH、0BH、0CH、0DH、0EH、0FH。EXG:MOVA,@R0;取操作数CLRC;进位清零SUBBA,#10MOVA,@R0;取操作数JCSB;数值在0~9,则转换到SBADDA,#37HSJMPOKSB:ADDA,#30H;0~9的转换OK:MOV@R0,A;存结果RETDLV:MOVR2,#10;1KHz持续时间DLV1:MOVR3,#200DLV2:CPLP1.0;输出1KHZ方波LCALLD025MSLCALLD025MS;2次调用0.25ms延时子程序DJNZR3,DLV2;持续0.1sDJNZR2,DLV1;持续1s例:已知单片机的晶振为12MHz,试用软件延时方法实现变频振荡报警。解:用P1.0端口输出1kHz和2kHz的变频信号报警,每隔1s交替变换一次。四、输入/输出类程序(I/O端口程序)MOVR2,#20;2KHz持续时间DLV3:MOVR3,#200DLV4:CPLP1.0;输出1KHZ方波LCALLD025MS;调用0.25ms延时子程序DJNZR3,DLV4;持续50msDJNZR2,DLV3;持续0.1sSJMPDLV;反复循环D025MS:MOVR7,#MTLOOP:NOPNOPDJNZR7,LOOPRETMT=62.5=3EH例:编写一个循环闪烁灯的程序:有8个LED,其中一个LED闪烁10次后,转移到下一个灯闪烁10次,循环不止。P1口输出为高电平时,LED灯亮,否则不亮MOVA,#01H;灯亮初值SHIFT:LCALLFLASH;调闪烁10次子程序RRA;右移一位SJMPSHIFT;循环FLASH:MOVR2,#10;闪烁10次FLASH1:MOVP1,A;点亮LCALLDELAY;延时MOVP1,#00H;熄灭LCALLDELAY;延时DJNZR2,FLASH1;循环RET练习:读程序,对源程序加以注释,写出程序功能,以图示意。ORG0000HMAIN:MOVDPTR,#TABMOVR1,#06HLP:CLRAMOVCA,@A+DPTRMOVP1,ALCALLDELAY1SINCDPTRDJNZR1,LPSJMPMAINTAB:DB01H,03H,02H,06H,04,05HDELAY1S:…………ENDP1.0P1.1P1.2P1.30234561将TAB表中的6个参数依次从P1口输出(每次输出延时1S)然后重复输出。课本100页:3,4,7,12要求:程序必须有必要的说明下周三交作业: