晶联讯LCD(JLX128128G-610-PC)使用教程

模块介绍:拿到板子,首先可以看到这个是3.3V串行的(如果想改成并行,把R1的0Ω电阻拆下来焊在R2处即可)。板子的串行和并行都是虚拟协议,也就是说只需要接到普通I/O口,保证可以调高或拉低电平即可。

例程效果:串行用到的I/O口少(9个+VDD+VSS+LEDA),并行要20个I/O口。本次以串行为实例,用pic驱动LCD。本例程主要用模块内部的字库GB2312,全屏可同时显示8*8个汉字(仅在GB2312中:行数16,列数128),可以根据自己的需求任意摆放汉字位置。

/*
 * File:   main.c
 * Author: zbx
 *
 * Created on 2021?11?17?, ??10:18
 */


// PIC16F19196 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FEXTOSC = ECH    // External Oscillator mode selection bits (EC above 8MHz; PFM set to high power)
#pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with OSCFRQ= 32 MHz and CDIV = 1:1)
#pragma config CLKOUTEN = OFF   // Clock Out Enable bit (CLKOUT function is disabled; i/o or oscillator function on OSC2)
#pragma config VBATEN = OFF     // VBAT Pin Enable bit (VBAT functionality is disabled)
#pragma config LCDPEN = ON      // LCD Charge Pump Mode bit (LCD Charge Pump is enabled)
#pragma config CSWEN = ON       // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (FSCM timer enabled)

// CONFIG2
#pragma config MCLRE = ON       // Master Clear Enable bit (MCLR pin is Master Clear function)
#pragma config PWRTE = OFF      // Power-up Timer selection bits (PWRT disable)
#pragma config LPBOREN = OFF    // Low-Power BOR enable bit (ULPBOR disabled)
#pragma config BOREN = ON       // Brown-out reset enable bits (Brown-out Reset Enabled, SBOREN bit is ignored)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (VBOR) set to 1.9V on LF, and 2.45V on F Devices)
#pragma config ZCD = OFF        // Zero-cross detect disable (Zero-cross detect circuit is disabled at POR.)
#pragma config PPS1WAY = ON     // Peripheral Pin Select one-way control (The PPSLOCK bit can be cleared and set only once in software)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a reset)

// CONFIG3
#pragma config WDTCPS = WDTCPS_31// WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)
#pragma config WDTE = OFF       // WDT operating mode (WDT Disabled, SWDTEN is ignored)
#pragma config WDTCWS = WDTCWS_7// WDT Window Select bits (window always open (100%); software control; keyed access not required)
#pragma config WDTCCS = SC      // WDT input clock selector (Software Control)

// CONFIG4
#pragma config BBSIZE = 512     // Boot Block Size Selection bits (Boot Block Size (Words) 512)
#pragma config BBEN = OFF       // Boot Block Enable bit (Boot Block disabled)
#pragma config SAFEN = OFF      // SAF Enable bit (SAF disabled)
#pragma config WRTAPP = OFF     // Application Block Write Protection bit (Application Block NOT write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block NOT write-protected)
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration Words NOT write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM NOT write-protected)
#pragma config WRTSAF = OFF     // Storage Area Flash Write Protection bit (SAF NOT write-protected)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/Vpp pin function is MCLR.)

// CONFIG5
#pragma config CP = OFF         // UserNVM Program memory code protection bit (UserNVM code protection disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.


#include <xc.h>

#define _XTAL_FREQ 32000000




void IO_init()
{
    TRISAbits.TRISA2=0;//A2__CS
    ANSELAbits.ANSA2=0;
    TRISCbits.TRISC6=0;//C6__RS
    ANSELCbits.ANSC6=0;
    TRISFbits.TRISF2=0;//F2__SCK
    ANSELFbits.ANSF2=0;
    TRISEbits.TRISE1=0;//E1__SDA
    ANSELEbits.ANSE1=0;
    TRISAbits.TRISA1=0;//A1__rst
    ANSELAbits.ANSA1=0;
    
    
    TRISBbits.TRISB3=0;//B3__Rom_CS
    ANSELBbits.ANSB3=0;
    TRISCbits.TRISC5=0;//C5__Rom_SCK
    ANSELCbits.ANSC5=0;
    TRISAbits.TRISA0=0;//A0__Rom_OUT
    ANSELAbits.ANSA0=0;
    TRISGbits.TRISG2=0;//G2__Rom_IN
    ANSELGbits.ANSG2=0;
}


void transfer_command(unsigned char cmd)
{

    PORTAbits.RA2=0;
    PORTCbits.RC6=0;
    for(int k=0;k<8;k++)
    {
        PORTFbits.RF2=0;
        if(cmd&0x80) PORTEbits.RE1=1;
        else PORTEbits.RE1=0;
        PORTFbits.RF2=1;
        cmd=cmd<<=1;
    }
    PORTAbits.RA2=1;
}


void transfer_data(unsigned char dat)
{
    PORTAbits.RA2=0;
    PORTCbits.RC6=1;
    for(int k=0;k<8;k++)
    {        
        PORTFbits.RF2=0;
        if(dat&0x80) PORTEbits.RE1=1;
        else PORTEbits.RE1=0;
        PORTFbits.RF2=1;
        dat=dat<<=1;
    }
    PORTAbits.RA2=1;
}


void initial_lcd()
{
    PORTAbits.RA1=0;
    __delay_ms(500);
    PORTAbits.RA1=1;
    __delay_ms(100);
    
    transfer_command(0x2c);
    __delay_ms(200);
    transfer_command(0x2e);
    __delay_ms(200);
    transfer_command(0x2f);
    __delay_ms(10);
    
    transfer_command(0xae);
    transfer_command(0x38);
    transfer_command(0xb8);
    transfer_command(0xc8);
    transfer_command(0xa0);
    
    transfer_command(0x44);
    transfer_command(0x00);
    transfer_command(0x40);
    transfer_command(0x00);
    
    transfer_command(0xab);
    transfer_command(0x67);
    transfer_command(0x27);
    transfer_command(0x81);
    transfer_command(0x28);
    
    transfer_command(0x56);
    transfer_command(0xf3);
    transfer_command(0x04);
    transfer_command(0x93);
    
    transfer_command(0xaf); 
}


void lcd_address(unsigned char page,unsigned char column)
{
	PORTAbits.RA2=0;
	column=column;
	page=page-1;
	transfer_command(0xb0+page);
	transfer_command(((column>>4)&0x0f)+0x10);
	transfer_command(column&0x0f);
}

void clear_screen()
{	
	unsigned char i,j;
	for(j=0;j<16;j++)
	{
		lcd_address(j+1,0);
		for(i=0;i<128;i++)
		{
			transfer_data(0x00);		
			transfer_data(0x00);
		}
	}
}


void display_32x32(unsigned char page,unsigned char column,unsigned char *dp)
{
	int i,j;
	for(j=0;j<4;j++)
	{
		lcd_address(page+j,column);
		for(i=0;i<32;i++)
		{
			transfer_data(*dp);
			transfer_data(*dp);
			dp++;
		}
	}
	
}


void display_graphic(unsigned char *dp)
{
	int i,j;
	for(j=0;j<16;j++)
	{
		lcd_address(j+1,0);
		for(i=0;i<128;i++)
		{
			transfer_data(*dp);
			transfer_data(*dp);
			dp++;	
		}
	}
}


void send_command_to_ROM(unsigned char datu)
{
	unsigned char i;
	for(i=0;i<8;i++ )
	{
		if(datu&0x80)
			PORTGbits.RG2 = 1;
		else
			PORTGbits.RG2 = 0;
			datu = datu<<1;
			PORTCbits.RC5=0;
			PORTCbits.RC5=1;
			__delay_us(1);
	}
}


static unsigned char get_data_from_ROM( )
{
	unsigned char i;
	unsigned char ret_data=0;
	PORTCbits.RC5=1;
	for(i=0;i<8;i++)
	{
		PORTAbits.RA0=1;
		PORTCbits.RC5=0;
		ret_data=ret_data<<1;
		if(PORTAbits.RA0)
			ret_data=ret_data+1;
		else
			ret_data=ret_data+0;
		PORTCbits.RC5=1;
		__delay_us(1);
	}
	return(ret_data);
}


void get_and_write_16x16(unsigned long fontaddr,unsigned char page,unsigned char column)
{
	unsigned char i,j,disp_data;
	PORTBbits.RB3 = 0;
	send_command_to_ROM(0x03);
	send_command_to_ROM((fontaddr&0xff0000)>>16);
	send_command_to_ROM((fontaddr&0xff00)>>8);	
	send_command_to_ROM(fontaddr&0xff);	
	for(j=0;j<2;j++)
	{
		lcd_address(page+j,column);
		for(i=0; i<16; i++ )
	  {
			disp_data=get_data_from_ROM();
			transfer_data(disp_data);	
			transfer_data(disp_data);	
		}
	}
	PORTBbits.RB3=1;
}

void get_and_write_8x16(unsigned long fontaddr,unsigned char page,unsigned char column)
{
	unsigned char i,j,disp_data;
	PORTBbits.RB3 = 0;
	send_command_to_ROM(0x03);
	send_command_to_ROM((fontaddr&0xff0000)>>16);	
	send_command_to_ROM((fontaddr&0xff00)>>8);		
	send_command_to_ROM(fontaddr&0xff);				 
	for(j=0;j<2;j++)
	{
		lcd_address(page+j,column);
		for(i=0; i<8; i++ )
	  {
			disp_data=get_data_from_ROM();
			transfer_data(disp_data);	
			transfer_data(disp_data);
		}
	}
	PORTBbits.RB3=1;
}


unsigned long  fontaddr=0;
void display_GB2312_string(unsigned char page,unsigned char column,unsigned char *text)
{
	unsigned char i= 0;			
	while((text[i]>0x00))
	{
		if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1))
		{						
			
		
			fontaddr = (text[i]- 0xb0)*94; 
			fontaddr += (text[i+1]-0xa1)+846;
			fontaddr = (unsigned long)(fontaddr*32);

			get_and_write_16x16(fontaddr,page,column);	 
			i+=2;
			column+=16;
			
		}

		else if(((text[i]>=0xa1) &&(text[i]<=0xa3))&&(text[i+1]>=0xa1))
		{						
			
			
			fontaddr = (text[i]- 0xa1)*94; 
			fontaddr += (text[i+1]-0xa1);
			fontaddr = (unsigned long)(fontaddr*32);
	
			get_and_write_16x16(fontaddr,page,column);
			i+=2;
			column+=16;
		}
		else if((text[i]>=0x20) &&(text[i]<=0x7e))	
		{									
			fontaddr = (text[i]- 0x20);
			fontaddr = (unsigned long)(fontaddr*16);
			fontaddr = (unsigned long)(fontaddr+0x3cf80);			

			get_and_write_8x16(fontaddr,page,column);	
			i+=1;
			column+=8;
		}
		else
			i++;	
	}	
}


void main(void)
{
    IO_init();
	initial_lcd();
	transfer_command(0xaf);
    clear_screen();
	while(1)
	{ 

        display_GB2312_string(3,1,"电 压 :");
        display_GB2312_string(7,1,"电 量 :");
        display_GB2312_string(11,1,"充 电 :");
        display_GB2312_string(15,1,"输 出 :");
	}
}

效果图:

 另外,补充两个正反转换的命令,输入这个命令后,后面的输出字符都反转180度。(如果不输入,默认“正”)

        transfer_command(0xc8);		//positive正
        transfer_command(0xa0);
        


        transfer_command(0xc0);		//negative反
        transfer_command(0xa1);		

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值