几个简单的汇编程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

流水灯程序ORG0JMPMAINORG0030HMAIN:MOVA,#0FEHLOOP:MOVP1,ARLACALLDELAYJMPLOOPDELAY:;延时子程序MOVR0,#0FFHMOVR1,#0FFHDLY_LP:NOPNOPDJNZR0,DLY_LPMOVR0,#0FFHDJNZR1,DLY_LPRETEND数码管流水程序A直接赋值org0jmpmainorg0030hmain:movp2,#00hmovp0,#3fhcallDELAYmovp2,#04hmovp0,#06hcallDELAYjmpmain;延时子程序DELAY:MOVR0,#0FFHMOVR1,#0FFHDLY_LP:NOPNOPDJNZR0,DLY_LPMOVR0,#0FFHDJNZR1,DLY_LPRETend数码管流水程序B查表org0jmpmainorg0030hmain:movdptr,#DIS_CODEloop:mova,#00hmovp2,#00hmovca,@a+dptrmovp0,acallDELAYmova,#01hmovp2,#04hmovca,@a+dptrmovp0,acallDELAYjmploopDIS_CODE:;共阴数码管段码表DB3FH,06H,5BH,4FH,66HDB6DH,7DH,07H,7FH,6FHDELAY:;延时子程序MOVR0,#0FFHMOVR1,#0FFHDLY_LP:NOPNOPDJNZR0,DLY_LPMOVR0,#0FFHDJNZR1,DLY_LPRETend数码管流水程序C子函数调用org0jmpmainorg0030hmain:movr3,#0loop:callBIT_INcallDAT_INincr3callDELAYcjner3,#8,loop1movr3,#0loop1:jmploopBIT_IN:movdptr,#BIT_CODEmova,r3movca,@a+dptrmovp2,aretDAT_IN:movdptr,#DAT_CODEmova,r3movca,@a+dptrmovp0,aretDAT_CODE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHBIT_CODE:DB00H,04H,08H,0CH,10H,14H,18H,1CH30秒倒计时org0main:movr3,#30a1:movr4,#50tt1:movdptr,#tabmova,r3movb,#10divabmovca,@a+dptrmovp0,asetbp2.5clrp2.6clrp2.7lcalldly_10msmova,bmovca,@a+dptrmovp0,aclrp2.5clrp2.6clrp2.7lcalldly_10msdjnzr4,tt1cplp1.0djnzr3,a1jmpmaintab:db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90hdly_10ms:MOVR5,#5d1:movr6,#4D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RET【例4-4】•有一巡回检测报警装置,需对16路(x)输入进行检测,每路有一个最大允许值(y),为双字节数。需根据测量的路数(x),查表找出对应该路的最大允许值(y),看输入值是否大于最大允许值,如果大于就报警。•取路数为x(0≤x≤15),y为最大允许值,放在表格中。设进入查表程序前,假设路数x已放于R2中,查表后该路的最大允许值y放于R3R4中。查表的程序如下:【例4-4】TB3:MOVA,R2ADDA,R2;(R2)*2→(A)MOVR3,A;保存指针ADDA,#6;加补偿偏移量MOVCA,@A+PC;查第一字节XCHA,R3;1ADDA,#3;2MOVCA,@A+PC;1,查第二字节MOVR4,A;1RET;1TAB3:DW1520,3721,42645,7580;DW05F0H,0E89H,A695H,1D9CHDW3483,32657,883,9943DW10000,40511,6758,8931DW4468,5871,13284,27808对于双字节数据来说,第n个数据的起始地址=表首地址+2n(n从0开始)绝对偏移量=补偿偏移量+相对偏移量地址数据数据00050高01F00低020E1高03891低04A62高05952低061D3高079C3低【例4-5】【例4-5】以AT89S51为核心的温度控制器,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D转换为10位二进制数。测得的不同温度下的电压值数据构成一个表,表中温度值为y(双字节无符号数),x(双字节无符号数)为电压值数据。设测得电压值x放入R2R3中,根据电压值x,查找对应的温度值y,仍放入R2R3中。参考程序:【例4-5】LTB2:MOVDPTR,#TAB2MOVA,R3;R3电压值低8位CLRCRLCA;A值乘以2MOVR3,AXCHA,R2;交换后A中电压高8位,R2低8位*2RLCA;A值乘以2,即高8位*2XCHR2,A;交换后A电压低8位*2,R2高8位*2ADDA,DPL;(R2R3)+(DPTR)→(DPTR)MOVDPL,AMOVA,DPHADDCA,R2MOVDPH,ACLRAMOVCA,@A+DPTR;查第一字节MOVR2,A;第一字节存入R2中CLRAINCDPTRMOVCA,@A+DPTR;查第二字节MOVR3,A;第二字节存入R3中RETTAB2:DW…,…,…;温度值表【例4-5】【例4-6】从50个字节的无序表中查找一个关键字“xxH”。ORG1000HMOV30H,#xxH;关键字xxH送30H单元MOVR1,#50;查找次数送R1MOVA,#14H;20D修正值送AMOVDPTR,#TAB4;表首地址送DPTR【例4-6】【例4-6】•LOOP:PUSHAcc•MOVCA,@A+PC;查表结果送A•CJNEA,30H,LOOP1;3(30H)不等于关键字则转LOOP1•MOVR2,DPH;2查到关键字,把地址送R2,R3•MOVR3,DPL;2•DONE:RET;1•LOOP1:POPAcc;2修正值弹出•INCA;1A+1→A•INCDPTR;1修改数据指针DPTR•DJNZR1,LOOP;2R1≠0,未查完,继续查找•MOVR2,#00H;2R1=0,R2和R3清0•MOVR3,#00H;2表中50个数已查完•AJMPDONE;2从子程序返回•TAB4:DB…,…,…;50个无序数据表【例4-7】片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存放首地址,R2中存放字节数,程序框图见图4-1。程序如下:MOVR2,#n;n为要比较的数据字节数MOVA,R0;存首地址指针MOVR1,ADECR2MOVA,@R1LOOP:MOVR3,ADECR1CLRCSUBBA,@R1;两个数比较JNCLOOP1;C=0,A中数大,跳LOOP1MOVA,@R1;C=1,则大数送ASJMPLOOP2LOOP1:MOVA,R3LOOP2:DJNZR2,LOOP;是否比较结束?MOV@R0,A;存最大数RET【例4-7】【例4-8】【例4-8】一批单字节无符号数,以R0为首地址指针,R2中为字节数,将这批数进行升序排列(冒泡法)。程序如下:SORT:MOVA,R0MOVR1,AMOVA,R2;字节数送入R5,字节数MOVR5,ACLRF0;互换标志位F0清0DECR5MOVA,@R1LOOP:MOVR3,AINCR1CLRCMOVA,@R1;比较大小【例4-8】SUBBA,R3JNCLOOP1SETBF0;互换标志位F0置1MOVA,R3;XCHA,@R1;两个数互换DECR1XCHA,@R1INCR1LOOP1:MOVA,@R1DJNZR5,LOOPJBF0,SORTRET【例4-9】【例4-9】求单字节有符号数的二进制补码(单分支)CMPT:JNBAcc.7,RETURN;(A)0,不需转换MOVC,Acc.7;符号位保存CPLA;(A)求反,加1ADDA,#1MOVAcc.7,C;符号位存在A的最高位RETURN:RET【例4-10】【例4-10】求符号函数的值。符号函数定义如下(多分支)X存放在40H单元,Y存放在41H单元Y=1X0X0X=00-1SIGNFUC:MOVA,40HCJNEA,#00H,NZEARAJMPNEGTNZEAR:JBAcc.7,POSIMOVA,#01HAJMPNEGTPOSI:MOVA,#81HNEGT:MOV41H,AEND【例4-6】【例4-6】【例4-6】【例4-6】

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功