📄 液晶菜单程序.c
字号:
{
}
/****************************************************************************
* 函数: void ddj(void)
*----------------------------------------------------------------------------
* 参数: 无
*----------------------------------------------------------------------------
* 返回: 无
*----------------------------------------------------------------------------
* 目的:
*----------------------------------------------------------------------------
* 举例:
*----------------------------------------------------------------------------
* 注意:
*----------------------------------------------------------------------------
* 需求:
*****************************************************************************/
void ddj(void)
{
}
void clockset(void)
{
}
void Linexy(Uint x0,Uchar y0,Uint xt,Uchar yt,Uchar att,Uchar att1)
{
Uint 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,att1);
//画点
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
col+=incx;
}
if( yerr > distance )
{
yerr-=distance;
row+=incy;
}
}
}
//---------------------------
// 写指令代码子程序pr1
void WriteCommand( Uchar CommandByte ) {
LcmCmdPort = CommandByte;
}
//---------------------------
// 写参数及显示数据子程序
void WriteData( Uchar dataW ) {
LcmWdataPort = dataW;
}
//---------------------------
// 读参数及显示数据子程序
Uchar ReadDataLcm( void ) {
return LcmRdataPort;
}
/*=====================================
初始化子程序
======================================*/
void LcmInition( void ) {
Uchar i;
WriteCommand( SystemSet ); // 系统参数设置
for (i=0;i<8;i++) {
WriteData( ParaSysTable8[i] ); //
}
WriteCommand( Scroll ); //设定显示区域起
始地址
for (i=0;i<10;i++) {
WriteData( ParaScrTableA[i] );
}
WriteCommand( HdotScr ); // 写入点位移指令代码
WriteData( 0 ); // 写
入P1参数
WriteCommand( Ovlay ); // 显示合成方式
设置
WriteData( 0x4 ); //
0000 0100 显示一区图形,三区文本属性,二重"或"合成
WriteCommand( DispOn ); // 写入指令代码
WriteData( 0x54 ); // 显示 1~4 区开
显示,光标关显示
}
/*==============================================================================
; 汉字写入子程序(图形方式)。每次调用输出一个汉字
; 支持图形方式使用,完成汉字点阵码的输出。
; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
Ptr......汉字码,库内的排列编码,大型程序时请改
用unsigned int类型
; 无返回数据。
==============================================================================*/
void PutCdotInGraph( Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth ) {
Uint tempPtr,Optr;
Uchar tempCount1,tempCount2,nByte;
Optr = (Uint)Oy * paraP9 + Ox;
nByte = DotWidth/8;
WriteCommand( CsrDirD );
// 自动右移。
tempPtr = (Uint)Cnumber * DotWidth*nByte;
for (tempCount1=0;tempCount1<nByte;tempCount1++) {
WriteCommand( CsrW );
// 光标定位指令
WriteData( (Uchar)(Optr &0xff) ); // 设
置光标地址CSR
WriteData( (Uchar)(Optr /256 ) );
WriteCommand( mWrite );
// ram写指令
switch(DotWidth){
case 16: for
(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData(
Cdotlib[Cnumber].Msk[tempCount2*2+tempCount1] ); // 写入数据
}
break;
case 24: for
(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData(
Cdot24lib[tempPtr] ); // 写入数据
tempPtr +=
nByte;
}
break;
}
tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
Optr++;
}
}
/////////////////////////////////////////////////////////////////////////////
//函数名称:void Point(Uint Px, Uchar Py, Uchar attr )
//入口参数:横坐标x,纵坐标y,画点或擦点
//出口参数:无
//其它调用:WriteCommand(),WriteData()
//函数说明:用于在屏幕上任意一点画点
//当前状态:无
//修改状态:无
//修改内容:无
/////////////////////////////////////////////////////////////////////////////
void Point(Uint Px, Uchar Py, Uchar attr,Uchar attr1 )
{
Uint tempPtr;
Uchar tempD,tempP;
tempPtr = (Uint)Py * paraP9 + (Px & 0x7fff)/8; // 去除最高位(显
示属性)
if(attr) tempPtr+=BasePart2*256;
WriteCommand( CsrDirD );
// CSRDIR 代码(光标自动下移)
WriteCommand( CsrW );
// 设置光标地址
WriteData( (Uchar)(tempPtr & 0xff) );
WriteData( (Uchar)(tempPtr /256) );
WriteCommand( mRead );
// 读显示ram指令
tempD = ReadDataLcm();
// 读取当前显示数据
tempP = 1<<(Uchar)(7-Px & 0x0007);
// 根据预定属性决定写点或擦除
if( attr1 )tempD |= tempP; // 画点
else tempD &= ~tempP; // 消点
WriteCommand( CsrW );
// 重新设置光标地址
WriteData( (Uchar)(tempPtr & 0xff) );
WriteData( (Uchar)(tempPtr /256) );
WriteCommand( mWrite );
// 代码0x42,数据写入指令
WriteData( tempD );
// 写入合成数据
}
/////////////////////////////////////////////////////////////////////////////
//函数名称:void LcmClear( void )
//入口参数:无
//出口参数:无
//其它调用:WriteCommand(),WriteData()
//函数说明:用于清显示32K RAM区清屏字程序
//当前状态:无
//修改状态:无
//修改内容:无
/////////////////////////////////////////////////////////////////////////////
void LcmClear( void ) {
Uint i1=32768;
WriteCommand( CsrDirR ); // 光标移动方向
定义:自动右移
WriteCommand( CsrW ); // 光标Locate,定
位
WriteData( 0 );
// 写入参数CSRL设置参数光标指针低8位
WriteData( 0 );
// 写入参数CSRH设置参数光标指针高8位
WriteCommand( mWrite ); // 数
据写入指令,代码0x42
while(i1--) {
WriteData( 0x0 ); // 写入数据0
}
}
/////////////////////////////////////////////////////////////////////////////
//函数名称:void Locatexy(Uchar x,Uchar y, Uchar attribs)
//入口参数:横坐标x,纵坐标y,所在的区attribs
//出口参数:无
//其它调用:WriteCommand(),WriteData()
//函数说明:用于光标位定位
//当前状态:无
//修改状态:无
//修改内容:无
/////////////////////////////////////////////////////////////////////////////
void Locatexy(Uchar x,Uchar y, Uchar attribs)
{
Uint temp;
temp = (Uint)y*paraP9+x;
if(attribs==1)
temp += BasePart2*256; // 如果需要就指向第二区,加上第二区首
地址
if(attribs==2)
temp +=BasePart3*256;
WriteCommand( CsrW ); // 光标Locate,定
位
WriteData( (Uchar)(temp & 0xff) ); // 写入参数CSRL设置参数光
标指针低8位
WriteData( (Uchar)(temp /256 ) ); // 写入参数CSRH设置参数光
标指针高8位
}
/////////////////////////////////////////////////////////////////////////////
//函数名称:Uchar dprintf(Uchar x, Uchar y, Uchar att,bit fb, char *fmt, ...)
//入口参数:横坐标x,纵坐标y,所在的层att,是否反白fb,所要显示在屏幕上的字符串
//出口参数:字符串长度
//其它调用:太多了,自己看吧。
//函数说明:用于汉字及英文字符的混合显示,英文字符为8*16,汉字为16*16
//当前状态:无
//修改状态:无
//修改内容:无
/////////////////////////////////////////////////////////////////////////////
Uchar dprintf(Uchar x, Uchar y, Uchar att,bit fb, char *fmt, ...)
{
va_list arg_ptr;
char c1,c2,cData;
Uchar i=0,j,uLen,uRow,uCol,temp;
Uint k;
uRow = x;
uCol =y;
uLen=0;
WriteCommand( CsrDirD );
// 光标移动方向定义:自动下移
Locatexy(uRow,uCol,att);
//起点定位
va_start(arg_ptr, fmt);
uLen = (Uchar)vsprintf(tmpBuf, fmt, arg_ptr) ;
va_end(arg_ptr);
while(i<uLen)
{
c1 = tmpBuf[i];
c2 = tmpBuf[i+1];
if(c1 >= 0)
{ // ASCII
if(c1 < 0x20)
{
switch(c1)
{
case CR:
case LF: // 回
车或换行
i++;
if(uRow < 224)
Locatexy(uRow+16,uCol,att);
else
Locatexy(0,0,att);
continue;
case BS: // 退
格
if(uCol > 0)
uCol-
-;
Locatexy
(uRow,uCol,att);
cData = 0x00;
break;
default: // 其
他
c1 = 0x1f;
}
}
for(j=0;j<16;j++)
{
WriteCommand( mWrite );
// 写数据
if(c1 >= 0x1f)
{
if(fb)
{
WriteData(255-ASC_MSK[(c1-0x20)
*16+j]);
}
else
{
WriteData(ASC_MSK[(c1-0x20)
*16+j]);
}
}
else
WriteData(cData);
}
uRow++;
}
else
// 中文
{
for(j=0;j<sizeof(Cdotlib)/sizeof(Cdotlib
[0]);j++) // 查找定位
{
if((c1 == Cdotlib[j].Index[0]) &&
(c2 == Cdotlib[j].Index[1]))
break;
}
for(k=0;k<2;k++)
// 分16行输出
{
Locatexy(uRow+k,uCol,att);
WriteCommand( mWrite );
// 写数据(命令)
for(temp=0;temp<16;temp++)
{
if(fb)
{
WriteData( 255-Cdotlib[j].Msk
[temp*2 + k]);
}
else
{
WriteData( Cdotlib[j].Msk[temp*2 +
k]);
}
}
}
uRow +=2;
// 光标右移一大格
i++;
}
if(uRow >= 40)
// 光标后移
{
uCol += 16;
// Y坐标
uRow = 0;
// X坐标
if( uCol >= 240 ) uCol = 0;
}
Locatexy(uRow,uCol,att);
i++;
}
return uLen;
//返回字串长度,汉字按2字节计算
}
main()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -