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

📄 drv_lcd.c

📁 sparc硬件平台下的lcd驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
        deg = 0.06;    else        deg = 0.08;    arc_stp = deg * 25.4/radius;            /* 如果输入的第二个角度小于第一个,则加上一个圆周 */     if ( tel < tsl)        tel += 6.28319;    num = ( D_INT32 ) ((tel - tsl) / arc_stp + 0.5);    if ( num == 0)        num = ( D_INT32 )(6.28319 / arc_stp + 0.5);            t_arc = tsl;    x1 = x + radius * cos ( tsl ) + 0.5;    y1 = y + radius * sin ( tsl ) + 0.5;    drv_lcd_pixel (x1, y1, color) ;    for ( arc_i = 0; arc_i < num - 1; arc_i++ )    {        t_arc += arc_stp;        t_cos = cos(t_arc);        t_sin = sin(t_arc);        x1 = x + radius * t_cos + 0.5;        y1 = y + radius * t_sin + 0.5;        drv_lcd_pixel (x1, y1, color);    }        x1 = x + radius * cos(tel) + 0.5;        y1 = y + radius * sin(tel) + 0.5;        drv_lcd_pixel (x1, y1, color);        return;        }/* 字模要重新添加 *///void drv_lcd_char ( D_UINT16 row, D_UINT16 col, D_UINT8 m_code, //                    D_UINT32 color, D_INT8 font, D_INT8 size)//{//  D_INT32 i, j, offset;//  D_UINT8 *p;///*//  offset = m_code * VERCHAR;//  D_UINT8 asc[16];//*///  if (0 == size)//  {//    offset = m_code * VERCHAR;//    D_UINT8 asc[16];//    p = ascii10;//    for ( i = 0; i < 16; i++)//    {//    asc[i] = *(p + offset + i);//    }//    for ( i = 0; i < 16; i++)//    for ( j = 0; j < 8; j++)//    {//      if ((asc[i] << j) & 0x80)//      drv_lcd_pixel ( row + j, col + i, color);//    }//  }// //  else if (1 == size)//  {//      offset = (m_code - 32) * 32;  /* 16*16靠?*///      D_UINT16 asc[16];//      p = ascii14;//      for ( i = 0, j = 0; i < 32; i += 2, j++)//      {//        asc[j] = (*(p + offset + i)<< 8) | (*(p + offset + i + 1));//      }////      for ( i = 0; i < 16; i++)//      for ( j = 0; j < 16; j++)//      {//        if ((asc[i] << j) & 0x8000)//          drv_lcd_pixel ( row + j, col + i, color);//      }//  }////  else if (2 == size)//  {//    D_UINT32 asc[32];//    ///*靠靠靠靠靠靠?2?2*///    offset = (m_code - 48) * 128;//    p = ascii24;////    for ( i = 0, j = 0; i < 32; i++, j += 4)//    {//      asc[i] = ((D_UINT32) *(p + offset + j)) << 24//             | ((D_UINT32) *(p + offset + j + 1)) << 16//             | (D_UINT32) *(p + offset + j + 2) << 8//             | (D_UINT32) *(p + offset + j + 3);////    }//    for ( i = 0; i < 32; i++)//    for ( j = 0; j < 32; j++)//    {//      if ((asc[i] << j) & 0x80000000)//        drv_lcd_pixel ( row + j, col + i, color);//    }//  }//  return ;//}/////* 汉字显示函数 *///void drv_lcd_han ( D_UINT16 row, D_UINT16 col, D_UINT8 m_code[2], //                   D_UINT32 color, D_INT8 font, D_INT8 size)//{//    D_INT32 i, j;//    D_INT32 offset;            /* 相对于字库的偏移量 *///    D_UINT16 han[16];          /* 保存相应汉字的点阵数据*///    D_UINT8 *p = NULL;//    if (0 == size)//      p = hz10;//    else if (1 == size)//      p = hz12;//    else if (2 == size)//      p = hz12;//    offset = ((m_code[0] - 161) * 94 + (m_code[1] - 161)) * 32;//    for ( i = 0, j = 0; i < 16; i++, j += 2)//    {/////**************** x 86平台 **********************////*        hz[i] = ((unsigned short) (*(p + offset + j + 1))) << 8 //              | (unsigned short) (*(p + offset + j ));//*//////***************** sparc平台 ********************///       han[i] = ((D_UINT16 ) (*(p + offset + j ))) << 8//              | (D_UINT16 ) (*(p + offset + j + 1));////      }//      for ( i = 0; i < 16; i++)//        for ( j = 0; j < 16; j++)//        {//            if ((han[i] << j) & 0x8000)//                drv_lcd_pixel ( row + j, col + i, color);                //        }//    return;//}/////******************************************************************** // * 显示字符串就是调用显示字符函数,其中要判断最高位是否为1,是1则为汉字区,// * 需要读取两个字节,否则为 ASCII 码,读取一个字节;ASCII 码需要调用另外// * 定义的字模,暂时空;// *///void drv_lcd_dispstr(D_UINT16 row, D_UINT16 col, D_UINT8 *pstr, D_UINT32 color, //                     D_UINT8 font, D_UINT8 size)//{//    D_UINT8 *p, code[2];/////*    D_INT16 i, num ;  */////    p = pstr;//    D_UINT16 xoffset, yoffset;        /* 输出上一个变量后的偏移量  *///    D_UINT16 ennum = 0, chnum = 0;         /* 统计字符与汉字的个数 *///    D_UINT8 *ch, *cw, *hh, *hw;//    ch = (D_UINT8 *)malloc(sizeof(char));//    hh = (D_UINT8 *)malloc(sizeof(char));//    cw = (D_UINT8 *)malloc(sizeof(char));//    hw = (D_UINT8 *)malloc(sizeof(char));//    if(!p)//      return;//    //    frm_get_word_para(size, font, 1, ch, cw);//    frm_get_word_para(size, font, 0, hh, hw);//    for ( xoffset = 0 ; *p != '\0'; p++)//    {//      if ( *p < 0x80)//      {//            /*code[0] = *p; *///        xoffset = (ennum * (*cw) + chnum * (*hw) + row) % Xwidth;//        yoffset = (ennum * (*cw) + chnum * (*hw) + row) / Xwidth * (*ch) + col;//        drv_lcd_char (xoffset, yoffset, *p, color, font, size);//        ennum++;//      }//      else//      {//        if (*p == '\0')//          break;//        else//        {//          code[0] = *p;//          code[1] = *(p+1);//          xoffset = (ennum * (*cw) + chnum * (*hw) + row) % Xwidth;//          yoffset = (ennum * (*cw) + chnum * (*hw) + row) / Xwidth//                          *(*ch) + col;//          drv_lcd_han (xoffset, yoffset, code, color, font, size);//          p++;//          chnum++;//        }//        	  //      }//    }//    free(ch);//    free(cw);//    free(hh);//    free(hw);//    return;    //}/* 显示 bmp 图像函数 */void drv_show_bmp( D_UINT16 row, D_UINT16 col, D_UINT8 bmpfile[] ){    D_INT32 bmpsize;    D_INT32 offset, ciWidth, ciHeight;    	/* 取得图片的每像素比特数,宽和高*/    D_UINT32 i, k, num;    D_UINT16 ciBitCount;    D_UINT16 r, g, b;    D_UINT16 color;             /*液晶屏支持的颜色色深*/       D_UINT8  *tmp;     /* 临时存放 BMP 图片的数组,300K,可适当调整 */    num = sizeof (bmpfile);    tmp = (D_UINT8 *)malloc(num*sizeof(char));    /**      *  注意:ciWidth, ciHeight, offset 都是4字节的长度,     *  考虑到实际情况,该版本只计算两个字节的长度(65535)     *   ciBitCount 目前最高是 32位     **/        ciWidth = bmpfile[18] + bmpfile[19] * 256;    ciHeight = bmpfile[22] + bmpfile[23] * 256;    ciBitCount = bmpfile[28];    offset = bmpfile[10] + bmpfile[11] * 256;     bmpsize = ciWidth * ciHeight * ciBitCount / 8;	/* 得到图片数据的大小 */     for ( i = 0; i < bmpsize; i++ )    {        tmp[i]= bmpfile[offset+i];    }        if ( ciBitCount == 32 )                /*图像是32位,第4字节为0*/    {        for ( i = 0, k = 0; i < bmpsize; i += 4, k++)        {            b = tmp[i] >> 3;            g = tmp[i+1] >> 2;  	        r = tmp[i+2] >> 3;            color = r << 11 | g << 5 | b;   /*RGB:565 格式*/                /* drv_lcd_pixel ( row + k % ciWidth,  col +  k / ciWidth, tmp2[k]); */                /* 由于BMP图像是从最后以行开始读取,故把纵坐标需要取负数平移 */            drv_lcd_pixel ( row + k % ciWidth, ciHeight + col -  k / ciWidth, color);        }    }     else if ( ciBitCount == 24 )          /* 图像是24位 */    {        for ( i = 0, k = 0; i < bmpsize; i += 3, k++)        {            b = tmp[i] >> 3;            g = tmp[i+1] >> 2;  	        r = tmp[i+2] >> 3;            color = r << 11 | g << 5 | b;   /*RGB:565 格式*/            drv_lcd_pixel ( row + k % ciWidth, ciHeight + col -  k / ciWidth, color);        }      }        if ( ciBitCount == 16 )                /*图像是32位,第4字节为0*/    {        for ( i = 0, k = 0; i < bmpsize; i += 2, k++)        {            b = tmp[i];            r = tmp[i+1];            color = b | r << 8;   /*RGB:565 格式*/            drv_lcd_pixel ( row + k % ciWidth, ciHeight + col -  k / ciWidth, color);        }    }    free (tmp);    return ;}D_UINT8* drv_lcd_get_all( void ){   return lcd_buff;}D_BOOL drv_lcd_set_all( D_INT8* buf ){   //D_UINT8 *addr = NULL;   //D_UINT32 len = 0;   if( !buf )     return FALSE;   //len = 2*Yheight*Xwidth;   //addr = (D_UINT8 *)h_address_lcd;   memcpy((D_UINT8 *)lcd_buff, buf, LCD_BUFF_LEN);   if( buff_flag == 0 )   	 memcpy((D_UINT8 *)h_address_lcd, buf, LCD_BUFF_LEN);   return TRUE;}D_BOOL drv_lcd_refresh(void){   //return drv_lcd_set_all(lcd_buff);   memcpy((D_UINT8 *)h_address_lcd, lcd_buff, LCD_BUFF_LEN);   return TRUE;}void drv_lcd_clear_buff(void){   memset(lcd_buff, 0xff, LCD_BUFF_LEN);   if( buff_flag == 0 )   	 memset((D_UINT8 *)h_address_lcd, 0xff, LCD_BUFF_LEN);}void drv_lcd_set_flag(D_UINT8 flag){   buff_flag = flag;   return ;}void drv_lcd_update(D_UINT16 x, D_UINT16 y, D_UINT16 w, D_UINT16 h){	 D_UINT16 i;	 D_UINT32 offset=0;	 D_UINT32 len=2*w;	 	 for(i=0; i<h; i++)	 {	 	    offset = 2*((y+i) * Xwidth + x);	    	memcpy(((D_UINT8 *)h_address_lcd)+offset, lcd_buff+offset, len);	 }}

⌨️ 快捷键说明

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