标题:[求助]PC104人机界面编程,TP6508IQ显示芯片,如何显示640*480*256画面
只看楼主
hsbnetsh
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-4-18
 问题点数:0 回复次数:3 
[求助]PC104人机界面编程,TP6508IQ显示芯片,如何显示640*480*256画面
大家好,偶是个新人,最近使用嵌入式PC104做项目,该机器使用的是台湾凌越(TOPRO)的TP6508IQ显示芯片,
我在普通PC机的TC2.0下编写的640*480*256色画面,在该PC104上就无法正常显示,
而很多高分辨率画面在该系统上更是无法显示,
我在网络上也搜索不到针对这种显示芯片的例程,
看到咱们这里很多热心的高手前辈,所以我想到这里来向大家请教,
希望有PC104编程经验的前辈们不吝赐教,万分感谢!

PS:偶前几天发的关于SVGA256.BGI问题的帖子,还请前辈们多多指点.
[求助]在使用SVGA256.BGI后,TC2.0中的setacivepage()函数还能使用么?
http://bbs.bc-cn.net/viewthread.php?tid=132901
[求助]寻求SVGA256.BGI相关的技术文档,谢谢大家
http://bbs.bc-cn.net/viewthread.php?tid=132826
搜索更多相关主题的帖子: 芯片 画面 台湾 人机界面 网络 
2007-04-20 19:47
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
得分:0 

做嵌入式最好自己编写底层驱动程序,仔细研究这个网站上提供的<NEO>、<VGA13h>、<jsk>源码,肯定能编写出800*600甚至1024*768图形驱动程序的。

以下是我的部分源码

#define VRAM_GRAPH_800X600X256(x,y) (((unsigned long)y<<9L)+((unsigned long)y<<8L)+((unsigned long)y<<5L)+((unsigned long)(x)))
void far (*XMS_Function)(void) = 0L;// XMS服务程序入口地址
XMS_HANDLE xms_handle; // 伪指针
int g_cur_vbe_page = 0;
int GUI_SP = 0; // 弹出式堆栈指针
unsigned char far *ROM_ASCII;
int Back_Color,Fore_Color,Fill_Color;
struct XMS xms;

// 设置 bar 填充颜色(同 Turbo C)
void _Cdecl setfillstyle(int __pattern,int color)
{
__pattern++; // no use
Fill_Color = color;
}

// 设置前景色(同 Turbo C)
void _Cdecl setcolor(int color)
{
Fore_Color = color;
}


// 获取前景色(同 Turbo C)
int _Cdecl getcolor(void)
{
return (Fore_Color);
}


// 设置背景色(同 Turbo C)
void _Cdecl setbkcolor(int color)
{
Back_Color = color;
}

// 获取背景色(同 Turbo C)
int _Cdecl getbkcolor(void)
{
return (Back_Color);
}


// 获取填充色
int _Cdecl getfillcolor(void)
{
return (Fill_Color);
}


//检测XMS是否安装
BOOL _Cdecl XMS_Test(void)
{
_AX = 0x4300;
__int__(0x2F);
if (_AL == 0x80) // 检查XMS驱动程序是否已经安装
{
_AX = 0x4310;
__int__(0x2F); // 取得XMS功能调用的地址
XMS_Function=(void far *)MK_FP(_ES,_BX); // 返回值:ES:BX -> 驱动程序入口地址
return (TRUE);
}
return (FALSE);
}


// 说明: 获取XMS驱动器版本号
unsigned int _Cdecl XMS_Version(void)
{
_AH = 0x00;
(XMS_Function)();
return (_AX);
}


//查询空闲的扩充内存空间(不包括HMA)
int _Cdecl XMS_Size(void)
{
_AH = 0x08;
XMS_Function();
return (_DX);
}


//分配扩充内存
int _Cdecl XMS_Alloc(int size)
{
_DX = size; // 扩充内存块大小,单位为K字节
_AH = 0x09;
XMS_Function();
if(_AX == 1)
return (_DX);
return (0x00);
}


// 为句柄重新分配内存
int _Cdecl XMS_ReAlloc(XMS_HANDLE handle,int resize)
{
_AH = 0x0F;
_DX = handle;
_BX = resize;
(XMS_Function)();
if (_AX)
{
XMS_Size();
return (handle);
}
return (-1);
}


// 释放指定句柄所分配的扩充内存
BOOL _Cdecl XMS_Free(XMS_HANDLE handle)
{
_DX = handle;
_AH = 0x0A;
XMS_Function();
if(_AX)
return (TRUE);
return (FALSE);
}


//扩充内存和常规内存中的数据交换(移动扩充内存块)
// 移动扩充内存块
// 输入参数:
// AH = 0Bh
// DS:SI -> XMS 结构
// 返回值:
// AX = 0001h 成功
// = 0000h 失败
// BL = 错误代码
// 注: 如果结构中任一句柄为0000h, 那么其对应32位偏移量将被视为常规内存的绝对地址
/////////////////////////////////////////////////////////////////////////////////////////////////
BOOL _Cdecl XMS_Move(struct XMS *xms)
{
_DS = FP_SEG(xms);
_SI = FP_OFF(xms);
_AH = 0x0B;
XMS_Function();
if (_AX)
return (TRUE);
return (FALSE);
}


//将汉字库点阵字模从常规内存缓冲区buf装载到扩充内存
void _Cdecl Write_To_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset)
{
xms.length = size;
xms.source_handle = 0;
xms.source_offset = FP_SEG((void far *)buf);
xms.source_offset <<= 16;
xms.source_offset += FP_OFF((void far *)buf);
xms.dest_handle = handle;
xms.dest_offset = offset;
XMS_Move(&xms);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//从扩充内存中读取汉字点阵字模到常规内存缓冲区buf
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl Read_From_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset)
{
xms.length = size;
xms.source_handle = handle;
xms.source_offset = offset;
xms.dest_handle = 0;
xms.dest_offset = FP_SEG((void far *)buf);
xms.dest_offset <<= 16;
xms.dest_offset += FP_OFF((void far *)buf);
XMS_Move(&xms);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//汉字库点阵装载到扩充内存
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl ReadHzkXMS(char *Hzk16)
{
unsigned long hzksize;
unsigned int size;
unsigned long offset = 0;
char buf[32];
FILE *fp;

if (!XMS_Test())
{
puts("not found XMS");
exit(1);
}
if ((fp = fopen(Hzk16,"rb")) == NULL)
{
puts("Cannot Open HZK16 ...\n");
exit(1);
}
fseek(fp,0L,SEEK_END);
hzksize = ftell(fp);
fseek(fp,0L,SEEK_SET);
size = (int)(hzksize>>10) +1;
if (XMS_Size() < size)
{
puts("not enough XMS");
fclose(fp);
exit(-1);
}
if ((xms_handle = XMS_Alloc(size)) == 0)
{
puts("XMS handle Error...");
fclose(fp);
exit(-1);
}
while (!feof(fp))
{
size = fread(buf,sizeof(char),32,fp);
Write_To_XMS(buf,size,xms_handle,offset);
offset += size;
}
fclose(fp);
ROM_ASCII = Current_ASCII_ROM(S16X8);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
// 释放XMS内存
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl HzkFree(void)
{
XMS_Free(xms_handle);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
// 汉字点阵字模从XMS读到缓冲区buf中
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl ReadHzkBit(unsigned char *qw,unsigned char *buf)
{
unsigned short QM,WM;
long offset;

QM = *qw - 160;
WM = *(qw+1) - 160;
offset = ((QM-1)*94+WM-1)*32L;
Read_From_XMS(buf,32,xms_handle,offset);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//获得 ASCII ROM字符集首址
/////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char far *Get_ASCII_ROM(unsigned int BX)
{
_AX = 0x1130;
_BX = BX;
__int__(0x10);
return (unsigned char far *)MK_FP(_ES,_BP);

}


/////////////////////////////////////////////////////////////////////////////////////////////////
//获得 8X8或14X8或16X8英文字模基地址
/////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char far *Current_ASCII_ROM(int ch)
{
switch(ch)
{
case S8X8:
return (Get_ASCII_ROM(0x0300));
case S14X8:
return (Get_ASCII_ROM(0x0200));
case S16X8:
return (Get_ASCII_ROM(0x0600));
default:
return (Get_ASCII_ROM(0x0600));
}
}



多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-04-23 16:09
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
得分:0 

/////////////////////////////////////////////////////////////////////////////////////////////////
//显存换页函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl set_vbe_page(int page)
{
if (g_cur_vbe_page != page)
{
_BX = 0;
_DX = g_cur_vbe_page = page;
_AX = 0x4F05;
__int__(0x10);
}
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//读像素点函数
/////////////////////////////////////////////////////////////////////////////////////////////////
char _Cdecl GetPixel(int x, int y)
{
long addr;
int page;
char far *videoptr = (char far *)0xa0000000L;

addr = VRAM_GRAPH_800X600X256(x,y);
page = (int)(addr >> 16);
set_vbe_page(page);
return *(videoptr + (unsigned)(addr & 0xffff));
// return (peekb(0xa000, (unsigned)(addr & 0xFFFF) ));
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//画点函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl PutPixel(int x,int y,int color)
{
int page;
long addr;
char far *videoptr = (char far *)0xa0000000L;

if (x < 800 && y < 600)
{
addr = VRAM_GRAPH_800X600X256(x,y);
page = (int)(addr >> 16);
set_vbe_page(page);
// pokeb(0xa000, (unsigned)(addr & 0xFFFF),color);
*(videoptr+(unsigned int)(addr&0xffff))= color;
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////
////绘制一条垂直线函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl Vline(int x, int y1, int y2)
{
int i,gcolor = getcolor();

for (i = y1; i <= y2; ++i)
PutPixel(x,i,gcolor);
}

/////////////////////////////////////////////////////////////////////////////////////////////////
////绘制一条水平线函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl Hline(int x1, int y, int x2)
{
int i,gcolor = getcolor();

for (i=x1;i<=x2;i++)
PutPixel(i,y,gcolor);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
////通用画线子程序
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl Line(int x1,int y1,int x2,int y2)
{
register int t,d;
int xer=0,yer=0,deta_x,deta_y,incx,incy;
int gcolor = getcolor();

deta_x = x2 - x1;
deta_y = y2 - y1;
if (deta_x>0)
incx = 1;
else if(deta_x == 0)
incx = 0;
else
incx = -1;
if (deta_y>0)
incy = 1;
else if (deta_y == 0)
incy = 0;
else
incy = -1;

deta_x = abs(deta_x);
deta_y = abs(deta_y);

if (deta_x>deta_y)
d = deta_x;
else
d = deta_y;

for (t=0;t<=d+1;t++)
{
PutPixel(x1,y1,gcolor);
xer += deta_x;
yer += deta_y;
if (xer>d)
{
xer -= d;
x1 += incx;
}
if (yer>d)
{
yer -= d;
y1 += incy;
}
}
}


/////////////////////////////////////////////////////////////////////////////////////////////////
////画矩形
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl Rectangle(int x1,int y1,int x2,int y2)
{
Hline(x1, y1, x2);
Hline(x1, y2, x2);
Vline(x1, y1, y2);
Vline(x2, y1, y2);

}

/////////////////////////////////////////////////////////////////////////////////////////////////
////填充矩形
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl Bar(int x1, int y1, int x2, int y2)
{
int i,gcolor = getcolor();

setcolor(Fill_Color);
for (i = y1; i <= y2; ++i)
Hline(x1, i, x2);
setcolor(gcolor);
}

/////////////////////////////////////////////////////////////////////////////////////////////////
////画圆函数,以(c_x, c_y)为中心画一半径为r的圆
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl Circle(int c_x, int c_y, int r)
{
int x = 0, y = r, d0, d1, d2, direction;
int gcolor = getcolor();

d0 = (1-r) << 1;
while (y >= 0)
{
PutPixel(c_x + x, c_y + y, gcolor);
PutPixel(c_x - x, c_y - y, gcolor);
PutPixel(c_x + x, c_y - y, gcolor);
PutPixel(c_x - x, c_y + y, gcolor);
if (d0 < 0)
{
d1 = ((d0 + y) << 1) -1;
if (d1 <= 0) direction = 1;
else direction = 2;
}
else if (d0 > 0)
{
d2 = ((d0 - x) << 1) - 1;
if (d2 <= 0) direction = 2;
else direction = 3;
}
else direction = 2;

switch(direction)
{
case 1 : ++x;
d0 += (x<<1) + 1;
break;
case 2 : ++x;
--y;
d0+=(x-y+1)<<1;
break;
case 3 : --y;
d0 += -(y<<1) + 1;
break;
}
}
}


/////////////////////////////////////////////////////////////////////////////////////////////////
////填充的圆形,使用的是Midpoint算法
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl CircleFill(int x0, int y0, int r)
{
int x,y;
int deltax,deltay;
int d,gcolor = getcolor();

x = 0;
y = r;
deltax = 3;
deltay = 2 - (r << 1);
d = 1 - r;

setcolor(getfillcolor());
while (x <= y)
{
Hline(x0-x, y0+y, x0+x) ;
Hline(x0-x, y0-y, x0+x);
Hline(x0-y, y0-x, x0+y);
Hline(x0-y, y0+x, x0+y);
Hline(x0-x, y0+y, x0+x);
if(d<0)
{
d += deltax;
deltax += 2;
x++;
}
else
{
d += deltax+deltay;
deltax += 2;
deltay += 2;
x++;
y--;
}
}
setcolor(gcolor);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
////图形模式初始化子程序
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl InitGraph(void)
{
_AX = 0x4F02;
_BX = VBE800X600X256;
__int__(0x10);
if (_AH != 0)
{
puts("Can't Initialize the graphics mode!");
exit(1);
}
}

//////////////////////////////////////////////////////////////////////////////
////关闭图形模式,回到文本模式子程序
//////////////////////////////////////////////////////////////////////////////
void _Cdecl CloseGraph(void)
{
_AX = 0x4F02;
_BX = 0x03;
__int__(0x10);
}


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-04-23 16:09
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
得分:0 

/////////////////////////////////////////////////////////////////////////////////////////////////
////中英文混合输出函数
////unsigned char mat[16][2],
////for(j=0;j<16;j++)
//// for(i=0;i<2;i++)
//// for(k=0;k<8;k++)
//// if(mat[j][i]&(0x80>>k)) /*测试为1的位则显示*/
//// putpixel(i*8+k,j,WHITE);
//// x,y =坐标
////p = 中英文混合字符串
////d=字符之间的间距,以像素为单位
///color = 字符颜色
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl puthz(int x,int y,char *p,int color,int d)
{
unsigned int i,j;
unsigned char ch;
unsigned char matrix[32];
unsigned char far *ROM_ASCII;

while((ch=*p++)!=0)
{
if(ch>160)
{
p--;
ReadHzkBit(p,matrix);
for(j = 0 ; j < 16 ; j++)
for(i = 0 ; i < 16 ; i++)
if(matrix[2*j+i/8] & (0x80>>i%8))
PutPixel(i+x,y+j,color);
else
PutPixel(i+x,y+j,Back_Color);
p++;
p++;
x+=16+d;
}
else
{
ROM_ASCII = Current_ASCII_ROM(S16X8);//从PC机ROM中提取英文16X8点阵字模
for(i=0;i<16;i++)
{
matrix[i*2]=*(ROM_ASCII+(ch)*16+i);
matrix[i*2+1]=0; // 字模右边8位补0
}
for(j=0;j<16;j++)
for(i=0;i<8;i++)
if (matrix[2*j+i/8] & (0x80>>i%8))
PutPixel(i+x,y+j,color);
else
PutPixel(i+x,y+j,Back_Color);
x+=8+d;
/*-----------------------------------------------------------------------------------------------*/
// 如果采用8X8点阵字模显示英文及数字,请采用如下代码
/*-----------------------------------------------------------------------------------------------*/
/* for(i=0;i<8;i++)
buf[i]=*(ROM_ASCII+(ch)*8+i);
for(j=0;j<8;j++)
for(i=0;i<8;i++)
if((0x80>>i%8)&buf[j+i/8])
POPUP_PutPixel(i+x,y+j+5,color);
else
POPUP_PutPixel(i+x,y+j+5,Back_Color);
x+=8+d;*/
}
}
}


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-04-23 16:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-133563-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.596665 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved