当前位置:文档之家› 显示驱动实验报告

显示驱动实验报告

显示驱动实验报告1 引言随着显示技术的蓬勃发展,各种显示产品不断被开发出来.它们随处可见,创造了巨大的价值,也同时丰富了我们的日常生活.显示驱动技术是指利用电路驱动显示器件显示的技术,LED点阵显示屏是显示技术的一种,因LED的高亮度特点,主要用于户外显示.LED 显示屏的驱动,一般可以采用单片机或FPGA/CPLD作为控制芯片.我们实验是采用单片机,通过C程序控制LED显示屏,显示汉字或简单的动画.2 实验方案设计利用字模软件将汉字或者图形取模成二进制数据,然后用单片机编程控制硬件显示出图形.硬件电路连接如图一:图一,LED显示驱动电路框图3 实验结果及讨论通过不断地调试与修改,我们得到了不错的显示效果.讨论一:采用单片机控制LED显示屏的优缺点?讨论二:我们的LED驱动实验能否作成视频显示.4 结论结论一:单片机通过C程序控制,输出正确的时序及显示数据,从而使LED显示屏能够稳定的工作.因C语言的简洁高效与可移植的特点,使我们的实验顺利完成.然而,也因为C语言的效率不如汇编,使其在速度方面不如汇编.另外,单片机是通过执行指令输出时序,也使其不如CPLD/FPGA高效.如果单片机的频率不够高或者LED显示屏较大,则单片机就很难控制LED显示.结论二:由于我们的实验采用单片机驱动显示屏.单片机的晶振频率一般只有几十兆赫兹.其指令周期则更长.使其佷难作成视频显示.但简单的动态显示是可以的5 参考文献(1)STC89C51RC-RD _GUIDE-CHINESE.pdf(2)CD401__2422678.pdf(3)74LS244_.pdf(4)6B595_.pdf(5)APM4953_DataSheet.pdf(6)新概念51单片机C语言教程:入门、提高、开发、拓展全攻略郭天祥电子工业出版社(7)C程序设计(第四版)谭浩强著/2010年06月/清华大学出版社6 附录:原程序(包含详尽注释)#include"reg52.h"sbit MCSDI = P1^1 ; // 显示数据(每列的选通信号,数据为高时,对应的象素点亮)sbit MCCLK = P1^2 ; // 列移位时钟即点时钟(上升沿触发)sbit MCOE = P1^3 ; // 亮度控制(即列信号的输出使能控制,低电平有效)sbit MCST = P1^4 ; // 数据锁存(即列信号的数据锁存控制,上升沿锁存)sbit MRRST = P1^5 ; // 行清零(清屏)(高电平有效,清零后所有行信号为低电平,全亮)sbit MRSDI = P1^6 ; // 帧信号(每行的选通信号,数据为低时,对应的行点亮)sbit MRCLK = P1^7 ; // 行扫描时钟// 常数定义#define LED_HANG 48 // 定义LED显示屏的高度,即行数#define LED_LIE 64 // 定义LED显示屏的宽度,即列数#define LED_HANG_DATA_NUM (LED_LIE/8)// 定义LED显示屏每一行的显示数据个数,以字节为单位,以本显示屏为例,每行的数据为8字节#define LED_DATA_NUM ((LED_HANG*LED_LIE)/8)// 定义LED显示屏的显示数据个数,以字节为单位,以本显示屏为例,全屏显示数据为384字节// 主模块内部函数的定义void LARGE_LED_Init(void); // LED显示屏的初始化程序void LED_DISP_Picture( unsigned char *ptr); // 显示64*48的图片的程序void LED_Send_Lie(unsigned char send_buf); // 送出一字节列信号的程序//主模块内部全局变量的定义// 图片数据的每行起始地址,本显示屏的大小为64(列)*48(行),每行的数据为8字节// 在切换到下一行显示时,起始地址加8即可,加到384(64/8*48)后显示完一屏的数据unsigned int LEDHangNum;// 显示数据的场计数单元,本显示屏的大小为64(列)*48(行),每48行后送出一个场信号// 实际上作为了行移位寄存器的数据输入unsigned int LEDChangNum;//显示图片数据// 关键字Code 表示是存放在ROM区域// 显示动画的6个图片,横向取模,字节倒序unsigned char code Bmp1[]={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,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,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0xE6,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0xFB,0x37,0x00,0x00,0x00,0x00,0x00,0x80,0xF3,0xF3,0x01,0x00,0x00,0x00,0x00,0xE0,0x03,0xC0,0x03,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x30,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x80,0x01,0x00,0xC0,0x30,0x00,0x00,0x00,0x80,0x01,0xC0,0xFF,0x38,0x00,0x00,0x00,0x80,0x01,0xC3,0x0F,0x18,0x00,0x00,0x00,0x00,0xFB,0x03,0x00,0x1C,0x00,0x00,0x00,0x00,0x7B,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x0E,0x00,0x80,0x07,0x00,0x00,0x00,0x80,0x1D,0x00,0xC0,0x07,0x00,0x00,0x00,0xC0,0xFF,0x00,0xF8,0x06,0x00,0x00,0x00,0x40,0xEE,0xFF,0x3F,0x0C,0x00,0x00,0x00,0xC0,0x9B,0xFF,0x27,0x0C,0x00,0x00,0x00,0xC0,0xFF,0xFD,0x31,0x0D,0x00,0x00,0x00,0x00,0xEE,0xFE,0x37,0x0D,0x00,0x00,0x00,0x00,0x0C,0x06,0x3F,0x09,0x00,0x00,0x00,0x00,0x18,0xFE,0x99,0x19,0x00,0x00,0x00,0x00,0xF0,0xDF,0x83,0x19,0x00,0x00,0x00,0x00,0xE0,0x1B,0xFF,0x18,0x00,0x00,0x00,0x00,0x00,0x18,0x7C,0x18,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,} ;// 系统主函数int main(void){unsigned char *BmpPtr; // 设置一个指向图片显示数据的指针unsigned char i;LARGE_LED_Init(); // 引脚初始化BmpPtr = Bmp1; // 初始化显示图片指针while(1){// 显示图片BmpPtr = Bmp1;i=10;while(i--){LED_DISP_Picture(BmpPtr);}}}/ *LED点阵显示相关模块相关程序函数名:LARGE_LED_Init()功能:初始化大屏幕LED屏说明:模块的外部函数,提供给主程序调用*/void LARGE_LED_Init(void){MCSDI = 0 ; // 显示数据(每列的选通信号,数据为高时,对应的象素点亮)MCCLK = 0 ; // 移位时钟(上升沿触发)MCOE = 1 ; // 亮度控制(即列信号的输出使能控制,低电平有效)MCST = 0 ; // 数据锁存(即列信号的数据锁存控制,上升沿锁存)MRRST = 0 ; // 行清零(清屏)(高电平有效,清零后所有行信号为低电平,全亮)MRSDI = 1 ; // 帧信号(每行的选通信号,数据为低时,对应的行点亮)MRCLK = 0; // 行扫描时钟}/*函数名:LED_DISP_Picture( unsigned char *ptr)功能:显示一幅64*48的图片说明:模块的内部函数,提供给本模块其他程序调用入口参数:*ptr:指向显示图片数据的指针*/void LED_DISP_Picture( unsigned char *ptr){unsigned char i;LEDHangNum = 0; // LED显示屏每行起始地址初始化,实质为点计数LEDChangNum = 0; // LED显示屏场信号计数单元初始化,实质为行计数do{// 每行显示数据倒序送出,每个字节内部是高位先送// 对应的取模方式:从左到右,字节倒序for(i=7;i!=0xFF;i--) // 循环8次,送完一行的数据{LED_Send_Lie( ptr[ LEDHangNum + i ] ); // 字节倒序,则每个字节内部是高位先送MCOE =1; // MCOE =1;关闭显示(只在显示送完一行的8个数据就灭显示,亮度最弱)}// MCOE =1; // MCOE =1;关闭显示(在显示送完一行的64个数据就灭显示,亮度最强)// 先送场移位信号和时钟,再锁存数据,这样可以避免下一行的数据在上一行形成显示的余晖if (LEDChangNum ==0 ) // 场信号,只有一个低电平信号,其余为高电平,形成移位的效果{// 只需第一次送出一个低电平,其余保持高电平即可MRSDI = 0; // MRSDI = 0;}else{MRSDI = 1; ; // MRSDI = 1;}// 送场移位时钟MRCLK = 0; // MRCLK=0; 行时钟MRCLK = 1; // MRCLK=1;MRCLK = 0; // MRCLK=0;// 锁存,将本行的信号锁存,这样在下一行数据送入5B595的过程中,上一行数据可以保存继续显示(即上一行// 数据的显示)时间是下一行数据的移位时间,显示和移位可以同时进行,节约时间;MCST = 0; // MCST = 0,列信号锁存MCST = 1; // MCST = 1MCST = 0; // MCST = 0MCOE =0; // MCOE =0; 使能显示LEDChangNum++ ; // 场序号加1LEDHangNum = LEDHangNum + LED_HANG_DATA_NUM;// 显示数据切换到下一行}while( LEDHangNum < (LED_DATA_NUM -1) ); // 一屏数据显示完重新开始}/* 函数名:LED_Send_Lie(unsigned char send_buf)功能:送出列信号说明:模块的内部函数,提供给本模块其他程序调用入口参数:send_buf:向LED写入的字符返回值:无其他: 1.采用上升沿写入数的SPI时序,先在数据线上放入要发送的数据,再在时钟线上形成上升沿来锁存数据到595的移位接收寄存器。

相关主题