📄 drv_lcd.c
字号:
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 + -