📄 lcd_st7920_bymg.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 + -