1. 程式人生 > >BLE-CC254x-1.4.2.2之LCD分析

BLE-CC254x-1.4.2.2之LCD分析

INT_HEAP_LEN=3072
HALNODEBUG
OSAL_CBTIMER_NUM_TASKS=1
HAL_AES_DMA=TRUE
HAL_DMA=TRUE
POWER_SAVING
xPLUS_BROADCASTER
HAL_LCD=TRUE
HAL_LED=FALSE
HAL_KEY=TRUE

--------------------------------------------------------------------------------------LCD初始化

main(void) ==>HalDriverInit();  ==>HalDriverInit (void) ===> HalLcdInit()===>HalLcd_HW_Init(void):

--------------------------------------------------------------------------------------hal_lcd.h

/*常量*/

#define HAL_LCD_LINE_1      0x01

#define HAL_LCD_LINE_2      0x02
#define HAL_LCD_LINE_3      0x03
#define HAL_LCD_LINE_4      0x04
#define HAL_LCD_LINE_5      0x05
#define HAL_LCD_LINE_6      0x06
#define HAL_LCD_LINE_7      0x07

#define HAL_LCD_LINE_8      0x08

/*函式 - API*/

extern void HalLcdInit(void);// 初始化液晶服務
extern void HalLcdWriteString ( char *str, uint8 option);//在LCD上寫入一個字串。
extern void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option);//為LCD寫一個值。
extern void HalLcdWriteScreen( char *line1, char *line2 );//為LCD寫一個值。
extern void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line );//寫一個字串後跟一個值到LCD。
extern void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, uint16 value2, uint8 format2, uint8 line );//編寫一個字串後跟兩個值到LCD。
extern void HalLcdDisplayPercentBar( char *title, uint8 value );//在液晶屏上寫一個百分比欄。

--------------------------------------------------------------------------------------hal_lcd.c

/* LCD Max Chars and Buffer */
#define HAL_LCD_MAX_CHARS   16
#define HAL_LCD_MAX_BUFF    25
/* LCD 控制線設定 */
#define HAL_LCD_MODE_PORT 0    //  control-  P0.0 - LCD_MODE
#define HAL_LCD_MODE_PIN  0 
#define HAL_LCD_RESET_PORT 1     //  control-  P1.1 - LCD_FLASH_RESET
#define HAL_LCD_RESET_PIN  1
#define HAL_LCD_CS_PORT 1          //  control-  P1.2 - LCD_CS
#define HAL_LCD_CS_PIN  2

/* LCD SPI 線設定 */


#define HAL_LCD_CLK_PORT 1     //  spi-   P1.5 - CLK
#define HAL_LCD_CLK_PIN  5
#define HAL_LCD_MOSI_PORT 1   //  spi-   P1.6 - MOSI
#define HAL_LCD_MOSI_PIN  6
#define HAL_LCD_MISO_PORT 1   //  spi-   P1.7 - MISO

#define HAL_LCD_MISO_PIN  7

/* SPI settings */
#define HAL_SPI_CLOCK_POL_LO      0x00         //極性
#define HAL_SPI_CLOCK_PHA_0        0x00          //相位
#define HAL_SPI_TRANSFER_MSB_FIRST 0x20   //MSB優先
/* LCD lines */

#define LCD_MAX_LINE_COUNT              3       // 顯示行數

#define SET_POWER_SAVE_MODE(options)    HalLcd_HW_Control(0x0C | (options))  //Set power save mode

#define FUNCTION_SET(options)           HalLcd_HW_Control(0x10 | (options))  // Function Set 

#define SET_DISPLAY_START_LINE(line)    HalLcd_HW_Control(0x18 | (line))  //Set Display Start Line

#define SET_BIAS_CTRL(bias)             HalLcd_HW_Control(0x1C | (bias))  //Bias control

#define SET_POWER_CTRL(options)         HalLcd_HW_Control(0x20 | (options)) //Power control

#define SET_DISPLAY_CTRL(options)       HalLcd_HW_Control(0x28 | (options))  //Set display control

#define SET_DDRAM_ADDR(charIndex)       HalLcd_HW_Control(0x80 | (charIndex)) //Set DD address

#define SET_GCRAM_CHAR(specIndex)       HalLcd_HW_Control(0xC0 | (specIndex)) //Set CGRAM address

#define SET_ICONRAM_ADDR(addr)          HalLcd_HW_Control(0x40 | (addr))  //Set ICONRAM address

#define SET_DOUBLE_HEIGHT(options)      HalLcd_HW_Control(0x08 | (options)) //Set double height

/* SPI interface control */

#define LCD_SPI_BEGIN()   // spi  chip select 使能

#define LCD_SPI_END()     //spi  chip select 失能

//清除接收和傳送的位元組狀態,將tx資料寫入緩衝區,等待發送完成

#define LCD_SPI_TX(x) 

#define LCD_SPI_WAIT_RXRDY()

/* Control macros */

#define LCD_DO_WRITE()        HAL_IO_SET(HAL_LCD_MODE_PORT,  HAL_LCD_MODE_PIN,  1);
#define LCD_DO_CONTROL()      HAL_IO_SET(HAL_LCD_MODE_PORT,  HAL_LCD_MODE_PIN,  0);
#define LCD_ACTIVATE_RESET()  HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 0);

#define LCD_RELEASE_RESET()   HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1);

/*  FUNCTIONS - API*/

void HalLcd_HW_Init(void);   // 液晶驅動初始化
void HalLcd_HW_WaitUs(uint16 i); // ms延時
void HalLcd_HW_Clear(void);  //LCD清屏,寫空格
void HalLcd_HW_ClearAllSpecChars(void);  //清除所有特殊字元
void HalLcd_HW_Control(uint8 cmd);//將1個命令寫入LCD
void HalLcd_HW_Write(uint8 data);//將1個數據寫入LCD
void HalLcd_HW_SetContrast(uint8 value); //設定顯示的對比
void HalLcd_HW_WriteChar(uint8 line, uint8 col, char text); //將一個字元寫入顯示。
void HalLcd_HW_WriteLine(uint8 line, const char *pText);//在顯示器上寫一行。

--------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------

void SimpleBLEPeripheral_Init( uint8 task_id )

{

    。。。。

#if (defined HAL_LCD) && (HAL_LCD == TRUE)
#if defined FEATURE_OAD //若打開了OAD功能
  #if defined (HAL_IMAGE_A)
    HalLcdWriteStringValue( "BLE Peri-A", OAD_VER_NUM( _imgHdr.ver ), 16, HAL_LCD_LINE_1 );
  #else
    HalLcdWriteStringValue( "BLE Peri-B", OAD_VER_NUM( _imgHdr.ver ), 16, HAL_LCD_LINE_1 );
  #endif // HAL_IMAGE_A
#else
  HalLcdWriteString( "BLE Peripheral", HAL_LCD_LINE_1 );
#endif // FEATURE_OAD
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)

    。。。。

}

--------------------------------------------------------------------------------------HalLcd_HW_Init()解析

void HalLcd_HW_Init(void)
{
  /* Initialize LCD IO lines */
  halLcd_ConfigIO();
  /* Initialize SPI */
  halLcd_ConfigSPI();
  /* 執行重置 */
  LCD_ACTIVATE_RESET();
  HalLcd_HW_WaitUs(15000); // 15 ms
  LCD_RELEASE_RESET();
  HalLcd_HW_WaitUs(15); // 15 us
  /* 執行初始化序列 */
  FUNCTION_SET(CGRAM | COM_FORWARD | THREE_LINE);
  /*設定對比度*/
  HalLcd_HW_SetContrast(15);
  /* 設定電源 */
  SET_POWER_SAVE_MODE(OSC_OFF | POWER_SAVE_ON);
  SET_POWER_CTRL(VOLTAGE_DIVIDER_ON | CONVERTER_AND_REG_ON);
  SET_BIAS_CTRL(BIAS_1_5);
  HalLcd_HW_WaitUs(21000);// 21 ms
  /* 清屏 */
  HalLcd_HW_Clear();
  HalLcd_HW_ClearAllSpecChars();
  SET_DISPLAY_CTRL(DISPLAY_CTRL_ON | DISPLAY_CTRL_BLINK_OFF | DISPLAY_CTRL_CURSOR_OFF);

}

static void halLcd_ConfigIO(void)
{
  /* GPIO configuration */
  HAL_CONFIG_IO_OUTPUT(HAL_LCD_MODE_PORT,  HAL_LCD_MODE_PIN,  1);//選擇 lCD的模式
  HAL_CONFIG_IO_OUTPUT(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1); //LCD復位
  HAL_CONFIG_IO_OUTPUT(HAL_LCD_CS_PORT,    HAL_LCD_CS_PIN,    1);  //LCD片選
}

static void halLcd_ConfigSPI(void)
{
  /* UART/SPI 外設配置 */
   uint8 baud_exponent;
   uint8 baud_mantissa;
  /* Set UART 1上的SPI 為 位置2 */
  PERCFG |= 0x02;
  /* 配置時鐘線, 主機輸出、主機輸出線*/
  HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_CLK_PORT,  HAL_LCD_CLK_PIN);
  HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_MOSI_PORT, HAL_LCD_MOSI_PIN);
  HAL_CONFIG_IO_PERIPHERAL(HAL_LCD_MISO_PORT, HAL_LCD_MISO_PIN);
  /*將SPI速度設定為1MHz(值假設系統clk為32MHz),確認在1MHz SPI clk中。*/
  baud_exponent = 15;
  baud_mantissa =  0;
  /*配置SPI */
  U1UCR  = 0x80;      /* 重新整理並進入空閒狀態。8 - n - 1。 */
  U1CSR  = 0x00;      /* 設定SPI 模式為  主機*/
  U1GCR  = HAL_SPI_TRANSFER_MSB_FIRST | HAL_SPI_CLOCK_PHA_0 | HAL_SPI_CLOCK_POL_LO | baud_exponent;
  U1BAUD = baud_mantissa;
}