晶聯訊JLX12864G-290液晶,STM32+HAL庫 SPI顯示成功。

 

 


JLX12864G_290_PN.h

#ifndef __JLX12864G_290_PN_H__
#define __JLX12864G_290_PN_H__

/* 包含頭文件 ----------------------------------------------------------------*/
#include "stm32f0xx_hal.h"

/* 類型定義 --------------------------------------------------------------*/
#define CS_H          HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET) // 輸出高電平
#define CS_L          HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET) // 輸出低電平
#define RST_H         HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET) // 輸出高電平
#define RST_L         HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_RESET) // 輸出低電平
#define RS_H          HAL_GPIO_WritePin(RS_GPIO_Port,RS_Pin,GPIO_PIN_SET) // 輸出高電平
#define RS_L          HAL_GPIO_WritePin(RS_GPIO_Port,RS_Pin,GPIO_PIN_RESET) // 輸出低電平

/* 宏定義 --------------------------------------------------------------------*/


/* 擴展變量 ------------------------------------------------------------------*/
/* 函數聲明 ------------------------------------------------------------------*/
//void delay(int i); 
void delay_us(uint8_t i); 
void transfer_command(uint8_t data1);
void transfer_data(uint8_t data1);
void initial_lcd(void);
void lcd_address(uint8_t page,uint8_t column);
void clear_screen(void);
void full_display(uint8_t data_left,uint8_t data_right);
void display_graphic_32x32(uint8_t page,uint8_t column,uint8_t *dp);
void display_graphic_16x16(uint8_t page,uint8_t column,uint8_t reverse,uint8_t *dp);
void display_graphic_8x16(uint8_t page,uint8_t column,uint8_t *dp);
void display_string_8x16(uint16_t page,uint16_t column,uint8_t *text);
void display_string_5x7(uint16_t page,uint16_t column,uint8_t *text);
void disp_grap(uint8_t page,uint8_t column,uint8_t *dp);
#endif  // __JLX12864G_290_PN_H__
 


JLX12864G_290_PN.c

#include "spi.h"
#include "JLX12864G_290_PN/JLX12864G_290_PN.H"


uint8_t ascii_table_8x16[95][16]; 
uint8_t ascii_table_5x7[95][5]; 

///*延時*/ 
//void delay(int i) 
//{ 
// int j,k; 
// for(j=0;j<i;j++) 
// for(k=0;k<110;k++); 
//} 
/*延時*/ 
void delay_us(uint8_t i) 

 int j,k; 
 for(j=0;j<i;j++) 
 for(k=0;k<1;k++); 

//void waitkey() 
//{ 
//  repeat: 
//    if(key==1) 
//      goto repeat; 
//    else 
//      HAL_Delay(1000);
////      delay(1000); 
//}

/*寫指令到 LCD 模塊*/ 
void transfer_command(uint8_t data1) 

   CS_L; 
   RS_L; 
   HAL_SPI_Transmit(&hspi1,&data1,1,0xff);
   CS_H; 

/*寫數據到 LCD 模塊*/ 
void transfer_data(uint8_t data1) 

   CS_L;
   RS_H;  
   HAL_SPI_Transmit(&hspi1,&data1,1,0xff);
   CS_H; 

/*LCD 模塊初始化*/ 
void initial_lcd(void) 

//   CS_L;
   RST_L; /*低電平復位*/ 
   HAL_Delay(100); 
   RST_H; /*復位完畢*/ 
   HAL_Delay(100);  
   transfer_command(0xe2); /*軟復位*/ 
   HAL_Delay(5);  
   transfer_command(0x2c); /*升壓步聚 1*/ 
   HAL_Delay(5); 
   transfer_command(0x2e); /*升壓步聚 2*/ 
   HAL_Delay(5); 
   transfer_command(0x2f); /*升壓步聚 3*/ 
   HAL_Delay(5); 
   transfer_command(0x24); /*粗調對比度,可設置範圍 0x20~0x27*/ 
   transfer_command(0x81); /*微調對比度*/ 
   transfer_command(0x2a); /*0x1a,微調對比度的值,可設置範圍 0x00~0x3f*/ 
   transfer_command(0xa2); /*1/9 偏壓比(bias)*/ 
   transfer_command(0xc8); /*行掃描順序:從上到下*/ 
   transfer_command(0xa0); /*列掃描順序:從左到右*/ 
   transfer_command(0x40); /*起始行:第一行開始*/ 
   transfer_command(0xaf); /*開顯示*/ 
//   CS_H;

void lcd_address(uint8_t page,uint8_t column) 

   column=column-1; //我們平常所說的第 1 列,在 LCD 驅動 IC 裏是第 0 列。所以在這裏減去 1. 
   page=page-1; 
   transfer_command(0xb0+page); //設置頁地址。每頁是 8 行。一個畫面的 64 行被分成 8 個頁。我們平常所說的第 1 頁,在 LCD驅動 IC 裏是第 0 頁,所以在這裏減去 1*/ 
   transfer_command(((column>>4)&0x0f)+0x10); //設置列地址的高 4 位 
   transfer_command(column&0x0f); //設置列地址的低 4 位 

/*全屏清屏*/ 
void clear_screen(void) 

   uint8_t i,j; 
   for(i=0;i<9;i++) 
   { 
     lcd_address(1+i,1); 
     for(j=0;j<132;j++) 
     { 
        transfer_data(0x00); 
     } 
   } 

//==================display a piture of 128*64 dots================ 
void full_display(uint8_t data_left,uint8_t data_right) 

   int i,j; 
   for(i=0;i<8;i++) 
   { 
     CS_L; 
     lcd_address(i+1,1); 
     for(j=0;j<64;j++) 
     { 
       transfer_data(data_left); 
       transfer_data(data_right); 
     } 
   } 

/*顯示 32x32 點陣圖像、漢字、生僻字或 32x32 點陣的其他圖標*/ 
void display_graphic_32x32(uint8_t page,uint8_t column,uint8_t *dp) 

   uint8_t i,j; 
   for(j=0;j<4;j++) 
   { 
     lcd_address(page+j,column); 
     for (i=0;i<31;i++) 
     { 
       transfer_data(*dp); /*寫數據到 LCD,每寫完一個 8 位的數據後列地址自動加 1*/ 
       dp++; 
     } 
   } 

/*顯示 16x16 點陣圖像、漢字、生僻字或 16x16 點陣的其他圖標*/ 
void display_graphic_16x16(uint8_t page,uint8_t column,uint8_t reverse,uint8_t *dp) 

   uint8_t i,j; 
   for(j=0;j<2;j++) 
   { 
     lcd_address(page+j,column); 
     for (i=0;i<16;i++) 
     { 
       if(reverse==1) 
       { 
          transfer_data(*dp); /*寫數據到 LCD,每寫完一個 8 位的數據後列地址自動加 1*/ 
       } 
       else 
          transfer_data(~*dp); 
       dp++; 
     } 
   } 

/*顯示 8x16 點陣圖像、ASCII, 或 8x16 點陣的自造字符、其他圖標*/ 
void display_graphic_8x16(uint8_t page,uint8_t column,uint8_t *dp) 

   uint8_t i,j; 
   for(j=0;j<2;j++) 
   { 
     lcd_address(page+j,column); 
     for (i=0;i<8;i++) 
     { 
       transfer_data(*dp); /*寫數據到 LCD,每寫完一個 8 位的數據後列地址自動加 1*/ 
       dp++; 
     } 
   } 

void display_string_8x16(uint16_t page,uint16_t column,uint8_t *text) 

   uint16_t i=0,j,k,n; 
   while(text[i]>0x00) 
   { 
      if((text[i]>=0x20)&&(text[i]<=0x7e)) 
       { 
         j=text[i]-0x20; 
         for(n=0;n<2;n++) 
         { 
           lcd_address(page+n,column); 
           for(k=0;k<8;k++) 
           { 
              transfer_data(ascii_table_8x16[j][k+8*n]);/*顯示 5x7 的 ASCII 字到 LCD 上,y 爲頁地址,x 爲列地址,最後爲數據*/ 
           } 
         } 
         i++; 
         column+=8;        
       } 
       else 
         i++; 
   } 


void display_string_5x7(uint16_t page,uint16_t column,uint8_t *text) 

   uint16_t i=0,j,k; 
   while(text[i]>0x00) 
   { 
     if((text[i]>=0x20)&&(text[i]<0x7e)) 
     { 
       j=text[i]-0x20; 
       lcd_address(page,column); 
       for(k=0;k<5;k++) 
       { 
          transfer_data(ascii_table_5x7[j][k]);/*顯示 5x7 的 ASCII 字到 LCD 上,y 爲頁地址,x 爲列地址,最後爲數據*/ 
       } 
       i++; 
       column+=6; 
     } 
     else 
     i++; 
   } 

//==================display a piture of 128*64 dots================ 
void disp_grap(uint8_t page,uint8_t column,uint8_t *dp) 

   int i,j; 
   for(i=0;i<8;i++) 
   { 
     lcd_address(page+i,column); 
     for(j=0;j<128;j++) 
     { 
       transfer_data(*dp); 
       dp++; 
     } 
   } 

 


在main.C中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章