📄 ca320240.c-1
字号:
/*
* $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 + -