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

📄 lcd_st7920_bymg.cpp

📁 使用ST7920做液晶控制芯片(如RT12864-3)的C++类实现
💻 CPP
字号:
#include <msp430x14x.h>
#include "LCD_ST7920_ByMG.h"
//**********************************************************************
//初始化ST7920
//**********************************************************************
void CLcd::LCD_Init(void)

{
	
  	ControlSelReg &= ~(LCD_RS + LCD_RW + LCD_EN); 	//0 for digital I/o
	ControlDirReg |= (LCD_RS + LCD_RW + LCD_EN) ;	//1 for output
	
	DataSelReg	=0;
	DataDirReg	=0xff;
	LCD_EN_0;
        
}
//**********************************************************************
//向ST7920写命令或数据
//**********************************************************************
void CLcd::LCD_Write(unsigned char rs, unsigned char cd)
{
	if(rs)
	{//data
	 	LCD_RS_1;
	}
	else
	{//command
	  	LCD_RS_0;
	}
	LCD_RW_0;
	DataOutReg =cd;
	LCD_EN_1;
	LCD_Delay_50();
	LCD_EN_0;
	LCD_Delay();
}

//**********************************************************************
//延时函数
//**********************************************************************
void CLcd::CLcd::LCD_Delay(void)
{
  int i;
  for(i=0;i<1000;i++);
}
void CLcd:: LCD_Delay_50(void)
{
  int i;
  for(i=0;i<50;i++);
}
//**********************************************************************
//构造和析构函数
//**********************************************************************
CLcd::CLcd(void)
{
    LCD_Init();
	CurrentMode=TEXTMODE;
	LCD_Write(COMMAND,BASICFUN);
	LCD_Write(COMMAND,DSSTATE|DISPLAY);
	LCD_Write(COMMAND,CLEAR);
	LCD_Delay();
}
CLcd::~CLcd(void)
{
}
//输出汉字或字符函数
void CLcd::TextOut(int x,int y,char *s)
{
	unsigned char addr,conaddr;
	if(CurrentMode==TEXTMODE)
	{
		//x是行坐标 0~3 
		//y是列坐标 0~7
		addr=0x80+0x08*x;   //计算出行地址
		addr+=y;            //计算出实际地址
		while(*s)
		{
			conaddr=addr & 0xE7;
			conaddr += ((addr & 0x08)>>3)*16;
			conaddr+=((addr & 0x10)>>4)*8;
			//conaddr是addr的变换,以对应于液晶屏的映射关系
			//将D3与D4互换位置
			LCD_Write(COMMAND,conaddr);
			LCD_Write(DATA,*s++);
			LCD_Write(DATA,*s++);
			addr++;	
		}
		
	}
	else
	{
		
	}
}
//文本模式与图形设置
void CLcd::SetMode(int mode)
{
	if(mode==TEXTMODE)
	{
		if(CurrentMode==TEXTMODE) return;
		LCD_Write(COMMAND,EXTENDFUN);//使用扩展指令
		LCD_Write(COMMAND,EXTENDFUN); //关闭图形显示
		LCD_Write(COMMAND,BASICFUN);//使用基本指令
		LCD_Write(COMMAND,DSSTATE | DISPLAY);//no blink,no cursor
		CurrentMode=TEXTMODE;
	}
	
	else if(mode==GRAPHMODE)
	{
		if(CurrentMode==GRAPHMODE) return;
		LCD_Write(COMMAND,BASICFUN);//使用基本指令
		LCD_Write(COMMAND,CLEAR);
		LCD_Delay();//调试发现,在清零指令的后边必须加等待,否则状态不对
		LCD_Write(COMMAND,DSSTATE);//no display,no blink,no cursor
		//LCD_Delay();
		LCD_Write(COMMAND,GRAPHICMODEON);//开图形显示
		//LCD_Delay();
		LCD_Write(COMMAND,EXTENDFUN|GRAPHICMODEON); //开扩展指令并图形显示
		//LCD_Delay();
		CurrentMode=GRAPHMODE;
	}
	else
	{
	}
}
//清图形显示缓冲区
void CLcd::Clear(void)
{
	for(int i=0;i<64;i++)
		for(int j=0;j<8;j++)
		{
			GraphBuffer[i][j]=0x00;
		}
	CopyBuffer();
}
//设置文本方式的光标及闪烁
void CLcd::SetCursor(int cursor,int blink)
{
	if(CurrentMode==GRAPHMODE) return;
	LCD_Write(COMMAND,DSSTATE + DISPLAY + CURSOR * cursor + BLINK * blink);//no blink,no cursor
}
//图形方式下,
void CLcd::Point(int x,int y)
{
	unsigned int quotient,remainder,shift;
	quotient=y/16;
	remainder=y%16;
	shift=0x8000;
	shift >>= remainder;
	GraphBuffer[x][quotient]|=shift;
	
	CopyBuffer();
}
//将图形缓冲区内容拷贝到LCD
void CLcd::CopyBuffer(void)
{
	unsigned int tmp;
	for(int i=0;i<32;i++)
		for(int j=0;j<8;j++)
		{
			
			tmp=GraphBuffer[i][j];
			LCD_Write(COMMAND,0x80+i);
			LCD_Write(COMMAND,0x80+j);
			LCD_Write(DATA,tmp>>8);
			LCD_Write(DATA,tmp);
		}
	for(int i=32;i<64;i++)
		for(int j=0;j<8;j++)
		{
			tmp=GraphBuffer[i][j];
			LCD_Write(COMMAND,0x80+i-32);
			LCD_Write(COMMAND,0x80+j+8);
			LCD_Write(DATA,tmp>>8);
			LCD_Write(DATA,tmp);
		}
}
//输出64*128点阵位图
void CLcd::BmpOutAll(const char *p)
{
	unsigned int tmp;
	char *s=(char *)p;
	for(int i=0;i<64;i++)
		for(int j=0;j<8;j++)
		{
			tmp=(*s++)*256;
			tmp+=*s++;
			GraphBuffer[i][j]= tmp;
		}
	CopyBuffer();
}
//在指定位置开始输出点阵块
void CLcd::BmpOut(int x,int y,int height,int width,const char *p)
//要求y, width均为16的倍数
{
	unsigned int tmp;
	char *s=(char *)p;
	for(int i=x;i<x+height;i++)
		for(int j=y/16;j<(y+width)/16;j++)
		{
			tmp=*s++;
			tmp*=256;
			tmp+=*s++;
			GraphBuffer[i][j]= tmp;
		}
	CopyBuffer();
	
}

⌨️ 快捷键说明

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