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

📄 pg160128.c

📁 单片机c语言程序设计100例--基于PIC+PROTEUS
💻 C
📖 第 1 页 / 共 2 页
字号:
//-----------------------------------------------------------------
INT8U LCD_Write_Data(INT8U dat)
{
    if(Status_BIT_3() == 0) return 1;
    Write_Data(dat);
    return 0; //成功时返回0
}

//-----------------------------------------------------------------
// 读数据
//-----------------------------------------------------------------
INT8U LCD_Read_Data() 
{
    if(Status_BIT_01() == 0) return 1;
    return Read_LCD_Data();
}

//-----------------------------------------------------------------
// 设置当前地址
//-----------------------------------------------------------------
void Set_LCD_POS(INT8U row, INT8U col)
{
    INT16U Pos;    
    Pos = row * LCD_WIDTH + col;
    LCD_Write_Command_P2(LC_ADD_POS,Pos % 256, Pos / 256);
    gCurRow = row;
    gCurCol = col;
}

//-----------------------------------------------------------------
// 清屏
//-----------------------------------------------------------------
void Clear_Screen()
{
    INT16U i;
    LCD_Write_Command_P2(LC_ADD_POS,0x00,0x00); //置地址指针
    LCD_Write_Command(LC_AUT_WR);               //自动写
    for(i = 0;i < 0x2000; i++)
    {
        Status_BIT_3();
        LCD_Write_Data(0x00);                   //写数据
    }
    LCD_Write_Command(LC_AUT_OVR);              //自动写结束
    LCD_Write_Command_P2(LC_ADD_POS,0x00,0x00); //重置地址指针
    gCurRow = 0;                               
    gCurCol = 0;
}

//-----------------------------------------------------------------
// LCD初始化
//-----------------------------------------------------------------
char LCD_Initialise()
{
    LCD_Write_Command_P2(LC_TXT_STP,0x00,0x00);      //文本显示区首地址
    LCD_Write_Command_P2(LC_TXT_WID,LCD_WIDTH,0x00); //文本显示区宽度
    LCD_Write_Command_P2(LC_GRH_STP,0x00,0x00);      //图形显示区首地址
    LCD_Write_Command_P2(LC_GRH_WID,LCD_WIDTH,0x00); //图形显示区宽度
    LCD_Write_Command(LC_CUR_SHP | 0x01);            //光标形状
    LCD_Write_Command(LC_MOD_OR);                    //显示方式设置
    LCD_Write_Command(LC_DIS_SW  | 0x08);
    return 0;
}

//-----------------------------------------------------------------
// ASCII及汉字显示(rev表示是否反白)
//-----------------------------------------------------------------
void Disp_Str_at_xy(INT8U x,INT8U y,char buf[],INT8U len, INT8U rev)
{
    char c1,c2,cData;
    INT8U i = 0,j,k,uLen = strlen(buf);
    while(i < len && i < uLen)
    {
        c1 = buf[i]; c2 = buf[i+1];
        Set_LCD_POS(y, x / 8);
        //ASCII字符显示
        if((c1 & 0x80) == 0x00) 
        {
            if(c1 < 0x20)
            {
                switch(c1)
                {
                    case 0x0D:
                    case 0x0A: i++; x = 0;  //回车或换行
                             if(y < 112) y += HZ_CHR_HEIGHT;
                             continue;                        
                    case 0x08: i++;         //退格
                             if(y > ASC_CHR_WIDTH) y -= ASC_CHR_WIDTH;
                             cData = 0x00;
                             break;
                }
            }
             
            //从Flash程序ROM中读取字符点阵并显示
            for(j = 0; j < ASC_CHR_HEIGHT; j++)
            {
                if(c1 >= 0x1F)
                {
                    cData = ASC_MSK[(c1 - 0x1F) * ASC_CHR_HEIGHT + j];
                    if (rev) cData = ~cData;
                    Set_LCD_POS( y + j , x / 8);
                    if( (x % 8) == 0)
                    {
                        LCD_Write_Command(LC_AUT_WR);
                        LCD_Write_Data(cData);
                        LCD_Write_Command(LC_AUT_OVR);
                    }
                    else OutToLCD(cData, x, y + j);
                }
                Set_LCD_POS(y + j, x / 8);
            }
            x += ASC_CHR_WIDTH;
        }    
        //中文字符显示
        else  
        {     
            //在字库中查找汉字
            for(j = 0;j < sizeof(GB_16)/sizeof(GB_16[0]);j++)
            {
                if(c1 == GB_16[j].inner_CODE[0] && c2 == GB_16[j].inner_CODE[1])
                break;
            }
            //从中文点阵库中读取点阵并显示
            for(k = 0;k < HZ_CHR_HEIGHT; k++)
            {    
                Set_LCD_POS(y + k, x / 8);
                if(j < sizeof(GB_16)/sizeof(GB_16[0]))
                {
                    c1 = GB_16[j].Msk[k*2];
                    c2 = GB_16[j].Msk[k*2+1];
                }
                else c1 = c2 = 0;
                if((x % 8) == 0)
                {
                    LCD_Write_Command(LC_AUT_WR);
                    if (rev) c1 = ~c1;
                    LCD_Write_Data(c1);
                    LCD_Write_Command(LC_AUT_OVR);
                }
                else 
                {
                    if (rev) c1 = ~c1;
                    OutToLCD(c1, x, y + k);
                }     
    
                if(((x + 2 + HZ_CHR_WIDTH / 2) % 8) == 0)
                {
                    LCD_Write_Command(LC_AUT_WR);
                    if (rev) c2 = ~c2;
                    LCD_Write_Data(c2);
                    LCD_Write_Command(LC_AUT_OVR);
                }
                else
                {
                    if (rev) c2 = ~c2;
                    OutToLCD(c2,x + 2 + HZ_CHR_WIDTH / 2,y + k);
                }
            }
            x += HZ_CHR_WIDTH;  i++;
        } 
        i++;
    }
}

//-----------------------------------------------------------------
// 输出起点x不是8的倍数时,原字节分成两部分输出到LCD
//-----------------------------------------------------------------
void OutToLCD(INT8U Dat,INT8U x,INT8U y) 
{





}

//-----------------------------------------------------------------
// 绘点函数
// 参数:点的坐标,模式1/0分别为显示与清除点
//-----------------------------------------------------------------
void Pixel(INT8U x,INT8U y, INT8U Mode)
{





}

//-----------------------------------------------------------------
// 两数交换
//-----------------------------------------------------------------
void Exchange(INT8U *a, INT8U *b)
{


}

//-----------------------------------------------------------------
// 绘制直线函数
// 参数:起点与终点坐标,模式为显示(1)或清除(0),点阵不超过255*255)
//-----------------------------------------------------------------
void Line(INT8U x1,INT8U y1, INT8U x2,INT8U y2, INT8U Mode)
{
    INT8U x,y;        //绘点坐标
    float k,b;        //直线斜率与偏移
    
    if( fabs(y1 - y2) <= fabs( x1 - x2) )
    {
       



    }
    else 
    {
       



    }
}

//-----------------------------------------------------------------
// 绘制图像(图像数据来自于Flash程序ROM空间)
//-----------------------------------------------------------------
void Draw_Image(INT8U *G_Buffer, INT8U Start_Row, INT8U Start_Col)
{   
    INT16U i,j,W,H;
    //图像行数控制(G_Buffer的前两个字节分别为图像宽度与高度)
    W = G_Buffer[1];
    for(i = 0;i < W;i++)    
    {





    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -