12864液晶显示器(ST7920)基本显示程序(串口)
其实学校实验室里对每一组都发了一块12864供同学们使用,那个液晶显示器用的是6963的控制器。在网上找了半天也没找到相对应的PDF资料,一怒之下我就买了块ST7920控制的12864。今天把他的基本显示程序搞出来了,拿来秀一下……
哦,我先把我这个12864的20个引脚简单的说一下吧,省的同学们找错程序。
管脚号 | 管脚名称 | 电平 | 管脚功能描述 |
1 | VSS | 0V | 电源地 |
2 | VCC | 3.0+5V | 电源正 |
3 | V0 | – | 对比度(亮度)调整 |
4 | RS(CS) | H/L | RS=“H”,表示DB7——DB0为显示数据 RS=“L”,表示DB7——DB0为显示指令数据 |
5 | R/W(SID) | H/L | R/W=“H”,E=“H”,数据被读到DB7——DB0 R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR |
6 | E(SCLK) | H/L | 使能信号 |
7 | DB0 | H/L | 三态数据线 |
8 | DB1 | H/L | 三态数据线 |
9 | DB2 | H/L | 三态数据线 |
10 | DB3 | H/L | 三态数据线 |
11 | DB4 | H/L | 三态数据线 |
12 | DB5 | H/L | 三态数据线 |
13 | DB6 | H/L | 三态数据线 |
14 | DB7 | H/L | 三态数据线 |
15 | PSB | H/L | H:8位或4位并口方式,L:串口方式(见注释1) |
16 | NC | – | 空脚 |
17 | /RESET | H/L | 复位端,低电平有效(见注释2) |
18 | VOUT | – | LCD驱动电压输出端 |
19 | A | VDD | 背光源正端(+5V)(见注释3) |
20 | K | VSS | 背光源负端(见注释3) |
*注释1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。
*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。
时序图:
MPU写资料到ST7920(8位数据线模式)
MPU 从ST7920读资料(8位数据线模式)
外观图:
具体的我就不再赘述了,下面的doc文档里面都有,是我从网上搜刮来的,嘿嘿……
里面的那个程序好像有问题,我烧进89S52之后全是乱码,于是我写了下面这个程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
#include <reg52.h> #include <string.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char /*****************************************************************************/ sbit LCM_psb = P2^3; //H=并口; L=串口; sbit LCM_rst = P2^4; //Reset Signal 低电平有效 sbit LCM_cs = P2^5; sbit LCM_std = P2^6; sbit LCM_sclk = P2^7; sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; uchar code tab1[]={ " ibuly.com " "欢迎使用这个程序" " 纪小年 " " 这人是谁啊? " }; /*****************************************************************************/ //函数声明 void LCM_WriteString(unsigned char *str) ; //写字符 例:LCM_WriteString("您好!"); void LCM_WriteDatOrCom(bit ,unsigned char ); //(0,指令) (1,数据) void DelayM(unsigned int a); //延时 void LCM_init(void); //LCM初始化 void LCM_clr(void); //清屏 void Delay(int num); /*****************************************************************************/ //延时函数 1MS/次 void DelayM(unsigned int a) { unsigned char i; while( --a != 0) { for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。 } //i 从0加到125,CPU大概就耗时1毫秒 } /*****************************************************************************/ //初始化LCM void LCM_init(void) { LCM_rst=1; LCM_psb=0; LCM_WriteDatOrCom (0,0x30); //30---基本指令动作 LCM_WriteDatOrCom (0,0x01); //清屏,地址指针指向00H Delay (100); LCM_WriteDatOrCom (0,0x06); //光标的移动方向 LCM_WriteDatOrCom(0,0x0c); //开显示,关游标 } /*****************************************************************************/ //写指令或数据 (0,指令) (1,数据) void LCM_WriteDatOrCom(bit dat_comm,uchar content) { uchar a,i,j; Delay(50); a=content; LCM_cs=1; LCM_sclk=0; LCM_std=1; for(i=0;i<5;i++) { LCM_sclk=1; LCM_sclk=0; } LCM_std=0; LCM_sclk=1; LCM_sclk=0; if(dat_comm) LCM_std=1; //data else LCM_std=0; //command LCM_sclk=1; LCM_sclk=0; LCM_std=0; LCM_sclk=1; LCM_sclk=0; for(j=0;j<2;j++) { for(i=0;i<4;i++) { a=a<<1; LCM_std=CY; LCM_sclk=1; LCM_sclk=0; } LCM_std=0; for(i=0;i<4;i++) { LCM_sclk=1; LCM_sclk=0; } } } /*****************************************************************************/ void chn_disp (uchar code *chn) { uchar i,j; LCM_WriteDatOrCom (0,0x30); LCM_WriteDatOrCom (0,0x80); for (j=0;j<4;j++) { for (i=0;i<16;i++) LCM_WriteDatOrCom (1,chn[j*16+i]); } } /*****************************************************************************/ //清屏函数 void LCM_clr(void) { LCM_WriteDatOrCom (0,0x30); LCM_WriteDatOrCom (0,0x01); Delay (180); } /*****************************************************************************/ //向LCM发送一个字符串,长度64字符之内。 //应用:LCM_WriteString("您好!"); void LCM_WriteString(unsigned char *str) { while(*str != ' ') { LCM_WriteDatOrCom(1,*str++); } *str = 0; } /*****************************************************************************/ //延时函数 void Delay(int num) { while(num--); } /*****************************************************************************/ //主程序 main() { LCM_init(); //初始化液晶显示器 LCM_clr();//清屏 chn_disp(tab1); //显示欢迎字 while(1){} } |
应小鬼同学的要求,我把12864的硬件图拍了一张,嘿嘿……
在我的片子用了
好酷啊!!!
太专业了…
楼上 我敢说 必须是LED的,可能是计算器用的那种…答对了 小年给奖!
显示器多少寸的。。CRT还是LCD还是LED?
太专业,看不懂
你到底是学什么的呢?