⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdl162a.c

📁 ti公司的16位msp430单片机驱动1602液晶显示
💻 C
字号:
#include <msp430x16x.h>
#include "JDL162A.h"


/********************************************************
*毫秒级延时
*MSP430中,一个for循环耗费8个时钟周期
*本列中系统频率为8MHZ,因此1000个for循环约为1ms
*********************************************************/
void delay_ms(unsigned int n)       
{
   unsigned int i=0,j=0;
   for (i=n;i>0;i--)
      for (j=0;j<1000;j++);	
} 


/************************************
*  write_Command(),用于写命令到LCD
busy_sc为0时忽略忙检测
************************************/
void write_Command(unsigned char cmd,unsigned char busy_sc)
{
     if(busy_sc) 
     lcd_check_busy();
     data_port_dir = 0xff;	//数据端口为输出模式
     //CLR_LCD_EN;
    // data_port_out =cmd;
     CLR_LCD_RS;		//rs=0 ,指令
     CLR_LCD_RW;		//rw=0写操作
     data_port_out =cmd;
     CLR_LCD_EN;
     CLR_LCD_EN;
     SET_LCD_EN;
}

/***************************************************
* write data
****************************************************/
void write_Data(unsigned char content)
{
     lcd_check_busy();   //查忙
     data_port_dir = 0xff;	//数据端口为输出模式
     //CLR_LCD_EN;
    // data_port_out =content;
     SET_LCD_RS;				//rs=1数据
     CLR_LCD_RW;				//rw=0写操作
     data_port_out =content;  
     CLR_LCD_EN;
     CLR_LCD_EN;
     SET_LCD_EN;
}


/************************************************************
*  在指定的位置显示单个字符
SMC16O2A是16(列)*2(行)
************************************************************/
void LCD_write_char( unsigned X,unsigned char Y,unsigned char dat)
{
      unsigned char address;
      X &=0x0f;
      Y &=0x01;               //限制X不能大于15,Y不能大于1
      if(Y==0)
          address=X+0x80;     //第一行的首地址是0x80
      else
          address=X+0xc0;     //第二行的首地址是0xc0
      write_Command(address,1);     //发送地址码 
      write_Data(dat);
}

/**************************************
*  在指定的位置显示字符串
***************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *str)
{
    X &=0x0f;
    Y &=0x01;               //限制X不能大于15,Y不能大于1 
    if(Y==0)
    {
      if(X<16)
      {
        write_Command(X+0x80,1);     //发送地址码 
        for(;(X<16)&&(*str!='\0');X++)
        {
          write_Data(*str);
          str++;
        }
        if(*str!='\0')
        {
          X=0;
          Y=1;
        }
      }
    }
    if(Y==1)
    {
      write_Command(X+0xc0,1);     //发送地址码
      for(;(X<16)&&(*str!='\0');X++) 
      {
        write_Data(*str);
        str++;
      }
    }
}


/******************************************************
初始化
******************************************************/
void init_LCD()
{	
        data_port_dir |=0xff;		//设置数据端口为输出
	control_port_dir |=0x07;	//控制端口设置为输出模式
	delay_ms(15);                   //延时 15MS
	
	write_Command(0x38,0);          //三次显示模式设置,不检测忙信号
        delay_ms(5);                       //延时5ms
        write_Command(0x38,0);    
        delay_ms(5);
        write_Command(0x38,0);    
        delay_ms(5);
	
        write_Command(0x38,1); //设置16*2显示,5*7点阵,8位数据转换 ,要检测忙信号
        write_Command(0x08,1); //关闭显示
        write_Command(0x01,1); //清屏
        write_Command(0x06,1); //设定输入方式,增量方式
        write_Command(0x0c,1); //显示开,光标开,光标所在字符不闪烁
        
}


/***********************************
*查忙函数
***********************************/
void lcd_check_busy()
{
    data_port_dir &= 0x00;	    //输入模式
    CLR_LCD_RS;		            //RS=0,指令操作
    SET_LCD_RW;			    //读操作
    CLR_LCD_EN;			    //若晶振频率太高,可以在此加短暂的延时
    CLR_LCD_EN;			    //延时作用
    SET_LCD_EN;                     //选通
    while(P4IN & 0x80);     //检测忙信号
}

unsigned char ReadData(void)
{
    data_port_dir &= 0x00;	    //输入模式
    SET_LCD_RS; 
    SET_LCD_RW;
    CLR_LCD_EN;			    //若晶振频率太高,可以在此加短暂的延时
    CLR_LCD_EN;			    //延时作用
    SET_LCD_EN; 
    return(P4IN);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -