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

📄 lcd128645zk.c

📁 北京青云公司的LCM128645ZK驱动程序
💻 C
字号:
//writed by mengx 2001.7.27
#include "common.h"
#ifndef _UPSD_H_
	#include <at89x52.h>
#endif

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include <string.h>
#include <intrins.h>
#include <absacc.h>


/* define uchar,uint*/

#define LCD_RST_HI	 PSD8xx_reg.DATAOUT_B|=0x20
#define	LCD_RST_LO   PSD8xx_reg.DATAOUT_B&=~0x20

#define uchar unsigned char
#define uint unsigned int
#define lcd_buff_size	16
#define lcd_refresh_time_set  50		//300ms刷新一次

/*定义lcd命令字和lcd数据输出口*/
#define cls	0x1			/*清屏*/
#define home 0x2		/*光标回原点*/
#define cursor_rr		0x6     /*显示不动,光标右移,DDRAM+1*/
#define cursor_rl		0x4     /*显示不动,光标左移,DDRAM-1*/
#define disp_on 		0xf		/*打开显示*/
#define disp_off 		0xb		/*关闭显示*/
#define cursor_on 		0xc		/*关闭光标显示*/
#define cursor_off 		0xe		/*关闭光标闪烁*/
#define cursor_ctrl		0x14	/*光标向右移动*/
#define ddram_ac 	    0x80	/*设定光标AC位置*/
#define funcset 		0x38    /*设定功能:8位接口,2行显示,5*7点阵*/
#define BG_LIGHT		0x80;	//LCD背光灯控制 P0 bit7 0=off 1=on 



//unsigned char idata lcd_buff[2][lcd_buff_size];

unsigned char idata cursor_position=0;			//光标位置
unsigned char idata lcd_refresh_time;
uchar idata last_row=0x53;


//lcd 并行接口以外设模式访问 wr、rd合成出E信号
#define DATA_RD_PORT	XBYTE [0x030f]		//数据读端口
#define DATA_WR_PORT	XBYTE [0x030e]		//数据写端口
#define COMD_RD_PORT	XBYTE [0x030d]		//命令读端口
#define COMD_WR_PORT	XBYTE [0x030c]		//命令写端口


#define data_port	P0	//P1
sbit	RS=P2^0;		//P3^2
sbit	RW=P2^1;		//P3^3
sbit	E=P2^2;			//P3^4

//char	xdata 	___scr_buffer[MAX_ROW * MAX_COL+20];


#if(0)
//读取忙标志和ac值
unsigned char lcd_read_busy(void)
{unsigned char data busy;
	data_port=0xff;		//置P0口位高阻输入状态	
	RS=0;RW=1;E=1;
	busy=data_port;
	E=0;
	return (busy);
}
//写命令到lcd
void lcd_write_command(unsigned char data_com)
{	unsigned char i=120;
    ET0 = 0;
	data_port=data_com;
	RS=0;RW=0;E=1;
	E=0;
    ET0 = 1;
	while(lcd_read_busy()&0x80&&i)i--;

}
//写数据到lcd
void lcd_write_data(unsigned char data_com)
{	unsigned char i=120;
    ET0 = 0;
	data_port=data_com;
	RS=1;RW=0;E=1;
	E=0;
    ET0 = 1;
	while(lcd_read_busy()&0x80&&i)i--;
}

#else

/*读取忙标志和ac值*/
unsigned char lcd_read_busy(void)
{unsigned char data busy;
	busy=COMD_RD_PORT;
	return (busy);
}
//写命令到lcd
void lcd_write_command(unsigned char data_com)
{	unsigned char i=120;
	while(lcd_read_busy()&0x80&&i)i--;
	COMD_WR_PORT=data_com;
}
//写数据到lcd
void lcd_write_data(unsigned char data_com)
{	unsigned char i=120;
	while(lcd_read_busy()&0x80&&i)i--;
	DATA_WR_PORT=data_com;
}

#endif

/*设定ddram ac位置,在该位置写入、显示数据*/
void set_ddram_ac(unsigned char ac)
{
	lcd_write_command(ac|ddram_ac);
}

void lcd_init(void)
{		
		LCD_RST_LO;
		LCD_RST_HI;
		lcd_write_command(funcset);   
		lcd_refresh_time=0x10;
//		while(lcd_refresh_time);
		lcd_write_command(funcset);   
		lcd_refresh_time=0x10;
//		while(lcd_refresh_time);
		lcd_write_command(disp_on);
		lcd_refresh_time=0x1;
//		while(lcd_refresh_time);
		lcd_write_command(cursor_rr);
		lcd_refresh_time=0x1;
//		while(lcd_refresh_time);
		lcd_write_command(cls);
		lcd_refresh_time=0x10;
//		while(lcd_refresh_time);
		lcd_write_command(cursor_on);
		lcd_refresh_time=0x5;
//		while(lcd_refresh_time);
		lcd_write_command(0x0f);
		lcd_refresh_time=0x5;
//		while(lcd_refresh_time);
//		lcd_write_command(cursor_on);
		lcd_refresh_time=0x5;
//		while(lcd_refresh_time);
		lcd_write_command(disp_off);
		lcd_refresh_time=0x5;
//		while(lcd_refresh_time);
		lcd_write_command(disp_on);
		lcd_refresh_time=0x5;
//		while(lcd_refresh_time);



/*
		lcd_write_command(0x34);		//8bit 扩充指令
		lcd_refresh_time=0x1;
		while(lcd_refresh_time);
		lcd_write_command(0x06);		//反白显示
		lcd_refresh_time=0x1;
		while(lcd_refresh_time);
		lcd_write_command(0x30);		//8bit 扩充指令
		lcd_refresh_time=0x1;
		while(lcd_refresh_time);
*/
		memset(&___scr_buffer,' ',sizeof(___scr_buffer));

}


/***********反白显示某行******************/
void	invert_line(uchar row)
{
	if(last_row!=row){
		lcd_write_command(cls);
		lcd_write_command(0x34);		//8bit 扩充指令
		lcd_write_command(0x04|(row&0x03));		//反白显示
		lcd_write_command(0x38);		//8bit 基本指令
		last_row=row;
	}
}




/*显示数据,在主程序中调用*/
void lcd_disp(void)
{unsigned char xdata *ptr,*ptr1;
 unsigned char i;
	if(RunSta.lcd_timer==0){
		if(Msgbuff.delay && RunSta.debug_fg==0){
			ptr=&Msgbuff.buff;
		}else{
			ptr=&___scr_buffer;
		}
		ptr1=ptr;
//		cursor_position=lcd_read_busy();		//保存光标位置
		 lcd_write_command(home);
		 for(i=0;i<64;i++){
		 	 if(i==16){
				ptr1=ptr+32;
			 }
			 else{
			 	 if(i==32){
					ptr1=ptr+16;
				 }
				 else{
				 	 if(i==48){
						ptr1=ptr+48;
					 }
				 }
			 }
			 if(*ptr1==0x00){
			 	*ptr1=0x20;
			 }
			 lcd_write_data(*ptr1++);
		 }
		 RunSta.lcd_timer=lcd_refresh_time_set;
 		if(___cursor_on){					//如果光标显示功能打开
			switch(wherey()&0x03){
				 case 0:i=0;break;
				 case 1:i=16;break;
				 case 2:i=8;break;
				 case 3:i=24;break;
			}
		 	set_ddram_ac(i+wherex()/2);	//设定光标位置
		}
	}
//	set_ddram_ac(cursor_position&0x7f);			//恢复光标位置
}

⌨️ 快捷键说明

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