p1口八个灯作跑马灯。org0000hajmpstartorg0030hstart:mova,#0ffh;clrc;movr2,#08h;循环八次。loop:rlca;带进位左移。movp1,a;输出到P1口。calldelay;延时一段时间djnzr2,loop;反复循环movr2,#07h;再往回循环。loop1:rrca;带进位右移movp1,a;输出到P1口。calldelay;延时一段时间djnzr2,loop1;反复循环jmpstart;重新开始delay:movr3,#20;延时子程序d1:movr4,#20d2:movr5,#248djnzr5,$djnzr4,d2中断控制的P1.1小灯。org0000hajmpmainorg000bhajmpint_timer0org0030hmain:movtmod,#01h;设置定时器工作方式寄存器。movth0,#high(65536-50000);movtl0,#low(65536-50000);设50MS初始值。movie,#82h;设置中断允许寄存器mov30h,#10;mov31h,#6;30H和31H是两个软件计数器。setbtr0;启动定时ajmp$;原地踏步int_timer0:;定时器0中断服务程序。movth0,#high(65536-50000);movtl0,#low(65536-50000);重设50MS定时。djnz30h,l1;mov30h,#10;djnz31h,l1;mov31h,#6;软件计数cplp1.1;10*6*50MS=3000MS时间到,P1.1取反l1:reti;中断返回end一位计数器,按p3.2数码管加1,到9后回0loop:mov30h,#0ffh;30h送ff即-1main:INC30Hmova,30hsetbp3.2;把键盘口送高电平mm:jnbp3.2,tt;如果p3.2按下则执行ttljmpmm;如果没有按下则反复监测键盘tt:MOVDPTR,#TABMOVCA,@A+DPTRCLRP2.6;开数码管MOVP0,A;送显示lcalldelay;延时一段时间cjnea,#60h,main;如果是最后一个数据重新开始ljmploop;否则30H清除retTAB:DB28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60HDELAY:;延时程序MOVR7,#255D1:MOVR6,#255D2:DJNZR6,D2DJNZR7,D1RETend