커뮤니티>공지사항
   
   
 
    TFT 터치 LCD Interface   2018.12.04
    TFT 터치 LCD Interface
    Background.png
 

7" TFT LCD를 이용한 프로젝트입니다. #include #include #include #include #include "stm32f3xx_hal.h" #include "stm32f3xx.h" #include "stm32f3xx_it.h" #include "lcdcommand.h" #include "tm_stm32_delay.h" #include "ads1232.h" #include "temperktype.h" const int8_t FanButton[]="bt3\0"; const int8_t Fan1Dan[]="1\0"; const int8_t Fan2Dan[]="2\0"; const int8_t Fan3Dan[]="3\0"; const int8_t Fan4Dan[]="4\0"; const int8_t Fan5Dan[]="5\0"; const int8_t FanOff[]="Off\0"; extern UART_HandleTypeDef huart3; extern TIM_HandleTypeDef htim14; #define LCDQUESIZE 4 tLcdRxD LcdRxD[LCDQUESIZE]; bool bSetMode,BlinkOnOff; bool bTxLcdComplete; uint8_t ucPageNumber,ucRxCount; uint8_t ucLcdTxCommand[50],ucWorkBuff[20]; uint8_t ucTemperSkinBuff[20],ucWorkTimeBuff[20],ucTemperTankBuff[20]; uint8_t ucWorkMinute,ucWorkSec; uint8_t ucWorkSetMinute,ucWorkSetSec; uint8_t ucWorkCurrMinute,ucWorkCurrSec; uint16_t uiN2GasWeightLevel; uint16_t uiSkinTemperLevel; uint16_t uiElapTimeLevel; uint16_t uiTankTemperLevel; uint8_t ucSetPosion; uint8_t LcdQueueHead,LcdQueueTail; void SendLcdPage(uint8_t ucPage); void SendLcdPicture(uint8_t uiObjName,uint8_t uiPicNumber); void SendLcdText(uint8_t *Item,uint8_t *str); void SendLcdNumeric(uint8_t uiObjName,int16_t uiNumber); void SendLcdCheckBox(uint8_t uiObjName,uint8_t ucNumber); void SendLcdWaveform(uint8_t uiObjName,uint8_t ucCh,uint8_t ucNumber); void SendLcdItemOnOff(uint8_t uiObjName,uint8_t ucKind,uint8_t ucOnOff); void SendLcdBlank(uint8_t *Item); void SendLcdProgressBar(uint8_t uiObjName,uint16_t uiNumber); void DisplayWorkTime(uint8_t m,uint8_t s); void DisTemperSkin(float fTemperature); void DisTemperTank(int16_t iTemperature); void RxLcdDataProc(void); void FanLevelDis(void); const uint8_t LCDIMG[]={ AlphaBlank,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,AlphaPicB,0x80,0x00, AlphaPic0,AlphaPic1,AlphaPic2,AlphaPic3,AlphaPic4,AlphaPic5,AlphaPic6,AlphaPic7,AlphaPic8,AlphaPic9,0x00,0x00,0x00,0x48,0x00,0x00, 0x00,0x77,0x7c,0x58,0x5e,0x79,0x71,0x00,0x76,0x06,0x00,0x00,0x38,0x55,0x54,0x5c, 0x73,0x00,0x50,0x6d,0x78,0x1c,0x1c,0x1d,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00 }; const uint8_t TblWorkingObj[]={ CurrJobMin10,CurrJobMin1,CurrJobSec10,CurrJobSec1 }; const uint8_t TblTemperSkinObj[]={ FullJobH100,FullJobH10,FullJobH1 }; const uint8_t TblTemperTankObj[]={ TEMPERTANK1000,TEMPERTANK100,TEMPERTANK10,TEMPERTANK1 }; void SendLcdPage(uint8_t ucPage) { ucPageNumber=ucPage; memset(ucLcdTxCommand,0,sizeof(ucLcdTxCommand)); sprintf((char *)&ucLcdTxCommand[0],"page %d\xff\xff\xff\0",ucPage); HAL_UART_Transmit(&huart3,(uint8_t *)&ucLcdTxCommand[0],strlen((char*)ucLcdTxCommand),30); } void SendLcdPicture(uint8_t uiObjName,uint8_t uiPicNumber) { // char buf[10] = {0}; // itoa(uiPicNumber,WorkBuf); memset(ucLcdTxCommand,0,sizeof(ucLcdTxCommand)); sprintf((char *)&ucLcdTxCommand[0],"p%d.pic=%d\xff\xff\xff\0",uiObjName,uiPicNumber); HAL_UART_Transmit(&huart3,(uint8_t *)&ucLcdTxCommand[0],strlen((char*)ucLcdTxCommand),30); } void SendLcdText(uint8_t *Item,uint8_t *str) { memset(ucLcdTxCommand,0,sizeof(ucLcdTxCommand)); sprintf((char*)&ucLcdTxCommand[0],"%s.txt=\x22%s\x22\xff\xff\xff\0",Item,str); HAL_UART_Transmit(&huart3,(uint8_t *)&ucLcdTxCommand[0],strlen((char*)ucLcdTxCommand),30); } void SendLcdNumeric(uint8_t uiObjName,int16_t uiNumber) { // char buf[10] = {0}; // itoa(uiPicNumber,WorkBuf); memset(ucLcdTxCommand,0,sizeof(ucLcdTxCommand)); sprintf((char *)&ucLcdTxCommand[0],"n%d.val=%d\xff\xff\xff\0",uiObjName,uiNumber); HAL_UART_Transmit(&huart3,(uint8_t *)&ucLcdTxCommand[0],strlen((char*)ucLcdTxCommand),30); } //SendLcdWaveform(11,0,40); void SendLcdWaveform(uint8_t uiObjName,uint8_t ucCh,uint8_t ucNumber) { memset(ucLcdTxCommand,0,sizeof(ucLcdTxCommand)); sprintf((char *)&ucLcdTxCommand[0],"add %d,%d,%d\xff\xff\xff\0",uiObjName,ucCh,ucNumber); HAL_UART_Transmit(&huart3,(uint8_t *)&ucLcdTxCommand[0],strlen((char*)ucLcdTxCommand),30); } void SendLcdCheckBox(uint8_t uiObjName,uint8_t ucNumber) { //0=un check 1=check memset(ucLcdTxCommand,0,sizeof(ucLcdTxCommand)); sprintf((char *)&ucLcdTxCommand[0],"c%d.val=%d\xff\xff\xff\0",uiObjName,ucNumber); HAL_UART_Transmit(&huart3,(uint8_t *)&ucLcdTxCommand[0],strlen((char*)ucLcdTxCommand),30); } void SendLcdItemOnOff(uint8_t uiObjName,uint8_t ucKind,uint8_t ucOnOff) { memset(ucLcdTxCommand,0,sizeof(ucLcdTxCommand)); if(ucKind==PICTURE){ sprintf((char *)&ucLcdTxCommand[0],"vis p%d,%d\xff\xff\xff\0",uiObjName,ucOnOff); } if(ucKind==NUMERIC){ sprintf((char *)&ucLcdTxCommand[0],"vis n%d,%d\xff\xff\xff\0",uiObjName,ucOnOff); } if(ucKind==TEXTCHAR){ sprintf((char *)&ucLcdTxCommand[0],"vis t%d,%d\xff\xff\xff\0",uiObjName,ucOnOff); } HAL_UART_Transmit(&huart3,(uint8_t *)&ucLcdTxCommand[0],strlen((char*)ucLcdTxCommand),30); } void SendLcdProgressBar(uint8_t uiObjName,uint16_t uiNumber) { memset(ucLcdTxCommand,0,sizeof(ucLcdTxCommand)); sprintf((char *)&ucLcdTxCommand[0],"j%d.val=%d\xff\xff\xff\0",uiObjName,uiNumber); HAL_UART_Transmit(&huart3,(uint8_t *)&ucLcdTxCommand[0],strlen((char*)ucLcdTxCommand),30); } void SendLcdBlank(uint8_t *Item) { sprintf((char *)&ucWorkBuff[0]," \0"); SendLcdText(Item,ucWorkBuff); } void PageChangeProc(uint8_t ucPage) { ucPageNumber=ucPage; //화면에 부릴 내용을 다시 뿌린다. if(ucPageNumber==PAGE_MAIN){ // DisTemperSkin(fSkinTemperature); ucWorkMinute=0; ucWorkSec=0; DisplayWorkTime(ucWorkMinute,ucWorkSec); ucFireForce=2; FanLevelDis(); HAL_GPIO_WritePin(L_PDWN_GPIO_Port,L_PDWN_Pin,GPIO_PIN_SET); ads1232_init(); Temper_init(); } } void DisplayWorkTime(uint8_t m,uint8_t s) { uint8_t const *ptr; uint8_t i,j; if(ucPageNumber !=PAGE_MAIN){ return; } sprintf((char*)&ucWorkBuff[0],"%02u%02u\0",m,s); ptr=&LCDIMG[0]; if(ucWorkBuff[0]==0x30){ ucWorkBuff[0]=0x20; } for(i=0;i<4;i++){ if(ucWorkBuff[i] !=ucWorkTimeBuff[i]){ j=ucWorkBuff[i]; j-=0x20; SendLcdPicture(TblWorkingObj[i],*(ptr+j)); HAL_Delay(5); } } memcpy(ucWorkTimeBuff,ucWorkBuff,4); } void DisTemperSkin(float fTemperature) { uint8_t const *ptr; uint8_t i,j,k; if(ucPageNumber !=PAGE_MAIN){ return; } sprintf((char*)&ucWorkBuff[0],"%2.1f\0",fTemperature); ptr=&LCDIMG[0]; k=0; for(i=0;i<4;i++){ // if(ucWorkBuff[i] !=ucTemperSkinBuff[i]){ if(ucWorkBuff[i] !='.'){ j=ucWorkBuff[i]; j-=0x20; SendLcdPicture(TblTemperSkinObj[k],*(ptr+j)); HAL_Delay(5); k++; } // } } memcpy(ucTemperSkinBuff,ucWorkBuff,4); } void DisTemperTank(int16_t iTemperature) { uint8_t const *ptr; uint8_t i,j; bool bBlankCheck; if(ucPageNumber !=PAGE_MAIN){ return; } sprintf((char*)&ucWorkBuff[0],"%04d\0",iTemperature); bBlankCheck=0; for(i=0;i<4;i++){ if(ucWorkBuff[i]==0x30){ ucWorkBuff[i]=0x20; } else{ break; } } ptr=&LCDIMG[0]; for(i=0;i<4;i++){ if(ucWorkBuff[i] !=ucTemperTankBuff[i]){ j=ucWorkBuff[i]; j-=0x20; SendLcdPicture(TblTemperTankObj[i],*(ptr+j)); HAL_Delay(5); } } memcpy(ucTemperTankBuff,ucWorkBuff,4); } void LcdCommnadProc(void) { uint8_t ch; while (rx_rd_index3 !=rx_wr_index3 ){ ch=GetLcdData(); if(ch==STARTF){ ucRxCount=0; } aLcdRxCommand[0]=aLcdRxCommand[1]; aLcdRxCommand[1]=aLcdRxCommand[2]; aLcdRxCommand[2]=aLcdRxCommand[3]; aLcdRxCommand[3]=ch; ucRxCount++; if((ch==ENDF) || (ucRxCount>=4)){ if(aLcdRxCommand[0]==STARTF){ memcpy((uint8_t *)&LcdRxD[LcdQueueTail].ucStartFlag,(uint8_t *)&aLcdRxCommand[0],4); if(++LcdQueueTail>=LCDQUESIZE){ LcdQueueTail=0; } } ucRxCount=0; aLcdRxCommand[0]=0; } } } void FanLevelDis(void) { switch(ucFireForce){ case 1: SendLcdProgressBar(3,20); break; case 2: SendLcdProgressBar(3,40); break; case 3: SendLcdProgressBar(3,60); break; case 4: SendLcdProgressBar(3,80); break; case 5: SendLcdProgressBar(3,100); break; default: // HAL_TIM_Base_Stop_IT(&htim14); //Timer 14 Stop SendLcdProgressBar(3,0); // HAL_GPIO_WritePin(HeatOnOff_GPIO_Port,HeatOnOff_Pin,GPIO_PIN_SET); //Heater Off break; } } void IncProc(void) { if(bSetMode){ if(ucSetPosion){ //sec if(ucWorkSetSec<59){ ucWorkSetSec++; } } else{ if(ucWorkSetMinute<59){ ucWorkSetMinute++; } } ucBlinkTimes=0; BlinkOnOff=true; DisplayWorkTime(ucWorkSetMinute,ucWorkSetSec); } else{ //온도 증감 if(ucFireForce<5){ ucFireForce++; if(ucFireForce==5){ HAL_TIM_Base_Stop_IT(&htim14); HAL_GPIO_WritePin(HeatOnOff_GPIO_Port,HeatOnOff_Pin,GPIO_PIN_RESET); //Heater On } } FanLevelDis(); } } void DecProc(void) { if(bSetMode){ if(ucSetPosion){ //sec if(ucWorkSetSec){ ucWorkSetSec--; } } else{ if(ucWorkSetMinute){ ucWorkSetMinute--; } } ucBlinkTimes=0; BlinkOnOff=true; DisplayWorkTime(ucWorkSetMinute,ucWorkSetSec); } else{ //온도 증감 if(ucFireForce){ ucFireForce--; } FanLevelDis(); } } void ShiftProc(void) { if(bSetMode){ if(++ucSetPosion>1){ ucSetPosion=0; } ucBlinkTimes=0; BlinkOnOff=true; DisplayWorkTime(ucWorkSetMinute,ucWorkSetSec); } } void BlinkProc(void) { uint8_t i; if(bSetMode){ if(++ucBlinkTimes>=150){ ucBlinkTimes=0; if(BlinkOnOff){ BlinkOnOff=false; } else{ BlinkOnOff=true; } if(BlinkOnOff){ DisplayWorkTime(ucWorkSetMinute,ucWorkSetSec); } else{ if(ucSetPosion){ for(i=2;i<4;i++){ SendLcdPicture(TblWorkingObj[i],AlphaBlank); HAL_Delay(5); ucWorkTimeBuff[i]=0; } } else{ for(i=0;i<2;i++){ SendLcdPicture(TblWorkingObj[i],AlphaBlank); HAL_Delay(5); ucWorkTimeBuff[i]=0; } } } } } } void RxLcdDataProc(void) { uint8_t ucCommand; if(LcdQueueHead !=LcdQueueTail){ LcdRxD[LcdQueueHead].ucStartFlag; ucCommand=LcdRxD[LcdQueueHead].ucPage; if((ucCommand=='P') || (ucPageNumber !=PAGE_MAIN)){ PageChangeProc(PAGE_MAIN); } else{ switch(ucCommand){ case 'B': //+,- if(LcdRxD[LcdQueueHead].ucButton=='+'){ IncProc(); } else if(LcdRxD[LcdQueueHead].ucButton=='-'){ DecProc(); } else if(LcdRxD[LcdQueueHead].ucButton=='S'){ //shift ShiftProc(); } else if(LcdRxD[LcdQueueHead].ucButton=='R'){ // 시간 리셋 ucWorkCurrSec=ucWorkSec; ucWorkCurrMinute=ucWorkMinute; } break; case 'S': //start/stop 1=start,0=stop if(LcdRxD[LcdQueueHead].ucButton==0x01){ if(bTankEmpty==false){ //민약 설정 중이라면 값 저장하고 시작 if(bSetMode){ bSetMode=false; ucWorkSec=ucWorkSetSec; ucWorkMinute=ucWorkSetMinute; DisplayWorkTime(ucWorkMinute,ucWorkSec); memset(ucLcdTxCommand,0,sizeof(ucLcdTxCommand)); sprintf((char *)&ucLcdTxCommand[0],"bt2.val=%d\xff\xff\xff\0",0); HAL_UART_Transmit(&huart3,(uint8_t *)&ucLcdTxCommand[0],strlen((char*)ucLcdTxCommand),30); } bRunStop=true; SetTemperPCB(RAZER_ON|DCT_TEMPER_ON); ucWorkCurrSec=ucWorkSec; ucWorkCurrMinute=ucWorkMinute; //출력 레벨에 맞는 Heater On } } else{ bRunStop=false; SetTemperPCB(DCT_TEMPER_ON); HAL_GPIO_WritePin(HeatOnOff_GPIO_Port,HeatOnOff_Pin,GPIO_PIN_SET); HAL_TIM_Base_Stop_IT(&htim14); //Heater Fire Stop } break; case 'T': //time setting 1,0 if(LcdRxD[LcdQueueHead].ucButton==0x01){ //time setting ucWorkSetMinute=ucWorkMinute; ucWorkSetSec=ucWorkSec; bSetMode=true; } else{ ucWorkSec=ucWorkSetSec; ucWorkMinute=ucWorkSetMinute; bSetMode=false; DisplayWorkTime(ucWorkMinute,ucWorkSec); } break; default: break; } } if(++LcdQueueHead>=LCDQUESIZE){ LcdQueueHead=0; } } }

 
 
   
 
주소: 인천광역시 서구 봉수대로 141 가좌시범공단 B동 505호    대표자 : 김시석    전화번호 : 032)672-2966    팩스번호 : 032)672-2965
사업자등록 번호 : 225-14-00080    콘트롤러개발,전자제품개발 아테크