📄 1335c51.c.bak
字号:
[说明]:线状光标的形状由CRX确定其长度,由CRY确定其所占的显示行数,当CRY=FY时,
光标显示底线形式。光标显示仅在文本方式下有效。
*/
//Cgram首地址设置.A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数2字节
#define CgramAdr 0x5c
/* 该指令设置了CGRAM在显示存储器内的起始地址SAG.从该地址SAG起的2K字节空间(M2=0)
或4K字节空间(M2=1)为CGRAM区域。该指令带有两个参数:
P1 [ SAGL ]
P2 [ SAGH ]
SAG.... CGRAM起始地址。SAGL为SAG的低8位,SAGH为SAG的高8位。
[说明]SAG所指向对应的是字符代码0的字模首地址,所以对于CGRAM1的首地址应该是SAG+
0x80*8,CGRAM2区域的字符代码为0xE0~0xFF,但是由于控制部在CGRAM2的首地址上安置了异
或0x40的电路,所以,CGRAM2的地址应按0xA0~0xBF计算,即CGRAM2的首地址为SAG+0xA0*8
*/
//光标移动方向设置。A0=1;/WR=0;/RD=1.后续参数:无
#define CsrDirR 0x4c
#define CsrDirL 0x4d
#define CsrDirU 0x4e
#define CsrDirD 0x4f
/* 该指令规定了光标指针CSR在计算机读写显示数据后自动修复的方向,从显示效果来说,
就是光标移动的方向设置。该指令的两个参数位DR1,DR0:
===========================
DR1 DR0 自动定位方向
===========================
0 0 右
0 1 左
1 0 上
1 1 下
===========================
*/
//光标指针设置。A0=1..写指令/0...读写参数;/WR=0/1;/RD=1/0(指令/后续参数读写).后
//续参数2字节
#define CsrW 0x46
/* 该指令设置了光标指针CSR.该指针有两个功能:1。作为当前光标显示的位置;2。作为
显示存储器当前的地址指针。2个参数:CSRL,CSRH
[说明]:当光标指针指向有效显示区域之外时,光标将自动消失,但不影响显示数据的读写。
光标指针在计算机的每次读写显示数据操作后,将根据最近设置的光标指针移动方向而自动
修正。光标指针不受画面滚动操作的影响。
*/
//读取光标指针。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数2字节
#define CsrR 0x47
/* 该指令代码写入后,计算机将从SED1335等数据通道读出当前的光标指针值。光标指针读
出的顺序是先CSRL再CSRH.
*/
//数据写入设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数N字节
#define mWrite 0x42
/*该指令写入后将允许计算机连续的向显示存储器内写入数据。写入的单元地址由光标指针
CSR提供,写操作完成后光标指针自动根据所设置的光标指针移动方向进行修改。显示数据
写入操作在计算机写入下一指令代码后结束。
*/
//数据读取设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数N字节
#define mRead 0x43
// 程序参数定义,根据用户选择的LCM型号修改
#define Busy 0x40 // 忙状态标志位0b0100 0000
#define paraP9 0x28 // 相对于320 X 240
//菜单光标控制程序,控制光标开/关
void SurCtl(uint x0, uchar y0, uint xt, uchar yt, uchar att)
{
Rectangle(x0-7, y0-7, xt+7, yt+7, att);
Rectangle(x0-6, y0-6, xt+6, yt+6, att);
Rectangle(x0-5, y0-5, xt+5, yt+5, att);
if(att==0)
{
Linexy(x0-8,y0-8,x0-4,y0-4,1);
Linexy(x0-8,yt+8,x0-4,yt+4,1);
Linexy(xt+8,y0-8,xt+4,y0-4,1);
Linexy(xt+8,yt+8,xt+4,yt+4,1);
}
}
//============================== 西文显示演示程序 ==============================
// 仅仅用于文本方式下的西文字符串显示,本函数只写入第3显示区
void TextDisp( uchar Ox,uchar Oy, uchar *ptr )
{
uchar TexLength=0,ii;
uint iTemp;
while(ptr[TexLength]>0x1f) {TexLength++;}; // 获取字串长度
iTemp = Oy*paraP9+Ox;
//WriteCommand( CsrForm ); // 光标形状设置,代码0x5d
//WriteData( 0x07 ); // 设置光标水平点为CSX=8
//WriteData( 0x07 ); // 光标为块状形式,垂直点为CSY=8
//WriteCommand( DispOn ); // 写入指令DISP ON/OFF代码,后续参数:
//WriteData( 0x56 ); // 01 01 01 10显示1~4区开显示,光标闪烁显示
iTemp = (uint)Oy * paraP9 + Ox; // 光标位置到实际ram地址换算
WriteCommand( CsrDirR ); // 自动右移光标指向
WriteCommand( CsrW ); // 制定光标位置
WriteData( (uchar)(iTemp &0xff) ); // 设置光标地址CSR
WriteData( (uchar)(iTemp /256 + BasePart1) );
WriteCommand( mWrite ); // 当前位置写入数据指令
for(ii=0;ii < TexLength;ii++) {
WriteData( ptr[ii] ); // 写入显示字符代码
}
WriteCommand( DispOn );
WriteData( 0x54 );
}
//数字显示,por为是表示负数,要显示“-”
void NumDisp(uchar x0, uchar y0, int dat)
{
uint temp;
uint tempPtr;
tempPtr = (uint)y0*paraP9+x0-1;
WriteCommand(CsrDirR);
WriteCommand( CsrW ); // 制定光标位置
WriteData( (uchar)(tempPtr &0xff) ); // 设置光标地址CSR
WriteData( (uchar)(tempPtr /256 + BasePart1) );
WriteCommand( mWrite ); // 当前位置写入数据指令
if(dat<0)
{
WriteData('-');
dat-=1;
dat=~dat;
}
else
{
WriteData(' ');
}
WriteData(dat/1000+48);
temp=dat%1000;
WriteData(temp/100+48);
temp%=100;
WriteData(temp/10+48);
WriteData(temp%10+48);
}
/********************************************/
/*画线。任意方向的斜线,直线数学方程 aX+bY=1 */
/********************************************/
// 参数类型有待修改
void Linexy(uint x0,uchar y0,uint xt,uchar yt,uchar att)
{
register uchar t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy;
uint row,col;
delta_x = xt-x0; //计算坐标增量
delta_y = yt-y0;
col = x0;
row = y0;
if(delta_x>0)
{
incx=1; //设置单步方向
}
else
{
if( delta_x==0 )
{
incx=0; //垂直线
}
else
{
incx=-1;
delta_x=-delta_x;
}
}
if(delta_y>0)
{
incy=1;
}
else
{
if( delta_y==0 )
{
incy=0; //水平线
}
else
{
incy=-1;
delta_y=-delta_y;
}
}
if( delta_x > delta_y )
{
distance=delta_x; //选取基本增量坐标轴
}
else
{
distance=delta_y;
}
for( t=0;t <= distance+1; t++ )
{ //画线输出
Point((uint)col,row,att); //画点
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
col+=incx;
}
if( yerr > distance )
{
yerr-=distance;
row+=incy;
}
}
}
/********************************************/
/*画矩形 */
/********************************************/
void Rectangle(uint x0, uchar y0, uint xt, uchar yt, uchar att)
{
Linexy(x0, y0, x0, yt,att);
Linexy(x0, yt, xt, yt,att);
Linexy(xt, yt, xt, y0,att);
Linexy(xt, y0, x0, y0,att);
}
// 写指令代码子程序
void WriteCommand( uchar CommandByte )
{
LCD_CS=0; //选通
LCD_A0=1; //1为写命令或读数据
LCD_WR=0;
LCD_RD=1; //确定读信号不起作用
LCM_DATA=CommandByte; //向1335中写入指令代码
LCD_WR=1;
LCD_CS=1;
//LcmCmdPort = CommandByte;
}
//---------------------------
// 写参数及显示数据子程序
void WriteData( uchar dataW )
{
LCD_CS=0; //选通
LCD_A0=0; //0为写数据、参数和读忙标志
LCD_RD=1; //确定读信号不起作用
LCM_DATA=dataW; //向1335中写入指令代码
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;
//LcmWdataPort = dataW;
}
//---------------------------
// 读参数及显示数据子程序
uchar ReadDataLcm( void )
{
uchar Lcmdat;
LCM_DATA=0xff;
LCD_CS=0; //选通
LCD_A0=1; //0为写数据、参数和读忙标志
LCD_RD=0; //
LCD_WR=1;
Lcmdat=LCM_DATA;
LCD_RD=1;
LCD_CS=1;
return Lcmdat;
}
/*=====================================
初始化子程序
======================================*/
void LcmInition( void )
{
uchar i;
delay_xms(500); // 足够的延时确保Lcm已经准备好
WriteCommand( SystemSet ); // 系统参数设置
for (i=0;i<8;i++) {
WriteData( ParaSysTable8[i] ); //
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -