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

📄 lcd.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 2 页
字号:
//文件名:     lcd_ctrol.c
//功  能:     LCD源程序
//版本号:     V1.2
//日  期:     2003.2.17
//历史纪录:   在lcd_ctrol.c基础上修改:LCD显示以行刷新

#include "include.h"

uchar u1,u2,u3,u4,u5,u6=0;
/*
uchar zimobuf[32] = 
{
//	0x7e,0x42,0x7e,0xff,0x89,0xf7,0x78,0x49,0x79,0x01,0xff,0x00,0x00,0x00,0x00,0x07,
//	0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x00	
//	0x80,0x40,0x20,0xf8,0x00,0x00,0x01,0x01,0x01,0x07,0x01,0x00,
	0xf0,0xf8,0x0c,0xc4,0x0c,0xf8,0xf0,0x00,0x03,0x07,0x0c,0x08,0x0c,0x07,0x03,0x00
};
*/
//==============================================================================
void _write_cpld(uint _addr, uchar _date)
{
	//PSD8xx_reg.PAGE|=0x40;
	XBYTE[_addr]=_date;
	//PSD8xx_reg.PAGE&=0xbf;
}

void write_cpld_u5(uchar enable_bit, uchar logic)
{
	if(logic)
		u5 |= enable_bit;
	else
		u5 &= ~enable_bit;

	_write_cpld(0x8104,u5);
}

void write_cpld_u6(uchar enable_bit, uchar logic)
{
	if(logic)
		u6 |= enable_bit;
	else
		u6 &= ~enable_bit;

	_write_cpld(0x8105,u6);
}


void Writ_cpld(uchar enable_bit, uchar logic)
{
	if(logic)
		u4 |= enable_bit;
	else
		u4 &= ~enable_bit;

	_write_cpld(0x8103,u4);
}

/***********************************************************
*函数名: wrt_lcd_cmd()
*输入:   uchar  byte  -- 要输入的命令
*输出:   void
*功能:   向lcd中写入一字节命令
***********************************************************/
void wrt_lcd_cmd(uchar byte)
{
	write_cpld_u5(EN_lcd,1);
	write_cpld_u5(W_R_lcd,0); //RW=0;        //读写控时位
	write_cpld_u5(D_I_lcd,0); //CD=0;        //数据类型控制位

	_write_cpld(0x8102,byte);
	
	write_cpld_u5(EN_lcd,0);
}

/***********************************************************
*函数名: wrt_lcd_data(uchar ubyte)
*输入:   uchar  ubyte  -- 要输入的数据
*输出:   void
*功能:   向lcd中写入一字节数据
*描叙:   用MCU模拟6800时序与LCM通讯
***********************************************************/
void wrt_lcd_data(uchar byte)
{

	write_cpld_u5(EN_lcd,1);
	write_cpld_u5(D_I_lcd,1);  //CD=1;
	write_cpld_u5(W_R_lcd,0);  //RW=0;

	_write_cpld(0x8102,byte);

	write_cpld_u5(EN_lcd,0);
}


/***********************************************************
*函数名: select_p(uchar d_page)
*输入:   uchar  (输入的开通显示区号):0-选左64列,1-选中64列,2-选右64列,>=3-不选
*输出:   void  
*功能:   选择开放显示区
***********************************************************/
void select_p(uchar d_page)
{
	uchar EAStatus;
	EAStatus = EA;
	EA = 0;
	switch(d_page)
	{
		case 0:
			write_cpld_u5(Cs1_lcd,0);//Cs1_lcd=csb
			write_cpld_u5(Cs2_lcd,1); //Cs2_lcd=csa
			write_cpld_u5(Cs3_lcd,1);
			break;
	  	case 1:
			write_cpld_u5(Cs1_lcd,1);
			write_cpld_u5(Cs2_lcd,0);
			write_cpld_u5(Cs3_lcd,1);
			break;
	  	case 2:
			write_cpld_u5(Cs1_lcd,1);
			write_cpld_u5(Cs2_lcd,1);
			write_cpld_u5(Cs3_lcd,0);
			break;
	  	     
	  	default:
			write_cpld_u5(Cs1_lcd,1);
			write_cpld_u5(Cs2_lcd,1);
			write_cpld_u5(Cs3_lcd,1);
			break;

	}
	EA = EAStatus;
}

/***********************************************************
*函数名: init_lcd(uchar ubyte)
*输入:   uchar  ubyte --初始化状态字
			0x3e 关显示;
			0x3f 开显示;
			0x0c0 定义显示起始行
*输出:   void 
*功能:   LCD模块初始化显示 
***********************************************************/
void init_lcd(uchar ubyte)
{
	uchar i=0;
	
	write_cpld_u5(W_R_lcd,0);//RW=1;
	write_cpld_u5(EN_lcd,0);
	write_cpld_u5(D_I_lcd,0);//CD=0;
	
	do
	{
	    select_p(i);
	    wrt_lcd_cmd(ubyte);            //开显示
	    i++;
	}while(i<3);
	select_p(3);
}

//初始化LCD显示
//开显示,并定义显示起始行(0)
void InitialLCD(void)
{
	_nop_ ( );
	init_lcd(0x3e);   //关显示
    _nop_ ( );
	init_lcd(0x3f);   //开显示
    _nop_ ( );
	init_lcd(0x0c0); //设置显示起始行第0行开始
}

/***********************************************************
*函数名: con_data(uchar len,uchar *databuf)
*输入:   uchar  len  -- 取反数据的长度
*         uchar  *databuf  -- 传入数据指针
*
*输出:   void
*功能:   反白显示数据时将 len 长度的 字模数据 按位取反
***********************************************************/
void con_data(uchar len,uchar *databuf)
{
	uchar i;
//	uchar *p,i;
//	p=databuf;
	for(i=0;i<len;i++)
	{
		*databuf=~*databuf;
		databuf++;
	}
}

static int is_gb13000(unsigned char *str)
{
    return (((*(uchar*)(str) > 0x80) && (*(uchar*)(str) < 0xff)) &&
		(((*(uchar*)(str+1) > 0x3f) && (*(uchar*)(str+1) < 0x7f)) ||
		((*(uchar*)(str+1) > 0x7f) && (*(uchar*)(str+1) < 0xff))));
}

int is_chinese(unsigned char *str)
{
	return is_gb13000(str);
}

unsigned int _gb13000_index(unsigned char const *s)
{
	unsigned char s0, s1;
	unsigned int result;
    s0 = *s;
    s1 = *(s+1);

    if(s0>=0xa1&&s0<=0xa9&&s1>=0xa1&&s1<=0xfe)
    {
       return (s0 - 0xa1)*94 + (s1 - 0xa1);
    }
    else if(s0>=0xb0&&s0<=0xf7&&s1>=0xa1&&s1<=0xfe)
    {
       return (s0 - 0xb0)*94 + (s1 - 0xa1) +1038;
    }
    else if(s0>=0x81&&s0<=0xa0&&s1>=0x40&&s1<=0xfe)
	{
		result = (s0 - 0x81)*190 + (s1 - 0x40) + (0xf8 - 0xb0)*94 +1038;
		if(s1>=0x80)
			result--;
		return result;
    }
    else if(s0>=0xaa&&s0<=0xfe&&s1>=0x40&&s1<=0xa0)
    {
		result = (s0 - 0xaa)*96 + (s1 - 0x40) + (0xf8 - 0xb0)*94 + (0xa0 -0x80)*190 +1038;
		if(s1>=0x80)
			result--;
		return result;
    }
}

//=================================================================
//把一行(inbuf)字符串内码转化为显示点阵值存到outbuf中
//字模首地址=((机内码高字节-1)×94+(机内码低字节-1))×N    (2)
void convert(uchar xdata *inbuf,uchar  *outbuf)
{
	ulong addr;
	uchar tempbuf[32];
//	uchar tempbuf1[32];
	
	while(1)
	{
		if(is_chinese(inbuf))                      /*转换汉字内码*/
		{
			addr = 32*(ulong)_gb13000_index(inbuf);
		
		//	addr = get_hz_ptaddr(inbuf);
		
	  	  	inbuf+=2;
	  	  	
			read_flash(addr,32,tempbuf);
			
			memcpy(outbuf,tempbuf,16);
			memcpy(outbuf+192,tempbuf+16,16);
	  	  	outbuf+=16;
		}
		else if((*inbuf>0x1f)&&(*inbuf<0x80))	/*转换ASCII内码*/
		{
	  	  	addr=0xdf400 + (ulong)*inbuf*16;
	  	  	
	  	//  	addr = get_ascii_ptaddr(inbuf);
	  	  	inbuf++;
	  	  	read_flash(addr,16,tempbuf);
			memcpy(outbuf,tempbuf,8);
			memcpy(outbuf+192,tempbuf+8,8);
	  	  	outbuf+=8;
		}
	  	else if(*inbuf==0) break;
		else inbuf++;
	}
}

//=================================================================
//把一行(inbuf)字符串内码转化为显示点阵值存到outbuf中反显
//字模首地址=((机内码高字节-1)×94+(机内码低字节-1))×N    (2)
void convert1(uchar xdata *inbuf,uchar xdata *outbuf,uchar len)
{

	ulong addr;
	
	uchar xdata tempbuf[32];
	uchar lentemp;

    lentemp=len;
	while(1)
	{
		if(is_chinese(inbuf))                     /*转换汉字内码*/
		{
			addr = 32*(ulong)_gb13000_index(inbuf);
	  	  	inbuf+=2;
	  	  	
			read_flash(addr,32,tempbuf);
			//for debug
			//delayms(2);
			//EA = 0;
			if(lentemp>1){con_data(32,tempbuf);lentemp-=2;}

			memcpy(outbuf,tempbuf,16);
			memcpy(outbuf+192,tempbuf+16,16);
	  	  	outbuf+=16;
		}
		else if((*inbuf>0x1f)&&(*inbuf<0x80))	/*转换ASCII内码*/
		{
	  	  	addr=0xdf400 + (ulong)*inbuf*16;
	  	  	inbuf++;
	  	  	read_flash(addr,16,tempbuf);	//read_eepromZIKU(addr,16,tempbuf);
			if(lentemp>0){con_data(16,tempbuf);lentemp--;}
			memcpy(outbuf,tempbuf,8);
			
			memcpy(outbuf+192,tempbuf+8,8);
	  	  	outbuf+=8;
		}
	  	else if(*inbuf==0) break;
		else inbuf++;
	}
}
//=========================================================================================
//把影射到外部SRAM中的 1536(c_buf) 个字节显示点阵数据写入LCD模块寄存区
void write_lcd_mem(uchar xaddr,uchar xdata *disbuf)
{
	uchar i;//,xtemp;
	uchar j;
	uchar k;
	uchar xdata *p;
	
	p=&disbuf[(xaddr*192)];

	xaddr=xaddr+0xb8;                      //设置DDRAM中的页地址(X地址)
	k=2;
	do                                     //输入全屏
	{
	  	if(xaddr>0xbf)
	  		break;
		
	  	for(i=0;i<3;i++)//do                                 //输入一逻辑行
		{
			select_p(i);                  //选第几部分共3部分每部分64列
			wrt_lcd_cmd(0xc0);               //第0行显示
		  	wrt_lcd_cmd(xaddr);              //设置DDRAM中的页地址(X地址)

⌨️ 快捷键说明

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