/**************************************************************************** * 名 称:BackSpace * 功 能:液晶显示,退格,地址指向前一个(退半字) * 入口参数:无 * 出口参数:无 * 说 明: 此函数供putchar2Lcd函数调用,当液晶收到退格字符,后,调用此函数, 地址退回一格(英文:半字,中文:一字) ****************************************************************************/ void BackSpace() { char addr,dat; addr = LcdReadAddr(); //当前地址 LcdWriteData(0x20); //写入一个空字符,根据地址判断是否为前半字 if(addr == LcdReadAddr()) //前半字 { if(addr == 0x80) return; else if(addr == 0x90) addr = 0x87; else if(addr == 0x88) addr = 0x97; else if(addr == 0x98) addr = 0x8F; else addr = addr - 1; LcdWriteComm(addr); LcdReadData(); //空读取 dat = LcdReadData(); LcdWriteComm(addr); if(dat < 0x80) LcdWriteData(dat); } else { LcdWriteComm(addr); } }
/**************************************************************************** * 名 称:putchar2Lcd * 功 能:向标12864液晶设备发送一字节数据(1个ASCII字符) * 入口参数:ch: 待发送的字符 * 出口参数:发出的字符 * 说 明: 此函数供putchar函数调用,完成printf函数底层输出到液晶。 ****************************************************************************/ int putchar2Lcd(int ch) { char addr,dat; char changeRowFlag = 0; if (ch == '\n') // '\n'(回车),换行 { ChangeNextRow(); changeRowFlag = 1; } else if (ch == '\b') // '\b' (退格) { BackSpace(); } else { addr = LcdReadAddr(); if(ch < 0x80) { LcdWriteData(ch); } else { LcdWriteData(0x20); //写入一个空字符,根据地址判断是否为前半字 if(addr == LcdReadAddr()) //前半字 从新写入ch字符 { LcdWriteComm(addr); LcdWriteData(ch); } else { LcdWriteComm(addr); dat = LcdReadData(); if(dat < 0x80) //前一个字符是英文字符 { LcdWriteData(0x20); //空格 } if((addr != LcdReadAddr()) && //写入的是行最后位的后半字则换行 (addr==0x87 || addr==0x97 || addr==0x8F || addr==0x9F)) { ChangeNextRow(); changeRowFlag = 1; } LcdWriteData(ch); } } } if((addr != LcdReadAddr()) && //写入的是行最后位的后半字则换行,且未换过行 (changeRowFlag == 0) && (addr==0x87 || addr==0x97 || addr==0x8F || addr==0x9F)) { ChangeNextRow(); } return (ch); }
/**************************************************************************** * 名 称:GotoXY * 功 能:定位至液晶的具体位置:(x,y)(0-15,0-3) * 入口参数:无 * 出口参数:无 * 说 明: 调用printf之前调用此函数,可以定位至液晶的具体位置,中文则以偶数 有效,若是奇数,自动后移一位 ****************************************************************************/ void GotoXY(char x,char y) { char addr; if(y==0) { addr = 0x80 + x / 2; } else if(y==1) { addr = 0x90 + x / 2; } else if(y==2) { addr = 0x88 + x / 2; } else { addr = 0x98 + x / 2; } LcdWriteComm(addr); if(x % 2) //是奇数,后移一位(写入空格) { LcdWriteData(0x20); } }
void ST7789H2_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t data) { uint8_t dataB = 0; /* Set Cursor */ ST7789H2_SetCursor(Xpos, Ypos); /* Prepare to write to LCD RAM */ ST7789H2_WriteReg(0x2C, (uint8_t*)NULL, 0); /* RAM write data command */ /* Write RAM data */ dataB = (uint8_t)(data >> 8); LcdWriteData(dataB); dataB = (uint8_t)data; LcdWriteData(dataB); }
void LcdUpdate(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd) { u8 x, y, page, page_end, data; page_end = yEnd / Y_PAGE_SIZE; for(page=yStart/Y_PAGE_SIZE; page<=page_end; page++) { #if defined(TP_SIM800W_OLD) LcdSetDisplayAddress(xStart, page*Y_PAGE_SIZE); #else LcdSetDisplayAddress(xStart + 4, page*Y_PAGE_SIZE); #endif for(x=xStart; x<=xEnd; x++) { data = 0; for(y=0; y<8; y++) { if(M_LcdDisplayData(x, ((page*Y_PAGE_SIZE)+y)) == EAT_TRUE) { data |= 1<<y; } } LcdWriteData(data); } } }
//清除屏幕 void LcdClsScr(void) { u16 i; //LcdSetLocation(0, 0); LcdWriteDC(LCDCMD , 0x80); for ( i=0; i<(LCD_ROW*LCD_COL); i++) LcdWriteData(0x00); }
static void lcdPrint(char *line){ int i; /* * Show welcome message in LCD-display */ LcdSetCursor(0); LcdClear(); for (i = 0; i < strlen(line); i++) { LcdSetCursor(i); LcdWriteData(line[i]); } }
// 输出英文字符 // x : x位置 // y : y位置 // c : 英文字符 static void LcdPutEnChar(uint8_t x, uint8_t y, uint8_t c) { u8 tch = c , n; if((tch< 32) || (tch >= (32+NUMBER_OF_CHARACTER))) return; tch -= 0x20; LcdSetLocation(x, y); for ( n=0; n<LCD_ROW; n++) LcdWriteData( EnPix[ tch ][ n] ); }
void ST7789H2_WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters) { uint8_t i; /* Send command */ LcdWriteReg(Command); /* Send command's parameters if any */ for (i=0; i<NbParameters; i++) { LcdWriteData(Parameters[i]); } }
// 清除位图 // x : x位置 // y : y位置 // row : 位图行数 // col : 位图列数 void LcdEraseBitmap(uint8_t x, uint8_t y, uint8_t col, uint8_t row) { uint8_t i,j; if((col > 84) || (row > 6)) return; for ( i=0; i<row; i++) { LcdSetLocation(x, y); for( j=0; j<col; j++) LcdWriteData(0); y++; } }
// 绘画位图 // x : x位置 // y : y位置 // pBmp : 位图 // row : 位图行数 // col : 位图列数 void LcdDrawBitmap(uint8_t x, uint8_t y, uint8_t *pBmp, uint8_t col, uint8_t row) { uint8_t i,j; if((col > 84) || (row > 6)) return; for ( i=0; i<row; i++) { LcdSetLocation(x, y); for( j=0; j<col; j++) LcdWriteData(*(pBmp+i*col+j)); y++; } }
/******************************************************************************* * 函 数 名 :ShowFullSDPic * 函数功能 :显示SD卡的bin文件形式的图片 * 输 入 :add 图片起始地址,通过winhex查看 * 输 出 :无 *******************************************************************************/ void ShowFullSDPic(unsigned long add) { unsigned long i=0,j=0,k=0; AddressSet(0,0,239,319); while(i < 76800)//240*320 { LED = ~LED; SdReadBlock(DATA,add+k*512,512); for(j=0;j<256;j++) { LcdWriteData(DATA[j*2+1],DATA[j*2]); //写一个像素点 i++; if(i >= 76800) break; } k++; } }
/*************************************** 说明: 显示字符 x: 横坐标 y: 纵坐标 value: 显示的字符 *****************************************/ void PutChar(char x , char y , char value) { LocateXY(x,y); LcdWriteData(value); }