12864液晶串行显示
这一篇只是简单的介绍了 12864液晶 串行显示一些文字不能显示图片,先看一下 12864 的引脚。
从上面的引脚说明我们可以看出,如果要想串行显示只需要将 4、5、6 引脚接到单片机就行了,同时还需要将 1、15、20 引脚接地,17、19 引脚接电源,注意 17 号引脚所说的低电平有效,并不是将 17 号引脚接地复位功能就可以使用了,而是需要软件置低,为了节省 IO 口要将 17 号引脚置高,置高说明 17 号引脚复位功能不使用。 3 号引脚接一 10k可调变阻以调节12864液晶 的 亮 度 。具 体 接 法 可 参 考 下 图 :
以下是程序:/********************************************************************串行12864液晶显示*引脚说明:CS P1.0SID P1.1SCLK P1.2PSB P1.3RST P1.4Ps:因为PSB和RST我们已经在电路中连接好了,所以这两个引脚没有使用 *********************************************************************** / #include <msp430g2553.h> #define uchar unsigned char #define uint unsigned int/********************************************************************* 名称 : delay()* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。* 输入 : t* 输出 : 无***********************************************************************/ void delay( unsigned int t){ unsigned int i,j;for(i=0; i<t; i++) for(j=0; j<10; j++);}/********************************************************************* 名称 : sendbyte()* 功能 : 按照液晶的串口通信协议,发送数据* 输入 : zdata* 输出 : 无***********************************************************************/ void sendbyte( unsigned char zdata){ unsigned int i; for(i=0; i<8; i++){ if((zdata << i) & 0x80){P1OUT |= BIT1; //SID = 1;} else{P1OUT &= ~BIT1;//SID = 0;}P1OUT &= ~BIT2;//SCLK = 0; P1OUT |= BIT2;//SCLK = 1;}}/********************************************************************* 名称 : write_com()* 功能 : 写串口指令* 输入 : cmdcode* 输出 : 无**********************************************************************/ void write_com( unsigned char cmdcode){P1OUT |= BIT0;//CS = 1;sendbyte(0xf8); //告诉12864接下来传送指令 sendbyte(cmdcode & 0xf0); sendbyte((cmdcode << 4) & 0xf0);delay(2);}
/********************************************************************* 名称 : write_data()* 功能 : 写串口指令* 输入 : cmdcode* 输出 : 无***********************************************************************/ void write_data( unsigned char Dispdata){P1OUT |= BIT0;//CS = 1;sendbyte(0xfa); //告诉12864接下来传送数据 sendbyte(Dispdata & 0xf0); sendbyte((Dispdata << 4) & 0xf0); delay(2);}/********************************************************************* 名称 : lcdinit()* 功能 : 初始化函数* 输入 : cmdcode* 输出 : 无***********************************************************************/ void lcdinit(){/* P1OUT &= ~BIT4;//RST = 0; delay(100);P1OUT |= BIT4;//RST = 1; 这一部分是LCD复位功能,我们已经将复位引脚置高,所以复位功能不能使用了,如果要使用复位功能就将其接到单片机IO口再加上这段函数就行*/delay(20000);write_com(0x30); //基本指令操作delay(50);write_com(0x0c); //显示开 关闭光标delay(50);}/********************************************************************* 名称 : hzkdis()* 功能 : 显示字符串* 输入 : *s* 输出 : 无***********************************************************************/
void hzkdis( char *s){ while(*s > 0){write_data(*s);s++;delay(50);}}/********************************************************************* 名称 : Test()* 功能 : 显示子函数* 输入 : 无* 输出 : 无***********************************************************************/ void Test(){write_com(0x03); //地址归为 delay(50);write_com(0x81); //显示第一行hzkdis("二院科协");write_com(0x91); //显示第二行hzkdis("刘渠");}/********************************************************************* 名称 : Main()* 功能 : 主函数* 输入 : 无* 输出 : 无***********************************************************************/ void main(){P1DIR |= BIT0 + BIT1 + BIT2 +BIT3 + BIT4; WDTCTL = WDTPW + WDTHOLD; //关闭看门狗/* P1OUT &= ~BIT3; PSB = 0; 串并行选择,如果要使用并行方式,只要置高就行,我们已将PSB接地选择了串行这句可以不要*/delay(1);lcdinit();delay(10);
while(1){Test();delay(5000);}}12864 程序的详细分析: void sendbyte( unsigned char zdata){ unsigned int i; for(i=0; i<8; i++){ if((zdata << i) & 0x80){P1OUT |= BIT1; //SID = 1;} else{P1OUT &= ~BIT1;//SID = 0;}P1OUT &= ~BIT2;//SCLK = 0;P1OUT |= BIT2;//SCLK = 1;}}这个函数的功能就是按照12864传送数据的时序图将数据一位一位的传送给12864,这部 分 程 序 需 要 参 照 12864 的 时 序 图 来
if((zdata << i) & 0x80) 这是在判断传送过来的数据 zdata 的每一位数据是 0还是 1, 假设 zadata 是 10101111 来分析一下, 那么就是 zdata 先左进 0 还是10101111 不变,然后与 0x80 进行“与”运算,0x80 就是 10000000, 10101111& 10000000————10000000“与”完之后为 1000000,为非 0,所以 P1OUT 输出 1,然后 i++等于 1;zdata左进 1 为 01011110;再与 0x80 进行“与”运算,结果为 00000000,所以 P1OUT 输出为 0;与 0x80 进行“与”运算,因为 0x80 只有第一位是 1,其他都是 0,所以这样就可以不改变 zdata 的第一位数据而使其他位为 0,如果 zdata 第一位为 1“与”后结果就是非零,就输出 1,反之相反。void write_com(unsigned char cmdcode){P1OUT |= BIT0;//CS = 1;sendbyte(0xf8); //告诉12864接下来传送指令 sendbyte(cmdcode & 0xf0); sendbyte((cmdcode << 4) & 0xf0); delay(2);}传送指令的函数,P1OUT |= BIT0; 先使片选信号为高,接下来才能开始传送数据,sendbyte(0xf8);0xf8可以从12864的使用手册中查出来他是告诉12864接下来传送的是指令。然后把数据分两次传送过去。Ps:本程序所使用单片机为 MSP430.
文章原创来于12864:http://www.hzjingxian.com/zixun/xydt/932.html,转载请注明出处