- 顯示字用查表法,不占內存,用四個16*16共陽LED點陣顯示,
- ;效果:向上滾動顯示字,每次四個,重復循環。
- ;R2:行掃描地址(從00-0FH)。
- ;R3:滾動顯示時控制移動速度,也可控制靜止顯示的時間。
- ;************;
- ;中斷入口程序;
- ;************;
- ;
- ORG 0000H
- LJMP START
- ORG 0003H
- RETI
- ORG 000BH
- LJMP INTT0
- ORG 0013H
- RETI
- ORG 001BH
- RETI
- ORG 0023H
- RETI
- ORG 002BH
- RETI
- ;
- ;************;
- ; 初始化程序 ;
- ;************;
- ;
- ;
- ;************;
- ; 主程序 ;
- ;************;
- ;
- START: MOV 20H,#00H ;清標志,00H為1幀掃描結束標志
- MOV A,#0FFH ;端口初始化
- MOV P1,A
- MOV P2,A
- MOV P3,A
- MOV P0,A
- CLR P1.6 ;串行寄存器打入輸出端控制位
- MOV TMOD,#01H ;使用T0作16位定時器,行掃描用。
- MOV TH0,#0FCH ;1ms初值(12MHZ)
- MOV TL0,#18H
- MOV SCON,#00H ;串口0方式傳送顯示字節
- MOV IE,#82H ;T0中斷允許,總中斷允許
- MOV SP,#70H
- LCALL DIS1 ;顯示準備,黑屏,1.5秒
- MAIN: MOV DPTR,#TAB
- LCALL MOVDISP ;逐排顯示,每次四字)
- MOV DPTR,#TAB
- LCALL MOVDISP1 ;滾動顯示,每排四字)
- AJMP MAIN
- ;
- ;
- ;********************;
- ; 四字逐排顯示子程序 ;
- ;********************;
- ;每次四字移入移出顯示方式,入口時定義好DPTR值
- ;
- MOVDISP: MOV R1,#6 ;顯示6排字,每排四字(R1=排數)
- DISLOOP: MOV R3,#100 ;每排顯示時間1.6*100=1.6S
- DISMOV: MOV R2,#00H ;第0行開始
- SETB TR0 ;開掃描(每次一幀)
- WAITMOV: JBC 00H,DISMOV1 ;標志為1掃描一幀結束(16毫秒為1幀,每行1毫秒)
- AJMP WAITMOV
- DISMOV1: DJNZ R3,DISMOV ;1幀重復顯示(控制顯示時間)
- MOV A,#128 ;顯示字指針移一排(每排4字*32=128)
- ADD A,DPL ;
- MOV DPL,A
- MOV A,#0
- ADDC A,DPH
- MOV DPH,A
- DEC R1 ;R1為0,顯示完
- MOV A,R1
- JZ MOVOUT ;
- AJMP DISLOOP ;
- MOVOUT: RET ;移動顯示結束
- ;
- ;********************;
- ; 四字滾動顯示子程序 ;
- ;********************;
- ;每排四字向上移出顯示方式,入口時定義好DPTR值
- ;
- MOVDISP1: MOV R1,#255 ;向上移動顯示6排字,每排四字(R1=排數*16)
- DISLOOP1: MOV R3,#10 ;移動速度1.6*10=0.16S
- DISMOV2: MOV R2,#00H ;第0行開始
- SETB TR0 ;開掃描(每次一幀)
- WAITMOV1: JBC 00H,DISMOV3 ;標志為1掃描一幀結束(16毫秒為1幀,每行1毫秒)
- AJMP WAITMOV1
- DISMOV3: DJNZ R3,DISMOV2 ;1幀重復顯示(控制移動速度)
- INC DPTR ;顯示字指針移一行(二字節位置)
- INC DPTR
- DEC R1 ;R1為0,顯示完
- MOV A,R1
- JZ MOVOUT1 ;
- AJMP DISLOOP1 ;
- MOVOUT1: RET ;移動顯示結束
- ;
- ;
- ;*****************;
- ; 四個字顯示子程序 ;
- ;*****************;
- ;靜止顯示表中某四個字
- DIS1: MOV R3,#5AH ;靜止顯示時間控制(16MS*#=1.6秒)
- DIS11: MOV R2,#00H ;一幀掃描初始值(行地址從00-0FH)
- MOV DPTR,#TAB ;取表首址
- SETB TR0 ;開掃描(每次一幀)
- WAIT11: JBC 00H,DIS111 ;為1,掃描一幀結束
- AJMP WAIT11
- DIS111: DJNZ R3,DIS11
- RET
- ;
- ;
- ;************;
- ; 掃描程序 ;
- ;************;
- ;1MS傳送一行,每行顯示1毫秒,一次傳送四個字的某行共8個字節.
- ;
- INTT0: PUSH ACC
- MOV TH0,#0FCH ;1ms初值重裝
- MOV TL0,#18H
- MOV A,#97 ;指向第四個字行右字節
- ADD A,DPL
- MOV DPL,A
- MOV A,#0
- ADDC A,DPH
- MOV DPH,A
- MOV A,#0
- MOVC A,@A+DPTR ;查表
- MOV SBUF,A ;串口0方式發送
- WAIT: JBC TI,GO ;等待發送完畢
- AJMP WAIT ;
- GO: MOV A,DPL ;指向第四個字行左字節
- SUBB A,#1
- MOV DPL,A
- MOV A,DPH
- SUBB A,#0
- MOV DPH,A
- MOV A,#0
- MOVC A,@A+DPTR
- MOV SBUF,A
- WAIT1: JBC TI,GO1
- AJMP WAIT1
- ;
- GO1: MOV R0,#03H
- MLOOP: MOV A,DPL ;指向前三個字行右字節
- SUBB A,#31
- MOV DPL,A
- MOV A,DPH
- SUBB A,#0
- MOV DPH,A
- MOV A,#0
- MOVC A,@A+DPTR ;查表
- MOV SBUF,A ;串口0方式發送
- WAIT2: JBC TI,GO2 ;等待發送完畢
- AJMP WAIT2 ;
- GO2: MOV A,DPL ;指向前三個字行左字節
- SUBB A,#1
- MOV DPL,A
- MOV A,DPH
- SUBB A,#0
- MOV DPH,A
- MOV A,#0
- MOVC A,@A+DPTR
- MOV SBUF,A
- WAIT3: JBC TI,GO3
- AJMP WAIT3
- GO3: DJNZ R0,MLOOP ;執行三次
- ;
- ;
- SETB P1.7 ;關行顯示,準備涮新
- NOP ;串口寄存器數據穩定
- SETB P1.6 ;產生上升沿,行數據打入輸出端
- NOP ;
- NOP ;
- CLR P1.6 ;恢復低電平
- MOV A,R2 ;修改顯示行地址
- ORL A,#0F0H ;修改顯示行地址
- MOV R2,A ;修改顯示行地址
- MOV A,P1 ;修改顯示行地址
- ORL A,#0FH ;修改顯示行地址
- ANL A,R2 ;修改顯示行地址
- MOV P1,A ;修改完成
- CLR P1.7 ;開行顯示
- INC R2 ;下一行掃描地址值
- INC DPTR ;
- INC DPTR ;下一行數據地址
- MOV A,R2
- ANL A,#0FH
- JNZ GO4
- SETB 00H ;R2為10H,現為末行掃描,置1幀結束標志
- MOV A,DPL ;指針修正為原幀初值
- SUBB A,#32
- MOV DPL,A
- MOV A,DPH
- SUBB A,#0
- MOV DPH,A
- CLR TR0 ;一幀掃描完,關掃描
- GO4: POP ACC
- RETI ;退出
- ;
- ;
- ;***************;
- ; 掃描文字表 ;
- ;***************;
- ; 共五排字,每排四個字,前后為黑屏
- TAB: DB ;黑屏
- ;黑屏
- ;黑屏
復制代碼
|