SH_CP EQU P2.0;
DS0 EQU P2.1;
ST_CP EQU P2.2;
ORG 00H
AJMP MAIN
ORG 30H
MAIN:
MOV R0,#8
MOV R4,#50 ;
MOV DPTR,#TAB
MOV R3,#80
MAIN1:
MOV A,R2
INC A ;先送下半列
MOVC A,@A+DPTR
ACALL WB
INC R2
MOV A,R2
DEC A ;后送上半列
MOVC A,@A+DPTR
ACALL WB
INC R2
MOV P1,R1
SETB ST_CP
CLR ST_CP
INC R1
CJNE R1,#16,MAIN1
MOV R1,#0
CJNE R2,#32,MAIN1
MOV R2,#0
DJNZ R4,MAIN1
MOV R4,#50;50次
INC DPTR
INC DPTR
DJNZ R3,MAIN1
AJMP MAIN
WB:
CLR C
RRC A
MOV DS0,C
SETB SH_CP
CLR SH_CP
DJNZ R0,WB
MOV R0,#8
RET
TAB: 阴码 逐列 顺向
DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H
DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H;" ",0
DB 000H, 000H, 030H, 004H, 036H, 00EH, 037H, 03CH, 031H, 0F0H, 03FH, 0E0H, 03EH, 03AH, 000H, 013H
DB 00EH, 007H, 0FFH, 00EH, 0F8H, 01CH, 01BH, 0F8H, 01BH, 0F0H, 018H, 01CH, 01EH, 00EH, 01EH, 007H;"欢",1
DB 000H, 000H, 003H, 002H, 073H, 007H, 073H, 0FEH, 003H, 0FCH, 000H, 006H, 03FH, 0F3H, 03FH, 0F3H
DB 060H, 033H, 060H, 063H, 000H, 003H, 07FH, 0FFH, 07FH, 0FFH, 060H, 063H, 07FH, 0E3H, 07FH, 0E3H;"迎",2
DB 000H, 000H, 003H, 002H, 003H, 003H, 003H, 007H, 033H, 00EH, 03FH, 01CH, 00FH, 0F8H, 003H, 0F0H
DB 0FFH, 000H, 0FFH, 000H, 003H, 0FEH, 003H, 0FFH, 00FH, 003H, 03FH, 003H, 033H, 003H, 003H, 00FH;"光",3
DB 000H, 000H, 03FH, 0FCH, 03FH, 0FCH, 000H, 000H, 0FFH, 0FFH, 0FFH, 0FFH, 000H, 000H, 00CH, 000H
DB 01EH, 0FFH, 0F8H, 0FFH, 0F0H, 0C6H, 036H, 0FEH, 036H, 0FEH, 030H, 0C6H, 030H, 0FFH, 030H, 0FFH;"临",4
2012 06 29 更新
;2012 06 29
SH_CP EQU P2.0;
DS0 EQU P2.1;
ST_CP EQU P2.2;
ORG 00H
AJMP MAIN
ORG 30H
MAIN:
MOV P1,#00H
MOV R0,#8
MOV R4,#50 ; 每屏反复显示50次
MOV DPTR,#TAB
MOV R3,#80 ;含空格字符共80列
MAIN1:
MOV A,R2
MOVC A,@A+DPTR
ACALL WB
INC R2
MOV A,R2
MOVC A,@A+DPTR
ACALL WB
JB F0,MAIN2
INC R2
MOV P1,R1
SETB P1.6 ;U2使能
SETB ST_CP
CLR ST_CP
INC R1
CJNE R1,#8,MAIN1
MOV R1,#0
SETB F0
AJMP MAIN1
MAIN2:
INC R2
MOV A,R1
RL A
RL A
RL A
MOV P1,A ;A里的数左移3 次,即R1之0~7,送P1.3~P1.5输出
SETB P1.7 ;U3使能
SETB ST_CP
CLR ST_CP
INC R1
CJNE R1,#8,MAIN1
MOV R1,#0
CLR F0
CJNE R2,#32,MAIN1
MOV R2,#0
DJNZ R4,MAIN1
MOV R4,#50;50次
INC DPTR
INC DPTR
DJNZ R3,MAIN1
AJMP MAIN
WB:
CLR C
RRC A
MOV DS0,C
SETB SH_CP
CLR SH_CP
DJNZ R0,WB
MOV R0,#8
RET
TAB: ;黑体 逐列 顺向 阴码
DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H
DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H;" ",0
DB 000H, 000H, 030H, 004H, 036H, 00EH, 037H, 03CH, 031H, 0F0H, 03FH, 0E0H, 03EH, 03AH, 000H, 013H
DB 00EH, 007H, 0FFH, 00EH, 0F8H, 01CH, 01BH, 0F8H, 01BH, 0F0H, 018H, 01CH, 01EH, 00EH, 01EH, 007H;"欢",1
DB 000H, 000H, 003H, 002H, 073H, 007H, 073H, 0FEH, 003H, 0FCH, 000H, 006H, 03FH, 0F3H, 03FH, 0F3H
DB 060H, 033H, 060H, 063H, 000H, 003H, 07FH, 0FFH, 07FH, 0FFH, 060H, 063H, 07FH, 0E3H, 07FH, 0E3H;"迎",2
DB 000H, 000H, 003H, 002H, 003H, 003H, 003H, 007H, 033H, 00EH, 03FH, 01CH, 00FH, 0F8H, 003H, 0F0H
DB 0FFH, 000H, 0FFH, 000H, 003H, 0FEH, 003H, 0FFH, 00FH, 003H, 03FH, 003H, 033H, 003H, 003H, 00FH;"光",3
DB 000H, 000H, 03FH, 0FCH, 03FH, 0FCH, 000H, 000H, 0FFH, 0FFH, 0FFH, 0FFH, 000H, 000H, 00CH, 000H
DB 01EH, 0FFH, 0F8H, 0FFH, 0F0H, 0C6H, 036H, 0FEH, 036H, 0FEH, 030H, 0C6H, 030H, 0FFH, 030H, 0FFH;"临",4
END
2012 07 10 更新 仍用汇编所用的上图
//16x16 2个138,2个595 控制LED点阵 流动显示 欢迎光临
//2012 07 10 E:\DPJ_C\点阵DIY\4X8X8\16X16_138595\16X16_138595.c
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
bit flag;
sbit SH_CP=P2^0;
sbit DS=P2^1;
sbit ST_CP=P2^2;
sbit U2E1=P1^6;
sbit U3E1=P1^7;
uchar code tab[ ]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x30,0x04,0x36,0x0E,0x37,0x3C,0x31,0xF0,0x3F,0xE0,0x3E,0x3A,0x00,0x13,
0x0E,0x07,0xFF,0x0E,0xF8,0x1C,0x1B,0xF8,0x1B,0xF0,0x18,0x1C,0x1E,0x0E,0x1E,0x07,/*"欢",1*/
0x00,0x00,0x03,0x02,0x73,0x07,0x73,0xFE,0x03,0xFC,0x00,0x06,0x3F,0xF3,0x3F,0xF3,
0x60,0x33,0x60,0x63,0x00,0x03,0x7F,0xFF,0x7F,0xFF,0x60,0x63,0x7F,0xE3,0x7F,0xE3,/*"迎",2*/
0x00,0x00,0x03,0x02,0x03,0x03,0x03,0x07,0x33,0x0E,0x3F,0x1C,0x0F,0xF8,0x03,0xF0,
0xFF,0x00,0xFF,0x00,0x03,0xFE,0x03,0xFF,0x0F,0x03,0x3F,0x03,0x33,0x03,0x03,0x0F,/*"光",3*/
0x00,0x00,0x3F,0xFC,0x3F,0xFC,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x0C,0x00,
0x1E,0xFF,0xF8,0xFF,0xF0,0xC6,0x36,0xFE,0x36,0xFE,0x30,0xC6,0x30,0xFF,0x30,0xFF,/*"临",4*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",5*/
};
//顺向、逐列、阴码 黑体 字宽16 字高17 MATRIX-8X8-GREEN 左旋90度 左右翻转
// MATRIX-8X8-RED 右旋90度 上下翻转
void delay_ms(unsigned int ms)
{
uchar j;
while(ms--)
for(j=0;j<123;j++);
}
void WriteByte(uchar dat)
{
uchar k;
for(k=0;k<8;k++)
{
dat=dat>>1;
DS=CY;
SH_CP=0;
SH_CP=1;
}
}
void main()
{
uchar num,temp,n,m,k;
while(1)
{ P1=0;
for(k=0;k<5;k++) //含空格,5个字符。
for(n=0;n<16;n++) //每字16行
for(m=0;m<4;m++) //重复显示4次
{
for(num=n;num<16+n;num++)
{
WriteByte(tab[2*num+(k*32)+0]);
WriteByte(tab[2*num+(k*32)+1]);
ST_CP=0;
ST_CP=1;
if(flag==0)
{
P1=temp;
U2E1=1;
delay_ms(1);
P1=0; //关显示,消隐
temp++;
}
else
{
P1=_crol_(temp,3);
U3E1=1;
delay_ms(1);
P1=0; //关显示,消隐
temp++;
}
delay_ms(1);
if(temp==8)
{
flag=!flag;
temp=0;
}
}
}
}
}
关于增加流动显示字数的补充 2012 10 31 更新
例子中为5 字符左流动,按程序中MOV R3,#80 ;R3存放的是总列数,亦即显示的总屏数。如果R3初为0则最大值256,可以显示16个字符。
但可再设一个R5,就可 16X16=256个数了。
比如上例中,显示“ 欢迎光临”,如果再加上0~9及A~Z共41个字符,可以这样:
......
MAIN:
MOV R0,#8
MOV R4,#50;
MOV DPTR,#TAB
MOV R3,#16 ;16列
MOV R5,#41 ;41个字符
MAIN1:
.....
INC DPTR
INC DPTR
DJNZ R5,MAIN1;这里加一条
MOV R5,#41
DJNZ R3,MAIN1 ;共显示16X41屏
AJMP MAIN;
WB:
......
同理,可再嵌套循环,显示的字数可以更多,只要单片机的ROM足够
评论