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

📄 ca320240.c

📁 移植好的Ibm405ep bsp板极支持包
💻 C
📖 第 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 "ca320240.h"
#include <rebootLib.h>
#include "ca320240_boot.c"
#define CHARACTER_HEIGH 12
#define CHARACTER_WIDTH 13 
extern INCORE_RBFINFO fixed6x12_iso8859_1;
extern INCORE_RBFINFO song12_gb2312;
static unsigned char *character_house12_tab;
static unsigned char *character_house_asc;
#define ca320240_wait_for_write()  do{}while(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;
}
/***********************************************************
				反白显示
				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);
			continue;
		}	
		code=*(str++);
		if(code<128){/*为ascii码*/
			if(code<31){/*为控制字符*/
				ca320240_control_text(&x,&y,code);
				continue;/*控制字符不进行显示*/
			}/*为控制字符*/	
			code=code*12+1;
			if(x>(AP*8-8)){
				x=0;
				y+=(CHARACTER_HEIGH+1);	
			}
			for(j=0;j<12;j++){
				ch=character_house_asc[code++];
				switch(color){
					case 0:
						ch=0x00;
						break;	
					case 2:
						ch=~ch;
						break;
					default:
						break;
				}
				ca320240_output_one_data(x,y+j,6,ch,color);/*英文字符宽度为6*/
			}
			x+=6;/*英文字符宽度为6*/
		}else{/*为汉字*/
			if(x>(AP*8-CHARACTER_WIDTH)){
				x=0;
				y+=(CHARACTER_HEIGH+1);	
			}
			code=gb2312_0_char_offset(str-1)*16*CHARACTER_HEIGH/8;/*在字库中默认为16宽度*/
			str++;
			if(str!=ptr)
				ca320240_output_ch(x,y,code,color);
			i++;
			x+=(CHARACTER_WIDTH);/*中文字符宽度*/
		}
	}/*显示字符*/
	*l=x;
	*h=y;
	return 0;
}
/***********************************************************
				输出英文显示
				x---x坐标(以字符位单位)
				y---y坐标(以字符位单位)
				len--字符长度;
				str---英文字符
				color----0  底色
					 1  白色
					 2  反白
************************************************************/
int text_print(unsigned int x,unsigned int y,unsigned char *str,int len,int color)
{
	x*=8;
	y*=8;
	return 	ca320240_output_en_drv(&x,&y,len,str,color);
}
/***********************************************************
				输出英文显示
				x---x坐标
				y---y坐标
				len--字符长度;
				str---英文字符
				color----0  底色
					 1  白色
					 2  反白
************************************************************/
int graphics_print(unsigned int x,unsigned int y,unsigned char *str,int len,int color)

⌨️ 快捷键说明

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