技术热线: 4007-888-234

QLdsPIC3]LCD1602[C30+dsPIC30F6014A]

更新时间: 2019-03-23
阅读量:2759

深圳市英锐恩科技有限公司:台湾麦肯单片机(Micon MDT单片机)亚太地区A级代理商

QLdsPIC3]LCD1602[C30+dsPIC30F6014A]
//实验目的:熟悉LCD的使用方法
//LCD循环显示本产品名称和公司网站地址
//硬件要求:跳线全部跳好
//所有拨码开关置OFF
//调节电位器VR2到LCD1602能正常显示。

#include             //dsPIC30F6014标准头文件

  _FOSC(CSW_FSCM_OFF & XT_PLL4);  //4倍频晶振,Failsafe 时钟关闭
  _FWDT(WDT_OFF);                 //关闭看门狗定时器
  _FBORPOR(PBOR_OFF & MCLR_EN);   //掉电复位禁止,MCLR复位使能。
  _FGS(CODE_PROT_OFF);            //代码保护禁止


#define rs LATBbits.LATB4          //定义LCD控制位(注意这里只能用LATB寄存器,不能直接用PORTB寄存器)
#define rw LATBbits.LATB5
#define e  LATBbits.LATB6
 const int web[ ]={' ','W','W','W','.','P','I','C','1','6','.','C','O','M',' ',' '};
//定义公司web地址
const int name[ ]={' ',' ',' ',' ','Q','L','d','s','P','I','C','3',' ',' ',' ',' '};
//定义公司产品名称

void init();                   //申明I/O口初始化函数
void lcd_init();               //申明LCD初始化函数
void write_web();              //申明显示公司web地址函数
void write_name();             //申明显示产品名字函数
void write(unsigned int x);    //申明显示1字节数据函数
void lcd_enable();             //申明LCD显示设置函数
void delay();                  //申明延时函数

//---------------------------------------
//主函数
int main(void)
 {
    while(1)
      {
        delay();
        delay();
        delay();
        delay();
        delay();
        init();                //调用I/O口初始化函数
        lcd_init();            //调用LCD初始化函数
        write_name();          //调用显示产品名字函数
        PORTD=0X00C0;          //设置第2行显示地址
        lcd_enable();          //调用LCD显示设置函数
        write_web();           //调用显示公司tel函数
          while(1);
         
      }
 }
 
//---------------------------------------
//I/O口初始化函数
void init()
 {
    TRISB=0X0000;              //设置B口为输出
    TRISD=0X0000;              //设置D口为输出
 }

//---------------------------------------
//LCD初始化函数
void lcd_init()
 {
    PORTD=0X1;                 //清除显示
    lcd_enable();
    PORTD=0X38;                //8位2行5*7点阵
    lcd_enable();
    PORTD=0X0e;                //显示开,光标开,闪烁
    lcd_enable();
    PORTD=0X06;                //文字不动,光标右移
    lcd_enable();
    PORTD=0X80;                //产品名字显示地址
    lcd_enable();
 }
 
//--------------------------------------
//显示公司web地址
void write_web()
 {
    unsigned char i,j;
    for(i=0;i<16;i++)          //一共16字节数据
       {
         write(web[i]);        //查表获取数据并调用写一个字节数据函数送LCD显示
         for(j=0;j<5;j++)      //延时一段时间(主要是为了控制显示的速度)
          {delay();}
       }
 }

//--------------------------------------
//显示产品名字函数
 void write_name()
 {
    unsigned char i,j;
    for(i=0;i<0x10;i++)       //一共显示16字节数据
       {
       
         write(name[i]);      //查表获取数据并调用写一个字节数据函数送LCD显示
         for(j=0;j<5;j++)
          {delay();}
       }
 }
 
//--------------------------------------
//写一个字节数据函数
//在电平发生改变后需要插入一段延时时间,否则LCD反应不过来。
void write(unsigned int x)
 {
  PORTD=x;                   //待显示数据送PORTD口
  delay();                  
  rs=1;                      //该字节数据为数据,而不是命令
  delay();
  rw=0;                      //此次操作为写,而不是读
  delay();
  e=0;                       //拉低使能信号
  delay();                   //保持使能信号为低一段时间
  e=1;                       //拉高使能信号,建立LCD操作所需要的上升沿
  delay();
 }


//--------------------------------------
//LCD显示设置函数
//在电平发生改变后需要插入一段延时时间,否则LCD反应不过来。
void lcd_enable()
 {
   delay();
   rs=0;                     //该字节数据为命令,而不是数据
   delay();
   rw=0;                     //此次操作为写,而不是读
   delay();
   e=0;                      //拉低使能信号
   delay();                  //保持使能信号为低一段时间
   e=1;                      //拉高使能信号,建立LCD操作所需要的上升沿
   delay();
}

//--------------------------------------
//延时函数
void delay()
 {
   unsigned int i;
   for(i=0;i<100;i++);
 }