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足够

评论