⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 6029lcd驱动显示程序,直接可以运用的
💻 C
📖 第 1 页 / 共 2 页
字号:
        }
        Linexy( MAIN_METHOD*64,49,MAIN_METHOD*64+63,49,0,1);
        Linexy( MAIN_METHOD*64,49,MAIN_METHOD*64,51+NO_FANGFA_COMMANDS*16,0,1);
        Linexy( MAIN_METHOD*64+63,49,MAIN_METHOD*64+63,51+NO_FANGFA_COMMANDS*16,0,1);
        Linexy( MAIN_METHOD*64,51+NO_FANGFA_COMMANDS*16,MAIN_METHOD*64+63,51+NO_FANGFA_COMMANDS*16,0,1);
    }
    if (  current_command->parent == (COMMAND*)&main_menu[MAIN_FUNCTION])
    {
        WriteCommand( 0x59 );            // 写入指令DISP ON/OFF代码,后续参数:
        WriteData( 0x44 );               // 00 00 01 00显示1区开显示,其余层关闭
        for(i=0;i<NO_GONGNENG_COMMANDS;i++)
        {
            if(current_command->ID==i)
            {
                fb=1;
            }
            else
            {
                fb=0;
            }
            dprintf
(MAIN_FUNCTION*8,51+16*i,0,fb,gongneng_menu[i].name);
        }
        Linexy( MAIN_FUNCTION*64,49,MAIN_FUNCTION*64+63,49,0,1);
        Linexy( MAIN_FUNCTION*64,49,MAIN_FUNCTION*64,51+NO_GONGNENG_COMMANDS*16,0,1);
        Linexy( MAIN_FUNCTION*64+63,49,MAIN_FUNCTION*64+63,51+NO_GONGNENG_COMMANDS*16,0,1);
        Linexy( MAIN_FUNCTION*64,51+NO_GONGNENG_COMMANDS*16,MAIN_FUNCTION*64+63,51+NO_GONGNENG_COMMANDS*16,0,1);
    }
    if (  current_command->parent == (COMMAND*)&main_menu[MAIN_PPL])
    {
        WriteCommand( 0x59 );            // 写入指令DISP ON/OFF代码,后续参数:
        WriteData( 0x44 );               // 00 00 01 00显示1区开显示,其余层关闭
        for(i=0;i<NO_PLL_COMMANDS;i++)
        {
            if(current_command->ID==i)
            {
                fb=1;
            }
            else
            {
                fb=0;
            }
            dprintf(MAIN_PPL*8,51+16*i,0,fb,pll_menu[i].name);
        }
        Linexy( MAIN_PPL*64,49,MAIN_PPL*64+63,49,0,1);
        Linexy( MAIN_PPL*64,49,MAIN_PPL*64,51+NO_PLL_COMMANDS*16,0,1);
        Linexy( MAIN_PPL*64+63,49,MAIN_PPL*64+63,51+NO_PLL_COMMANDS*16,0,1);
        Linexy( MAIN_PPL*64,51+NO_PLL_COMMANDS*16,MAIN_PPL*64+63,51+NO_PLL_COMMANDS*16,0,1);
    }
    if (  current_command->parent == (COMMAND*)&main_menu[MAIN_HELP])
    {
        WriteCommand( 0x59 );             // 写入指令DISP ON/OFF代码,后续参数:
        WriteData( 0x44 );                // 00 00 01 00显示1区开显示,其余层关闭
        for(i=0;i<NO_HELP_COMMANDS;i++)
        {
            if(current_command->ID==i)
            {
                fb=1;
            }
            else
            {
                fb=0;
            }
            dprintf(MAIN_HELP*8,51+16*i,0,fb,help_menu[i].name);
        }
        Linexy( MAIN_HELP*64,49,MAIN_HELP*64+63,49,0,1);
        Linexy( MAIN_HELP*64,49,MAIN_HELP*64,51+NO_HELP_COMMANDS*16,0,1);
        Linexy( MAIN_HELP*64+63,49,MAIN_HELP*64+63,51+NO_HELP_COMMANDS*16,0,1);
        Linexy( MAIN_HELP*64,51+NO_HELP_COMMANDS*16,MAIN_HELP*64+63,51+NO_HELP_COMMANDS*16,0,1);
     
    }
}
void set(void)
{
    current_command=&set_menu[SET_DDJ];              //    BlockClr(0,50,40,170);
    return;
}

void method(void)
{
    current_command=&fangfa_menu[FANGFA_FANGFA1];    //    BlockClr(0,50,40,170);
    return;
}
void function(void)
{
    current_command=&gongneng_menu[GONGNENG_analyse];//    BlockClr(0,50,40,170);
    return;
}
void pll(void)
{
      current_command=&pll_menu[PLL_PLL1];            //    BlockClr(0,50,40,170);
    return;
}
void help(void)
{
     current_command=&help_menu[HELP_HELP1];           //    BlockClr(0,50,40,170);
    return;
}
void help2(void)
{
}
void help1(void)
{
}
void pll3(void)
{
}
void pll2(void)
{
}
void pll1(void)
{
}
//-------------------------------------------
// 函数: void analyse(void)
//-------------------------------------------
void analyse(void)
{
    
}
//--------------------------------------------
//函数: void gongneng2(void)
//-------------------------------------------
void gongneng2(void)
{

}
//---------------------------------------------
// 函数: void gongneng3(void)
//--------------------------------------------
void gongneng3(void)
{

}
//---------------------------------------------
// 函数: void gongneng4(void)
//---------------------------------------------
void gongneng4(void)
{

}
void gongneng5(void)
{
}
void fang1(void)
{
    
}
void fang2(void)
{
    
}
void fang3(void)
{

}
void fang4(void)
{

}
void fang5(void)
{

}
void shezi(void)
{
}
void mainfangfa(void)
{
}
void biaoyang(void)
{
}
void brj(void)
{
}
//------------------------------------------
// 函数: 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 + -