?? lcd.c
字號:
/****************************************************************/
/* 項目名稱 : R8C/23 CAN/LIN Demo Board */
/* : 樣例程序1 */
/* : 人機接口 */
/* 硬件環境 : R0K521237C000BB */
/* MCU型號 : R5F21237JFP */
/* C編譯器 : NC30WA,版本5.30.r02及以上 */
/* 文件名 : LCD.c */
/* 功能簡介 : Samsung S6B0724 LCD控制器驅動 */
/* 版本 : 1.0 */
/* 作者 : 閆雋 */
/* 修訂歷史 : */
/* 修訂者 時間 版本 說明 */
/* 閆雋 2006/9/11 1.0 初版發行 */
/* */
/****************************************************************/
/* Copyright, 2006 RENESAS TECHNOLOGY CORPORATION & */
/* RENESAS SOLUTIONS CORPORATION */
/****************************************************************/
#include "..\inc\Comdef_r823.h"
#include "..\inc\Misc.h"
#include "..\inc\Isr.h"
#include "..\inc\LCD.h"
#include "..\inc\LCD_F16x8.h"
uchar8 ucLcd_buf[ LCD_BUF_SIZE ]; // 液晶行顯示緩沖區,16個半角字符
void vLcd_adc_set( void );
void vLcd_bias_set( void );
void vLcd_buf_clear( void );
void vLcd_column_set( uchar8 );
void vLcd_contrast_set( uchar8 );
void vLcd_disable( void );
void vLcd_display_clear( void );
void vLcd_display_off( void );
void vLcd_display_on( void );
void vLcd_enable( void );
void vLcd_entire_normal( void );
void vLcd_entire_on( void );
void vLcd_init( void );
void vLcd_line_set( uchar8 );
void vLcd_page_set( uchar8 );
void vLcd_power_set( void );
void vLcd_resistor_select( uchar8 );
void vLcd_reverse_off( void );
void vLcd_reverse_on( void );
void vLcd_screen_clear( void );
void vLcd_shl_set( void );
void vLcd_soft_reset( void );
void vLcd_write16( uchar8, uchar8, uchar8, uchar8, uchar8 );
void vLcd_write_data( uchar8 );
void vLcd_write_reg( uchar8 );
/*------------------------------------------------------
名稱 : vLcd_soft_reset
功能 : 液晶模塊軟件復位
入口 : 無
出口 : 無
調用 : vLcd_write_reg
寄存器 : 無
------------------------------------------------------*/
void vLcd_soft_reset( void )
{
vLcd_write_reg( (uchar8)0xe2 );
}
/*------------------------------------------------------
名稱 : vLcd_disable
功能 : 液晶模塊復位
入口 : 無
出口 : 無
調用 : 無
寄存器 : P6.5
------------------------------------------------------*/
void vLcd_disable( void )
{
RST_LOW;
}
/*------------------------------------------------------
名稱 : vLcd_enable
功能 : 液晶模塊復位
入口 : 無
出口 : 無
調用 : 無
寄存器 : P6.5
------------------------------------------------------*/
void vLcd_enable( void )
{
RST_HIGH;
}
/*------------------------------------------------------
名稱 : vLcd_write_reg
功能 : 改寫LCD控制寄存器
入口 : ucOut_data
出口 : 無
調用 : 無
寄存器 : 無
------------------------------------------------------*/
void vLcd_write_reg( uchar8 ucOut_data )
{
RS_LOW;
te_sser = 1; // 發送:允許
ucFlag_ssu_busy = YES;
sstdr = ucOut_data; // 數據送入SSU發送寄存器
while ( ucFlag_ssu_busy == YES )
{
}
RS_HIGH;
}
/*------------------------------------------------------
名稱 : vLcd_write_data
功能 : 改寫LCD顯示內存
入口 : ucOut_data
出口 : 無
調用 : 無
寄存器 : 無
------------------------------------------------------*/
void vLcd_write_data( uchar8 ucOut_data )
{
RS_HIGH;
te_sser = 1; // SSU發送:允許
ucFlag_ssu_busy = YES;
sstdr = ucOut_data; // 數據送入SSU發送寄存器
while ( ucFlag_ssu_busy == YES )
{
}
}
/*------------------------------------------------------
名稱 : vLcd_line_set
功能 : 液晶顯示起始行號
入口 : 行號
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_line_set( uchar8 ucI )
{
ucI &= ( uchar8 ) 0x3f;
ucI |= ( uchar8 ) 0x40;
vLcd_write_reg( ucI ); // 設定起始行號 ( 0~64 )
}
/*------------------------------------------------------
名稱 : vLcd_page_set
功能 : 設置光標的Y軸頁坐標(0~7)
入口 : 頁號
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_page_set( uchar8 ucI )
{
ucI &= ( uchar8 ) 0x07;
ucI |= ( uchar8 ) 0xb0;
vLcd_write_reg( ucI );
}
/*------------------------------------------------------
名稱 : vLcd_column_set
功能 : 設置光標的X軸坐標(0~128)
入口 : 列號
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_column_set( uchar8 ucI)
{
uchar8 ucJ;
ucJ = ucI >> 4;
ucJ &= ( uchar8 ) 0x0f;
ucJ |= ( uchar8 ) 0x10;
vLcd_write_reg( ucJ ); // MSB
vLcd_write_reg( ( uchar8 ) 0x0f & ucI ); // LSB
}
/*------------------------------------------------------
名稱 : vLcd_display_on
功能 : 開啟顯示
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_display_on( void )
{
vLcd_write_reg(( uchar8 ) 0xaf );
}
/*------------------------------------------------------
名稱 : vLcd_display_off
功能 : 關閉顯示
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_display_off( void )
{
vLcd_write_reg(( uchar8 ) 0xae );
}
/*------------------------------------------------------
名稱 : vLcd_adc_set
功能 : 文字水平方向
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_adc_set( void )
{
vLcd_write_reg(( uchar8 ) 0xa0 ); // 0xa0:seg0~131,0xa1:seg131~0
}
/*------------------------------------------------------
名稱 : vLcd_shl_set
功能 : 文字垂直方向
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_shl_set( void )
{
vLcd_write_reg(( uchar8 ) 0xc8 ); // 0xc0: COM0~63, 0xc8: COM63~0
}
/*------------------------------------------------------
名稱 : vLcd_bias_set
功能 : 設置bias倍率
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_bias_set( void )
{
vLcd_write_reg(( uchar8 ) 0xa2 ); // 0xa2: 1/9, 0xa3: 1/7
}
/*------------------------------------------------------
名稱 : vLcd_power_set
功能 : 液晶內部電源
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 ), vMisc_softdelay_1ms( int16 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_power_set( void )
{
vLcd_write_reg(( uchar8 ) 0x2c ); // VC = 1
vMisc_softdelay_1ms( 1U );
vLcd_write_reg(( uchar8 ) 0x2e ); // VR = 1
vMisc_softdelay_1ms( 1U );
vLcd_write_reg(( uchar8 ) 0x2f ); // VF = 1
vMisc_softdelay_1ms( 10U );
}
/*------------------------------------------------------
名稱 : vLcd_contrast_set
功能 : 液晶對比度
入口 : 設定值
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_contrast_set( uchar8 ucI )
{
vLcd_write_reg(( uchar8 ) 0x81 ); // 電壓設定模式啟動
vLcd_write_reg( ucI & ( uchar8 ) 0x3f ); // 設定參考電壓 ( 0~64 )
}
/*------------------------------------------------------
名稱 : vLcd_reverse_on
功能 : 顯存內容反白
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_reverse_on( void )
{
vLcd_write_reg(( uchar8 ) 0xa7 );
}
/*------------------------------------------------------
名稱 : vLcd_reverse_off
功能 : 正常顯示
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_reverse_off( void )
{
vLcd_write_reg(( uchar8 ) 0xa6 );
}
/*------------------------------------------------------
名稱 : vLcd_entire_on
功能 : 屏幕全黑
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_entire_on( void )
{
vLcd_write_reg(( uchar8 ) 0xa5 );
}
/*------------------------------------------------------
名稱 : vLcd_entire_normal
功能 : 屏幕正常顯示
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_entire_normal( void )
{
vLcd_write_reg(( uchar8 ) 0xa4 );
}
/*------------------------------------------------------
名稱 : vLcd_resistor_select
功能 : 設置內部分壓電阻
入口 : 無
出口 : 無
調用 : vLcd_write_reg( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_resistor_select( uchar8 ucI )
{
ucI |= (uchar8) 0x20;
ucI &= (uchar8) 0x27;
vLcd_write_reg( ucI );
}
/*------------------------------------------------------
名稱 : vLcd_buf_clear
功能 : LCD行緩沖區置空格
入口 : 無
出口 : ucLcd_buf[]
調用 : 無
寄存器 : 無
------------------------------------------------------*/
void vLcd_buf_clear( void )
{
uchar8 ucI;
uchar8 *ucpP;
ucpP = ucLcd_buf;
for ( ucI=0; ucI < LCD_BUF_SIZE; ucI++ )
{
*ucpP++ = ' ';
}
}
/*------------------------------------------------------
名稱 : vLcd_disp_clear
功能 : LCD顯示內存清零
入口 : 無
出口 : 顯示內存
調用 : vLcd_line_set( uchar8 ), vLcd_page_set( char8 ), vLcd_column_set( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_display_clear( void )
{
uchar8 ucI;
uchar8 ucJ;
vLcd_line_set(( uchar8 ) 0 );
for ( ucI=0; ucI < 8; ucI++ )
{
vLcd_page_set( ucI );
vLcd_column_set(( uchar8 ) 0 );
for ( ucJ = 0; ucJ < 128; ucJ++ )
{
vLcd_write_data(( uchar8 ) 0x00 );
}
}
}
/*------------------------------------------------------
名稱 : vLcd_init
功能 : LCD初始化
入口 : 無
出口 : 無
調用 : vLcd_disable(), vLcd_enable(), vMisc_softdelay_1ms(), vLcd_contrast(),
vLcd_adc_set(), vLcd_shl_set(), vLcd_bias_set(), vLcd_power_set(),
vLcd_display_on(), vLcd_display_off(), vLcd_entire_on(), vLcd_entire_off(),
vLcd_display_clear(), vMisc_softdelay_1ms()
寄存器 : 無
------------------------------------------------------*/
void vLcd_init( void )
{
uchar8 ucI;
vLcd_disable();
vMisc_softdelay_1ms( 10U );
vLcd_enable();
vMisc_softdelay_1ms( 1U );
vLcd_bias_set(); // 內部掃描周期:1/9
vLcd_adc_set(); // 設定文字顯示方向:左到右
vLcd_shl_set(); // 設定文字顯示方向:上到下
vLcd_power_set(); // 內部電源電路:啟用
vLcd_resistor_select(( uchar8 )0x24 ); // 1 + Rb / Ra = 5 默認
vLcd_contrast_set(( uchar8 )0x20 ); // 對比度:alpha = 32 默認
vLcd_display_on(); // 顯示:允許
vLcd_entire_on();
vMisc_softdelay_1ms( 250U );
vLcd_entire_normal();
}
/*------------------------------------------------------
名稱 : vLcd_write16
功能 : 顯示一行16×8字符,最多16個。
顯示內容可以選擇正常顯示(白底黑字)或反白顯示(黑底白字)。
實際字符串長度小于ucFont_no時,后面自動補空白
要求 :LCD要支持"寫入后光標自動移位"的功能。
使用16×8縱向字庫,范例如下:
D0 D1 . . . D7
LSB
.
.
.
MSB
D8 D9 . . . DF
LSB
.
.
.
MSB
入口 : ucColumn 列號
ucPage 頁碼
ucFont_no 字符個數
ucInverse=1 反白, =0 正常
ucFont_set 字庫ID
ucFont_ascii, ucFont_chs, ucImage
ucLcd_buf[16]
出口 :
調用 : vLcd_page_set( uchar8 ), vLcd_column_set( uchar8 )
寄存器 : 無
------------------------------------------------------*/
void vLcd_write16( uchar8 ucPage, uchar8 ucColumn, uchar8 ucFont_no, uchar8 ucInverse, uchar8 ucFont_set )
{
uchar8 ucData;
uchar8 ucI, ucJ;
uint16 uiK;
uchar8 ucPage_count; // 當前顯示頁碼
uchar8 ucFlag_end; // 字符串結束標志
uchar8 *ucpP;
ucpP = ucLcd_buf;
for ( ucPage_count = 0; ucPage_count < 2; ucPage_count++ )
{
vLcd_page_set( ucPage + ucPage_count );
vLcd_column_set( ucColumn );
ucpP = ucLcd_buf;
ucFlag_end = NO;
for ( ucI = 0; ucI < ucFont_no; ucI++ )
{
if (( *ucpP == 0x00 ) && ( ucFlag_end == NO ))
{
ucFlag_end = YES;
}
else
{
}
if ( ucFlag_end != YES )
{ // 字符串未結束,取字模
uiK = 0U; // 計算字模地址偏移量
for ( ucJ = 0; ucJ < *ucpP; ucJ++ )
{
uiK += 16U;
}
uiK += ucPage_count * 8U; // ucPage_count = 0, 顯示字模的上半部分
// ucPage_count = 1, 顯示字模的下半部分
for ( ucJ = 0; ucJ < 8; ucJ ++ ) // 字模送顯
{
switch ( ucFont_set )
{
case ( FONT ):
ucData = ucFont[ uiK ++ ];
break;
case ( IMAGE ):
ucData = ucImage[ uiK ++ ];
break;
default:
ucData = ucFont[ uiK ++ ];
break;
}
if ( ucInverse == YES )
{
ucData = ~ucData;
}
else
{
}
vLcd_write_data( ucData );
}
}
else
{
// 字符串結束,補空白
for ( ucJ = 0; ucJ < 8; ucJ ++ )
{
vLcd_write_data( ( uchar8 )0x00 );
}
}
ucpP ++; // 指針移動,指向下個字符
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -