P0=j;delay(1);P0=0;P3=0x7f;P0=k;delay(1);} } delay() 多少自己调整,使显示不闪烁,这是动态扫描显示 移动速度调整y循环的次数。动态扫描一般是用定时中断来做的,你这个程序简单这样凑合着用也行。

x=0;x<=148;x++);} / 名称 : Main()功能 : 主函数 输入 : 无 输出 : 无 / void main(){ int i;while(1){ for(i=0;i<8;i++){ P0=0;P2=tabP2[i];P0=tabP0[i];Delay_1ms(2);} } }

{ for(i=0;i<8;i++){ Ser_IN(a[i]);//8X8点阵列扫描 Ser_IN(b[i]);//8X8点阵行扫描 Par_OUT();//74HC595输出显示 } i=0;} } 程序里面还要包含"74HC595.H"把它放在工程文件夹里面就可以了。"74HC595.

你好:在void set(void)里少了P2的设置.在下面的循环中,n=0和n=7时,显示相同,所以 点阵第一行总是不对,可能同第8行相同.可在n=7后加延时,以错开循环到n=0时,P2,P1的值.for(n = 0; n < 8; n++){ P2=

include include define uchar unsigned char sbit B0=P1^0;sbit B1=P1^1;sbit B2=P1^2;sbit B3=P1^3;uchar table[31]={0,10,20};uchar count;uchar way;uchar T;int tt;uchar flag,fl

1.首先在Proteus下选择我们需要的元件,AT89C51、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-GREEN,MATRIX-8*8-BLUE,MATRIX-8*8-ORANGE ,MATRIX-

单片机 8*8点阵C51程序

单片机在通过点阵显示汉字的时候,需要用到如下技术手段:1、汉字取模 汉字取模,即把汉字对应16x16点阵的图形用16进制数来描述,形成可以用于驱动显示的数据。例如下图,的汉字“中”该字的16x16点阵图形中,每行有16个

行驱动电路: 单片机P1口低4位输出的行号经4/16线译码器4515译码后生成1 6条行选通信号线,再经过驱动器驱动对应的行线。一条行线上要带动16列的LED进行显示,按每一LED器件20 mA电流计算,16个LED同时发光时,需要320 mA电流,选用

//这是16*16点阵 显示一个字的代码。。。 临时写的。。。include include define IOdata //数据口定义 define uchar unsigned char sbit row0 //0行 定义 sbit row1 //1行 定义 sbit c

include"at89x51.h"unsigned char code led[]={0x10,0x04,0x10,0x03,0xD0,0x00,0xFF,0xFF,0x90,0x00,0x18,0x1D,0xF7,0x13,0x14,0x11,0x54,0x15,0x94,0x19,0x14,0x51,0x14,0x91,0xF6,0x7F,0x04,

include unsigned int code hang[][32]={/*电 CB5E7 */ 0x01,0x80,0x01,0x80,0x01,0x80,0x3F,0xFC,0x31,0x8C,0x31,0x8C,0x3F,0xFC,0x31,0x8C, 0x31,0x8C,0x31,0x8C,0x3F,0xFC,0

51单片机用汇编语言驱动16*16点阵显示“机电工程系”汉字

多建一个缓冲区,将移位的数据从缓冲区读出加入到显示字符的最后一位,前面的数据移动一位,移动那一位数据加在前一位数据的最后一位。缓冲区的数据移完后再加入,一般是8位的数据。也就是说移8次加载一次数据到缓冲区

uchar DisBuff[7];uchar code numtab1[]={ //字序已更改,num*2 num*2+1 这更要注意了,为了方便一般把字序改动了 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF

你这个单片机是带I2C接口的 那个SMBus就是,我用这个系列的单片机写过,模拟的还没有借口直接来的好。 我的空间里面有我调好的一篇247519442 你说的全部是0xff也是正常的,因为外部存储一般都是高电平为空,也就是说你的

首先,从Proteus元件库中找到“MATRIX-8X8-RED”元器件,并将四块该元器件放入Proteus文档区编辑窗口中。此时需要注意,如果该元器件保持初始的位置(没有转动方向),我们要首先将其左转90°,使其水平放置,那么此时它的左面

单片机16*16LED点阵怎样让文字从上到下显示出来 求程序

void main(){ uchar a,temp;temp=0xfe;for (a=8;a>0;a--)//循环8次,即流水灯8个循环8次即可点亮8个 { P1=temp;temp=_crol_(temp,1);//移动 delay(100);} temp=0x7f;//注意这一句,如果没有这一句,

3 当软件计数器减到0时,表示0.5秒时间到 这时可以判断开关状态 开关合上 可以让8个LED左移一位 开关断开 可以让8个LED右移一位 呵呵 按上诉算法 编写程序 就可以实现你的要求(指导可以见百度知道的消息

void delay1(void){ unsigned char i,j,k;for(k=8;k>0;k--)for(i=10;i>0;i--)for(j=15;j>0;j--);} main(){ unsigned int i;while(1){ for(i=0;i<8;i++){ P2=taba[i];P0=tabb[i];dela

在8X8 LED 点阵上显示柱形,让其先从左到右平滑移动1次,其次从右到左 平滑移动1次,再次从上到下平滑移动1次,最后从下到上平滑移动次,如此循环下去。LED显示原理:显示某一个点时,列值设为1,行值设为0即可

//定义一个无符号字符型局部变量 i 取值范围 0~255 Delay(50000); P1=0xfe;      //赋初始值 for(i=0;i8;i++)  //加入 for循环,表明for循环大括号中的程序循环执行8次

当实现循环左移时,将a[i+1]的值赋给a[i];将a[0]赋给a[7];当然说的不大清楚 给你个例子:define LEDPORT P1 unsigned char a[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};unsigned char i =

单片机程序8x8led点阵显示心形并实现左移右移的程序

MOV B, P2 ;再读 CJNE A, B, LOOP ;消抖 MOV SBUF, A ;向串口发送 MOV P1, A ;在本机显示 JNB TI,CLR TI SJMP LOOP ;--- UART_INT:PUSH ACC JB TI, U_EXIT CLR

;10.12.29 外部中断1按键按下,P1流水灯(跑马灯),P2鸳鸯戏水灯(交叉点亮)ORG 00H AJMP MAIN ORG 03H AJMP EX0INT ORG 0030H MAIN: MOV SP,#60H SETB EA SETB EX0 SETB IT0 MOV R0,#8 JNB F0,MOV A

循环点亮LED灯,也就是流水灯效果的控制,可以用定时器来控制,这样做相对代码量较少而时间比较精确,外部中断0接以按键,可以控制动态效果的启停。程序如下:ORG 0000H LJMP MAIN ORG 0003H LJMP EXT0 ;外部中断0,

也可以作为两个独立的8位寄存器来使用LED显示屏的基本工作原理是动态扫描。显示控制的过程是先从数据存储器读得字模数据,再通过单片机的串行口或并行口将数据写给LED点阵片,然后再行扫描。动态扫描方案和静态显示方案相比节省

如何用汇编写LED显示屏的读程序?

每屏显示时,列控制码左(右)移,就可实现点阵屏左(右)移动。 以显示“ | ” 从右向左移为例,第1 屏,右边第1 列亮1ms后灭,第2 屏,第2 列亮。。。。8 屏显示后,完成“| ”左移。
#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--; } }
很简单/*16*16点阵屏的显示*/ #include #include #define DATAOUT P2 //指定P2口做为输出 sbit DATA=DATAOUT^0; //列数据输出位 sbit SCLH=DATAOUT^1; //列扫描时钟位 sbit SCLT=DATAOUT^2; //列数据锁存位 sbit AB=DATAOUT^4; //行数据输出位 sbit SCK=DATAOUT^5; //行扫描时钟位 unsigned char lhj[32];//32字节RAM做为16*16点阵屏显示缓存 void display();//做为点阵扫描函数,将显示缓存的数据输出到点阵屏 void displayS(unsigned int timer);//指定时间扫描显示 void displaymove(unsigned char *lp,unsigned char c,unsigned char timer);//显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数, //timer是移动的速度 void displaymovetb(unsigned char din,unsigned char *lp,unsigned char timer); //上下移动内容,din:1为向下,0为向上,lp指向要移入的内容,timer为移动速度 void delay(unsigned int a);//延时子函数 code unsigned char lin[32]={0x04,0x20,0x04,0x20,0xff,0xfe,0x04,0x20,//汉字"英"的点阵数据。汉字点阵数据,可用汉字库点阵生成软件获得 0x01,0x00,0x1f,0xf0,0x11,0x10,0x11,0x10, 0x11,0x10,0xff,0xfe,0x01,0x00,0x02,0x80, 0x04,0x40,0x08,0x30,0x10,0x1c,0x20,0x08}; code unsigned char yang[32]={//达 0x00,0x00,0x40,0x80,0x30,0x80,0x10,0x80, 0x0f,0xfc,0x00,0x80,0x00,0x80,0xe0,0x80, 0x21,0x40,0x21,0x20,0x22,0x18,0x24,0x0c, 0x28,0x08,0x50,0x02,0x8f,0xfc,0x00,0x00}; code unsigned char dian[32]={//通 0x40,0x00,0x27,0xf8,0x20,0x90,0x00,0x60, 0x07,0xf8,0x04,0x48,0xe7,0xf8,0x24,0x48, 0x24,0x48,0x27,0xf8,0x24,0x48,0x24,0x68, 0x24,0x50,0x50,0x00,0x8f,0xfe,0x00,0x00}; code unsigned char zi[32]={//讯 0x40,0x00,0x27,0xf8,0x31,0x08,0x21,0x08, 0x01,0x08,0xf1,0x08,0x17,0xe8,0x11,0x08, 0x11,0x08,0x11,0x08,0x11,0x08,0x11,0x0a, 0x15,0x0a,0x19,0x0a,0x11,0x04,0x00,0x00}; code unsigned char LY[32]={//图案数据 0x00,0x00,0x30,0x00,0x30,0x20,0x30,0x30, 0x30,0x18,0x30,0x0C,0x30,0x06,0x3F,0x7F, 0x3F,0x7F,0x00,0x06,0x00,0x0C,0x00,0x18, 0x00,0x30,0x00,0x20,0x00,0x00,0x00,0x00}; void main(void) //主入口函数 { unsigned char i=0,j=0; for(i=0;i<32;i++) lhj[i]=LY[i];//将图案数据复制到显示缓存 while(1){ displayS(2); //显示图案约2秒 displaymove(lin,4,7);//将从"英"开始的四个汉字从右向左移动 displayS(1); //等持约1秒 displaymovetb(1,0,10); //将点阵上显示的内容向下以10的速度移出,补上0,即清空显示屏 displayS(1); //等待1秒 displaymovetb(0,lin,10); //达"达"字以10的速度向上移动 displaymovetb(0,yang,10); //将"通"字以10的速度向上移动 displaymovetb(0,dian,10); //将"讯"字以10的速度向上移动 displaymovetb(0,zi,10); //将"子"字以10的速度向上移动 displaymovetb(0,0,10); //以10的速度向上清空 displayS(1); //等待1秒 displaymovetb(1,LY,10); //将"图案"以10的速度向下移动 } } void display()//显示 { unsigned char i,ia,j,tmp; //定义变量 DATAOUT=0XFF; //置位高电平做准备 AB=0; //将行数据位清0,准备移位 for(i=0;i<16;i++){ //循环输出16行数据 SCK=0; //为行移位做准备 SCLT=0; //为列锁存做准备 for(ia=2;ia>0;){ //每行16个点,循环位移两个字节 ia--; //循环两次 tmp=~lhj[i*2+ia]; //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成, //电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据 for(j=0;j<8;j++){ //循环两次,每次移一个字节, SCLH=0; //为列移位做准备 DATA=tmp&0x01; //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位 tmp>>=1; //将数据缓冲右移一位,为下次输出做准备 SCLH=1; //将DATA上的数据移入寄存器 } //移入单字节结束 } //移入两个字节结束 DATAOUT|=0X24; //此句可以用以下两句来理解,如果不将两句合为一句,将出现拖影现像 //SCK=1; //SCK拉高,行数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳) //SCLT=1; //SCLT拉高,将数据锁存输出到相应列的点阵发光管显示,显示一行后将保持到下一行显示开始 AB=1; //行数据位只在第一行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始一直移位最后一位, //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱 } j=64; while(j--); //每一行的显示,保持了两字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度 SCK=0; // SCK=1; //将最后一行数据移出 } void displayS(unsigned int timer) //指定时间扫描显示 { unsigned char i; while(timer--){ //当timer=1时,大约1秒时间 i=130; while(i--) display(); } } void displaymove(unsigned char *lp,unsigned char c,unsigned char timer)//显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数, //timer是移动的速度 { unsigned char i=0,j=0,ia=0; unsigned int tmp=0,timerc=0; unsigned char tmp2[16]; c*=2; //因一个汉字由32字节组成,而移位显示,要分开半个汉字16字节处理,因此将这里乘以2 for(i=0;i<16;i++) tmp2[1]=0; //将缓冲区清0, while(c){ //循环处理 if(lp!=0){ //当lp指向的地址为0时,直接用组缓冲0补上,效果是将当前显示的内容移出 tmp=c%2; //取余,目的是为了判断处理汉字的前半部份还是后半部份 for(i=0;i<16;i++){ tmp2[i]=lp[i*2+tmp]; //取半个汉字点阵数据,16字节 } if(tmp) //当tmp为1时,表时一个字数组处理完成,将地址转到下一个字 lp+=32; } //-------------- tmp=8; //变量再次利用 while(tmp){ //循环8次,是将下一个字的前半部份的字节数据移入显示缓冲 ia=0; //做为点阵数组的元素 for(i=0;i<16;i++){//移动是16行同时移,因此要处理16个字节 lhj[ia]<<=1; //移当前显示缓冲的前半行字节 if(lhj[ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理 lhj[ia]++; ia++; lhj[ia]<<=1; //移当前显示缓冲的后半行字节 if(tmp2[i]&0x80) //判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理 lhj[ia]++; ia++; tmp2[i]<<=1; //下一个要显示汉字的半行字节向高位移一位,准备下一次取位 } tmp--; timerc=timer; //处理完16行,调用显示函数更新点阵 while(timerc--) //循环做为处理的速度,即移动的速度 display(); } //---------- c--; //移完一半,进入下一半或下一个汉字,直到结束 } } void displaymovetb(unsigned char din,unsigned char *lp,unsigned char timer) //上下移动内容,din:1为向下,0为向上,lp指向要移入的内容,timer为移动速度 { unsigned char i=0,j=0,ia=0; unsigned int tmp=0,timerc=0; if(din){ //判断移动方向,向下 ia=32; //要移入第一个汉字的数组元素 i=16; //行索引 while(i--){ //逐行处理 j=30; while(j){ j--; lhj[j+2]=lhj[j]; //将上一行的内容复制到下一行,每两行内容相隔四个字节,复制15行 } if(lp==0){ //最后一行的处理,判断移入的内容是否为空,是用0移入 lhj[0]=0; lhj[1]=0; } else{ //否则,取字数组处理 ia--; lhj[1]=lp[ia]; ia--; lhj[0]=lp[ia]; } timerc=timer; //处理完16行,调用显示函数更新点阵 while(timerc--) //循环做为处理的速度,即移动的速度 display(); } } else{ //移动方向,向上 ia=0; //向上移动,移入汉字从低位开始 for(i=0;i<16;i++){ //处理16行 for(j=0;j<30;j++) //将下一行的内容复制到上一行,每两行内容相隔四个字节,复制15行 lhj[j]=lhj[j+2]; if(lp==0){ //最后一行的处理,判断移入的内容是否为空,是用0移入 lhj[30]=0; lhj[31]=0; } else{ //否则,取字数组处理 lhj[30]=lp[ia]; lhj[31]=lp[ia+1]; ia+=2; } timerc=timer; //处理完16行,调用显示函数更新点阵 while(timerc--) //循环做为处理的速度,即移动的速度 display(); } } } void delay(unsigned int a) //延时 { while(a--); } 有字模软件修改你想要显示的字,程序要字模改动别告诉我你不懂
#include unsigned int code hang[][32]={/*电 CB5E7 */ 0x01,0x80,0x01,0x80,0x01,0x80,0x3F,0xFC,0x31,0x8C,0x31,0x8C,0x3F,0xFC,0x31,0x8C, 0x31,0x8C,0x31,0x8C,0x3F,0xFC,0x31,0x8C,0x01,0x83,0x01,0x83,0x00,0xFF,0x00,0x00, /*气 CC6F8 */ 0x0C,0x00,0x0C,0x00,0x1F,0xFF,0x18,0x00,0x30,0x00,0x6F,0xFC,0x00,0x00,0x1F,0xF8, 0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0F,0x00,0x0F,0x00,0x07,0x00,0x03, /*自 CD7D4 */ 0x01,0x80,0x01,0xC0,0x03,0x00,0x1F,0xFC,0x18,0x0C,0x18,0x0C,0x1F,0xFC,0x18,0x0C, 0x18,0x0C,0x18,0x0C,0x1F,0xFC,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x1F,0xFC,0x18,0x0C, /*动 CB6AF */ 0x00,0x30,0x00,0x30,0x7F,0x30,0x00,0x30,0x00,0xFE,0xFF,0xB6,0x18,0x36,0x18,0x36, 0x36,0x36,0x33,0x36,0x6F,0xE6,0xFF,0x66,0x60,0xC6,0x01,0x9E,0x03,0x0C,0x00,0x00, /*化 CBBAF */ 0x0C,0xC0,0x0E,0xC0,0x0C,0xCC,0x18,0xCE,0x18,0xDC,0x38,0xF8,0x78,0xF0,0xD8,0xE0, 0x19,0xC0,0x1B,0xC0,0x1E,0xC0,0x18,0xC6,0x18,0xC6,0x18,0xC6,0x18,0x7E,0x00,0x00,} unsigned char lie[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0XFF}; main() {unsigned int i,j,k,m; while(1) {for(m=0;m<10;m++) for(k=0;k<100;k++) {for (i=0;i<8;i++) {P1=0XFF;P0=0XFF; P3=hang[m][i*2];P2=hang[m][i*2+1]; P1=lie[i];P0=0XFF; for(j=0;j<500;j++);} for (i=0;i<8;i++) {P1=0XFF;P0=0XFF; P3=hang[m][i*2+16];P2=hang[m][i*2+17]; P1=0xff;P0=lie[i]; for(j=0;j<500;j++);} }} } 上面显示“电气自动化”汇编有点难。必须得练。帮我加分 采纳哦
avr的静态点阵 #include unsigned char a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //控制低电平 unsigned char b[]={0xff,0x18,0x18,0xff,0x18,0x18,0x18,0xff}; //控制高电平 void delay(unsigned int cnt) { while(--cnt); } void main(void) { int i=0,n=0; DDRA=0xFF; DDRB=0xFF; while(1) { for (i=0;i<8;i++) { PORTA=a[i]; PORTB=b[i]; delay(300); } } } AVR的动态点阵 #include unsigned char a[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //列高电平控制端 unsigned char b[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //行低电平控制端 0x7e,0x76,0x76,0x00,0x00,0x76,0x76,0x7e, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; void delay(unsigned int cnt) { while(--cnt); } void main(void) { int i=0,n=0,k=0; DDRA=0xFF; DDRB=0xFF; while(1) { for(k=0;k<16;k++) { for(n=0;n<50;n++) { for (i=0;i<8;i++) //i循环8次进去下个语句 { PORTA=a[i]; PORTB=b[i+k]; delay(50); } } }
8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮。 不知道你要实现什么样的显示,不过基本方法是一样的。我这有一个现成的8*8的程序,你可以根据这个去修改: 在8X8点阵LED上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。(要实现一根柱形的亮法:一根竖柱,对应的列置1,而行则采用扫描的方法来实现。 一根横柱,对应的行置0,而列则采用扫描的方法来实现。) 汇编源程序: ORG 00H START: NOP MOV R3,#3 LOP2: MOV R4,#8 MOV R2,#0 LOP1: MOV P1,#0FFH MOV DPTR,#TABA MOV A,R2 MOVC A,@A+DPTR MOV P3,AINC R2 LCALL DELAY DJNZ R4,LOP1 DJNZ R3,LOP2 MOV R3,#3 LOP4: MOV R4,#8 MOV R2,#7 LOP3: MOV P1,#0FFH MOV DPTR,#TABA MOV A,R2 MOVC A,@A+DPTR MOV P3,A DEC R2 LCALL DELAY DJNZ R4,LOP3 DJNZ R3,LOP4 MOV R3,#3 LOP6: MOV R4,#8 MOV R2,#0 LOP5: MOV P3,#00H MOV DPTR,#TABB MOV A,R2 MOVC A,@A+DPTR MOV P1,A INC R2 LCALL DELAY DJNZ R4,LOP5 DJNZ R3,LOP6 MOV R3,#3 LOP8: MOV R4,#8 MOV R2,#7 LOP7: MOV P3,#00H MOV DPTR,#TABB MOV A,R2 MOVC A,@A+DPTR MOV P1,A DEC R2 LCALL DELAY DJNZ R4,LOP7 DJNZ R3,LOP8 LJMP START DELAY: MOV R5,#10 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET TABA: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH TABB: DB 01H,02H,04H,08H,10H,20H,40H,80H END C51语言源程序 #include unsigned CHAR code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned CHAR code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void DELAY(void) { unsigned CHAR i,j; for(i=10;i>0;i--) for(j=248;j>0;j--); } void DELAY1(void) { unsigned CHAR i,j,k; for(k=10;k>0;k--) for(i=20;i>0;i--) for(j=248;j>0;j--); } void main(void) { unsigned CHAR i,j; while(1) { for(j=0;j<3;j++) //FROM left to right 3 time { for(i=0;i<8;i++){ P3=taba[i]; P1=0xff; DELAY1();} } for(j=0;j<3;j++) //FROM right to left 3 time { for(i=0;i<8;i++) { P3=taba[7-i]; P1=0xff; DELAY1();}} for(j=0;j<3;j++) //FROM top to bottom 3 time { for(i=0;i<8;i++) { P3=0x00; P1=tabb[7-i]; DELAY1();}} for(j=0;j<3;j++) //FROM bottom to top 3 time { for(i=0;i<8;i++) { P3=0x00; P1=tabb[i]; DELAY1();}} } }