📄 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 + -