?? 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 + -