1、 单片机 课程设计 题目: 基于液晶 12864 的显示器 目录 1. 题目简介 . 1 2. 实现方案 . 1 2.1 12864 液晶显示原理 . 1 2.2 硬件设计方案 . 2 2.3 程序设计方案 . 4 3. 总结 . 16 1 1. 题目简介 通过单片机控制 12864 液晶 显示模块 显示专业、班级、姓名、学号,并且可以通过按键选择菜单界面的切换,可通过矩阵键盘对学号进行修改。 2. 实现方案 2.1 12864 液晶 显示原理 LCD12864 的分辨率为 128x64,对于 16x16 的字体可以显示 4 行 8 列,已满足大部分设备显示的要求,本设计采用以 ST7920
2、为控制器的带有中文字库的12864 液晶显示模块。 文本显示 RAM 提供 8 个 4 行的汉字空间,当写入文本显示 RAM 时,可以分别显示 CGROM、 HCGROM 与 CGRAM 的字型, ST7920 可以显示三种字型 ,分别是半宽的 HCGROM 字型、 CGRAM 字型及中文 CGROM字型。三种字型的选择,由在 DDRAM 中写入的编码选择,在 0000H 0006H的编码中将自动的结合下一个位元组,组成两个位元组的编码达成中文字型的编码( A140 D75F) 。本设计采用 8 位并口传输数据,单片机写入显示模块资料的时序图如下图 1 所示,单片机读取显示模块资料的时序图如图
3、 2 所示。 12864 液晶显示模块 共有 20 个引脚,其中 RS 引脚和数据、命令操作有关, R/W 引脚和读取、写入操作有关, E引脚为使能端, RST引脚为复 位功能,低电平有效, PSB引脚为高电平时是并行口传输模式,反之为串行口传输。 图 1 8 位并口写操作 时序图 2 图 2 8 为并口读操作 时序图 2.2 硬件设计方案 STC89C52RC 单片机是整个系统的控制核心, 通过对其进行编程控制 12864液晶显示模块显示个人信息并通过按键进行修改内容 。当单片机检测到按键按下时 进行相应的操作,包括菜单页面上选择键、下选择键、确定键、返回键,通过矩阵键盘可以对个人信息中的学
4、号进行修改。系统原理图如图 3 所示,电路原理图如下图 4 所示,仿真电路图如图 5 所示。 图 3 系统原理图 控制按键 电源模块 STC89C52RC 12864 液晶显示模 块 时钟电路 3 图 4 电路原理图 图 4 proteus 仿真图 P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RST/VPDP3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDXTAL2XTAL1GND P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7PSENALE/PROGEA/VPPP0.7P0.6P0
5、.5P0.4P0.3P0.2P0.1P0.0VCCU1STC89C52p0.0p0.1p0.2p0.3p0.4p0.5p0.6p0.7p1.0p1.1p1.2p1.3p1.4p1.5p1.6p1.7p2.0p2.1p2.2p2.3p2.4p2.5p2.6p2.7p3.7p3.6p3.5p3.4p3.3p3.2p3.1p3.010KR412Y111.0592MHz10uFC330pFC1GND1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20LCD1286430pFC2123456789R310kp0.7p0.6p0.5p0.4p0.3p0.2p
6、0.1p0.0RESTGNDGNDp0.010KR1p2.0 p2.1 p2.2 p0.1 p0.4p0.2 p0.3 p0.7p0.5 p0.6 p2.5p2.3GNDS2SW-PBS3SW-PBS4SW-PBS5SW-PBS11SW-PBS12SW-PBS13SW-PBS14SW-PBS21SW-PBS31SW-PBS41SW-PBS22SW-PBS32SW-PBS42SW-PBS23SW-PBS33SW-PBS43SW-PBS24SW-PBS34SW-PBS44SW-PBGNDp3.2p3.3p3.4p3.5p1.4p1.5p1.6p1.7p1.0p1.1p1.2p1.3+5+5+5+5
7、GNDUSB-+5POWER104pFC4470uFC5GND4 2.3 程序设计方案 12864 液晶显示模块可以显示 4 行汉字,其 X 坐标如表 1 所示。在程序中首先进行 LCD 初始化,然后进入待机界面,等待按下选择键的操作。选择键 按下后进入主菜单页面,显示四个成员标号,这时可以通过两个选择键控制箭头的移动。此时可以按下确定键,显示出相应的个人信息界面,包括姓名、班级、学号等等,此时可以通过矩阵键盘对学号进行修改, 09 键号对应相应的数字, AF键按下则显示“错 误”,接着显示出正确 的学号。也可以跳过此操作,直接按下返回键,则返回主菜单显示界面,程序流程图如图 5 所示。 表
8、1 X 坐标 第一行 80H 81H 82H 83H 84H 85H 86H 87H 第二行 90H 91H 92H 93H 94H 95H 96H 97H 第三行 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH 第四行 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH 开 始下 选 择 键 按 下 ?等 待N菜 单 界 面Y下 选 择 键 按 下 上 选 择 键 按 下箭 头 移 动 选 择确 定 键 按 下显 示 相 应 的 个人 信 息矩 阵 键 盘 扫 描显 示 键 值 , 修改 学 号返 回 键 按 下返 回 菜 单 界面图 5 程序流程图 源程序: 5
9、 #include #include unsigned char x=0,n=0,i=0,flag=0; sbit PSB=P23; sbit RST=P25; sbit RS=P20; sbit RW=P21; sbit EN=P22; sbit BF=P07; sbit key1=P32; sbit key2=P33; sbit key3=P34; sbit key4=P35; unsigned char code shuzi=0,1,2,3,4,5,6,7,8,9; unsigned char code menu1=“ 1:成员 1 “; unsigned char code menu2
10、=“ 2:成员 2 “; unsigned char code menu3=“ 3:成员 3 “; unsigned char code menu4=“ 4: 成员 4 “; unsigned char code ST1=“姓名: 张三 “; unsigned char code ST2=“班级: 自动化 “; unsigned char code ST3=“学号: 1-1-1-7 “; unsigned char code ST4=“大学 “; unsigned char code SJY1=“姓名: 李四 “; unsigned char code SJY2=“班级:自动化 “; unsi
11、gned char code SJY3=“学号: 1-1-1-8 “; unsigned char code SJY4=“大学 “; unsigned char code SH1=“姓名: 王五 “; unsigned char code SH2=“班级:自动化 “; unsigned char code SH3=“学号: 1-1-1-9 “; unsigned char code SH4=“大学 “; unsigned char code SLC1=“姓名:孙 六 “; unsigned char code SLC2=“班级:自动化 “; unsigned char code SLC3=“学
12、号: 1-1-2-0 “; unsigned char code SLC4=“大学 “; void delay(unsigned int i) unsigned int j; for(;i0;i-) for(j=0;j113;j+); 6 bit busy() bit a; RS=0; RW=1; EN=1; _nop_(); _nop_(); _nop_(); _nop_(); a=BF; EN=0; return a; void Writeorder(unsigned char order) while(busy()=1); RS=0; RW=0; EN=0; P0=order; _nop
13、_(); _nop_(); _nop_(); _nop_(); EN=1; _nop_(); _nop_(); _nop_(); _nop_(); EN=0; void Writedata(unsigned char dat) while(busy()=1); RS=1; RW=0; EN=0; 7 P0=dat; _nop_(); _nop_(); _nop_(); _nop_(); EN=1; _nop_(); _nop_(); _nop_(); _nop_(); EN=0; void chushihua() delay(20); PSB=1; delay(1); RST=0; delay
14、(1); RST=1; delay(10); Writeorder(0x30); delay(5); Writeorder(0x0C); delay(5); Writeorder(0x06); delay(5); Writeorder(0x01); delay(5); void LCD_Write_String(unsigned char x,unsigned char y,unsigned char code *s) switch(y) case 1: Writeorder(0x80+x);break; case 2: Writeorder(0x90+x);break; case 3: Wr
15、iteorder(0x88+x);break; case 4: Writeorder(0x98+x);break; default:break; 8 while(*s!=0) Writedata(*s); s+; delay(30); void k1() if(key1=0) delay(10); if(key1=0) n+; while(!key1); if(n=1) flag=1; Writeorder(0x80); for(i=0;i16;i+) Writedata(menu1i); Writeorder(0x80); Writedata(0x1A); Writeorder(0x90); for(i=0;i16;i+) Writedata(menu2i); Writeorder(0x88); for(i=0;i16;i+) Writedata(menu3i); Writeorder(0x98); for(i=0;i16;i+) Writedata(menu4i); if(n=2) flag=2; Writeorder(0x90); for(i=0;i16;i+) Writedata(menu2i); Writeorder(0x90); Writedata(0x1A);