点阵屏显示原理及实验详解..pdf

上传人:tbuqq 文档编号:5218956 上传时间:2020-02-25 格式:PDF 页数:32 大小:168.72KB
返回 下载 相关 举报
点阵屏显示原理及实验详解..pdf_第1页
第1页 / 共32页
点阵屏显示原理及实验详解..pdf_第2页
第2页 / 共32页
点阵屏显示原理及实验详解..pdf_第3页
第3页 / 共32页
点阵屏显示原理及实验详解..pdf_第4页
第4页 / 共32页
点阵屏显示原理及实验详解..pdf_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《点阵屏显示原理及实验详解..pdf》由会员分享,可在线阅读,更多相关《点阵屏显示原理及实验详解..pdf(32页珍藏版)》请在三一文库上搜索。

1、标题: LED 点阵屏学习攻略共享资料 LED 点阵屏学习攻略 在经历了将近一个学期断断续续的点阵屏学习后,最后终于在AVR 平台下 完成了 128*32 点阵屏的无闪烁显示。现把整个学习过程总结如下: 无论是 51 单片机还是AVR 单片机,点阵屏的显示原理是一样的,所以首先从 51 讲起。 说明:以下所有试验如无特殊说明均在Keil uVision3 + Proteus 6.9 SP5下仿 真完成。 一基于 51 的点阵屏显示:(1)点亮第一个8*8 点阵 : 1.首先在 Proteus 下选择我们需要的元件,AT89C52 、74LS138 、 MATRIX-8*8-GREEN(在这里使

2、用绿色的点阵)。在 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 译码器每次可输出相应一个

3、I/O 口的低电平,正好 与点阵屏的低电平选中行相对,并且节省了I/O 口,大大方便了我们的编程和 以后的扩展。 3.下面让我们把它点亮,先看一个简单的程序: (将奇数行偶数列的点点亮,效果如下图) 下面是源代码: /*8*8LED点阵屏显示 */ #include void delay(int z) /延时函数 int x,y; for(x=0;x char code table=0x0f,0xe9,0xaf,0xe9,0xaf,0xa9,0xeb,0x11; /“明“ 字编码 void delay(int z) /延时函数 int x,y; for(x=0;x char code tabl

4、e=0x00,0x20,0x20,0x7F,0x7E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x80,0x20,0x80,0x20,0x40,0x28,0x20,0x10; / “明” void delay(int z) int x,y; for(x=0;x sbit R=“P2“0; /数据输入端口 sbit CLK=“P2“1; / 时钟信号 sbit STB=“P2“2; / 锁存端 char code table=0x00,0x2

5、0,0x20,0x7F,0x7E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x80,0x20,0x80,0x20,0x40,0x28,0x20,0x10; / “明” void delay(int z) int x,y; for(x=0;x1; /右移一位,取出该字节的最低位 R=CY; /将该字节的最低位传给R CLK=0; / 将数据移入595 ,上升沿 CLK=1; void main() int num; while(1) for(

6、num=0;num1 ,把要输入的数据右移一位, 这样最低位便进入移位寄存器CY 中,紧接着我们让R=CY ,把该位传给595 的输入端, CLK 一个上升沿的跳变就实现了把该位数据移入595 的功能。 8 次 循环便可以将一个字节的数据送出。重点还是看while 循环内, 同样也是 16 行 的扫描,然后就是WriteByte (table2*num )等同于上面的P2=table2*num, WriteByte(table2*num+1)等同于 P3=table2*num+1,完成列选,接着行选, 然后有一个STB 的下降沿的跳变, 这个变化能够实现并行输出移位寄存器中的 数据。这样就完成

7、了整个过程。 (3)16*16 点阵的移位控制 点阵的移位一般有上、下、左、右的移动,这里我们重点讲上移和左移,其它 同理。 1. 点阵的上移: 点阵的上移相对来说很简单,看效果图如下: 源代码:(该程序实现了循环上移显示“ 邢台 ” ) /*16*16LED点阵屏显示 */ #include sbit R=“P2“0; /数据输入端口 sbit CLK=“P2“1; / 时钟信号 sbit STB=“P2“2; / 锁存端 char code table= /*- 文字 : 邢-*/ /*- 宋体 12; 此字体下对应的点阵为:宽x 高=16x16 -*/ 0x00,0x00,0xFE,0x

8、3E,0x48,0x22,0x48,0x22, 0x48,0x12,0x48,0x12,0x48,0x0A,0xFF,0x13, 0x48,0x22,0x48,0x42,0x48,0x42,0x48,0x46, 0x44,0x2A,0x44,0x12,0x42,0x02,0x40,0x02, /*- 文字 : 台-*/ /*- 宋体 12; 此字体下对应的点阵为:宽x 高=16x16 -*/ 0x40,0x00,0x40,0x00,0x20,0x00,0x10,0x04, 0x08,0x08,0x04,0x10,0xFE,0x3F,0x00,0x20, 0x00,0x08,0xF8,0x1F,

9、0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08, ; void delay(int z) int x,y; for(x=0;x1; /右移一位,取出该字节的最低位 R=CY; /将该字节的最低位传给R CLK=0; / 将数据送出,上升沿 CLK=1; void main() int num,move,speed; while(1) if(+speed8) /移动速度控制 speed=0; move+; /移位 if(move16) /是否完成移位一个汉字 move=0; /从头开始 for(num=0;numtempy

10、id) | (BUFFs+1 #define uchar unsigned char #define uint unsigned int uchar yid,h; /YID 为移动计数器,H 为行段计数器 uint zimuo; /字模计数器 uchar code hanzi; /汉字字模 uchar BUFF4; /缓存 void in_data(void); /调整数据 void rxd_data(void); /发送数据 void sbuf_out(); /16 段扫描 uchar code table=/篇幅有限,省略编码; void main(void) uchar i,d=10;

11、yid=0; zimuo=0; while(1) while(yid=96) /到最后从头开始,有字数决定 zimuo=0; /*/ void sbuf_out() for(h=0;h=0;s-) /h 为向后先择字节计数器,zimuoo 为向后 选字计数器 BUFF2*s+1=tablezimuo+1+32*s+2*h; /把第一个字模的第一个字节 放入 BUFF0 /中,第二个字模的第一个字节放入BUFF2 中 BUFF2*s=tablezimuo+32*s+2*h; / 把第一个字模的第二个字节放 入 BUFF1 中, /第二个字模的第二个字节放入BUFF3 中 /*/ void rxd

12、_data(void) /串行发送数据 char s; uchar inc,tempyid,temp; if(yidtempyid)|(BUFFs+1 #define uchar unsigned char #define uint unsigned int uchar yid,h; /YID 为移动计数器,H 为行段计数器 uint zimuo; /字模计数器 uchar code hanzi; /汉字字模 uchar BUFF18; /缓存 void in_data(void); /调整数据 void rxd_data(void); /发送数据 void sbuf_out(); /16 段

13、扫描 uchar code table=/篇幅有限,省略编码; void main(void) uchar i,d=10; yid=0; zimuo=0; while(1) while(yid=480) /到最后从头开始,有字数决定 zimuo=0; /*/ void sbuf_out() for(h=0;h=0;s-) /h 为向后先择字节计数器,zimuoo 为向后 选字计数器 BUFF2*s+1=tablezimuo+1+32*s+2*h; /把第一个字模的第一个字节 放入 BUFF0 /中,第二个字模的第一个字节放入BUFF2 中 BUFF2*s=tablezimuo+32*s+2*h

14、; / 把第一个字模的第二个字节放 入 BUFF1 中, /第二个字模的第二个字节放入BUFF3 中 /*/ void rxd_data(void) /串行发送数据 char s; uchar inc,tempyid,temp; if(yidtempyid)|(BUFFs+1 #include #define uchar unsigned char #define uint unsigned int #include “delay.h“ #include “code.h“ #pragma data: data #define screen_size 8 /半屏显示汉字个数:8 32*128 u

15、char BUFF_1screen_size*2+2; /缓存 uchar BUFF_2screen_size*2+2; /缓存 uchar disrow; /disrow 为 16 行变量 uchar temp_up,temp_down; uchar Move_up,Move_down; uchar temp_up,temp_down; uint zimo_up,zimo_down; #define HC595_data1_H() PORTB |= BIT(0) #define HC595_data1_L() PORTB HC595_lock_L; for (i=0x01;i!=0;i=i=

16、0;s-) BUFF_12*s=pf+32*s+2*disrow; BUFF_12*s+1=pf+1+32*s+2*disrow; /* 函数名 :void Move_Down(const uchar *p,uint f) 功能 :下半屏缓存数据左移 输入 : 输出 : /*/ void Move_Down( const uchar *p,uint f) signedchar s; for (s=screen_size;s=0;s-) BUFF_22*s=pf+32*s+2*disrow; BUFF_22*s+1=pf+1+32*s+2*disrow; /* 函数名 :void display

17、(void) 功能 :显示刷新 输入 : 输出 : /*/ void display( void ) uchar i = Move_up; uchar j = Move_down; uchar s; uchar inc,tempyid,temp1,temp2; if(itempyid)|(BUFF_1s+1tempyid)|(BUFF_2s+1(8-tempyid); HC595_send_2byte(temp1,temp2); /发送数据 void port_init( void ) PORTA = 0x00; DDRA = 0xFF; PORTB = 0x00; DDRB = 0xFF; PORTC = 0x00; /m103 output only DDRC = 0xFF; PORTD = 0x00; DDRD = 0xFF; /call this routine to initialize all peripherals void init_devices( void ) /stop errant interrupts until set 2010-8-13 8:5044

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1