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

📄 ca320240.c-1

📁 移植好的Ibm405ep bsp板极支持包
💻 C-1
📖 第 1 页 / 共 2 页
字号:
/*
 * $Id: ca320240.c,v 1.111.2.6.4.1 2004/02/06 08:58:59 hzk Exp $
 * $Copyright: (c) 2004-2005,Vcom Corp.
 * All Rights Reserved.$
 *
 * ca320240
 */
#include <vxworks.h>
#include <math.h>
#include "drv/multi/ppc860Siu.h"
#include <drv/multi/ppc860Siu.h>
#include "ca320240.h"
#include <rebootLib.h>
#define CHARACTER_HEIGH 12
#define CHARACTER_WIDTH 13 
#define LCM_TIME_DELAY /*delay(5);*/
#define LCM_ENABLE_WAIT
extern INCORE_RBFINFO fixed6x12_iso8859_1;
extern INCORE_RBFINFO song12_gb2312;
static unsigned char *character_house12_tab;
static unsigned char *character_house_asc;
static void delay(unsigned int time)
{
	while(time--){};
	return;	
}
/*
static void ca320240_wait_for_write()
{
	unsigned char ch;
	int count=0;
	unsigned char *ptr=(unsigned char *)CA0320240_CRADDR;	
	ch=*ptr;
	while(!(ch & 0x40)){
		ch=*ptr;	
		count++;
		if(count>375*500)reboot(0);
	}
	while(ch & 0x40){
		ch=*ptr;	
		count++;
		if(count>375*500)reboot(0);
	}
}*/
#define ca320240_wait_for_write()  do{}while(0)
/***********************************************************
				写指令代码
				cw---要写的指令代码
				always return 0;
************************************************************/
int ca320240_pr1(unsigned char cw)
{
	#ifdef LCM_ENABLE_WAIT
	unsigned char ch;
	int count=0;
	unsigned char *ptr=(unsigned char *)CA0320240_CRADDR;
	ch=*ptr;
	while(ch & 0x40){
		ch=*ptr;	
		count++;
		if(count>375*500)reboot(0);
	}
	#else
	unsigned char *ptr;
	#endif
	ptr=(unsigned char *)CA0320240_CWADDR;
	*ptr=cw;
	LCM_TIME_DELAY
	return 0;
}
/***********************************************************
				写参数及显示数据
				cw---要写的指令代码
				always return 0;
************************************************************/
int ca320240_pr2(unsigned char cw)
{
	#ifdef LCM_ENABLE_WAIT
	int count=0;
	unsigned char ch;
	unsigned char *ptr=(unsigned char *)CA0320240_CRADDR;
	ch=*ptr;
	while(ch & 0x40){
		ch=*ptr;
		count++;
		if(count>375*500)reboot(0);	
	}
	#else
	unsigned char *ptr;	
	#endif
	ptr=(unsigned char *)CA0320240_DWADDR;
	*ptr=cw;
	LCM_TIME_DELAY
	return 0;
}
/***********************************************************
				读参数及显示数据
				cw---要写的指令代码
				return read data;
************************************************************/
unsigned char ca320240_pr3()
{
	#ifdef LCM_ENABLE_WAIT
	int count=0;
	unsigned char ch;
	unsigned char *ptr=(unsigned char *)CA0320240_CRADDR;
	ch=*ptr;
	while(ch & 0x40){
		ch=*ptr;
		count++;
		if(count>375*500)reboot(0);	
	}
	#else
	unsigned char ch;
	unsigned char *ptr;
	#endif
	ptr=(unsigned char *)CA0320240_DRADDR;
	ch=*ptr;
	LCM_TIME_DELAY
	return ch;
}
/***********************************************************
				ca320240初始化
************************************************************/ 
static void  ca320240_init_set()
{
		/*SYSTEM SET*/
	ca320240_pr1(CA320240_SYSTEM_SET);/*SYSTEM SET指令代码*/
	ca320240_pr2(0x30);
	ca320240_pr2(0x87);
	ca320240_pr2(0x07);
	ca320240_pr2(CR);
	ca320240_pr2(LCD_TCR);
	ca320240_pr2(LF);
	ca320240_pr2(APL);
	ca320240_pr2(APH);
	/*SCROLL*/
	ca320240_pr1(CA320240_SCROLL);/*SCROLL指令代码*/
	ca320240_pr2(SAD1L);
	ca320240_pr2(SAD1H);
	ca320240_pr2(SL1);
	ca320240_pr2(SAD2L);
	ca320240_pr2(SAD2H);
	ca320240_pr2(SL2);
	ca320240_pr2(SAD3L);
	ca320240_pr2(SAD3H);
	ca320240_pr2(SAD4L);
	ca320240_pr2(SAD4H);
	/*HDOT SCR*/
	ca320240_pr1(CA320240_HDOT_SCR);/*HDOT SCR*/
	ca320240_pr2(0x00);/*写入参数*/
	/*OVLAY*/
	ca320240_pr1(CA320240_OVLAY);/*OVLAY*/
	ca320240_pr2(0x00);/*一,三区为文本属性,二重“或"合成*/
	/*DISP ON开显示*/
	ca320240_pr1(CA320240_DISP_ON);/*DISP ON*/
	ca320240_pr2(0x10);/*二开显示,0101 0100,光标关显示*/
}
int ca320240_init()
{
 	ca320240_init_set();/*设置lcd参数*/
 	/*ca320240_clear();清除屏幕*/
	/*初始化字体*/
	character_house12_tab=song12_gb2312.data;
	character_house_asc=fixed6x12_iso8859_1.data;
	return 0;
}
/***********************************************************
				ca320240清除一行
************************************************************/
int ca320240_clear_line(unsigned int x)
{
	int i;
	unsigned int addr_l,addr_h;
	/*计算显示内存位置*/
	x=x*AP;
	addr_l=x & 0xff;
	addr_h=(x & 0xff00)>>8;
	
	/*CSRDIR 右移*/
	ca320240_pr1(CA320240_CSDIR_RIGHT);
	
	/*CSRW*/
	ca320240_pr1(CA320240_CSRW);
	ca320240_pr2(addr_l);/*设置指针寄存器低8位*/
	ca320240_pr2(addr_h);/*设置指针寄存器高8位*/
	
	/*MWRITE*/
	ca320240_pr1(CA320240_MWRITE);
	for(i=0;i<AP;i++){
		ca320240_pr2(0x20);	
	}
	return 0;
}
/***********************************************************
				ca320240清屏
************************************************************/
int ca320240_clear()
{
	unsigned int i=32768;
	/*CSRDIR 右移*/
	ca320240_pr1(CA320240_CSDIR_RIGHT);
	
	/*CSRW*/
	ca320240_pr1(CA320240_CSRW);
	ca320240_pr2(0x00);/*设置指针寄存器低8位*/
	ca320240_pr2(0x00);/*设置指针寄存器高8位*/
	
	/*MWRITE*/
	ca320240_pr1(CA320240_MWRITE);
	while(i--){
		ca320240_pr2(0x00);	
	}
	return 0;
}
/***********************************************************
				反白显示
				x---x坐标(以字符位单位)
				y---y坐标(以字符位单位)
				len---反白长度
				flag----0---禁止反白 1---显示反白
************************************************************/
int ca320240_invert_display(unsigned int x,unsigned int y,int len,int flag)
{
	int i;
	int addr_l,addr_h;
	unsigned char code;
	if(flag){
		code=0xff;	
	}else{
		code=0x00;
	}	
	
	/*计算光标位置*/
	addr_l=y*AP+x+SAD2;/*计算光标地址*/
	addr_h=(addr_l & 0xff00)>>8;
	addr_l=addr_l & 0xff;
	
	/*CSDIR 右移 ?*/
	ca320240_pr1(CA320240_CSDIR_RIGHT);
	
	/*CSRW*/
	ca320240_pr1(CA320240_CSRW);
	ca320240_pr2(addr_l);/*设置指针位置*/
	ca320240_pr2(addr_h);
	/*MWRITE*/
	ca320240_pr1(CA320240_MWRITE);
	for(i=0;i<len;i++){
		ca320240_pr2(code);
	}
	return 0;
}
/***********************************************************
				输出汉字显示
				x---x坐标
				y---y坐标
				str---汉字指针
				显示后,str自动加2
************************************************************/
int ca320240_output_ch(int x,int y,unsigned int code,int color)
{
	int i,j;
	unsigned char ch;
	unsigned int temp;
	if(y<0)return 0;
	temp=code;		
	/*计算光标位置*/
	for(i=0;i<2;i++){
		for(j=0;j<CHARACTER_HEIGH+1;j++){/*使用16X16的字体*/
			if(j==CHARACTER_HEIGH){
				ch=0x00;
			}else{
				ch=character_house12_tab[code];
			}
			switch(color){
					case 0:
						ch=0x00;
						break;	
					case 2:
						ch=~ch;
						break;
					default:
						break;
				}
			if(i==0){
				ca320240_output_one_data(x,y+j,8,ch,color);
			}else{
				ca320240_output_one_data(x,y+j,CHARACTER_WIDTH-8,ch,color);
			}
			code+=2;
		}
		/*修正光标位置,右移一格*/
		x+=8;/*中文字符宽度至少大于8*/
		temp++;
		code=temp;
	}
	return 0;
}
/***********************************************************
				向上卷动一行(英文字符)
************************************************************/
static char scroll_up_buf[LF][AP];
int CA320240_scroll_up_en()
{
	int i,j;
	unsigned int pos;
	int lock=intLock();
	/*CSDIR 设置内存指针向右移动*/
	ca320240_pr1(CA320240_CSDIR_RIGHT);
	
	/*CSRW 设置显示内存目标地址*/
	ca320240_pr1(CA320240_CSRW);
	ca320240_pr2(SAD2L);/*设置指针位置*/
	ca320240_pr2(SAD2H);
	
	/*读取显示内存*/
	ca320240_pr1(CA320240_MREAD);
	for(i=0;i<LF;i++){
		ca320240_pr1(CA320240_CSRW);
		pos=SAD2+i*AP;
		ca320240_pr2((pos & 0xff));/*设置指针寄存器低8位*/
		ca320240_pr2(((pos>>8) & 0xff));/*设置指针寄存器高8位*/
		/*MWRITE*/
		ca320240_pr1(CA320240_MREAD);
		for(j=0;j<AP;j++)
			scroll_up_buf[i][j]=ca320240_pr3();
	}
	
	/*CSDIR 设置内存指针向右移动*/
	ca320240_pr1(CA320240_CSDIR_RIGHT);
	/*CSRW 设置显示内存目标地址*/
	ca320240_pr1(CA320240_CSRW);
	ca320240_pr2(SAD2L);/*设置指针位置*/
	ca320240_pr2(SAD2H);
	/*写显示内存*/
	ca320240_pr1(CA320240_MWRITE);
	for(i=12;i<LF;i++){
		ca320240_pr1(CA320240_CSRW);
		pos=SAD2+(i-12)*AP;
		ca320240_pr2((pos & 0xff));/*设置指针寄存器低8位*/
		ca320240_pr2(((pos>>8) & 0xff));/*设置指针寄存器高8位*/
		/*MWRITE*/
		ca320240_pr1(CA320240_MWRITE);
		for(j=0;j<AP;j++)
			ca320240_pr2(scroll_up_buf[i][j]);
	}
	for(i=0;i<12;i++){
		ca320240_pr1(CA320240_CSRW);
		pos=SAD2+(i+240-12)*AP;
		ca320240_pr2((pos & 0xff));/*设置指针寄存器低8位*/
		ca320240_pr2(((pos>>8) & 0xff));/*设置指针寄存器高8位*/
		/*MWRITE*/
		ca320240_pr1(CA320240_MWRITE);
		for(j=0;j<AP;j++)
			ca320240_pr2(0x00);
	}
	intUnlock(lock);
	return 0;	
}
/***********************************************************
				设置字符光标位置
				x---x坐标(以字符位单位)
				y---y坐标(以字符位单位)
************************************************************/
int ca320240_gotoxy_text(unsigned int x,unsigned int y)
{
	unsigned int addr_l,addr_h;
	/*if(y<0)return 0;*/
	/*计算光标位置*/
	addr_l=y*AP+x+SAD2;/*计算显示内存地址+起始地址*/
	addr_h=(addr_l>>8)&0xff;
	addr_l=addr_l & 0xff;
	
	/*CSRW 设置显示内存目标地址*/
	ca320240_pr1(CA320240_CSRW);
	ca320240_pr2(addr_l);/*设置指针位置*/
	ca320240_pr2(addr_h);
	return 0;		
}
/***********************************************************
				读取字符光标位置
				x---x坐标(以字符位单位)
				y---y坐标(以字符位单位)
************************************************************/
int ca320240_getxy_text(unsigned int *x,unsigned int *y)
{		
	/*CSRR 读取显示内存目标地址*/
	ca320240_pr1(CA320240_CSRR);
	*x=ca320240_pr3();/*设置指针位置*/
	*y=ca320240_pr3();
	return 0;		
}
/***********************************************************
				响应控制字符
				x---x坐标(以字符位单位)
				y---y坐标(以字符位单位)
************************************************************/
int ca320240_control_text(unsigned int *x,unsigned int *y,unsigned char code)
{
	int tempx,tempy;
	int i;
	tempx=*x;
	tempy=*y;
	switch(code){
		case '\n':
			tempx=0;
			tempy+=12;
			if(tempy>=LF){
				CA320240_scroll_up_en();
				tempy=LF-12;
				/*设置光标位置*/
				ca320240_gotoxy_text(tempx,tempy);
				/*MWRITE*/
				ca320240_pr1(CA320240_MWRITE);
			}
			break;
		case '\r':
			tempx=0;
			ca320240_gotoxy_text(tempx,tempy);	
			/*MWRITE*/
			ca320240_pr1(CA320240_MWRITE);
			break;
		case 8:
			if(tempx>=6){
				tempx-=6;
				for(i=0;i<12;i++)
					ca320240_output_one_data(tempx,tempy+i,6,0x0,0);/*英文字符宽度为6*/
				
			}
			break;
	}
	*x=tempx;
	*y=tempy;
	return 0;		
}
/***********************************************************
				输出字符显示,写入一个字节数据
				x---x坐标
				y---y坐标
				len--长度(1-7);
				data---数据
				color---0  底色
					1  白色
					2  反白
************************************************************/
static unsigned char ca320240_output_one_data_var[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
void ca320240_output_one_data(int x,int y,int len,unsigned char data,int color)
{
	char buf[2];
	int ptr,plen,sl;
	unsigned char temp,temp1;
	if(x>=CA320240_WIDTH)return;
	if(y>=CA320240_HEIGTH)return;	
	ptr=y*AP+x/8+SAD2;
	
	/*设置指针左移*/
	ca320240_pr1(CA320240_CSDIR_RIGHT);
	/*CSRW*/
	ca320240_pr1(CA320240_CSRW);
	ca320240_pr2(ptr & 0xff);/*设置指针寄存器低8位*/
	ca320240_pr2((ptr>>8) & 0xff);/*设置指针寄存器高8位*/
	
	/*读取当前显示的数据*/
	ca320240_pr1(CA320240_MREAD);
	buf[0]=ca320240_pr3();
	buf[1]=ca320240_pr3();
	
	sl=x%8;
	plen=8-sl;
	if(plen>=len){
		temp=ca320240_output_one_data_var[len];
		data&=temp;
		data>>=sl;
		temp>>=sl;
		buf[0]&=(~temp);
		buf[0]|=data;
	}else{
		/*第一字节*/
		temp=ca320240_output_one_data_var[plen];
		temp1=(data & temp);
		temp1>>=sl;
		temp>>=sl;
		buf[0]&=(~temp);
		buf[0]|=temp1;
		data<<=plen;
		
		/*第二字节*/
		plen=len-plen;
		temp=ca320240_output_one_data_var[plen];
		temp1=data & temp;
		buf[1]&=(~temp);
		buf[1]|=temp1;
	}
	ca320240_pr1(CA320240_CSRW);
	ca320240_pr2(ptr & 0xff);/*设置指针寄存器低8位*/
	ca320240_pr2((ptr>>8) & 0xff);/*设置指针寄存器高8位*/
	
	/*读取当前显示的数据*/
	ca320240_pr1(CA320240_MWRITE);
	ca320240_pr2(buf[0]);
	ca320240_pr2(buf[1]);
	return;
}
/***********************************************************
				输出英文显示
				x---x坐标(以字符位单位)
				y---y坐标(以字符位单位)
				len--字符长度;
				str---英文字符
				color---0  底色
					1  白色
					2  反白
************************************************************/
static unsigned int gb2312_0_char_offset (const unsigned char* mchar)
{
    int area = mchar [0] - 0xA1;

    if (area < 9) {
        return (area * 94 + mchar [1] - 0xA1);
    }
    else if (area >= 15)
        return ((area - 6)* 94 + mchar [1] - 0xA1);

    return 0;
}
int ca320240_output_en_drv(unsigned int *l,unsigned int *h,int len,unsigned char *str,int color)
{
	unsigned int i,code,j;
	unsigned int x=*l,y=*h;
	unsigned char ch;
	unsigned char *ptr=str+len+1;
	for(i=0;i<(unsigned int)len;i++){/*显示字符*/
		/*判断x是否超界*/
		if((x>AP*8-6) && (y>LF-CHARACTER_HEIGH)){/*位置超界不显示*/
			CA320240_scroll_up_en();
			y=LF-12;
			if(x>AP*8-6)x=0;
			ca320240_gotoxy_text(x,y);

⌨️ 快捷键说明

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