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 D

74hc595要用四片 行列扫描 把两组(一组两片)的锁存脉冲接在一起。然后把第一片的Q7‘接入第二片的SDA。另外把每组SCK接在一起。十六位的移动是只 你往595里送个数据。那么595就会把最先送入的数据丢掉。然后整体

CHKSCO BIT P3.2 DAT1 EQU 50H ; 数据1 DAT2 EQU 51H ; 数据2 DA0: MOV A, DAT1 ACALL HC59500 ; 8位移位输出1 MOV A, DAT2 ACALL HC59500 ; 8位移

这是16X16的,自己一改就好了 //74HC595练习程序 //串入并出实现16流水灯效果 //2009.12.28 includereg52.h sbit shcp=P2^0; //数据在上升沿进入移位寄存器 sbit date1=P2^1; //串行数据输入端 sbit clock=P2^

;16*16点阵左移汇编程序 DS_595 EQU P1.5 ;串行数据输入(595-14)CH_595 EQU P1.7 ;移位时钟脉冲(595-11)CT_595 EQU P1.6 ;输出锁存器控制脉冲(595-12)G_595 EQU P1.4 ORG 0000H LJMP M

用2个138级联控制列,2个595,每个595控制2个8x8的点阵 我感觉这个程序就是最简单的滚动显示的程序 了 include sbit STR=P3^2; //锁存 sbit SRCLK=P3^3; //时钟 sbit SDI= P3^5;//16×16汉?

; * ATA89C52 12MHz晶振 ; * 2004.2.11 LRM ;;显示字用查表法,不占用内存,字符用16x16共阳LED点阵,;效果:向上滚动显示5个字,再重复循环。;R1:查表偏址寄存器,B:查表首址,R2:扫

本人用74HC595驱动(行列)LED点阵16*16,由于编程能力有限,求高手指点,发我调试程序即可 带汉字显示哦

20H-27H单元是存好的要显示的汉字,程序整体你应该明白,就光说说显示子程序部分哈 START: LCALL DISPLAY SJMP START DISPLAY: MOV R7,#8 ;R7预存 数“8”MOV R2,#11111110B ;R2用来列选 MOV R0,#20H

1、8*8双色点阵实际上是两个8*8点阵,必须增加一个端口来控制是使用哪个颜色的8*8点阵;或者连接成一个8*16点阵来控制。C语言代码和控制8*8点阵类似,增加扫描端口就可以了。2、例程:include unsigned

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(){uint num,temp,n,m;while(1){ for(n=0;n<112;n++)for(m=0;m<8;m++) //重复显示

P1=0xff;WL=0;while(1){ for(a=0;a<8;a++){ P0=table1[a];P1=table2[a];delay(2);} } }

这个程序验证过,你可以参考试试://---//8*8矩阵循环显示字符和数字//显示字符串在数组disstr[]中申明//---#include#include#define uchar unsigned char#define uint unsigned int//---uchar

回答:// 5*7(2)点阵 pzowen #include #include #include #include #include #include #include #include #

void main(){ unsigned char w,i;while(1){ //显示0 w=0x01; //行变量为第一行 for(i=0;i<8;i++){ P1=w;//行数据送P1口 P0=led0[i];delayms(1);//列数据送P0口 w<<=1;//向下移动一行 }

求一个8*8LED点阵汉字显示C语言程序(C52)

1、可以通过左移函数_crol_()和右移函数_cror_()来实现LED等的来回流动。2、具体实现方法可以参考如下程序:

if(led1==0xff)led1=0x7f;delay(100);case 2:P0=led3;led3=(led3<<1)|0x01;if((led3&0xf0)==0x30)led3=0x3e;if((led3&0xf0)==0x70)led3=0x7c;if((led3&0xf0)==0xf0)led3=0xf8;break;case

按行取模可以向上移动,按列取模才可以向左移动。以按列取模为例,每个字的字模表中第1,2字节送LED屏第一列显示,依次显其余15列。假如显示0.5秒(时间可以调),再取字模的第3,4字节,还送LED屏第一列显示,依此

MOV DPTR,#HZKE ;此处设定所要显示的字符 MOVC A,@A+DPTR CPL ACC ;代码取反,决定显示的阴阳 MOV DPTR,#CSr1 MOVX @DPTR,A MOV A,R5 RL ACC INC ACC MOV DPTR,#HZKE ;此处设定所要显示的字符 MOVC

怎样用C语言实现led点阵显示字符移动

第一步,先将Proteus运行起来,同样新建一个Arduino 328的项目,自己为项目取个名字,此处取名为LEDMatrix。第二步,要从元件库当中找到LED点阵,并添加到工作区。点击左侧“Component Mode”按钮——点击“P”按钮——在输入

1、并不是字真在移动,只是每次显示的图像不一样的,连续显示16次出来就是移动。比如上下移动,有个函数能显示一个字模数组。把“西”的整个字的字模放到这个数组显示的是西字,把“安”放进去就是安字。把西字16行的

这个程序可以循环显示0~9.#include#include#define uchar unsigned char#define uint unsigned intuchar code Table_of_Digits[]={0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //00x00,0x00

使用的单片机仿真试验仪型号为DP-51PRO以下的程序是在8x8led显示频上显示一个心形我需要将它移动起来CLKEQUP3.2DINAEQUP3.3DINBEQUP3.4CLEAREQUP3.5org0000hajmpmainorg0100hmain:mov 使用的单片机仿真试验仪型号为DP-51PRO以下的程序

for (int i = 0; i < 7; i++) { //依次点亮数字的7个LED digitalWrite(ledPins[i], numPins[num][i]); //控制LED引脚输出高低电平 } delay(1000); //延时1秒 } } 该程序利用数组存储数字09的LED点

include//单片机头文件 void delay1ms(unsigned int ms);//延时ms函数声明(可根据实际情况更改)unsigned char code led0[]={};//字码表,你自己把你要显示的字码放进去就可以了 void main(){ unsigned ch

include define uchar unsigned char define uint unsigned int define outdat P2 sbit ld=P3^0;sbit lw=P3^1;//数码管显示代码 unsigned char code tab[]={ 0x01,0x02,0x03,0x04,0xFF,0xFF,0xFF,

LED点阵程序

你的程序没有问题的,估计是,你的程序与你的开发板上74HC595的引脚不符吧。下图是根据你的程序画的仿真图,程序没有变,只是把显示的图形数据变了一下,显示出菱形。 u8 code duanled[]= { /*-- 调入了一幅图像:这是您新建的图像 --*/ /*-- 宽度x高度=8x8 --*/ 0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00 };
#include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char code image[11][8] = { {0xC3, 0x81, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3}, //数字0 {0xEF, 0xE7, 0xE3, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3}, //数字1 {0xC3, 0x81, 0x9D, 0x87, 0xC3, 0xF9, 0xC1, 0x81}, //数字2 {0xC3, 0x81, 0x9D, 0xC7, 0xC7, 0x9D, 0x81, 0xC3}, //数字3 {0xCF, 0xC7, 0xC3, 0xC9, 0xC9, 0x81, 0xCF, 0xCF}, //数字4 {0x81, 0xC1, 0xF9, 0xC3, 0x87, 0x9D, 0x81, 0xC3}, //数字5 {0xC3, 0x81, 0xF9, 0xC1, 0x81, 0x99, 0x81, 0xC3}, //数字6 {0x81, 0x81, 0x9F, 0xCF, 0xCF, 0xE7, 0xE7, 0xE7}, //数字7 {0xC3, 0x81, 0x99, 0xC3, 0xC3, 0x99, 0x81, 0xC3}, //数字8 {0xC3, 0x81, 0x99, 0x81, 0x83, 0x9F, 0x83, 0xC1}, //数字9 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //全亮 }; void main() { EA = 1; //使能总中断 ENLED = 0; //使能U4,选择LED点阵 ADDR3 = 0; TMOD = 0x01; //设置T0为模式1 TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms TL0 = 0x67; ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 while (1); } /* 定时器0中断服务函数 */ void InterruptTimer0() interrupt 1 { static unsigned char i = 0; //动态扫描的索引 static unsigned int tmr = 0; //1s软件定时器 static unsigned char index = 9; //图片刷新索引 TH0 = 0xFC; //重新加载初值 TL0 = 0x67; //以下代码完成LED点阵动态扫描刷新 P0 = 0xFF; //显示消隐 switch (i) { case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index][0]; break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index][1]; break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index][2]; break; case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index][3]; break; case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index][4]; break; case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index][5]; break; case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index][6]; break; case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index][7]; break; default: break; } //以下代码完成每秒改变一帧图像 tmr++; if (tmr >= 1000) //达到1000ms时改变一次图片索引 { tmr = 0; if (index == 0) //图片索引10~0循环 index = 10; else index--; } }
;FOR T598D ;*********LED 点阵显示示例程序*********************** CSLED EQU 8000H CSc1 EQU CSLED ;列1~8 273 CSc2 EQU CSLED+1H ;列9~16 273 CSr1 EQU CSLED+2H ;行1~8 374 CSr2 EQU CSLED+3H ;行9~16 374 ORG 0000H MOV SP,#60H INIT: MOV A,#0H ;关闭LED列显示 MOV DPTR,#CSc1 MOVX @DPTR,A MOV DPTR,#CSc2 MOVX @DPTR,A MOV A,#0FFH ;关闭LED行显示 MOV DPTR,#CSr1 MOVX @DPTR,A MOV DPTR,#CSr2 MOVX @DPTR,A D: MOV R5,#00H ;设定汉字表格初始值 MOV R4,#01H ;设定列扫描初始值,从第一列开始 DISP: MOV A,R5 RL ACC MOV DPTR,#HZKE ;此处设定所要显示的字符 MOVC A,@A+DPTR CPL ACC ;代码取反,决定显示的阴阳 MOV DPTR,#CSr1 MOVX @DPTR,A MOV A,R5 RL ACC INC ACC MOV DPTR,#HZKE ;此处设定所要显示的字符 MOVC A,@A+DPTR CPL ACC MOV DPTR,#CSr2 MOVX @DPTR,A MOV DPTR,#CSc1 MOV A,R4 MOVX @DPTR,A RL ACC MOV R4,ACC INC R5 LCALL DELAY MOV A,#00H ;清上次显示值 MOVX @DPTR,A ;关闭行、列 MOV A,#0FFH MOV DPTR,#CSR1 MOVX @DPTR,A CJNE R5,#8H,DISP ;判是否显示到第八列 MOV R5,#08H ;设定汉字表格初始值 MOV R4,#01H ;设定列扫描初始值,从第九列开始 DISP2: MOV A,R5 RL ACC MOV DPTR,#HZKE ;此处设定所要显示的字符 MOVC A,@A+DPTR CPL ACC MOV DPTR,#CSr1 MOVX @DPTR,A MOV A,R5 RL ACC INC ACC MOV DPTR,#HZKE ;此处设定所要显示的字符 MOVC A,@A+DPTR CPL ACC MOV DPTR,#CSr2 MOVX @DPTR,A MOV DPTR,#CSc2 MOV A,R4 MOVX @DPTR,A RL ACC MOV R4,ACC INC R5 LCALL DELAY MOV A,#00H ;清上次显示值 MOVX @DPTR,A ;关闭行、列 MOV A,#0FFH MOV DPTR,#CSR2 MOVX @DPTR,A CJNE R5,#10H,DISP2 ;判是否扫描到第十六列 SJMP D ;******** 延时子程序,协调字符显示速度 ************* DELAY: MOV R7,#1H DL1: MOV R6,#00H DL2: DJNZ R6,DL2 DJNZ R7,DL1 RET ;******** 字符点阵字库 *************** ; HZ16 字符编码排列 ; 数 D7 R1 (0 2 --28 30) ; | | ; | | ; 据 D0 R8 (1 3 --29 31) ; ;运行zimo.exe程序,在参数设置里选择“纵向取模”,16*16点阵,宋体、小四号(12) ;取模方式为A51格式 ;取完模之后,将16~32字节间隔插入1~15字节,详见下面示例字模。 ;***************************************************** ;ZIMO程序生成的字模 ;显示“爱迪克” ;HZAI: ; DB 00H,02H,4DH,69H,59H,49H, 6FH,59H, 0C9H,89H,99H,0E9H,89H,09H,0CH,00H ; DB 02H,04H,05H,09H,32H,0E2H,54H,54H, 48H, 58H,64H,44H, 02H,03H,02H,00H ;HZDI: ; DB 02H,82H,73H, 20H,00H,0FH, 09H,09H, 09H,0FFH,09H,09H,09H,0FH,00H,00H ; DB 02H,04H,0F8H,04H,02H,0FAH,12H,12H, 12H,0F2H,12H,12H,12H,0FAH,02H,00H ;HZKE: ; DB 0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;片 ; DB 0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0FFH ;****************************************************** ; 转换后的字模 HZAI: DB 00H,02H,02H,04H,4DH,05H,69H,09H,59H,32H,49H,0E2H,6FH,54H,59H,54H DB 0C9H,48H,89H,58H,99H,64H,0E9H,44H,89H,02H,09H,03H,0CH,02H,00H,00H HZDI:DB 02H,02H,82H,04H,73H,0F8H,20H,04H,00H,02H,0FH,0FAH,09H,12H,09H,12H DB 09H,12H,0FFH,0F2H,09H,12H,09H,12H,09H,12H,0FH,0FAH,00H,02H,00H,00H HZKE:DB 0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;片 DB 0EFH,0EFH,0EFH,0EFH,0E0H,00FH,0EFH,0EFH,0BFH,0EFH,07FH,0FFH,0DFH,0EFH,0DFH,0EFH ;**************************************************** END 这是程序请求帮忙修改
不知道你的硬件是什么结构,是好是发硬件图上来,要不怎么写程序
include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit rs=P3^5; sbit lcden=P3^4; uchar code table[]="2010-11-28 SUN"; uchar code table1[]=" 15:00:00"; uchar count,miao,shi,fen; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { rs=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar date) { rs=1; lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void write_sfm(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); } void init() { uchar num; dula=0; wela=0; lcden=0; write_com(0x38); write_com(0x06); write_com(0x0c); write_com(0x01); write_com(0x80); for(num=0;num<14;num++) { write_date(table[num]); delay(5); } write_com(0x80+0x40); for(num=0;num<10;num++) { write_date(table1[num]); delay(5); } TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void main() { init(); while(1) { if(count==20) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } write_sfm(2,shi); } write_sfm(5,fen); } write_sfm(8,miao); } } } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; }
用汇编语言完全可以实现。 第一步:先制作字库,少量汉字可以利用画笔工具,在画笔上写上16*16的汉字(最好是宋体),在放大功能下查看每个像素,黑色为1,白色为0,按照列或行依次读取。一个汉字的点阵用32个字节表示。 第二步:将上述汉字点阵制成表格,采用查表法获取需要显示的汉字点阵。 第三步:依据字库提取时的顺序,采用扫描驱动的方式依次在行和列上输出点阵。
这个图片会压小。看大图到这看 http://0e.images22.51img1.com/6000/kgd235143/e4be871c454f0c1d6f7f46b964dacee7.jpg 要仿真的话我发给你,当然实际电路要三极管驱动 #include #define uchar unsigned char uchar i,j,k=15; sbit xsi=P2^0; sbit xrck=P2^1; sbit xsck=P2^2; sbit ysi=P2^3; sbit yrck=P2^4; sbit ysck=P2^5; sbit kg= P3^2; uchar code zbm[][32]={ {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,}, {0xFF,0xFF,0xFF,0xF7,0xBF,0xF7,0xBF,0xFB,0xBF,0xFD,0x03,0xE0,0xFF,0xFF,0xFF,0xFF, 0x01,0xF0,0x7F,0xEF,0xBF,0xEF,0x9F,0xEF,0xDF,0xEF,0xFF,0xF1,0xFF,0xFF,0xFF,0xFF},/*"北",0*/ {0xF7,0xFF,0xF7,0xFF,0xF7,0xEF,0xF7,0xF3,0x37,0xFF,0xB7,0xFE,0xB6,0xDE,0xD5,0x80, 0xDB,0xFE,0x5B,0xFF,0x9B,0xFB,0xFB,0xF7,0xFB,0xE7,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF},/*"京",1*/ {0xFF,0xEF,0x5F,0xF7,0xDF,0xFA,0xEF,0xFD,0x0F,0xFA,0xFF,0xDF,0xBF,0xEF,0xC7,0xF3, 0x58,0xFC,0xEF,0xFB,0xAF,0xF7,0xCF,0xEF,0xEF,0xCF,0xFF,0xDF,0xFF,0xDF,0xFF,0xFF},/*"欢",2*/ {0xBF,0xF7,0xBF,0xF7,0xBB,0xF6,0x37,0xF1,0xFF,0xF7,0x07,0xF6,0xF7,0xF6,0x7B,0xF7, 0xF9,0xEF,0x0F,0xE8,0xF7,0xEF,0x77,0xCF,0x07,0xCF,0xFF,0xEF,0xFF,0xEF,0xFF,0xFF},/*"迎",3*/ {0xFF,0xFE,0x7F,0xFF,0xBF,0xFF,0x0F,0xC0,0xF1,0xFF,0xFF,0xF7,0xBF,0xF9,0xCF,0xEF, 0xD1,0xDF,0x5F,0xC0,0xEF,0xFF,0xAF,0xFD,0xCF,0xFB,0xFF,0xF3,0xFF,0xFF,0xFF,0xFF},/*"你",4*/ 0x87,0xFF,0x03,0xFF,0x01,0xFE,0x00,0xF8,0x01,0xF0,0x01,0xE0,0x03,0x80,0x07,0x00, 0x07,0x00,0x03,0x80,0x01,0xE0,0x01,0xF0,0x00,0xF8,0x01,0xFE,0x03,0xFF,0x87,0xFF,/*"心",5*/ {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,}, }; uchar code zbm1[][16]={ {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,}, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xC0,0x6F,0xDB,0x63,0xEB,0x6C,0xEB}, {0xEF,0xEF,0xEF,0xDF,0x0F,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*"自",0*/ {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3B,0xF0,0xBB,0xEF,0xBB,0xEF,0xBB,0xEF,0xDD,0xEF}, {0xCD,0xEF,0xF1,0xEF,0xFF,0xEF,0xFF,0xEF,0xFF,0xEF,0xFF,0xF1,0xFF,0xFF,0xFF,0xFF},/*"己",1*/ {0x7F,0xFF,0xBF,0xFF,0x0F,0xC0,0xD1,0xFF,0xDF,0xF1,0x01,0xF6,0xEF,0xF6,0xEF,0xE8}, {0x3F,0xF7,0xCF,0xFA,0xD1,0xFD,0x1F,0xFA,0xEF,0xE7,0xEF,0xEF,0xFF,0xEF,0xFF,0xFF},/*"做",2*/ {0xFF,0xFF,0x3F,0xF8,0x9F,0xE6,0xAF,0xF6,0xD3,0xF7,0x1F,0xE0,0x7F,0xFF,0xBF,0xFF}, {0x5F,0xFF,0xC7,0xFC,0xD9,0xEF,0xEF,0xDF,0x0F,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*"的",3*/ {0xFF,0xFF,0x3F,0xCF,0x3F,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*":",4*/ {0xF7,0xDF,0x07,0xC0,0xF7,0xDF,0xFF,0xDF,0xFF,0xDF,0xFF,0xDF,0xFF,0xCF,0xFF,0xFF},/*"L",0*/ {0xF7,0xDF,0x07,0xC0,0x77,0xDF,0x77,0xDF,0x17,0xDC,0xF7,0xDF,0xEF,0xE7,0xFF,0xFF},/*"E",1*/ {0xF7,0xDF,0x07,0xC0,0xF7,0xDF,0xF7,0xDF,0xF7,0xDF,0xEF,0xEF,0x1F,0xF0,0xFF,0xFF},/*"D",2*/ {0xFF,0xDF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFF,0x7F,0xF4,0x7F,0xED,0x81,0xFD,0xB7,0xFD}, {0xB7,0xF5,0xBB,0xED,0x3B,0xFE,0xFF,0xF7,0xFF,0xEF,0xFF,0xCF,0xFF,0xFF,0xFF,0xFF},/*"点",3*/ {0xFF,0xFF,0x03,0xE0,0xBB,0xFF,0x6D,0xFF,0x11,0xFB,0xFF,0xFB,0x37,0xFB,0x57,0xFB}, {0x67,0xFB,0x19,0x80,0xBB,0xFD,0xBB,0xFD,0xBF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFF},/*"阵",4*/ {0xFF,0xEF,0xFF,0xF7,0xFF,0xF9,0x7F,0xFE,0x81,0xBD,0x75,0xDD,0x65,0xE5,0x55,0xF8}, {0xB6,0xFD,0x9A,0xFD,0x28,0x80,0xBC,0xFE,0xBF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFF},/*"屏",5*/ {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,}, }; void ys (uchar a) //延时 { uchar b; for (;a>0;a--) for (b=100;b>0;b--) ; } void yfs() //Y轴发数 { ysck=0; yrck=0; k++; if (k==16) { k=0; ysi=0; } else ysi=1; ysck=1; P2=P2|0X14; //相当于 xrck=1; yrck=1; } void xfs(uchar a) //X轴发数 { uchar b,a1,a2; a1=~zbm[6][a*2+1]; a2=~zbm[6][a*2]; xsck=0; xrck=0; for (b=0;b<8;b++) { a1=a1<<1; xsi=CY; xsck=1; xsck=0; } for (b=0;b<8;b++) { a2=a2<<1; xsi=CY; xsck=1; xsck=0; } } void fs(uchar a) //X轴发数 { uchar b; xsck=0; xrck=0; for (b=0;b<8;b++) { a=a<<1; xsi=CY; xsck=1; xsck=0; } } void gdhs(uchar *zz,uchar N,uchar Time) //流动显示N个汉字 滚动函数 { //参数三个:字符串字模首地址、字数、显示流动速度 uchar FontNum,i,j,row; //循环变量,字数计数、16次流动、16列扫描 for(FontNum=0;FontNum<N;FontNum++) { for(i=0;i<16;i++) //字到字流动 16次左移才能完成 { for(j=0;j<Time;j++) //显示延迟,决定流动速度 { k=15; for(row=0;row<16;row++) //显示16*16屏幕一次 { yfs(); //选通显示列 //行选线,P3 低四位 fs (~*(zz+FontNum*32+(i+row)*2+1)); //以移动偏移为基础获取新数据 fs(~*(zz+FontNum*32+(i+row)*2)); //获取显示数据 循环显示关键算法 ys (12); //适当延时 } } } } } void wbzd () interrupt 0 //外部中断 { j++; if (j>1) j=0; ys(10); while (!kg) { k=15; for (i=0;i<16;i++) { yfs(); xfs(i); ys(10); } } if (j==0) gdhs(zbm,8,2); if (j==1) gdhs(zbm1,10,1); } void main () { EA = 1; //打开总中断 EX0=1; IT0=1; while (1) { if (j==0) gdhs(zbm,8,5); if (j==1) gdhs(zbm1,10,3); } }
74hc595要用四片 行列扫描 把两组(一组两片)的锁存脉冲接在一起。 然后把第一片的Q7‘接入第二片的SDA。另外把每组SCK接在一起。 十六位的移动是只 你往595里送个数据。那么595就会把最先送入的数据丢掉。然后整体向前移一位。 另外要注意。OE要接地。而且需要输出的时候锁存要产生一个上升。