lcd12864.c

来自「我写的针对lpc2141的ucos源码」· C语言 代码 · 共 226 行

C
226
字号
#include <LPC214X.h>
#include <string.h>
#include "LCD12864.h"
#include "delay.h"
#include "type.h"

#define DI 0x01<<11
#define RW 0x01<<12
#define EN 0x01<<13

#define PSB 0X01

#define BF 0x80
#define FUNCTION_SET 0X30
#define FUNCTION_EXT 0X34

#define DISPLAY_ON  0X0C
#define DISPLAY_OFF 0X08

/* P1.16~P1.23*/     
#define FIO1DIR2          (*((volatile unsigned char *) 0x3FFFC022))        
#define FIO1MASK2		  (*((volatile unsigned char *) 0x3FFFC032))
#define FIO1PIN2          (*((volatile unsigned char *) 0x3FFFC036))
#define FIO1SET2          (*((volatile unsigned char *) 0x3FFFC03A)) 
#define FIO1CLR2          (*((volatile unsigned char *) 0x3FFFC03E))

/* P1.24~P1.32*/
#define FIO1DIR3          (*((volatile unsigned char *) 0x3FFFC023))        
#define FIO1MASK3		  (*((volatile unsigned char *) 0x3FFFC033))
#define FIO1PIN3          (*((volatile unsigned char *) 0x3FFFC037))
#define FIO1SET3          (*((volatile unsigned char *) 0x3FFFC03B)) 
#define FIO1CLR3          (*((volatile unsigned char *) 0x3FFFC03F)) 


static uint16 gbuffer[512];
static void draw_point(uint16 position,uint8 i);


void lcd_check_busy()
{
	while((lcd_read_status()&BF)==BF) {;}
}

void lcd_send_command(uint8 command)
{
	FIO1PIN2=command;
	
	IO0CLR=DI;//DI=L,RW=L
	IO0CLR=RW;
	//delay(10);
	IO0SET=EN;
	//delay(10);
	IO0CLR=EN;
	//delay(10);
}

void lcd_write_data(uint8 data)
{
	FIO1PIN2=data;
	
	IO0SET=DI;
	IO0CLR=RW;
	//delay(10);
	IO0SET=EN;
	delay(1); //don't remove this delay
	IO0CLR=EN;
	//delay(10);
}

uint8 lcd_read_status()
{
	uint8 status;
	FIO1DIR2=0X00;//数据口设为输入
	
	IO0CLR=DI;
	IO0SET=RW;//DI=L,RW=H;
	//delay(1);
	IO0SET=EN;
	//delay(1);
	status=FIO1PIN2;
	IO0CLR=EN;
	
	FIO1DIR2=0XFF;//数据口重新设为输出
	//delay(10);
	return status;
}
	
void lcd_init()
{	
	SCS=0x02;//P1使用增强IO模式
	
	
	//液晶所用端口功能选择
	//方向选择
	IO0DIR|=DI|RW|EN;	//控制线端口初始化为输出
	IO0CLR=DI|RW|EN;
	
	
	FIO1DIR2|=0XFF;  //数据接口初始化为输出
	
	delay(100*1000);
	
	FIO1DIR3|=PSB;  //片选端口初始化为输出
	FIO1SET3|=PSB;  //并行方式

	lcd_send_command(FUNCTION_SET);
	delay(80*1000);
	//lcd_check_busy();
	
	lcd_send_command(FUNCTION_SET);
	delay(80*1000);

	
	lcd_send_command(FUNCTION_SET);
	delay(80*1000);	
	
	lcd_send_command(FUNCTION_SET);
	lcd_check_busy();
	lcd_send_command(DISPLAY_ON);
	lcd_check_busy();
	lcd_send_command(0x01);//清屏
	lcd_check_busy();
	lcd_send_command(0x06);//输入模式
	lcd_check_busy();
	lcd_send_command(0x02);//set home
	lcd_check_busy();
/**/	
	
}

void fill_screen() 
{	
	uint8 v,h;
	SC(0x34);

	for(v=0X80;v<0xA0;v++) {
		SC(v);//垂直坐标
		SC(0x80);//水平坐标
		for(h=0;h<16;h++) {
			WD(0xFF);
			WD(0xFF);
		}
	}
	SC(0x36);
}

void clean_screen()
{
	uint8 v,h;
	SC(0x34);
	
	for(v=0X80;v<0xA0;v++) {
		SC(v);//垂直坐标
		SC(0x80);//水平坐标
		for(h=0;h<16;h++) {
			WD(0x00);
			WD(0x00);
		}
	}
	SC(0x36);
}

void lcd_update_screen()
{
	uint8 v,h;
	
	SC(0X34);
	for(v=0;v<32;v++) {
		SC(v+0x80);
		SC(0X80);
		for(h=0;h<16;h++) {
			WD(gbuffer[16*v+h]>>8);
			WD(gbuffer[16*v+h]);
		}
	}			
	SC(0X36);
}

void update_gbuffer(uint16 *result)
{
	uint8 i,j,n;
	memset(gbuffer,0,sizeof(gbuffer));
	for(i=0;i<127;i++) {
		draw_point(result[i],i);
		if( (result[i]>result[i+1]) && (n=(result[i]-result[i+1]))>1 ) {
			for(j=1;j<=n/2;j++)	{
				draw_point(result[i]-j,i);
				draw_point(result[i+1]+j,i+1);
			}
		}
		else if ( (result[i]<result[i+1]) && (n=(result[i+1]-result[i]))>1 ) {
			for(j=1;j<=n/2;j++)	{
				draw_point(result[i]+j,i);
				draw_point(result[i+1]-j,i+1);
			}				
		}
/*		offset=15-i%16;
		if(result[i]>=32) {
			y=63-result[i];
			x=i/16;
		} else {
			y=31-result[i];
			x=i/16+8;
		}
		gbuffer[16*y+x]|=(uint16)0x0001<<offset;
*/
	}
	draw_point(result[127],127);
}

static void draw_point(uint16 position,uint8 i)
{
	uint8 offset,x,y;
	offset=15-i%16;
	if(position>=32) {
		y=63-position;
		x=i/16;
	} else {
		y=31-position;
		x=i/16+8;
	}
	gbuffer[16*y+x]|=(uint16)0x0001<<offset;	
}


⌨️ 快捷键说明

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