双IO口流水灯(汇编)
org 0000h
ajmp start
start: mov dptr,#table ;数据表地址送入dptr
mov 30h,#16 ;30单元作为循环计数器
lop: mov a,#0 ;acc清零
movc a,@a+dptr ;查数据表中的值并送入a
mov p2,a ;查表结果(dw的前字节)送入P2口
inc dptr ;数据指针加1
mov a,#0 ;acc清零
movc a,@a+dptr ;查数据表中下个值送入a
mov P0,a ;查表结果(dw的后字节)送入P0口
inc dptr ;数据指针加1
lcall delay100ms ;延时100ms
djnz 30h,lop ;未到16次继续查表取值
ajmp start ;到了则重新循环
delay100ms: mov r5,#195 ;1+(1+2*255)*195+2*195=100.036ms@12M
temp: mov r6,#255 ;1+2*255
djnz r6,$
djnz r5,temp
ret
table: dw 0xfffe, 0xfffd, 0xfffb, 0xfff7 ;状态表
dw 0xffef, 0xffdf, 0xffbf, 0xff7f
dw 0x7fff, 0xbfff, 0xdfff, 0xefff
dw 0xf7ff, 0xfbff, 0xfdff, 0xfeff
end