⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 PIC24fj64ga006 芯片 8803控制器lcd驱动
💻 C
字号:
#include "lcd.h"
#include "tool.h"
#include <p24fj64ga006.h>

#define lcd_rst_dir TRISDbits.TRISD7
#define lcd_rst     PORTDbits.RD7

#define lcd_cs1_dir TRISDbits.TRISD6
#define lcd_cs1     PORTDbits.RD6

#define lcd_wr_dir TRISDbits.TRISD4
#define lcd_wr     PORTDbits.RD4

#define lcd_rd_dir TRISDbits.TRISD5
#define lcd_rd     PORTDbits.RD5

#define lcd_rs_dir TRISBbits.TRISB15
#define lcd_rs     PORTBbits.RB15

#define lcd_data_dir TRISE
#define lcd_data     PORTE

/*****************************************/
//写ddram
/*****************************************/
void lcd_datawrite(uchar wdata)
{
//	delay(10);
	
	lcd_cs1 = 0; delay(1);
	lcd_rs = 1; delay(1);
	lcd_wr = 0; delay(1);
	lcd_rd = 1; delay(1);
	lcd_data = wdata; 
	
	delay(10);

	lcd_wr = 1; delay(1);
	lcd_rs = 1; delay(1);
	lcd_cs1 = 1; delay(1);
}

/*****************************************/
//写寄存器
/*****************************************/
void lcd_regwr(uchar reg)
{
	 
	lcd_cs1 = 0; delay(1);
	lcd_rs = 0; delay(1);
	lcd_wr = 0; delay(1);
	lcd_rd = 1; delay(1);
	lcd_data = reg;
	
	delay(10);
	
	lcd_wr = 1; delay(1);
	lcd_rs = 1; delay(1);
	lcd_cs1 = 1; delay(1);
}

/*****************************************/
//读寄存器
/****************************************/
uchar lcd_dataread(uchar regname)
{
	lcd_regwr(regname);
	uchar rdata;
	lcd_data_dir = 0xff;Nop();
	lcd_cs1 = 0; delay(1);
	lcd_rs = 0; delay(1);
	lcd_wr = 1; delay(1);
	lcd_rd = 0; delay(1);
	rdata = lcd_data; 
	
	delay(10); 

	lcd_rd =1; delay(1);
	lcd_rs = 1; delay(1);
	lcd_cs1 = 1; delay(1);
	lcd_data_dir = 0x00;Nop();
	return rdata;
}

void lcd_regwrite(uchar regname,uchar regdata)
{
	lcd_regwr(regname);
//	delay(120);
	lcd_regwr(regdata);
}

void lcd_clear()
{
	uchar rdata;
	lcd_regwrite(0xe0,0x00);
	rdata = lcd_dataread(0xf0);
	rdata |= 0x08;
//	lcd_regwrite(0xf0,0x98);
	lcd_regwrite(0xf0,rdata);
	
	delay1(200);//必须延时100ms左右,否则所要显示的信息前几个不显示
}

void lcd_reset()
{
	delay(120);//等待上电复位
	
//	lcd_rs = 1; delay(1);	
//	lcd_wr = 1; delay(1);
//	lcd_rd = 1; delay(1);
//	lcd_cs1 = 1; delay(1);
	
	lcd_cs1 = 0;
	lcd_rst = 0;delay(250);
	lcd_rst = 1;delay(120);
}
void lcd_initial()
{
	lcd_rs_dir = 0; delay(1);
	lcd_cs1_dir = 0; delay(1);
	lcd_wr_dir = 0; delay(1);
	lcd_rd_dir = 0; delay(1);
	lcd_cs1_dir = 0; delay(1);
	lcd_data_dir = 0; delay(1);
	
  	lcd_regwrite(0x00,0xc9); // lcd control register(lcr)
 	lcd_regwrite(0x01,0xf2); // misc.register(mir)
	lcd_regwrite(0x02,0x10); // advance power setup register(apsr)
	lcd_regwrite(0x03,0x80); // advance display setup regiser(adsr)
	lcd_regwrite(0x80,0x32);//光标闪烁时间
	lcd_regwrite(0x10,0x3e); // cursor control register(ccr)字体加粗开启光标
	lcd_regwrite(0x11,0x30); // distance of word or lines register(dwlr)光标宽度
	lcd_regwrite(0x12,0x91); // memory access mode register(awrr)
	
	lcd_regwrite(0x21,0x27); // display window right register(dwrr)
	lcd_regwrite(0x31,0xef); // display window bottom register(dwbr)
	lcd_regwrite(0x41,0x00); // display window left register(dwlr)
	lcd_regwrite(0x51,0x00); // display window top register(dwtr)
	lcd_regwrite(0x20,0x27); // active window right register(awrr)
	lcd_regwrite(0x30,0xef); // active window bottom register(awbr)
	lcd_regwrite(0x40,0x00); // active window left register(awlr)
	lcd_regwrite(0x50,0x00); // active window top register(awtr)
	lcd_regwrite(0x60,0x00); // cursor position x register(cpxr)
	lcd_regwrite(0x61,0x00); // begin segment position register(bgsg)
	lcd_regwrite(0x70,0x00); // cursor position y register(cpyr)
	lcd_regwrite(0x71,0x00); // shift action range,begin commom register(bgcm)
	lcd_regwrite(0x72,0xef); // shift action range,end commom register(edcm)
	
	//lcd_regwrite(0x80,0xaa); // blink time register(btr)
	lcd_regwrite(0x81,0x00); // frame rate polarity change at common_fa register(fdca)
	lcd_regwrite(0x91,0x00); // frame rate polarity change at common_fb register(fdcb)
	lcd_regwrite(0x90,0x06); // shift clock control register(sccr)
	lcd_regwrite(0xa0,0x11); // interrupt setup & status register(frcb)
	lcd_regwrite(0xa1,0x00); // key scan control register(kscr)
	lcd_regwrite(0xa2,0x00); // key scan data register(ksdr)
	lcd_regwrite(0xa3,0x00); // key scan data expand register(kser)
	
	lcd_regwrite(0xb0,0x27); // interrupt column setup register(intx)
	lcd_regwrite(0xb1,0xef); // interrupt row setup register(inty)
	lcd_regwrite(0xc0,0x00); // touch panel control register(tpcr)
	lcd_regwrite(0xc1,0x0a); // adc status register(adcs)
	lcd_regwrite(0xc8,0x80); // touch panel segment high byte data register(tpxr)
	lcd_regwrite(0xc9,0x80); // touch panel common high byte data register(tpyr)
	lcd_regwrite(0xca,0x00); // touch panel segment/common low byte data register(tpzr)
	lcd_regwrite(0xd0,0x80); // lcd contrast control register (lccr)
	lcd_regwrite(0xe0,0x00); // pattern data register(pdr)
	lcd_regwrite(0xf0,0x90); // font control register(fcr)
	lcd_regwrite(0xf1,0x0f); // font size control register
}
void lcd_init()
{
	lcd_reset();
	lcd_initial();
	lcd_clear();
}

void lcd_xy(uchar x,uchar y)
{
	lcd_regwrite(0x60,x);
	lcd_regwrite(0x70,y);
}

void lcd_character(uchar *ch,uchar count)
{
	int i;
	for(i=0;i<count;i++)
	{
		lcd_datawrite(*ch);
		++ch;
	}
}
void lcd_show(float x,float y,uchar *msg,uchar num)
{
	lcd_regwrite(0x00,0xcd);
	lcd_xy(x*2,y*16);
	lcd_character(msg,num);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -