unsigned char code taba[]={0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7};unsigned char code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay1(void){ unsigned char i,j,k;for(k=8;
你好:在void set(void)里少了P2的设置.在下面的循环中,n=0和n=7时,显示相同,所以 点阵第一行总是不对,可能同第8行相同.可在n=7后加延时,以错开循环到n=0时,P2,P1的值.for(n = 0; n < 8; n++){ P2=
P1口为行,P2口为列;numb[10][8];//0~9的点阵数据 由下向上显示,即从 P1.7开始驱动行,然后是P1.6,,,P1.0;for(i=0;i<10;i++){ a=0x80;for(j=7;j>0;j--){ P1=a;P2=numb[i][j];de
int y;for(i=0;i
MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-GREEN,MATRIX-8*8-BLUE,MATRIX-8*8-ORANGE ,MATRIX-8*8-RED。
用51单片机驱动8*8点阵 的代码
8*8点阵是动态扫描的 静态显示也是动态扫描的结果。比如说下面这个程序:include
//移位时钟脉冲 ---接板卡上的SPOsbit RCK_595 =P1^7; //输出锁存器控制脉冲 ---接板卡上SPKsbit CS_LED8 =P1^1; //数码管片选 ---接板卡上的CSsbit CS_1302 =P1^4; //ds1302片
1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,
你好:在void set(void)里少了P2的设置.在下面的循环中,n=0和n=7时,显示相同,所以 点阵第一行总是不对,可能同第8行相同.可在n=7后加延时,以错开循环到n=0时,P2,P1的值.for(n = 0; n < 8; n++){ P2=
include
移动速度调整y循环的次数。动态扫描一般是用定时中断来做的,你这个程序简单这样凑合着用也行。
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程序
一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:1.首先在Proteus下选择我们需要的元件,AT89C51、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-
stc89c52rc单片机按键控制点阵变换图片,首先保证点阵可以分别显示出几幅图片。其实,显示的每一幅图片都是一组数据,保存为一维数组。那多幅图片,可以按二维数组来保存。假设数组为,pic[5][32],为5幅图片,每幅图片为32
首先需要你把点阵上要显示图形的代码写出来,即每种图形每行显示的数据,每个图形有8行数据,即占8个字节的空间!如果楼主用51单片机来实现的话,可以使用P0口输出行数据,P1口作为点阵的行扫描控制。其次要用按键控制,只
if(key==0){ delayms(20);if(key==0)flag++;while(key==0);} if(flag==3) flag=0;if(flag==0){ for(i=0;i<8:i++){ P0=table1[i] ;P1=table0[i] ;delayms(2);} } if(flag==1){
CJNE A,#0EEH,NE2;;;将A中的数据与键值表对比,不同则跳到下一个对比 MOV A,#0;;;将输出显示数据送到寄存器 JMP KEYEND;;;跳出对比程序 NE2:CJNE A,#0EDH,NE3;;;1 MOV A,#1 JMP KEYEND NE3:CJN
用一按键切换8*8点阵图形显示三幅图, 要有代码和仿真图,求大佬帮忙, 是单片机,用AT89C51
//主程序 void main(){ P1=0x80;Num_Index=0; //从0 开始显示 TMOD=0x01; //T0 方式0 TH0=(65536-2000)/256; //2ms 定时 TL0=(65536-2000)%256;IE=0x82;key=0;xi=0;yi=0;EX0=1;IT0=1;TR0=1;
一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:1.首先在Proteus下选择我们需要的元件,AT89C51、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-
//显示0 w=0x01; //行变量为第一行 for(i=0;i<8;i++){ P1=w;//行数据送P1口 P0=led0[i];delayms(1);//列数据送P0口 w<<=1;//向下移动一行 } } } void delay1ms(unsigned int ms){ unsigned
0x22,0x1C},//3 {0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x08},//4 {0x3E,0x20,0x20,0x3E,0x02,0x02,0x22,0x1C},//5 {0x1C,0x22,0x20,
1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,
说明你的程序根本就不能控制8x8点阵LED,都不能点亮。再说了,显示一个汉字,至少要16x16的点阵,开发板上的8x8点阵只能显示一些图形,根本就不能显示汉字的。
static unsigned int tmr = 0; //1s软件定时器 static unsigned char index = 9; //图片刷新索引 TH0 = 0xFC; //重新加载初值 TL0 = 0x67;//以下代码完成LED点阵动态扫描刷新 P0 = 0xFF; //显示消隐
单片机汉字8x8点阵LED动态显示程序
你真厉害,一位数组显示点阵实验,点阵最好是用二位数组,基本思路也就是单片机两个IO口控制点阵的行和列,定义一个二位数组控制点阵每一行要亮拿几个灯,然后下一行亮那几个灯,以此类推,快速刷出没一个亮的灯就能让
include
if(++t==250) //每个数字刷新显示一段时间 { t=0;yi++;
用51单片机8×8点阵显示字母,是要用proteus仿真吧,先画出仿真图,再用取模软件画出字母X Q J,然后按行取模,每一个字母的字模是8个字节。显示时,依次取出每行的字模,按行扫描显示即可。下图是一个仿真图。
8*8点阵是动态扫描的 静态显示也是动态扫描的结果。比如说下面这个程序:include
用51单片机以及8*8点阵显示英文字母或者数字(最好是全部数字和字母都说说哈),静态显示就可以 谢谢啊
下载文件:prj15_8_8led.rar|这个我做过了,请参考下面的附件,程序已经上板验证过了,可用。
其实就是讲每一行的数据左右移动一行就可以了。使用>>或<<就可以了。include
temp=_crol_(temp,-1);//移动 delay(100);} }
在8X8 LED 点阵上显示柱形,让其先从左到右平滑移动1次,其次从右到左 平滑移动1次,再次从上到下平滑移动1次,最后从下到上平滑移动次,如此循环下去。LED显示原理:显示某一个点时,列值设为1,行值设为0即可
//定义一个无符号字符型局部变量 i 取值范围 0~255 Delay(50000); P1=0xfe; //赋初始值 for(i=0;i8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次
单片机程序8x8led点阵显示心形并实现左移右移的程序
每屏显示时,列控制码左(右)移,就可实现点阵屏左(右)移动。 以显示“ | ” 从右向左移为例,第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--; } }
我来帮你搞定
#include#include#define uchar unsigned char#define uint unsigned int//--------------------------------------------uchar code Table_of_Digits[40][8]={ {0x1C,0x22,0x22,0x22,0x22,0x22,0x22,0x1C},//0 {0x08,0x18,0x08,0x08,0x08,0x08,0x08,0x1C},//1 {0x1C,0x22,0x02,0x02,0x1C,0x20,0x20,0x3E},//2 {0x1C,0x22,0x02,0x1C,0x02,0x02,0x22,0x1C},//3 {0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x08},//4 {0x3E,0x20,0x20,0x3E,0x02,0x02,0x22,0x1C},//5 {0x1C,0x22,0x20,0x3C,0x22,0x22,0x22,0x1C},//6 {0x3E,0x02,0x04,0x08,0x10,0x10,0x10,0x10},//7 {0x1C,0x22,0x22,0x1C,0x22,0x22,0x22,0x1C},//8 {0x1C,0x22,0x22,0x22,0x1E,0x02,0x22,0x1C},//9 {0x00,0x1C,0x22,0x22,0x22,0x3E,0x22,0x22},//A {0x00,0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C},//B {0x00,0x1C,0x22,0x20,0x20,0x20,0x22,0x1C},//C {0x00,0x3C,0x22,0x22,0x22,0x22,0x22,0x3C},//D {0x00,0x3E,0x20,0x20,0x3E,0x20,0x20,0x3E},//E {0x00,0x3E,0x20,0x20,0x3E,0x20,0x20,0x20},//F {0x00,0x1C,0x22,0x20,0x3E,0x22,0x22,0x1C},//G {0x00,0x22,0x22,0x22,0x3E,0x22,0x22,0x22},//H {0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x1C},//I {0x00,0x3E,0x08,0x08,0x08,0x08,0x28,0x18},//J {0x00,0x20,0x2C,0x30,0x20,0x30,0x2C,0x20},//K {0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3E},//L {0x00,0x42,0x66,0x5A,0x42,0x42,0x42,0x42},//M {0x00,0x00,0x2C,0x32,0x22,0x22,0x22,0x22},//n {0x00,0x1C,0x22,0x22,0x22,0x22,0x22,0x1C},//O {0x00,0x3C,0x22,0x22,0x3C,0x20,0x20,0x20},//P {0x00,0x1C,0x22,0x22,0x22,0x2A,0x26,0x1F},//Q {0x00,0x38,0x24,0x24,0x38,0x30,0x28,0x24},//R {0x00,0x1C,0x22,0x20,0x1C,0x02,0x22,0x1C},//S {0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08},//T {0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//U {0x00,0x22,0x22,0x22,0x14,0x14,0x08,0x00},//V {0x00,0x41,0x41,0x49,0x55,0x55,0x63,0x41},//W {0x00,0x00,0x42,0x24,0x18,0x18,0x24,0x42},//X {0x00,0x22,0x22,0x14,0x08,0x10,0x20,0x00},//Y {0x00,0x3E,0x02,0x04,0x08,0x10,0x20,0x3E},//Z};//---------------------------------------uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//---------------------------------------uchar i=0;uchar j=0;uchar t=0;uchar Num_Index,disnum;uchar key;uchar xi;uchar yi;//---------------------------------------uchar code disstr[]="C201600102020";//显示内容可以自己定义//---------------------------------------sbit we1=P1^1;sbit we2=P1^3;//---------------------------------------//主程序//---------------------------------------void main(){//P1=0x80;Num_Index=0; //从0 开始显示TMOD=0x01; //T0 方式0TH0=(65536-2000)/256; //2ms 定时TL0=(65536-2000)%256;IE=0x82;key=0;xi=0;yi=0;EX0=1;IT0=1;TR0=1; //启动T0while(1);}//---------------------------------------//外部中断0 中断函数//按键处理//---------------------------------------void ext_int0() interrupt 0{ key++; key&=0x03;}//---------------------------------------//定时器0 中断函数//显示控制//---------------------------------------void LED_Screen_Display() interrupt 1{TH0=(65536-2000)/256; //2ms 定时TL0=(65536-2000)%256;switch(key){//显示点阵图形case 0: P0=0xff; if(disstr[Num_Index]>='A')disnum=disstr[Num_Index]-'A'+10; else disnum=disstr[Num_Index]-'0'; we1=1; P0=~Table_of_Digits[disnum][i]; we1=0; P0=0xff; //输出位码和段码 we2=1; P0=ydat[i]; we2=0; if(++i==8) i=0; //每屏一个数字由8 个字节构成 if(++t==250) //每个数字刷新显示一段时间 { t=0; if(++Num_Index==13) Num_Index=0; //显示下一个数字 } break;//流水灯“点”模式case 1: we1=1; P0=~xdat[xi]; we1=0; we2=1; P0=ydat[yi]; we2=0; if(++t==250) //每个数字刷新显示一段时间 { t=0; yi++; if(yi>7){yi=0;xi++;} if(xi>7)xi=0; } break;//流水灯“行列”模式case 2: we1=1; P0=0x00; we1=0; P0=0xff; //输出位码和段码 we2=1; P0=xdat[i]; we2=0; if(++t==250) //每个数字刷新显示一段时间 { if(++i==8) i=0; //每屏一个数字由8 个字节构成 t=0; } break;default: key=0; i=0; j=0; t=0; xi=0; yi=0; Num_Index=0; we1=1; P0=0xff; we1=0; we2=1; P1=0x80; we2=0; break;}}
这个程序验证过,你可以参考试试://-------------------------------------------//8*8矩阵循环显示字符和数字//显示字符串在数组disstr[]中申明//-------------------------------------------#include#include#define uchar unsigned char#define uint unsigned int//--------------------------------------------uchar code Table_of_Digits[40][8]={ {0x1C,0x22,0x22,0x22,0x22,0x22,0x22,0x1C},//0 {0x08,0x18,0x08,0x08,0x08,0x08,0x08,0x1C},//1 {0x1C,0x22,0x02,0x02,0x1C,0x20,0x20,0x3E},//2 {0x1C,0x22,0x02,0x1C,0x02,0x02,0x22,0x1C},//3 {0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x08},//4 {0x3E,0x20,0x20,0x3E,0x02,0x02,0x22,0x1C},//5 {0x1C,0x22,0x20,0x3C,0x22,0x22,0x22,0x1C},//6 {0x3E,0x02,0x04,0x08,0x10,0x10,0x10,0x10},//7 {0x1C,0x22,0x22,0x1C,0x22,0x22,0x22,0x1C},//8 {0x1C,0x22,0x22,0x22,0x1E,0x02,0x22,0x1C},//9 {0x00,0x1C,0x22,0x22,0x22,0x3E,0x22,0x22},//A {0x00,0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C},//B {0x00,0x1C,0x22,0x20,0x20,0x20,0x22,0x1C},//C {0x00,0x3C,0x22,0x22,0x22,0x22,0x22,0x3C},//D {0x00,0x3E,0x20,0x20,0x3E,0x20,0x20,0x3E},//E {0x00,0x3E,0x20,0x20,0x3E,0x20,0x20,0x20},//F {0x00,0x1C,0x22,0x20,0x3E,0x22,0x22,0x1C},//G {0x00,0x22,0x22,0x22,0x3E,0x22,0x22,0x22},//H {0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x1C},//I {0x00,0x3E,0x08,0x08,0x08,0x08,0x28,0x18},//J {0x00,0x20,0x2C,0x30,0x20,0x30,0x2C,0x20},//K {0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3E},//L {0x00,0x42,0x66,0x5A,0x42,0x42,0x42,0x42},//M {0x00,0x00,0x2C,0x32,0x22,0x22,0x22,0x22},//n {0x00,0x1C,0x22,0x22,0x22,0x22,0x22,0x1C},//O {0x00,0x3C,0x22,0x22,0x3C,0x20,0x20,0x20},//P {0x00,0x1C,0x22,0x22,0x22,0x2A,0x26,0x1F},//Q {0x00,0x38,0x24,0x24,0x38,0x30,0x28,0x24},//R {0x00,0x1C,0x22,0x20,0x1C,0x02,0x22,0x1C},//S {0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08},//T {0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//U {0x00,0x22,0x22,0x22,0x14,0x14,0x08,0x00},//V {0x00,0x41,0x41,0x49,0x55,0x55,0x63,0x41},//W {0x00,0x00,0x42,0x24,0x18,0x18,0x24,0x42},//X {0x00,0x22,0x22,0x14,0x08,0x10,0x20,0x00},//Y {0x00,0x3E,0x02,0x04,0x08,0x10,0x20,0x3E},//Z};//---------------------------------------uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//---------------------------------------uchar i=0;uchar j=0;uchar t=0;uchar Num_Index,disnum;uchar key;uchar xi;uchar yi;//---------------------------------------uchar code disstr[]="C201600102020";//---------------------------------------sbit we1=P1^1;sbit we2=P1^3;//---------------------------------------//主程序//---------------------------------------void main(){//P1=0x80;Num_Index=0; //从0 开始显示TMOD=0x01; //T0 方式0TH0=(65536-2000)/256; //2ms 定时TL0=(65536-2000)%256;IE=0x82;key=0;xi=0;yi=0;EX0=1;IT0=1;TR0=1; //启动T0while(1);}//---------------------------------------//外部中断0 中断函数//按键处理//---------------------------------------void ext_int0() interrupt 0{ key++; key&=0x03;}//---------------------------------------//定时器0 中断函数//显示控制//---------------------------------------void LED_Screen_Display() interrupt 1{TH0=(65536-2000)/256; //2ms 定时TL0=(65536-2000)%256;switch(key){//显示点阵图形case 0: P0=0xff; if(Num_Index==0)disnum=disstr[Num_Index]-'A'+10; else disnum=disstr[Num_Index]-'0'; we1=1; P0=~Table_of_Digits[disnum][i]; we1=0; P0=0xff; //输出位码和段码 we2=1; P0=ydat[i]; we2=0; if(++i==8) i=0; //每屏一个数字由8 个字节构成 if(++t==250) //每个数字刷新显示一段时间 { t=0; if(++Num_Index==13) Num_Index=0; //显示下一个数字 } break;//流水灯“点”模式case 1: we1=1; P0=~xdat[xi]; we1=0; we2=1; P0=ydat[yi]; we2=0; if(++t==250) //每个数字刷新显示一段时间 { t=0; yi++; if(yi>7){yi=0;xi++;} if(xi>7)xi=0; } break;//流水灯“行列”模式case 2: we1=1; P0=0x00; we1=0; P0=0xff; //输出位码和段码 we2=1; P0=xdat[i]; we2=0; if(++t==250) //每个数字刷新显示一段时间 { if(++i==8) i=0; //每屏一个数字由8 个字节构成 t=0; } break;default: key=0; i=0; j=0; t=0; xi=0; yi=0; Num_Index=0; we1=1; P0=0xff; we1=0; we2=1; P1=0x80; we2=0; break;}}
说明你的程序根本就不能控制8x8点阵LED,都不能点亮。 再说了,显示一个汉字,至少要16x16的点阵,开发板上的8x8点阵只能显示一些图形,根本就不能显示汉字的。
将显示的内容制成三个表:table1[]={。。。。。。。} table2[]={。。。。。。。} table3[]={。。。。。。。} 另将显示的列制成1个表:table0[]={0x80,0x40,0x20,0x01,0x08,0x04,0x02,0x01} 申请一个变量flag,计按键状态 ,按下按键 flag加1 然后根据flag的值,查不同的表,进行显示 if(key==0) { delayms(20); if(key==0)flag++; while(key==0); } if(flag==3) flag=0; if(flag==0) { for(i=0;i<8:i++) { P0=table1[i] ;P1=table0[i] ;delayms(2);} } if(flag==1) { for(i=0;i<8:i++) { P0=table2[i] ;P1=table0[i] ;delayms(2);} } if(flag==2) { for(i=0;i<8:i++) { P0=table3[i] ;P1=table0[i] ;delayms(2);} }
提示: CLK分频+(0-8的加法器)+译码器,实现位选
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();}} } }
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,A INC 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
一.基于51的点阵屏显示:(1)点亮第一个8*8点阵: 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-RED。 在这里请牢记:红色的为上列选下行选;其它颜色的为上行选下列选!而所有的点阵都是高电平选中列,低电平选中行!也就是说如果某一个点所处的行信号为低,列信号为高,则该点被点亮!此结论是我们编程的基础。 2.在选择完以上三个元件后,我们开始布线,具体如下图: 这里P2是列选,P3连接38译码器后作为行选。 选择38译码器的原因:38译码器每次可输出相应一个I/O口的低电平,正好与点阵屏的低电平选中行相对,并且节省了I/O口,大大方便了我们的编程和以后的扩展。 3.下面让我们把它点亮,先看一个简单的程序: (将奇数行偶数列的点点亮,效果如下图) 下面是源代码: /************8*8LED点阵屏显示*****************/ #include void delay(int z) //延时函数 { int x,y; for(x=0;x<z;x++) for(y=0;y<110;y++); } void main() { while(1) { P3=0; //行选,选择第一行 P2=0x55; //列选,即该行显示的数据 delay(5); //延时 /*****下同*****/ P3=2; //第三行 P2=0x55; delay(5); P3=4; //第五行 P2=0x55; delay(5); P3=6; //第七行 P2=0x55; delay(5); } } 上面的程序实现了将此8*8点阵的奇数行偶数列的点点亮的功能。重点让我们看while循环内,首先是行选P3=0,此时38译码器的输入端为000,则输出端为01111111,即B0端为低电平,此时选中了点阵屏的第一行,接着列选我们给P2口赋0x55,即01010101,此时又选中了偶数列,紧接着延时。然后分别对第三、五、七行进行相同的列选。这样就点亮了此点阵屏奇数行偶数列交叉的点。 完成这个程序,我们会发现其实点阵屏的原理是如此简单,和数码管的动态显示非常相似,只不过换了一种方式而已。 对不起啦,我传了三次图片都没传上,郁闷哪!希望你能理解哈! 不过我有传一份WORD文档在我的空间里面