/***********************************************************************/
/* */
/* FILE :1B4LCD1602.c */
/* DATE :Mon, Jun 03, 2013 */
/* DESCRIPTION :main program file. */
/* CPU GROUP :1B */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.8). */
/* */
/***********************************************************************/
/*****************************************************************************
LCD1602---------1B4MCU------芯片引脚数
RS---------------P3_4--------26PIN
RW---------------P3_5--------27PIN
EN---------------P3_3--------8PIN
DB0--------------P1_0--------18PIN
DB1--------------P1_1--------17PIN
DB2--------------P1_2--------15PIN
DB3--------------P1_3--------14PIN
DB4--------------P1_4--------13PIN
DB5--------------P1_5--------12PIN
DB6--------------P1_6--------11PIN
DB7--------------P1_7--------10PIN
其它说明:关于液晶指令,请参阅实验目录下的器件手册
晶振: 12MHZ
******************************************************************************/
#include "sfr_R81B.h" //Definition of R8C/1B SFR
#define _Disableint asm("Fclr I") //I标志位为0,则禁止所有的可屏蔽中断
#define _Enableint asm("Fset I") //I标志位置1,表示打开总中断控制
//定义
#define RS p3_4 //RS为寄存器选择,1=数据寄存器、0=指令寄存器。
#define RW p3_5 //RW为读写信号线,1=读操作,0=写操作。
//当RS=RW=0可以写入指令或者显示地址,
//当RS=0,RW=1可以读忙信号,
//当RS=1,RW=0可以写入数据。
#define EN p3_3 //当en端由高电平跳变成低电平时,液晶模块执行命令。
#define busy p1_7 //忙指示
#define ComDat p1 //命令或数据线----LCD (DB0)
unsigned char far str1[]={"LinHuaDianZi "}; //第一行16个字符
unsigned char far str2[]={"Mob:13372526618 "}; //第二行16个字符
unsigned char far dis1[] = {"www.hificat.com"};
unsigned char far dis2[] = {"0571-85956028"};
//---判断液晶显示器是否忙------------
_Bool lcd_bz()
{
_Bool result;
pd1 = 0x00; //置pd1=0输入
RS=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
RW=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
result =busy;
EN=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
pd1 = 0xff; //置方向输出
asm("nop");
asm("nop");
asm("nop");
asm("nop");
//rs = 0;
//rw = 1;
//ep = 1;
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//result = (bit)(P0 & 0x80);
//ep = 0;
return result;
}
//---写命令--------------------------
void lcd_wcmd(unsigned char cmd)
{
while(lcd_bz());//判断LCD是否忙碌
RS=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
RW=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=0;
asm("nop");
asm("nop");
asm("nop");
pd1 = 0xff; //置方向输出
asm("nop");
asm("nop");
ComDat= cmd;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void lcd_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80);
}
//---写数据------------------------------
void lcd_wdat(unsigned char dat)
{
while(lcd_bz());//判断LCD是否忙碌
RS=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
RW=0;
asm("nop"); //准备写入数据
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
pd1 = 0xff; //置方向输出
asm("nop");
asm("nop");
ComDat= dat;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=0;
asm("nop");
asm("nop");
}
//----延时----
lcd_delay(unsigned int t)
{ while(t--);
}
/************************************************************************
系统时钟初始化 选主时钟 1分频
************************************************************************/
void InitClock()
{
prcr=0x01; //关闭和时钟相关的保护寄存器,允许修改时钟
cm13=1; //XIN-XOUT引脚
cm15 =1; //XIN-XOUT引脚使用高驱动能力
cm05=0; //开始振荡
asm("NOP\nNOP\nNOP\nNOP");
asm("NOP\nNOP\nNOP\nNOP");
ocd2=0x00; //使用主时钟作为系统时钟
//cm16=0;cm17=1;cm06=0; //f4
cm16=0;cm17=0;cm06=0; //f1
prcr=0; //打开保护寄存器
}
Init_IO()
{
pd1 = 0xff;//设定输出 1(输出) 0(输入)
pd3_3 = 1; //输出
pd3_4 = 1; //输出
pd3_5 = 1; //输出
p1 = 0; //
}
//****************************************
void delay(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
}
void lcd_init()
{
lcd_wcmd(0x01); //清屏并光标复位
delay(1);
lcd_wcmd(0x38);//设置显示模式:8位2行5x7点阵
delay(1);
//lcd_wcmd(0x0c);
lcd_wcmd(0x0f); //显示器开、光标关、光标禁止闪烁
delay(1);
lcd_wcmd(0x06);
delay(1);
}
void main(void)
{
unsigned char i;
InitClock();
Init_IO();
lcd_init();// 初始化LCD
delay(10);
lcd_pos(0x00);//设置显示位置
i = 0;
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]);//显示字符
i++;
}
lcd_pos(0x40);// 设置显示位置
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]);// 显示字符
i++;
}
}
/*
main()
{
unsigned int i=2000;
InitClock();
Init_IO();
RS = 0;//
RW = 0;//
EN = 0;//
//---初始化
while(--i);
lcd_delay(2000);
while(1) //为保证用户何时插上液晶都可以正常显示,
//这里的初始化也是循环的,实际使用时只要初始化1次就可以了
{
ComDat=0x01; //清屏并光标复位
Write_Command(); //写入命令
ComDat=0x38; //设置显示模式:8位2行5x7点阵
Write_Command();
ComDat=0x0f; //显示器开、光标关、光标禁止闪烁
Write_Command();
ComDat=0x06; //文字不动,光标自动右移
Write_Command();
//选择1行
ComDat=0x00; //写入显示起始地址(第1行第2个位置)
ComDat=ComDat|0x80;
//按模块要求写入的地址最高位必需为1
Write_Command(); //写入命令
//送字符
for(i=0;i<16;i++)
{
ComDat=str1[i]; //提取字符
Write_Data(); //送数据
}//for
//选择2行
ComDat=0x40; //写入显示起始地址(第1行第1个位置)
ComDat=ComDat|0x80;
//按模块要求写入的地址最高位必需为1
Write_Command(); //写入命令
//送字符
for(i=0;i<16;i++)
{
ComDat=str2[i]; //提取字符
Write_Data(); //送数据
}//for
lcd_delay(30000);
}//end of while
}//end of main
*/
/*****************************************************************************
程 序 名:林华瑞萨1B4配套程序 - 1602LCM液晶模块显示
开发环境:HEW
编 写 者:hu
功能简述:在1602液晶上显示字符
技术支持:QQ:1787985634
邮箱:huli_2006@hotmail.com
淘宝店网址:http://shop70189212.taobao.com
硬件说明:
LCD1602---------1B4MCU------芯片引脚数
RS---------------P3_4--------26PIN
RW---------------P3_5--------27PIN
EN---------------P3_3--------8PIN
DB0--------------P1_0--------18PIN
DB1--------------P1_1--------17PIN
DB2--------------P1_2--------15PIN
DB3--------------P1_3--------14PIN
DB4--------------P1_4--------13PIN
DB5--------------P1_5--------12PIN
DB6--------------P1_6--------11PIN
DB7--------------P1_7--------10PIN
其它说明:关于液晶指令,请参阅实验目录下的器件手册
晶振: 12MHZ
******************************************************************************/
#include "sfr_R81B.h" //Definition of R8C/1B SFR
#define _Disableint asm("Fclr I") //I标志位为0,则禁止所有的可屏蔽中断
#define _Enableint asm("Fset I") //I标志位置1,表示打开总中断控制
//定义
#define RS p3_4 //RS为寄存器选择,1=数据寄存器、0=指令寄存器。
#define RW p3_5 //RW为读写信号线,1=读操作,0=写操作。
//当RS=RW=0可以写入指令或者显示地址,
//当RS=0,RW=1可以读忙信号,
//当RS=1,RW=0可以写入数据。
#define EN p3_3 //当en端由高电平跳变成低电平时,液晶模块执行命令。
#define busy p1_7 //忙指示
#define ComDat p1 //命令或数据线----LCD (DB0)
unsigned char far str1[]={"LinHuaDianZi "}; //第一行16个字符
unsigned char far str2[]={"Mob:13372526618 "}; //第二行16个字符
//---判断液晶显示器是否忙------------
void lcd_busy(void)
{ do
{
pd1 = 0x00; //置pd1=0输入
RS=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
RW=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
while(busy); //busy为高电平表示忙,循环等待
pd1 = 0xff; //置方向输出
}
//---写命令--------------------------
Write_Command()
{
RS=0;
asm("nop"); //写入控制命令的子程序
asm("nop");
asm("nop");
asm("nop");
asm("nop");
RW=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
lcd_busy(); //判断液晶模块是否忙
EN=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
//---写数据------------------------------
Write_Data()
{
RS=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
RW=0;
asm("nop"); //准备写入数据
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
EN=0;
asm("nop"); //执行显示命令
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
lcd_busy(); //判断液晶模块是否忙
EN=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
//----延时----
lcd_delay(unsigned int t)
{ while(t--);
}
//****************************************
main()
{
unsigned int i=2000;
/************************************************************************
系统时钟初始化 选主时钟 1分频
************************************************************************/
prcr=0x01; //关闭和时钟相关的保护寄存器,允许修改时钟
cm13=1; //XIN-XOUT引脚
cm15 =1; //XIN-XOUT引脚使用高驱动能力
cm05=0; //开始振荡
asm("NOP\nNOP\nNOP\nNOP");
asm("NOP\nNOP\nNOP\nNOP");
ocd2=0x00; //使用主时钟作为系统时钟
cm16=0;cm17=0;cm06=0; //f1
prcr=0; //打开保护寄存器
pd1 = 0xff;//设定输出 1(输出) 0(输入)
pd3_3 = 1; //输出
pd3_4 = 1; //输出
pd3_5 = 1; //输出
p1 = 0; //
RS = 0;//
RW = 0;//
EN = 0;//
//---初始化
while(--i);
while(1) //为保证用户何时插上液晶都可以正常显示,
//这里的初始化也是循环的,实际使用时只要初始化1次就可以了
{
ComDat=0x01; //清屏并光标复位
Write_Command(); //写入命令
ComDat=0x38; //设置显示模式:8位2行5x7点阵
Write_Command();
ComDat=0x0f; //显示器开、光标关、光标禁止闪烁
Write_Command();
ComDat=0x06; //文字不动,光标自动右移
Write_Command();
//选择1行
ComDat=0x00; //写入显示起始地址(第1行第2个位置)
ComDat=ComDat|0x80;
//按模块要求写入的地址最高位必需为1
Write_Command(); //写入命令
//送字符
for(i=0;i<16;i++)
{
ComDat=str1[i]; //提取字符
Write_Data(); //送数据
}
//选择2行
ComDat=0x40; //写入显示起始地址(第1行第1个位置)
ComDat=ComDat|0x80;
//按模块要求写入的地址最高位必需为1
Write_Command(); //写入命令
//送字符
for(i=0;i<16;i++)
{
ComDat=str2[i]; //提取字符
Write_Data(); //送数据
}
lcd_delay(30000);
}
}