单片机汇编语言8乘8点阵从上到下显示修改成从左到右显示 50
单片机汇编语言8乘8点阵从上到下显示修改成从左到右显示;用8255的PA、PC口做LED8*8点阵显示实验A8255_PAXDATA0FF00H;8255的A0、A1接总...
单片机汇编语言8乘8点阵从上到下显示修改成从左到右显示;用8255的PA、PC口做LED8*8点阵显示实验
A8255_PAXDATA0FF00H;8255的A0、A1接总线的A0、A1
A8255_PBXDATA0FF01H
A8255_PCXDATA0FF02H
A8255_CTLXDATA0FF03H
ROWXDATAA8255_PA;列线
LINEXDATAA8255_PC;行线
ORG0000H
AJMPSTART
ORG0100H
START:MOVSP,#60H
CALLINIT_IO
CALLTEST_LED;调用测试子程序,测试LED是否全亮
CALLCLEAR
;滚动显示多个字符
CHS_SHOW:MOVR7,#12H;显示13H个字符
MOVDPTR,#CHAR_TAB
CHS_1:MOVR1,#8;移动16次
CHS_2:ACALLDISP_CH;显示一桢
INCDPTR
DJNZR1,CHS_2
DJNZR7,CHS_1
SJMPCHS_SHOW
;显示一个16*16点阵字子程序,字型码放在DPTR指出的地址,显示时间为20*R7MS
DISP_CH:PUSH07H
MOVR7,#10H;08H
DISP_CH_1:ACALLDISP1
DJNZR7,DISP_CH_1
POP07H
RET
;显示一个8*8点阵字子程序,字型码放在显示缓冲区XBUFF
DISP1:PUSHDPL
PUSHDPH
MOVR6,#8;计数器,8列依次被扫描
MOVR2,#7FH;FEH;列输出值
REPEAT:MOVP2,#HIGH(LINE)
MOVR0,#LOW(LINE)
MOVA,R2
MOVX@R0,A;列输出
CLRA
MOVCA,@A+DPTR
INCDPTR
ACALLADJUST;调整A,将A中二进制数旋转180度
MOVR0,#LOW(ROW)
MOVX@R0,A;左边行输出
ACALLDL10ms
ACALLCLEAR
SETBC;循环移位R2,行线扫描输出0
MOVA,R2
RRCA;RLCA
MOVR2,A
DJNZR6,REPEAT
POPDPH
POPDPL
RET
;8155和8255初始化
INIT_IO:MOVDPTR,#A8255_CTL;8255控制字地址
MOVA,#80H;设置8255的PA、PB、PC口为输出口
MOVX@DPTR,A;写控制字
RET
CLEAR:MOVA,#0FFH
MOVP2,#HIGH(LINE)
MOVR0,#LOW(LINE)
MOVX@R0,A
CLRA
MOVR0,#LOW(ROW)
MOVX@R0,A
RET
;调整A中取到的字型码的一个字节,将最高位调整位最低位,最低位调整为最高位
ADJUST:MOVR5,#8;循环移位8次实现
ADJUST1:RLCA
XCHA,B
RRCA
XCHA,B
DJNZR5,ADJUST1
MOVA,B
RET
;测试LED子程序,点亮LED并延时1S
TEST_LED:MOVDPTR,#LINE
CLRA
MOVX@DPTR,A
MOVDPTR,#ROW
MOVA,#0FFH
MOVR0,#LOW(ROW)
MOVX@R0,A;左边行输出
ACALLDL10ms
ACALLCLEAR
SETBC;循环移位R2,行线扫描输出0
MOVA,R2
RRCA;RLCA
MOVR2,A
DJNZR6,REPEAT
POPDPH
POPDPL
RET
;8155和8255初始化
INIT_IO:MOVDPTR,#A8255_CTL;8255控制字地址
MOVA,#80H;设置8255的P 展开
A8255_PAXDATA0FF00H;8255的A0、A1接总线的A0、A1
A8255_PBXDATA0FF01H
A8255_PCXDATA0FF02H
A8255_CTLXDATA0FF03H
ROWXDATAA8255_PA;列线
LINEXDATAA8255_PC;行线
ORG0000H
AJMPSTART
ORG0100H
START:MOVSP,#60H
CALLINIT_IO
CALLTEST_LED;调用测试子程序,测试LED是否全亮
CALLCLEAR
;滚动显示多个字符
CHS_SHOW:MOVR7,#12H;显示13H个字符
MOVDPTR,#CHAR_TAB
CHS_1:MOVR1,#8;移动16次
CHS_2:ACALLDISP_CH;显示一桢
INCDPTR
DJNZR1,CHS_2
DJNZR7,CHS_1
SJMPCHS_SHOW
;显示一个16*16点阵字子程序,字型码放在DPTR指出的地址,显示时间为20*R7MS
DISP_CH:PUSH07H
MOVR7,#10H;08H
DISP_CH_1:ACALLDISP1
DJNZR7,DISP_CH_1
POP07H
RET
;显示一个8*8点阵字子程序,字型码放在显示缓冲区XBUFF
DISP1:PUSHDPL
PUSHDPH
MOVR6,#8;计数器,8列依次被扫描
MOVR2,#7FH;FEH;列输出值
REPEAT:MOVP2,#HIGH(LINE)
MOVR0,#LOW(LINE)
MOVA,R2
MOVX@R0,A;列输出
CLRA
MOVCA,@A+DPTR
INCDPTR
ACALLADJUST;调整A,将A中二进制数旋转180度
MOVR0,#LOW(ROW)
MOVX@R0,A;左边行输出
ACALLDL10ms
ACALLCLEAR
SETBC;循环移位R2,行线扫描输出0
MOVA,R2
RRCA;RLCA
MOVR2,A
DJNZR6,REPEAT
POPDPH
POPDPL
RET
;8155和8255初始化
INIT_IO:MOVDPTR,#A8255_CTL;8255控制字地址
MOVA,#80H;设置8255的PA、PB、PC口为输出口
MOVX@DPTR,A;写控制字
RET
CLEAR:MOVA,#0FFH
MOVP2,#HIGH(LINE)
MOVR0,#LOW(LINE)
MOVX@R0,A
CLRA
MOVR0,#LOW(ROW)
MOVX@R0,A
RET
;调整A中取到的字型码的一个字节,将最高位调整位最低位,最低位调整为最高位
ADJUST:MOVR5,#8;循环移位8次实现
ADJUST1:RLCA
XCHA,B
RRCA
XCHA,B
DJNZR5,ADJUST1
MOVA,B
RET
;测试LED子程序,点亮LED并延时1S
TEST_LED:MOVDPTR,#LINE
CLRA
MOVX@DPTR,A
MOVDPTR,#ROW
MOVA,#0FFH
MOVR0,#LOW(ROW)
MOVX@R0,A;左边行输出
ACALLDL10ms
ACALLCLEAR
SETBC;循环移位R2,行线扫描输出0
MOVA,R2
RRCA;RLCA
MOVR2,A
DJNZR6,REPEAT
POPDPH
POPDPL
RET
;8155和8255初始化
INIT_IO:MOVDPTR,#A8255_CTL;8255控制字地址
MOVA,#80H;设置8255的P 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询