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_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;
}