;多字移動(dòng) ;一個(gè)字占32個(gè)字節(jié),1K可以存放1K=1024字節(jié)/32=32個(gè)字,C51=4K=128個(gè)字,C52=8K=256個(gè)字。 ;但程序占用160個(gè)字節(jié)(相當(dāng)于5個(gè)字的空間),最終可以顯示的字為C51=123個(gè)字,C52=251個(gè)字。 ;超過后單片機(jī)將存儲(chǔ)不下。 ORG 000H JMP MIAN ORG 030H MIAN:MOV P3,#00 ;關(guān)閉端口 MOV P1,#0FFH MOV P0,#00 MOV P2,#00 CALL DELAY ;延時(shí)1ms MOV R5,#2 ;移動(dòng)列的數(shù)量(列數(shù)乘2) MOV A,#151 ;顯示幾個(gè)字 MOV B,#32 ;一個(gè)字=32個(gè)碼 MUL AB MOV 22H,A ;存放1~8個(gè)字的數(shù)量 MOV 23H,B ;存放8的倍數(shù)個(gè)字的數(shù)量 ;如50個(gè)字:50×32=1600=0640H,則DPH處為06H=6,DPL處為40H=64 ;簡單算法:50÷8=6余2,6為DPH處數(shù),余的2×32=64為DPL數(shù) MOV DPTR,#TABLE1 ;賦查表初址 MOV R0,DPL ;保存DPTR初值,R0、R1記錄取碼進(jìn)度 MOV R1,DPH MOV 20H,DPL ;20H、21H保持DPTR初值不變 MOV 21H,DPH LOOP: MOV R7,#5 ;每屏停留時(shí)間 L1: MOV R6,#16 ;每屏16個(gè)碼 MOV R4,#00 ;掃描指針清零 MOV DPL,R0 ;取碼指針存入DPL MOV DPH,R1 L16: MOV A,R4 ;掃描指針存入A MOV P1,A ;掃描輸出 INC R4 ;掃描指針加1 CLR A ;A清零 MOVC A,@A+DPTR ;查表送A MOV P0,A ;送P0口顯示 INC DPTR ;取碼指針加1 CLR A ;A清零 MOVC A,@A+DPTR ;查表送A MOV P2,A ;送P2口顯示 INC DPTR ;取碼指針加1 CALL DELAY ;掃描延時(shí)1ms MOV P0,#00 ;清除屏幕 MOV P2,#00 DJNZ R6,L16 ;1屏是否完成? DJNZ R7,L1 ;每屏停留時(shí)間是否到了? ; MOV R0,DPL ;如字不需移動(dòng),用該指令 ; MOV R1,DPH MOV A,R0 ;如字需移動(dòng),用該指令 ADD A,R5 ;如大于256,C=1 MOV R0,A JNC DP INC R1 DP: MOV A,20H ;DPL初值 ADD A,22H ;如大于256,C=1。因DPL初值在90H以上,顯示4個(gè)字后DPH將加1,導(dǎo)致判斷失誤 MOV A,DPH SUBB A,21H ;已顯示字的數(shù)量(乘8) CJNE A,23H,LOOP ;DPH中的字是否完成? CLR C MOV A,DPL SUBB A,20H ;已顯示字的數(shù)量 CJNE A,22H,LOOP ;DPL中的字是否完成? JMP MIAN DELAY:MOV R2,#2 ;延時(shí)1ms D1 :MOV R3,#248 DJNZ R3,$ DJNZ R2,D1 RET TABLE1: ;至拾字時(shí)為100個(gè)字,共150個(gè)字,用于測(cè)試。 ;(a3b1H)(1)(8001) DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H DB 00H, 00H, 10H, 02H, 20H, 02H, 7fH,0feH DB 00H, 02H, 00H, 02H, 00H, 00H, 00H, 00H DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ... ... END |
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |