📄 lcd12864s_430_easynet.c
字号:
/**********************************************************/
//MSP430 EasyNET V1.2 Developping Components - [LCD12864S_430_EASYNET.C]
////->>> http://www.just430.cn
////->>> tel :(0)13500717874
////->>> 2008年04月09日修改
/**********************************************************/
//MSP430 EasyNET V1.2 - LCD12864(字符型)液晶显示驱动
/*********************************************************/
#include <msp430x14x.h>
#define LCD_CS BIT4 //LCD_CS -> P1.4
#define LCD_CS_DIR P1DIR
#define LCD_CS_HI P1OUT |= LCD_CS
#define LCD_CS_LO P1OUT &= ~LCD_CS
#define LCD_DAT BIT5 //LCD_DAT -> P1.5
#define LCD_DAT_DIR P1DIR
#define LCD_DAT_IN P1IN
#define LCD_DAT_HI P1OUT |= LCD_DAT
#define LCD_DAT_LO P1OUT &= ~LCD_DAT
#define LCD_CLK BIT6 //LCD_CLK -> P1.6
#define LCD_CLK_DIR P1DIR
#define LCD_CLK_HI P1OUT |= LCD_CLK
#define LCD_CLK_LO P1OUT &= ~LCD_CLK
#define LCD_PSB BIT0 //LCD_PSB -> P6.0
#define LCD_PSB_DIR P6DIR
#define LCD_PSB_HI P6OUT |= LCD_PSB
#define LCD_PSB_LO P6OUT &= ~LCD_PSB
#define LCD_RST BIT7 //LCD_RST -> P1.7
#define LCD_RST_DIR P1DIR
#define LCD_RST_LO P1OUT &= ~LCD_RST
#define LCD_RST_HI P1OUT |= LCD_RST
void InitOSC(void);
void LCD_Init(void);
unsigned char CheckBusy(void);
void LCD_Delayt(unsigned int dtime);
void LCD_WriteComm(unsigned char wdata);
void LCD_WriteByte(unsigned char wdata);
void LCD_SetXY(unsigned char X,unsigned char Y);
void LCD_WriteDEC(unsigned char X,unsigned char Y,unsigned char Num);
void LCD_WriteString(unsigned char X,unsigned char Y,unsigned char *String);
void LCD_Draw();
const unsigned char Tianwei[64][16]= {
0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x01,0xDF,0x7C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0x0F,0xC0,0x00,0x00,0x00,0x01,0xFF,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xFF,0x03,0xF8,0x00,0x00,0x00,0x07,0xFF,0xFF,0xA0,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0x83,0xFE,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x00,
0x00,0x00,0x00,0x3F,0xFF,0x83,0xFF,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xF8,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0x81,0xFF,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xF8,0x00,0x00,
0x00,0x00,0x00,0xFF,0xFF,0x81,0xFF,0xC0,0x00,0x07,0xFF,0xFF,0xFF,0xFE,0x00,0x00,
0x00,0x00,0x03,0xFF,0xFF,0x81,0xFF,0xC0,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x07,0xFF,0xFF,0x01,0xFF,0xE0,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,
0x00,0x00,0x0F,0xFF,0xFF,0x01,0xFF,0xF0,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,
0x00,0x00,0x1F,0xFF,0xFF,0x0F,0xFF,0xF8,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,
0x00,0x00,0x7F,0xFF,0xFF,0x0F,0xFF,0xF8,0x00,0x7F,0xFC,0xC1,0xFF,0xFF,0xE0,0x00,
0x00,0x00,0xFF,0xC0,0x07,0xFF,0xFF,0xFC,0x01,0xFF,0xF8,0x00,0x07,0xFF,0xE0,0x00,
0x00,0x00,0xFF,0x00,0x01,0xFF,0xFF,0xFC,0x03,0xFF,0xC0,0x00,0x01,0xFF,0xE0,0x00,
0x00,0x01,0xFC,0x00,0x00,0x7F,0xFF,0xFC,0x0F,0xFF,0x00,0x00,0x00,0x7F,0xE0,0x00,
0x00,0x03,0xF8,0x00,0x00,0x3F,0xFF,0xFC,0x0F,0xFC,0x00,0x00,0x00,0x1F,0xF0,0x00,
0x00,0x03,0xE0,0x00,0x00,0x1F,0xFF,0xFC,0x0F,0xFC,0x00,0x00,0x00,0x0F,0xE0,0x00,
0x00,0x0F,0xC0,0x00,0x00,0x0F,0xFF,0xFC,0x1F,0xC8,0x00,0x00,0x00,0x0F,0xF0,0x00,
0x00,0x0F,0x80,0x00,0x00,0x07,0xFF,0xFE,0x1F,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,
0x00,0x0F,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,
0x00,0x1F,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x07,0xE0,0x00,
0x00,0x3C,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x07,0xE0,0x00,
0x00,0x7C,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,
0x00,0xF8,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,
0x00,0xF8,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x03,0x00,0x00,
0x00,0xF0,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xF0,0x00,0x00,0x00,0x00,0x7F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0xE0,0x00,0x00,0x00,0x00,0x7F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0xE0,0x00,0x00,0x00,0x00,0x3F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0xE0,0x00,0x00,0x00,0x00,0x3F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0xC0,0x00,0x00,0x00,0x00,0x3F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0xC0,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0xC0,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xC0,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xC0,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xC0,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xC0,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xC0,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xE0,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0F,0xE0,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,
0x0F,0xE0,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0xE0,0x00,0x00,
0x1F,0xE0,0x00,0x00,0x00,0x1F,0xC3,0xFF,0xFF,0xC0,0x00,0x00,0x01,0xE0,0x00,0x00,
0x07,0xF0,0x00,0x00,0x00,0x7F,0xC3,0xFF,0xFF,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,
0x07,0xF0,0x00,0x00,0x00,0xFF,0x01,0xFF,0xFF,0xE0,0x00,0x00,0x0F,0xC0,0x00,0x00,
0x07,0xF8,0x00,0x00,0x03,0xFE,0x01,0xFF,0xFF,0xF8,0x00,0x00,0x1F,0x80,0x00,0x00,
0x07,0xFE,0x00,0x00,0x00,0xFC,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x3F,0x80,0x00,0x00,
0x07,0xFF,0xC0,0x01,0x80,0xF8,0x00,0xFF,0xFF,0xFF,0xC0,0x00,0xFF,0x00,0x00,0x00,
0x03,0xFF,0xFC,0x0F,0xE0,0xF0,0x00,0xFF,0xFF,0xFF,0xE0,0x03,0xFE,0x00,0x00,0x00,
0x03,0xFF,0xFF,0xFF,0xE0,0xE0,0x00,0x7F,0xFF,0xFF,0xF8,0x47,0xFC,0x00,0x00,0x00,
0x03,0xFF,0xFF,0xFF,0xE1,0xC0,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x01,0xFF,0xFF,0xFF,0xE1,0x80,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x01,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xFF,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xFC,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,
0x00,0x1F,0xFF,0xFF,0xFC,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,
0x00,0x1F,0xFF,0xFF,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,
0x00,0x03,0xFF,0xFE,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,0x3F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00
};
unsigned char *aaa = "这是第一行吗?";
void main(void) {
WDTCTL = WDTPW + WDTHOLD;
InitOSC();
LCD_Init();
/*
LCD_Draw();
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Init();LCD_Delayt(5000);
*/
while(1) {
LCD_WriteString(1,1,aaa);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_WriteString(1,1,"这是第一行的!");
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);LCD_Delayt(50000);
}
}
void InitOSC(void) {
unsigned char i,j; //设置系统时钟
BCSCTL1 = 0x00; //启动XT2晶振,ACLK为XT1(32KHz)
BCSCTL2 = 0x88; //MCLK为XT2不分频;SMCLK为XT2,4MHz
j=0;
while(1) {
IFG1 &= ~OFIFG; //清OSCFault标志
for (i=0xFF;i>0;--i); //延时等待
if ((IFG1 & OFIFG)!=0) {
BCSCTL1 = 0x00; //启动XT2晶振,ACLK为XT1(32KHz)
BCSCTL2 = 0X88; //MCLK为XT2不分频,SMCLK为XT2不分频
j++; //如果检测到振荡器失效,则计数
if (j>10) //如果计数值超过10次,则认为是硬件问题
; //OSCFault();
}
else {
for (i=0xFF;i>0;--i); //等待振荡器达到足够的幅度
IFG1 &= ~OFIFG; //清OSCFault标志
IE1 |= OFIE + ACCVIE; //振荡器故障,FLASH非法访问中断允许
break;
}
}
}
void LCD_Init(void) {
LCD_RST_DIR |= LCD_RST; //RST -> 复位输出
LCD_RST_LO; //复位状态
LCD_CLK_DIR |= LCD_CLK;
LCD_CLK_LO;
LCD_DAT_DIR |= LCD_DAT;
LCD_DAT_LO;
LCD_CS_DIR |= LCD_CS;
LCD_CS_LO;
LCD_RST_HI;
LCD_WriteComm(0x30); //设定基本指令集
LCD_WriteComm(0x01); //清除显示
LCD_WriteComm(0x02); //地址归位
LCD_WriteComm(0x0c); //开显示状态
LCD_WriteComm(0x03);
LCD_WriteComm(0x06); //进入设定点
}
void LCD_Delayt(unsigned int dtime) {
unsigned int itemp;
for(itemp=0;itemp<dtime;itemp++);
}
unsigned char CheckBusy(void) {
unsigned char itemp;
unsigned char Read = 0XFC; //判断是否忙的指令
unsigned char Read_H,Read_L;
LCD_CS_LO;
LCD_CLK_LO;
LCD_DAT_LO;
LCD_CS_HI;
for(itemp=0;itemp<8;itemp++) {
if((Read<<itemp) & BIT7)
LCD_DAT_HI;
else
LCD_DAT_LO;
LCD_CLK_HI;
_NOP();
LCD_CLK_LO;
}
LCD_DAT_DIR &= ~LCD_DAT;
for(itemp=0;itemp<8;itemp++) {
LCD_CLK_LO;
LCD_CLK_HI;
Read<<=1;
if((LCD_DAT_IN&LCD_DAT) == LCD_DAT)
Read |= BIT0;
else
Read &= ~BIT0;
}
Read_H = Read;
for(itemp=0;itemp<8;itemp++) {
LCD_CLK_LO;
LCD_CLK_HI;
Read<<=1;
if((LCD_DAT_IN&LCD_DAT) == LCD_DAT)
Read |= BIT0;
else
Read &= ~BIT0;
}
LCD_CS_LO;
LCD_DAT_DIR |= LCD_DAT;
LCD_DAT_LO;
Read_L = Read>>4;
Read = Read_H|Read_L;
return(Read);
}
void LCD_WriteComm(unsigned char wdata) {
unsigned char itemp;
unsigned char jtemp=0xf8;
do {
itemp = CheckBusy();
}while(itemp&0x80);
LCD_CS_LO;
LCD_CLK_LO;
LCD_DAT_LO;
LCD_CS_HI;
for(itemp=0;itemp<8;itemp++) {
if((jtemp<<itemp) & BIT7)
LCD_DAT_HI;
else
LCD_DAT_LO;
LCD_CLK_HI;
_NOP();
LCD_CLK_LO;
}
jtemp = wdata&0xf0;
for(itemp=0;itemp<8;itemp++) {
if((jtemp<<itemp) & BIT7)
LCD_DAT_HI;
else
LCD_DAT_LO;
LCD_CLK_HI;
_NOP();
LCD_CLK_LO;
}
itemp = wdata&0x0f;
jtemp = (itemp<<4)&0xf0;
for(itemp=0;itemp<8;itemp++) {
if((jtemp<<itemp) & BIT7)
LCD_DAT_HI;
else
LCD_DAT_LO;
LCD_CLK_HI;
_NOP();
LCD_CLK_LO;
}
LCD_CS_LO;
}
void LCD_WriteByte(unsigned char wdata) {
unsigned char itemp;
unsigned char jtemp=0xfa;
do {
itemp = CheckBusy();
}while(itemp&0x80);
LCD_CS_LO;
LCD_CLK_LO;
LCD_DAT_LO;
LCD_CS_HI;
for(itemp=0;itemp<8;itemp++) {
if((jtemp<<itemp) & BIT7)
LCD_DAT_HI;
else
LCD_DAT_LO;
LCD_CLK_HI;
_NOP();
LCD_CLK_LO;
}
jtemp = wdata&0xf0;
for(itemp=0;itemp<8;itemp++) {
if((jtemp<<itemp) & BIT7)
LCD_DAT_HI;
else
LCD_DAT_LO;
LCD_CLK_HI;
_NOP();
LCD_CLK_LO;
}
itemp = wdata&0x0f;
jtemp = (itemp<<4)&0xf0;
for(itemp=0;itemp<8;itemp++) {
if((jtemp<<itemp) & BIT7)
LCD_DAT_HI;
else
LCD_DAT_LO;
LCD_CLK_HI;
_NOP();
LCD_CLK_LO;
}
LCD_CS_LO;
}
void LCD_SetXY(unsigned char X, unsigned char Y) {
switch(Y) {
case 1:
LCD_WriteComm(0x7F + X);
break;
case 2:
LCD_WriteComm(0x8F + X);
break;
case 3:
LCD_WriteComm(0x87 + X);
break;
case 4:
LCD_WriteComm(0x97 + X);
}
}
void LCD_WriteString(unsigned char X,unsigned char Y,unsigned char *String) {
unsigned char temp;
LCD_SetXY(X,Y);
temp = *String;
while(temp!=0) {
LCD_WriteByte(temp);
temp = *(++String);
}
}
void LCD_WriteDEC(unsigned char X,unsigned char Y,unsigned char Num) {
LCD_SetXY(X,Y);
LCD_WriteByte((Num/10) + 0x30);
LCD_WriteByte((Num%10) + 0x30);
}
void LCD_Draw() {
unsigned char itemp,jtemp;
unsigned char X = 0x80,Y = 0x80;
LCD_WriteComm(0x0c);
LCD_WriteComm(0x34);
for (itemp=0;itemp<64;itemp++) {
for(jtemp=0;jtemp<8;jtemp++) {
LCD_WriteComm(Y);
LCD_WriteComm(X);
LCD_WriteByte(Tianwei[itemp][(jtemp<<1)]);
LCD_WriteByte(Tianwei[itemp][(jtemp<<1)+1]);
X++;
}
Y++;
if(Y>0x9f)Y=0x80;
X=0x80+(((itemp+1)>>5)<<3);
}
LCD_WriteComm(0x36);
LCD_WriteComm(0x30);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -