/***********************************************************************/
/*                                                                     */
/*  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);
  }
}