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

📄 lcd12864.c

📁 MSP430单片机用12864液晶绘制DS18B20温度曲线源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <msp430x14x.h>
#include "Lcd12864.h"

//=========================================
//函数功能:显示字符串(第x行,第y列)
//=========================================
void DisplayString(unsigned char x,unsigned char y,unsigned char *s)
{
	switch(x)
  	{
    	case 1 : x = 0x80; break;
    	case 2 : x = 0x90; break;
    	case 3 : x = 0x88; break;
    	case 4 : x = 0x98; break;
  	}
	LcdWriteCommand(x + y - 1); 
  	while(*s)
  	{
  		LcdWriteData(*s);
   		s++;
  	}
}
//=========================================
//函数功能:显示bmp图像(GDRAM)
//=========================================
void DisplayBMP(unsigned char *bmp)
{
	unsigned char i = 0,j = 0;
	LcdWriteCommand(0x36);	  //扩充指令,绘图打开
	for(i=0;i<32;i++)
	{
    	LcdWriteCommand(0x80+i);//先送垂直地址 
    	LcdWriteCommand(0x80);  //再送水平地址,显示图片的上半部分 
		for(j=0;j<16;j++)
		{
			LcdWriteData(*bmp++);
		}
 	}
	for(i=0;i<32;i++)
	{
    	LcdWriteCommand(0x80+i);	//先送垂直地址
		LcdWriteCommand(0x88);	//显示图片的下半部分 
    	for(j=0;j<16;j++)
    	{
			LcdWriteData(*bmp++);
		}
	}
	LcdWriteCommand(0x30);	//基本指令,绘图关闭
}
/*******************************************************************************
        初始化LCD 保证LCD 可靠工作
        采用常用的初始化步骤
******************************************************************************/
void InitLcd12864()
{
	SET_LCD_PSB;      //并口方式
	P5DIR |= 0xff;
  	Delay_352us(200);//;延时70.4ms > 40ms
  	LcdWriteCommand(0X30);//30---基本指令操作
  	Delay_352us(1);  //延迟352us > 100 us
  	LcdWriteCommand(0X30);//30---基本指令操作
  	Delay_us(40);  //延迟80us >37 us
  	LcdWriteCommand(0X0c);//显示状态设置 整体显示 游标打开 游标位置打开
 	 Delay_352us(1); //延迟352us >100 us
  	LcdWriteCommand(0X01);//指令#01H为:清除屏幕文字,把地址指针指向00H单元
  	Delay_352us(100);  //延迟35.2ms > 10ms
  	LcdWriteCommand(0X06);//指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
  	Delay_352us(1);  //简短延时
 
}
/*****************************************************************************
                            352us 延时函数
****************************************************************************/
void Delay_352us(unsigned int i)//352us延时程序
{ 
	unsigned char j;
	while(i--)
  	{
   		for(j=0;j<255;j++)
   		{  
    		_NOP();
    		_NOP();
    		_NOP();
    		_NOP();   
    	}
  	} 
}
/***************************************************************************
                             延时函数
                            delay 2.5us at 8M
*****************************************************************************/
void Delay_us(unsigned char i)// 
{  
	unsigned char ii;
   	for(ii =i;ii > 0;ii--)
   	{ 
    	_NOP();_NOP();_NOP();_NOP();   
      	_NOP();_NOP();_NOP();_NOP();
      	_NOP();_NOP();_NOP();_NOP();
      	_NOP();_NOP();_NOP();_NOP();   
   	}    
}
/****************************************************************************
                向LCD写命令字函数
******************************************************************************/
void LcdWriteCommand(unsigned char i)//;向12864写命令的子程序
{ 
  	LcdCheckBusy();//;判断忙标,以确保上一指令/数据模块已经接收处理完
  	LCD_DATA_DIR_OUT;//把IO 口设置为输出
  	LCD_RS_LOW;      //RS=0 选择指令寄存器 写指令设置
  	LCD_E_LOW; 
  	LCD_WRITE;       //RW=0 选择写操作
  	LCD_E_HIGE;      //E=1,12864使能
  	LCD_OUT=i;       //往液晶数据口送指令
  	Delay_us(100);
  	LCD_E_LOW;        //关LCD使能 
  	Delay_us(100);
}
/***************************************************************************
                    判断忙标子程序
******************************************************************************/
void LcdCheckBusy()
{ 
 
  	LCD_DATA_DIR_IN;      // 把数据口置1,准备读入数据
  	LCD_E_LOW;
  	LCD_RS_LOW;           // RS = 0 选择指令寄存器
  	LCD_READ;             // 读操作
  	LCD_E_HIGE;           // 将E 置高电平, 12864使能
  	Delay_us(1);      
  	while(LCD_IN & 0X80);// 忙碌标志为1,则停在此处
  	LCD_E_LOW;           // 将 E 置低 
  	Delay_us(100);
}

/*******************************************************************************
                        向LCD写数据函数
*****************************************************************************/
void LcdWriteData(unsigned char i)//;写数据子程序
{  
   	LcdCheckBusy();//判断忙标,以确保上一指令/数据模块已经接收处理完
   	LCD_DATA_DIR_OUT;//设置io 为输出 要想LCD 写数据
   	LCD_E_LOW;
   	LCD_RS_HIGE;    //RS=1选择数据寄存器,设置为写数据
   	LCD_WRITE;     //RW=0 选择写操作
   	LCD_E_HIGE;//LCD 使能
   	Delay_us(1);
   	LCD_OUT=i;	    //往LCD 送数据
   	Delay_us(100);   //延时
   	LCD_E_LOW;       //关使能
   	Delay_us(100);   // 延迟
} 
/*******************************************************************************
                     向LCD读数据函数
*****************************************************************************/
unsigned char LcdReadData()//;写数据子程序
{  
   	unsigned char data;
  	 LcdCheckBusy();  //判断忙标,以确保上一指令/数据模块已经接收处理完
   	LCD_DATA_DIR_IN; //设置io 为输入 要想LCD 读数据
   	LCD_E_LOW;
   	LCD_RS_HIGE; 
   	LCD_READ;        //RW=1 选择读操作
   	Delay_us(5);
   	LCD_E_HIGE;	   //LCD 使能
   	Delay_us(1);
   	data = LCD_IN;  //往LCD 送数据
   	Delay_us(100);   //延时
   	LCD_E_LOW;       //关使能
   	Delay_us(10);   // 延迟
   	return (data);
}
/******************************************************************************
                            数据填充函数
设置为扩充指令,关闭绘图模式
连续写两个字节的GDRAM地址,先写垂直地址,后写水平地址
写两个字节数据,先写高8位数据,后写低8位数据
打开绘图模式
设置回基本指令集
*******************************************************************************/
void FillGdram(unsigned char data)
{
    unsigned char i;
    unsigned char j;
    unsigned char k;
    unsigned char xAddress = 0x80;
    unsigned char yAddress = 0x80;
    for( i = 0;i < 2;i++ )
    {
        for(j = 0;j <32;j++)
        {
            for(k = 0;k < 16;k++)
            {
                LcdWriteCommand(0x34);
                LcdWriteCommand(yAddress + j);//GDRAM垂直地址Y
                LcdWriteCommand(xAddress + k);//GDRAM水平地址X
                LcdWriteData(data);
                LcdWriteData(data);
            }
        }
        xAddress = 0x88;
    }
    LcdWriteCommand(0x36);
    LcdWriteCommand(0x30);
}
/****************************************************************************
                    画点函数(过程:读->修改->写)
x,y坐标区间分别为[0,127]、[0,63](即:0<= x <=127,0<= y <=63)
4个顶点坐标:
            (0,0)________________(127,0)
                |                |
                |      12864     |
                |      LCD       |
          (0,63)|_______________ |(127,63)

(X, Y )为点坐标; color = 1,该点填充1 ,color = 0 该点填充0
***************************************************************************/
void DrawPoint(unsigned char x,unsigned char y,unsigned char color)
{
    unsigned char Row,Tier,Tier_bit;
    unsigned char ReadOldH,ReadOldL;
    LcdWriteCommand(0x34);
    LcdWriteCommand(0x36);//设定为扩展指令,8位数据操作
    Tier = x >> 4;
    Tier_bit = x & 0x0f;
    if(y < 32)
    {
        Row = y;
    }
    else
    {
        Row = y -32;
        Tier += 8;
    }
    LcdWriteCommand(0x80 + Row);
    LcdWriteCommand(0x80 + Tier);
    LcdReadData();      //预读数操作
    ReadOldH = LcdReadData(); //读取当前显示高8位数据
    ReadOldL = LcdReadData();  //读取当前显示低8位数据
    Delay_us(250);
    
    LcdWriteCommand(0x80 + Row);
    LcdWriteCommand(0x80 + Tier);

    Delay_us(250);
    if(Tier_bit < 8)//判断当前是高8位还是低8位
    {
        switch(color)
        {
            case 0: ReadOldH &= (~(0x01 << (7 - Tier_bit)));break;
            case 1: ReadOldH |= (0x01 << (7 - Tier_bit))   ;break;
            case 2: ReadOldH ^= (0x01 << (7 - Tier_bit))   ;break;
            default:break;
        }
        LcdWriteData(ReadOldH);
        LcdWriteData(ReadOldL);
    }
    else
    {
       switch(color)
        {
            case 0: ReadOldL &= (~(0x01 << (15 - Tier_bit)));break;
            case 1: ReadOldL |= (0x01 << (15 - Tier_bit))   ;break;
            case 2: ReadOldL ^= (0x01 << (15 - Tier_bit))   ;break;
            default:break;
        }
        LcdWriteData(ReadOldH);
        LcdWriteData(ReadOldL); 
    }
    
    LcdWriteCommand(0x30);
}
/******************************************************************************
                            画水平直线
垂直于y轴的直线
x0起点,x1终点
*******************************************************************************/
void DrawHorizontalLine(unsigned char x0,unsigned char x1,unsigned char y,unsigned char color)
{
    unsigned char temp;

⌨️ 快捷键说明

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