历史上的今天
返回首页

历史上的今天

今天是:2025年03月22日(星期六)

2021年03月22日 | 240x128液晶T6963控制器驱动程序(C51)

2021-03-22 来源:eefocus

简介:本文主要介绍了240x128液晶T6963控制器驱动程序(C51)。


#include "absacc.h"

#include "math.h"



#include "ASCII816.h" //标准ASCII库

#include "HZTable.h" //汉字点阵库(自做)

#include "menu.h" //菜单库(自做)


#define ComPort 0xB101

#define DataPort 0xB000

#define GraphAddr 0x0000 //head of graph


//以8*8字符计算,显示屏横向、纵向可以显示的字符个数

//以240*128为例:

#define LineChar 30 //一行16个字符(8*8)

#define ColumnChar 16 //总共16列



//指令,数据 读写状态检查

#define RWCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x03; } while(sta!=0x03); }

//数据自动读 状态检查

#define AutoRCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x04; } while(sta!=0x04); }

//数据自动写 状态检查

#define AutoWCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x08; } while(sta!=0x08); }


/*------输入/出函数,与T6963通讯------------------------------------------------*/

/*------------------------------------------------------------------------*/


// 向数据口发Data

#define OutPortData(dat ) { RWCheck(); XBYTE[DataPort]=dat; }


//写有 1 个参数命令

#define OutPortCom1(command) { RWCheck(); XBYTE[ComPort]= command; }


//写有 2 个参数命令

#define OutPortCom2(dat, command) { OutPortData(dat); OutPortCom1(command); }


//写有 3 个参数命令

#define OutPortCom3(data1, data2, command) { OutPortData(data1); OutPortData(data2); OutPortCom1(command);}



unsigned char InPortData() { RWCheck(); return(XBYTE[DataPort]); }


/*-----------------------------------------------------------------------------------*/

//显示8*16字符

//lin:行(0-7), column: 列(0-15)

//ch:字符代码(标准ASCII码)

void ShowChar(unsigned char lin,unsigned char column,unsigned char ch)

{

unsigned char i;

unsigned char dat;

unsigned int StartAddr;


StartAddr=lin*LineChar +column; //定位起始行


for(i=0;i<16;i++)

{

dat=ASCII816[ ch-0x20 ][i];

OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address

OutPortCom2( dat, 0xc4);


StartAddr=StartAddr + LineChar;

}

}


/*----------------------------------------------------------------------------------------------*/

//显示一个汉字(16*16点阵)

//lin:行(0-7), column: 列(0-7)

//hzcode: 汉字代码(自定义的)

void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)

{

unsigned char i;

unsigned int StartAddr;


StartAddr=lin*LineChar + column; //定位起始行


for(i=0;i<16;i++)

{

OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);

OutPortCom2( HZTable[hzcode][i*2], 0xc0); //左半部 地址加一

OutPortCom2( HZTable[hzcode][i*2+1], 0xc4); //右半部 字模地址加一


StartAddr=StartAddr + LineChar;

}

}

/////////////////////////////////////////////////////////////////////////////////////////////

//显示一个汉字(16*16点阵)

//lin:行(0-7), column: 列(0-7)

//hzcode: 汉字代码(自定义的)

void ShowHZD(unsigned char lin,unsigned char column,unsigned int hzcode)

{

unsigned char i,j;

unsigned int StartAddr;


StartAddr=lin*LineChar*16 +column; //定位起始行


for(i=0;i<35;i++)

{

OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //定位当前操作位置

for(j=0;j<5;j++) OutPortCom2( HZTable[hzcode][i*5+j], 0xc0); //显示当前一行


StartAddr=StartAddr + LineChar;

}

}


////////////////////////////////////////////////////////////////////////////////////////////

/*-----------------------------------------------------------------------------------*/

//显示一行字符串(汉字,字母混排,一行16字节)

//lin:行

//lineheadaddr: 此行汉字代码区首地址

void ShowLine(unsigned char lin,unsigned char column,unsigned char linehead[])

{

unsigned char i,j;

unsigned char byte;

unsigned int hzcode;


for( i= column,j=0; i< column+14 ; )

{ byte=linehead[j];

if(byte < 0x80) //字母

{

ShowChar(lin, i , byte);

i=i+1;j=j+1;

}

else // byte >= 0x80(汉字)

{

byte=byte & 0x7f; //最高位置0,即:减去0x8000

hzcode=byte*256 + linehead[j+1]; //加低8位,组合成整型数地址

ShowHZ( lin,i,hzcode);

i=i+2;j=j+2;

}

}

}


/*-----------------------------------------------------------------------------------*/

//显示一屏汉字

//pageheadaddr:此屏汉字代码地址区首地址

void ShowPage(unsigned char lin,unsigned char column1,unsigned char pagehead[][14])

{

unsigned char i;

for(i=0;i< 4 ;i++)

ShowLine((lin+i*20),column1,pagehead[i]); //1行8个汉字,16字节

}


/*----------------------------------------------------------------------------------------------------*/

//反显一个字符

//lin:行(0-7), column: 列(0-15)

void ReverseShowChar(unsigned char lin,unsigned char column)

{

unsigned char i;

unsigned char dat;

unsigned int StartAddr;


StartAddr=lin*LineChar +column; //定位起始行


for(i=0;i<16;i++)

{

OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address

OutPortCom1( 0xc5 ); //数据一次读,地址不变

dat=InPortData(); //读入数据

dat=~dat; //取反

OutPortCom2( dat, 0xc4); //送回


StartAddr=StartAddr+ LineChar;

}

}



/*----------------------------------------------------------------------------------------------------*/

//反显一个汉字

//lin:行(0-7), column: 列(0-15)

void ReverseShowHZ(unsigned char lin,unsigned char column)

{

ReverseShowChar(lin,column);

ReverseShowChar(lin,column+1);

}

/*----------------------------------------------------------------------------------------------------*/

//反显一行汉字

//lin:行(0-7)

void ReverseShowLine(unsigned char lin)

{

unsigned char column;

for(column=0; column< ColumnChar; column++) ReverseShowChar(lin,column);

}



//////////////////////////////////////////////////////////////////////////////////////

void ShowPicture(unsigned char Startline,unsigned char Startcolumn,unsigned char LineWidth,unsigned char ColumnWidth,unsigned int address)

{

unsigned char i,j;

unsigned int StartAddr;


StartAddr=Startline*LineChar + Startcolumn; //定位起始位置


for(i=0;i{


OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address

for(j=0;j{

OutPortCom2( CBYTE[address + i*LineWidth+ j ], 0xc0);

}

StartAddr=StartAddr + LineChar;

}

}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////

//图形函数,用于描点画图

//---------------------------------------------------------------------------

//在指定位置显示一个点

//如果显示屏超过了256*256,请修改这个函数 PointX,PointY的类型

//Mode 1:显示 0:清除该点

Pixel(unsigned char PointX,unsigned char PointY, bit Mode)

{

unsigned int StartAddr=0;

unsigned char dat;


StartAddr=PointX*LineChar + PointY/8;

dat=0xf0+7-PointY%8;

if(Mode) dat=dat|0x08;


OutPortCom3( (unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),0x24 ); //设置该点所在单元地址

OutPortCom1(dat);

}


//-------------------------------------------------------------------------------

//划线函数

void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)

{

unsigned char x,y;

double k,b;


if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1

{

k=(float)(y2-y1) / (float)(x2-x1) ;

b=y1-k*x1;


if( x1 <= x2 )

{

for(x=x1;x<=x2;x++)

{

y=k*x+b;

Pixel(x, y, Mode);

}

}

else

{

for(x=x2;x<=x1;x++)

{ y=k*x+b;

Pixel(x, y, Mode);

}

}

}

else // abs(y1-y2) > abs(x1-x2) |K|>1

{

k=(float)(x2-x1) / (float)(y2-y1) ;

b=x1-k*y1;


if( y1 <= y2 )

{

for(y=y1;y<=y2;y++)

{ x=k*y+b;

Pixel( x , y,Mode );

}

}

else

{

for(y=y2;y<=y1;y++)

{ x=k*y+b;

Pixel( x , y,Mode );

}

}

}

}




/*---------------------------------------------------------------------------------------------------*/

void ClearScreen()

{


unsigned int i;

///////// 清显示 RAM 区 0000h--2000h (8k)

OutPortCom3(0x00,0x00,0x24); //设置指针地址0000H


OutPortCom1(0xb0); //设置自动写状态

for(i=0x00;i<0x2000;i++) OutPortData(0x00); // data=0;

OutPortCom1(0xb2); // 自动写结束

}


//初始化LCD

//需要手动设置

void InitLCD()

{

OutPortCom3( 0x00,0x00,0x42 ); //设置图形显示区域首地址GraphAddr

OutPortCom3( 30,0x00,0x43 ); //设置图形显示区域宽度 : LineChar


// OutPortCom3( 0x00,0x00,0x42 ); //设置图形显示区域首地址GraphAddr

// OutPortCom3( 0x10,0x00,0x43); //设置图形显示区域宽度:10H


OutPortCom1(0xa7); //设置光标形状 cursor size 8x8

OutPortCom1(0x80); //设置显示方式: CGROM方式 文本图形 "或"

OutPortCom1(0x98); //设置显示开关: 1001 1100 图形


ClearScreen();

}


推荐阅读

史海拾趣

固驰(GUERTE)公司的发展小趣事

固驰电子深知产品质量是企业生存之本,因此始终将品质控制放在首位。公司不仅建立了完善的质量管理体系,还通过了ISO9001:2015质量管理体系认证和美国UL产品认证,这标志着固驰电子的产品质量达到了国际先进水平。此外,公司还积极申请专利,目前已拥有50项国家专利,进一步巩固了其在行业内的技术领先地位。

成都芯进(CrossChip)公司的发展小趣事

2013年,三位在半导体行业积累了近十年经验的成电校友,怀揣着对电子技术的热爱和对国产芯片事业的执着,在成都创办了成都芯进电子有限公司(CrossChip)。公司初期专注于模拟和混合信号芯片设计,并以磁传感器芯片作为切入点。一年后,他们的首款产品——开关型霍尔传感器成功实现量产销售,为公司的发展奠定了坚实的基础。

Esterline Power Systems公司的发展小趣事

随着公司产品的技术成熟和品质提升,Esterline Power Systems开始寻求国际市场的拓展。公司高层制定了明确的国际化战略,包括在欧洲和亚洲设立分支机构,与当地合作伙伴建立紧密的合作关系。通过参展国际航空展、加强与全球航空公司的技术交流与合作,公司逐渐打开了国际市场的大门,产品销售遍及全球多个国家和地区。

佰鸿(BrtLed)公司的发展小趣事

随着业务规模的不断扩大,佰鸿意识到提升产能效率的重要性。于是,公司在1990年转投资中国大陆兴建东莞高步厂,现有土地面积和厂房面积均达到相当规模,员工数量也增至数千人。这一举措极大地提升了佰鸿的生产能力,使其能够更好地满足市场需求,同时也为公司后续的发展提供了有力的支持。

HSMC公司的发展小趣事

HSMC的发展不仅为公司自身带来了显著的经济效益,也为当地社会和经济发展做出了重要贡献。项目全面达产后,预计可实现年产值600亿元,利税60亿元,直接带动就业人口3000人。此外,HSMC还通过技术创新和产业升级,带动了上下游产业链的发展,促进了整个电子行业的繁荣与进步。

以上五个故事共同描绘了HSMC在电子行业中的崛起与发展历程。作为一家充满活力和创新精神的企业,HSMC正以其独特的优势和不懈的努力,向着成为全球领先CIDM晶圆厂的目标不断迈进。

帝特(DTECH)公司的发展小趣事

帝特在国内市场取得一定成绩后,开始积极拓展国际市场。公司在中国区开设了广州、深圳分公司,并在泰国和马来西亚等地设立了分公司和专卖店。通过全球化的战略布局,帝特的产品销售网络遍布东南亚、中东、非洲和美洲等国家和地区,公司的知名度和市场份额均得到了显著提升。

问答坊 | AI 解惑

如何调整光驱激光头功率

如何调整光驱激光头功率 作者:diybios    转贴自:本站原创 凡是使用过电脑的朋友都知道,光驱只要用了差不多一年,就该挑盘了,有的盘能读,有的盘不能读。这种情况越来越越严重,最后干脆一张盘也不读了,把盘放进去 ...…

查看全部问答>

关于FPGA上电配置过程的时间----讨论

问题:程序通过jtag转;或者 下到EPCS64后重新上电;程序有事很快就运行,但是有事需要等十几秒才能运行,IO脚驱动的LED灯就可以看见;程序没有工作之前灯也处于半亮状态 像是一直在配置中? 分析:  在配置时是默认所有脚弱上拉, 一般配置时间是m ...…

查看全部问答>

关于x86平台下 显示偏移

我的工程是基于WCE6.0下的可nk下载后显示向上偏移 下面出现一断黑色的区域 请问各位大虾 该怎么改了 谢谢了…

查看全部问答>

wince连接固定的ip发送数据总是超时

  private void ReceMsg()         {             while (check)             {         ...…

查看全部问答>

关于ARM9200网络驱动的问题

我用ARM9200板子上的ping功能可以正常ping通别的板子,但是自己写了一个arp request程序就是不能正确发送,如果我发送长度设置小于64,虽然进入了发送完毕的中断,但是目标板接收不到数据,如果发送长度设置大于64,目标板能接收到数据,但是都是FF ...…

查看全部问答>

stm8用户手册中17.5.9

                                 etr 怎们设置 才有效  写得 不明不白的…

查看全部问答>

有熟悉这款方案的吗?出来给点意见

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 最近有方案商向我们推一款机顶盒方案(富士通MB86H60),据说这是一款非常成熟、性价比特别高的方案,但是网上居然很少相关资料。Why?说明下,我们的产品主要是针对ISDB-T、DVB-T及卫星机顶盒 ...…

查看全部问答>

大家来看看STM32的串口程序,不知道哪里错了,望高手指点一二、、、

#include\"stm32f10x.h\" #include\"delay.h\" void RCC_config(void); void USART_Config(void); void USART_GPIOInit(void); void Put_String(u8 *p); int main() { RCC_config(); USART_GPIOInit(); USART_Config(); Put_Stri ...…

查看全部问答>

单片机等精度测量频率怎么实现的?

本帖最后由 paulhyde 于 2014-9-15 03:49 编辑 最近在写测频的程序,之前用双定时器,周期法测频的方法都有很大的误差。由于还没有学过这个方法,不知道是什么原理,求各位能讲解一下,举个程序例子最好了。。。谢谢了~~~  …

查看全部问答>