收藏 分销(赏)

基于51系列单片机最小系统的液晶显示.doc

上传人:二*** 文档编号:4514243 上传时间:2024-09-26 格式:DOC 页数:15 大小:291KB 下载积分:5 金币
下载 相关 举报
基于51系列单片机最小系统的液晶显示.doc_第1页
第1页 / 共15页
本文档共15页,全文阅读请下载到手机保存,查看更方便
资源描述
. . . . 《创新设计报告 》 基于51系列单片机最小系统的液晶显示 学 院: 机电与自动化学院 专业班级: 电气自动化技术0802 学生: 刚 学生学号: 指导教师:裕安 同组设计者: 吴勇 (课程设计时间:2011年03月03日——2011年03月13日) 华中科技大学武昌分校 目录 1.设计题目 ………………………………………………………………… 02 2.设计任务与要求 …………………………………………………… 02 3.系统硬件电路设计………………………………………………………… 02 3.1设计电路原理图………………………………………………………… 02 3.2主要元器件清单………………………………………………………… 03 3.3 OMC12864-4(T6963c)的简介…………………………………………03 4.系统软件设计……………………………………………………………… 05 4.1程序流程图……………………………………………………………… 05 4.2子程序功能介绍………………………………………………………… 06 4.3完整程序与其功能注释………………………………………………… 06 5.系统调试故障分析………………………………………………………… 12 6.调试结果与设计任务分析………………………………………………… 13 7.课设收获与建议…………………………………………………………… 13 参考文献 ………………………………………………………………………13 1.设计题目 基于51单片机最小系统板实现“液晶显示汉字、数字、英文” 2.设计任务与要求 任务:最小系统板实现“液晶显示汉字、数字、英文”; 要求:①对液晶显示操作技能训练;学会运用Protell软件;②绘制软件流程图、编写并调试程序、详细注释软件功能;③对系统性能指标进行分析并提出改进方案;④作品演示与讲解(硬件、软件、调试、改进、) 3系统硬件电路设计(含文字介绍、电路原理图) 3.1用Protell软件绘制电路原理图采用的是直接访问方式。如图(1) 直接访问方式是把置T6963C控制器的液晶显示模块作为存储器或I/O设备直接挂在计算机的总线上。模块的数据线接计算机的数据总线上,片选与寄存器选择信号线由算机的地址总线提供,读和写操作由计算机的读写操作信号控制。 图(1) 图(1)中的引脚说明OCM12864-4与STC89C52RC接口: P0.0-0.7 <==========> D0-7 GND <==========> /CE P3.7 <==========> /RD VCC <==========> /RESET P3.6 <==========> /WR GND <==========> FG P2.0 <==========> C/D 3.2本设计所要用到的主要元器件:金鹏OMC12864-4液晶显示模块(主控芯片T6963C);JZ-M2单片机最小系统(采用STC89C52RC 51系列单片机); 3.3关于OMC12864-4(T6963c)的简介 3.3.1管脚定义见下表(1): 表(1) 3.3.2关于主控芯片T6963C说明: 结构特点: 藏T6963C 的液晶显示模块上已经实现了T6963C 与行、列驱动器与显示缓冲区RAM 的接口,同时也已用硬件设置了液晶屏的结构(单双屏、数据传输方式、显示窗口长度、宽度等等。我们常用的液晶显示模块一般都是单屏结构,因此我们这里只讨论单屏结构的液晶显示模块。藏T6963C 的单屏结构点阵图形液晶显示模块的方框图如图(2): 图(2) ►T6963C 是点阵式液晶图形显示控制器它能直接与8 位微处理器接口; ►T6963C 的字符字体可由硬件或软件设置,其字体有4 种5X8 、6X8 、7X8、8X8; ► T6963C 的占空比可从1/16 到1/128; ►T6963C 可以图形方式、文本方式与图形和文本合成方式进行显示,以与文本方式下的特征显示,还可以实现图形拷贝操作等等; ► T6963C 具有部字符发生器CGROM,共有128 个字符。T6963C 可管理64K显示缓冲区与字符发生器CGRAM,并允许MPU 随时访问显示缓冲区,甚至可以进行位操作。 3.3.3主控芯片T6963C指令说明: 如表(2) 命令 代码(bin) 代码(hex) 参数D1 参数D2 功能 Status S0-S7 - - 读状态 Reg Seting 00100001 21H XAddress yAddress 设光标指针 00100010 22H 偏移量 00H 设偏移量寄存器 00100100 24H 低位地址 高位地址 设地址指针 Set Control Word 01000000 40H 低位地址 高位地址 设文字区起始地址 01000001 41H 字节数 00H 设文字区宽度 01000010 42H 低位地址 高位地址 设图形区起始地址 01000011 43H 字节数 00H 设图形区宽度 Mode set 1000*000 80H/88H OR *=0部字符发生器 *=1外部字符发生器 1000*001 81H/89H XOR 1000*011 83H/8BH AND 1000*100 84H/8CH 文字属性 Display Molde 10010000 90H 显示关 1001xx10 92H 光标显示,闪烁关 1001xx11 93H 光标显示,闪烁开 100101xx 94H 文字开,图形关 100110xx 98H 文字关,图形开 100111xx 9BH 文字开,图形开 Cursor Pattern 10100D2-0 A0H-A8H 光标高度 Data Auto Read/write 10110000 B0H 设置数据自动写 10110001 B1H 设置数据自动读 10110010 B2H 退出自动读写 Data Read/write 11000000 C0H 显示数据 写数据,地址指针自加1 11000001 C1H - 读数据,地址指针自加1 11000010 C2H 显示数据 写数据,地址指针自减1 11000011 C3H - - 读数据,地址指针自减1 11000100 C4H 显示数据 - 写数据,地址指针不变 11000101 C5H - - 读数据,地址指针不变 Screen peek 11100000 E0H - - 屏幕读取 Screen copy 11101000 E8H - - 屏幕复制 Bit Set/reset 11110xxxx - - Bit Clear 11111xxxx - - Bit Set 表(2) 4. 系统软件设计(含程序流程图,子程序功能介绍、程序功能注释) 4.1程序流程图,如图(3) 读状态字, 闲吗? N Y 液晶模块初始化 填屏(清屏) 创建CGRAM 图(3) 写英文,写汉字写数字等 4.2子程序功能介绍 LCD_Write_Data()写数据子 LCD_Write_Command0()写无参数命令字 LCD_Write_Command1()写单参数命令字 LCD_Write_Command2()写双参数命令子 void LCD_T6963_Ini()液晶模块初始化工作 void LCD_Fill_All() LCD填充.对LCD的空间填入同一个数据 LCD_Dis_Chi()在主函数中,只要调用这几个函数,就能实现显示的文字显示 LCD_Dis_Str()能利用T9693C部字符发生器CGROM,在液晶屏上显示西文数组 LCD_Mak_Cgr()创建CGRAM,CGRAM中包含能用文本方式显示的自定义字符 LCD_DIS_CHI()利用CGRAM自定字符,以文本方式形式输出 4.3完整程序与其功能注释 ******************************************** 说明: 本程序为T6963C的驱动 功能: 能对OMC12864-4液晶模块硬件进行定义;定义了对液晶模块最层的操作函数, 如:,读状态字函数,读数据函数,写无参数命令字函数,写单参数命令字函数, 字双参数命令字函数,写数据函数 时间: 2011/01/010 修改时间:2011/01/12 HUSTWb wuyong ***************************************************/ /*说明: 本程序主要用来进行文本显示,实现的功能有:显示英文数组,中文数组, 在主函数中可以直接调用的函数有:T6963C初始化程序,液晶屏清零程序 显示英文数组,中文数组.实现了程序的封装. 修改日间:2011/01/12 T6963C命令的定义 ********************************************************************/ //指针设置指令 #define LCD_CUR_POS 0X21 //光标位置设置(只有设置到有效显示地址并打开显示才看 到),双参数(D1水平位置,D2垂直位置) #define LCD_CGR_POS 0X22 //CGRAM偏置地址设置(用来增加自己的符号),双参数(D1 低5位有效,D2=00) #define LCD_ADR_POS 0x24 //地址指针位置(设置读写操作打针) //显示区域设置指令 #define LCD_TXT_STP 0X40 //文本区首址(从此地址开始向屏幕左上角显示字符) #define LCD_TXT_WID 0X41 //文本区宽度(设置显示宽度,N/6式N/8,其中N为X轴的点 数) #define LCD_GRH_STP 0X42 //图型区首址(从此地址开始向屏幕左上角显示点,((有等进 一步确认))为文本方式显示时,显示为文本显示特性 #define LCD_GRH_WID 0X43 //图形区宽度(设置显示宽度,N/6式N/8,其中N为X轴的点 数) //显示方式设置指令,当CG(D3)为0启用CGROM #define LCD_MOD_OR 0X80 //显示方式:逻辑或 #define LCD_MOD_XOR 0X81 //显示方式:逻辑异或 #define LCD_MOD_AND 0x83 //显示方式:逻辑与 #define LCD_MOD_TCH 0x84 //显示方式:文本 //显示开关设置指令,(D0,D1,D2,D3)=1/0 <==========> (光标闪烁,光标显示,文本显示 图形显示)启用/禁用 #define LCD_DIS_SW 0x90 //显示开关设置 //光标开头设置指令 #define LCD_CUR_SHP 0xA0 //光标型形状选择:0xA0-0xA7代表光标占的行数 //自动读写设置指令 #define LCD_AUT_WR 0xB0 //自动写设置 #define LCD_AUT_RD 0xB1 //自动读设置 #define LCD_AUT_OVR 0xB2 //自动读写结束 //数据一次读写设置指令 #define LCD_INC_WR 0xC0 //数据一次写,地址加1 #define LCD_INC_RD 0xC1 //数据一次读,地址加1 #define LCD_DEC_WR 0xC2 //数据一次写,地址减1 #define LCD_DEC_RD 0xC3 //数据一次读,地址减1 #define LCD_ZER_WR 0xc4 //数据一次写,地址不变 #define LCE_ZER_RD 0xc5 //数据一次读,地址不变 //屏读设置指令 #define LCD_SCN_RD 0xE0 //屏读,屏读只能在图形显示区;该指令是把屏上的容 取出来作为数据使用. //屏拷贝 #define LCD_SCN_CP 0xE8 //屏拷贝,该指令将屏上当前地址指针(图形)处开妈的一行 合成显示容拷贝到相对应的图形显示区的一级单元 //位操作指令 #define LCD_BIT_OP 0xFF //该指令可将显示缓冲区单无的某位清零或置位.D0-D1-- 定义D0-D7位;D3--1为置位,D3--0为复位 unsigned char xdata LCD_DAT_ADD _at_ 0x8000; // C/D-P2.0 unsigned char xdata LCD_COM_ADD _at_ 0x8100; // C/D-P2.0 /*********************************************************************** 函数名称:LCD_Write_Data() 功 能:写数据子程序,将数据输入T6963C 入口参数:data 想要写入的数据 出口参数:无 说 明:在写命令之前,状态位D0(STA0),D1(STA1)必须全为1 ***********************************************************************/ void LCD_Write_Data(unsigned char data1) { while(((LCD_COM_ADD)&0x03)!=0x03); LCD_DAT_ADD=data1; } /*********************************************************************** 函数名称:LCD_Write_Command0() 功 能:写无参数命令字程序,将T6963C对应的指令写入,没有参数 入口参数:commond 想要写入的命令字 出口参数:无 说 明:在写命令之前,状态位D0(STA0),D1(STA1)必须全为1 ***********************************************************************/ void LCD_Write_Command0(unsigned char command) { while(((LCD_COM_ADD)&0x03)!=0x03) ; LCD_COM_ADD=command; } /*********************************************************************** 函数名称:LCD_Write_Command1() 功 能:写单参数命令字程序,将T6963C对应的指令写入 入口参数:commond 想要写入的命令字 出口参数:无 说 明:先送数据,再送命令字 ***********************************************************************/ void LCD_Write_Command1(unsigned char command,unsigned char data1) { LCD_Write_Data(data1); LCD_Write_Command0(command); } /*********************************************************************** 函数名称:LCD_Write_Command2() 功 能:写双参数命令子程序,将T6963C对应的指令写入 入口参数:commond 想要写入的命令字 出口参数:无 说 明:先送数据,再送命令字 ***********************************************************************/ void LCD_Write_Command2(unsigned char command,unsigned char data1,unsigned char data2) { LCD_Write_Data(data1); LCD_Write_Data(data2); LCD_Write_Command0(command); } /************************************************************************ 函数名称:LCD_T6963_Ini() 功 能:液晶模块初始化工作 入口参数:无 出口参数:无 说 明:初始化工作的主要要完成对文本方式的RAM起始地址的设定,文本模式的显示 宽度,图形方式的RAM的起始地址,以与其宽度;设置显示方式等工作. **************************************************************************/ void LCD_T6963_Ini(void) { LCD_Write_Command2(LCD_TXT_STP,0x00,0x00); //设置文本方式RAM起始地址 LCD_Write_Command2(LCD_TXT_WID,0x20,0x00); //设置文本方式的宽度,宽 度为N/6或N/8) LCD_Write_Command2(LCD_GRH_STP,0x00,0x08); //设置图形方式RAM起始地 址 LCD_Write_Command2(LCD_GRH_WID,0x20,0x00); //设置图形方式的宽度,宽 度为N/6或N/8) LCD_Write_Command0(LCD_CUR_SHP|0x08); //设置光标的形状 LCD_Write_Command0(LCD_MOD_OR); //设置显示方式为逻辑或方 式 LCD_Write_Command0(LCD_DIS_SW|0x94); //设置文本显示方式 } /*************************************************************************** 函数名称:LCD_Fill_All() 功 能:LCD填充.对LCD的空间填入同一个数据 入口参数:dat 出口参数:无 说 明:填充,主要可用来对液晶进行清屏,只对其填入使屏为白的字就行了 ****************************************************************************/ void LCD_Fill_All(unsigned char dat) { unsigned int i; LCD_Write_Command2(LCD_ADR_POS,0x00,0x00); //置地址指针 LCD_Write_Command0(LCD_AUT_WR); //自动写 for(i=0;i<32767;i++) { while((LCD_COM_ADD&0x08)!=0x08) { LCD_DAT_ADD=dat; //写数据 } } LCD_Write_Command0(LCD_AUT_OVR); //自动写关 LCD_Write_Command2(LCD_ADR_POS,0x00,0x00); //重置地址指针 } /***************************************************************************显示英文数组 函数名称:LCD_Dis_Str() 功 能:能利用T9693C部字符发生器CGROM,在液晶屏上显示西文数组 入口参数:x,y,*wordcode,*wordattr,wordlongth 出口参数:无 说 明:x,y对应是字符在屏上的字符坐标 ****************************************************************************/ LCD_Dis_Str(unsigned char x,unsigned char y,unsigned char *wordcode,unsigned char *wordattr,unsigned char wordlongth) { unsigned char i,xlable,ylable; unsigned int dataadd; dataadd=y*30+x; xlable=dataadd&0xff; ylable=dataadd/256; //计算字符RAM的地址 LCD_Write_Command0(LCD_DIS_SW|0x08); //设置设置显示方式 LCD_Write_Command0(LCD_DIS_SW|0x02); LCD_Write_Command0(0X8c); //设置为文本特征显示方式 LCD_Write_Command2(LCD_ADR_POS,(xlable+0),(ylable+0)); //设置地址 for(i=0;i<wordlongth;i++) //写字符代码,利用部GCROM { LCD_Write_Command1(LCD_INC_WR,wordcode[i]); } LCD_Write_Command2(LCD_ADR_POS,0x00,0x08); //写字符对应的特征位 for(i=0;i<wordlongth;i++) { LCD_Write_Command1(LCD_INC_WR,wordattr[i]); } } /*********************************************************************************建立CGRAM 函数名称:LCD_Mak_Cgr() 功 能:创建CGRAM,CGRAM中包含能用文本方式显示的自定义字符 入口参数:cgramnum 出口参数:无 说 明:在CGRAM中写入字符点阵 **********************************************************************************/ LCD_Mak_Cgr(unsigned char *cgram,unsigned char cgramnum) { unsigned int i; LCD_Write_Command2(LCD_CGR_POS,0x03,0x00); //设置CGRAM偏置地址 LCD_Write_Command2(LCD_ADR_POS,0x00,0x1c); //设置RAM地址指针 LCD_Write_Command0(LCD_AUT_WR); //设置自动写方式 for(i=0;i<cgramnum*16;i++) //写字符点阵 { while(((LCD_COM_ADD)&0X08)!=0X08); LCD_DAT_ADD=cgram[i]; } LCD_Write_Command0(LCD_AUT_OVR); //自动写结束 } /*********************************************************************************显示中文数组 函数名称:LCD_DIS_CHI() 功 能:利用CGRAM自定字符,以文本方式形式输出 入口参数:x,y,*chinacode,codelongth 出口参数:无 说 明:在屏上输出汉字数组 **********************************************************************************/ LCD_Dis_Chi(unsigned char x,unsigned char y,unsigned char *chinacode,unsigned char codelongth) { unsigned char i,xlable,ylable; unsigned int dataadd; LCD_Write_Command0(0x94); //设置设置显示方式 LCD_Write_Command0(LCD_MOD_TCH); //设置为文本特征显示方式 for(i=0;i<codelongth;i++) { if((x+2*i)%30==0) //换行时,地址要加30,否则汉字 会重叠 { y++; } dataadd=y*30+(x+2*i); //计算i字符RAM地址 xlable=dataadd&0xff; ylable=dataadd/8; //计算字符RAM的地址 LCD_Write_Command2(LCD_ADR_POS,xlable,ylable); //设置址 LCD_Write_Command1(LCD_INC_WR,chinacode[i]); //左上 LCD_Write_Command1(LCD_INC_WR,chinacode[i]+2); //右上 LCD_Write_Command2(LCD_ADR_POS,(xlable+32),ylable); //下部分地址// LCD_Write_Command1(LCD_INC_WR,chinacode[i]+1); //左下 LCD_Write_Command1(LCD_INC_WR,chinacode[i]+3); //右上 } } code unsigned char CGRAM[]= { 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,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, 0x04,0x04,0x08,0x08,0x18,0x29,0x4A,0x08,0x09,0x01,0xFF,0x01,0x01,0x01,0x01,0x01, 0x40,0x48,0x58,0x60,0xC0,0x40,0x44,0x44,0x3C,0x00,0xFE,0x00,0x00,0x00,0x00,0x00, 0x01,0x01,0x01,0x7F,0x41,0x41,0x41,0x41,0x7F,0x41,0x01,0x01,0x01,0x01,0x01,0x01, 0x00,0x00,0x04,0xFE,0x04,0x04,0x04,0x04,0xFC,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x0E,0xF8,0x08,0x08,0xFE,0x08,0x1C,0x1A,0x29,0x28,0x48,0x88,0x08,0x08,0x08, 0x10,0x10,0x90,0x50,0x10,0x90,0x50,0x14,0x1E,0xF0,0x10,0x10,0x10,0x10,0x10,0x10, 0x10,0x10,0x10,0x13,0xFC,0x10,0x10,0x13,0x1A,0x31,0xD1,0x10,0x10,0x10,0x51,0x26, 0x40,0x40,0x48,0xFC,0x40,0x40,0x40,0xF8,0x08,0x10,0x10,0xA0,0x40,0xB0,0x0E,0x04, 0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x02,0x02,0x02,0x04,0x04,0x08,0x10,0x60,0x00, 0x00,0x00,0x00,0x00,0x04,0xFE,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x0E,0x04,0x00, 0x22,0x11,0x11,0x00,0x7F,0x40,0x80,0x1F,0x00,0x01,0xFF,0x01,0x01,0x01,0x05,0x02, 0x08,0x08,0x10,0x20,0xFE,0x02,0x04,0xE0,0x40,0x84,0xFE,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,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, }; code unsigned char CHINACODE[]={0x80,0x84,0x88,0x8c,0x90,0x94,0x98,0x9c 0x0a0,0x0a4,0x0a8,0x0ac,0x0b0,0x0b4,0x0b8,0x0bc }; Unsigned`char`WORDCODE[17]={0x57,0x45,0x4C,0x43,0x4F,0x4D,0x45,0x00,0x39,0x4F,0x 55, }; unsignedcharWORDATTR[17]={0x000,/*0x00D,0x00D,0x00D,0x00D,0x00D,0x00D,0x0D,0x00D, 0x00D,0x00D*/ }; main() { LCD_Fill_All(0x00); //全屏清零 LCD_T6963_Ini(); //初始化 LCD_Dis_Str(0,0,WORDCODE,WORDATTR,16); LCD_Mak_Cgr(CGRAM,32); LCD_Di
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服