用MSP430F149驱动不带中文字库12864液晶显示时钟
菜鸟做的一个用MSP430F149驱动不带中文字库12864液晶显示时钟程序。分别显示时、分、秒、毫秒。不过现在只能做秒表用用还行。用按键来调时间还没有做进去。呵呵主函数里的程序main.c
#include "io430.h"
#include "lcd.h"
#include "delay.h"
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
InitClock(); //初始化系统时钟
P4DIR=0xff; // 初始化IO
P4OUT=0xff;
P1DIR=0xff;
P1OUT=0xff;
P2DIR=0XFF;
P2OUT=0XFB;
RW=0; //LCD设置为写数据状态
RST=0; //LCD复位
delay_50ms(1);
RST=1; //LCD复位结束
Init_LCD(); //初始化液晶显示器
Initialization(); //初始化函数
CleanScreen(0X00); //清屏
uchar h1=0,h=0,t1=0,t=0,s1=0,s=0,ms1=0,ms=0,q=2;
while(1)
{ Shi_jian(3,4, h1,h,t1,t,s1,s,ms); //显示时、分、秒、毫秒
if(h1==q)
{ h=0;q=16; }
else if(q/h==4)
{ h1=0;h=0;t1=0;t=0;s1=0;s=0; }
else if(h==10)
{ h=0;h1++; }
else if(t1==6)
{ t1=0; h++; }
else if(t==10)
{t=0;t1++; }
else if(s1==6)
{ s1=0;t++; }
else if(s==10)
{s=0;s1++; }
// else if(ms1==10)
// {ms1=0; s++; }
else if(ms==10)
{ms=0;s++; }
else if(ms<=9)
{ delay_50ms(1362);ms++; } //延时1362为1秒
}
}
子函数、被调用函数程序 LCD.C
#include "io430.h"
#include "lcd.h"
#include "delay.h"
#define Character_array 43 //字符数组的长度为43个
#define Chinese_character 68+6+4 //汉字数组的长度为78
//字符点阵数据结构
typedef conststruct
{
const signed char hanz;
const signed char code;
}Character;
//汉字点阵数据结构
typedef const struct
{
const unsigned char hanzi; //汉字
const unsigned char code; //代码
}hanzi;
/*******************************************
结构字符数组库、由hanzi类型定义的ChineseCharacter数组库
*******************************************/
Charactershuzi=
{
{'0',{0x00,0xF8,0xFC,0x04,0x04,0x04,0xFC,0xF8,0x00,0x1F,0x3F,0x20,0x20,0x20,0x3F,0x1F}},
//0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00
{'1',{0x00,0x00,0x30,0x18,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00}},
//0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00
{'2',{0x00,0x18,0x1C,0x04,0x84,0x84,0xFC,0x78,0x00,0x3E,0x3F,0x21,0x21,0x20,0x20,0x20}},
//0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00
{'3',{0x00,0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,0x10,0x30,0x20,0x20,0x20,0x3F,0x1F}},
//0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00
{'4',{0x00,0x80,0xC0,0x60,0x30,0xF8,0xFC,0x00,0x00,0x03,0x03,0x02,0x02,0x3F,0x3F,0x02}},
//0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00
{'5',{0x00,0xFC,0xFC,0x44,0x44,0x44,0xC4,0x80,0x00,0x10,0x30,0x20,0x20,0x20,0x3F,0x1F}},
//0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00
{'6',{0x00,0xF8,0xFC,0x44,0x44,0x44,0xCC,0x88,0x00,0x1F,0x3F,0x20,0x20,0x20,0x3F,0x1F}},
//0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00
{'7',{0x00,0x04,0x04,0x04,0x84,0xE4,0x7C,0x1C,0x00,0x00,0x00,0x3E,0x3F,0x01,0x00,0x00}},
//0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00
{'8',{0x00,0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,0x1F,0x3F,0x20,0x20,0x20,0x3F,0x1F}},
//0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00
{'9',{0x00,0xF8,0xFC,0x04,0x04,0x04,0xFC,0xF8,0x00,0x10,0x31,0x21,0x21,0x21,0x3F,0x1F}},
//0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
//10
{'A',{0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20}},
{'B',{0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00}},
{'C',{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00}},
{'D',{0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00}},
{'E',{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00}},
{'F',{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00}},
{'G',{0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00}},
{'H',{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20}},
{'I',{0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}},
{'J',{0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00}},
//20
{'K',{0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00}},
{'L',{0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00}},
{'M',{0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00}},
{'N',{0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00}},
{'O',{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00}},
{'P',{0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00}},
{'Q',{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00}},
{'R',{0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20}},
{'S',{0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00}},
{'T',{0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00}},
//30
{'U',{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00}},
{'V',{0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00}},
{'W',{0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00}},
{'X',{0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20}},
{'Y',{0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00}},
{'Z',{0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00}},
{'?',{0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00}},
//{' ',{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
{':',{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00}},
{'<',{0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00}},
//40
{'-',{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01}},
{'>',{0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00}},
{'+',{0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20}},
{'_',{0xE2,0x04,0x08,0x10,0x20,0x40,0x00,0x00,0x47,0x20,0x10,0x08,0x04,0x02,0x00,0x00}}
//44
};
/*******************************************
汉字库结构数组、由hanzi类型定义的ChineseCharacter数组库
*******************************************/
hanzi zi=
{
{"有", {0x80,0x40,0x20,0xF8,0x87,0x80,0x84,0x84,
0x84,0xFC,0x84,0x82,0x82,0xC0,0x80,0x00,
0x00,0x00,0x00,0xFF,0x00,0x20,0x20,0x20,
0x20,0x3F,0x20,0x20,0x30,0x20,0x00,0x00,}},
{"计",{ 0x84,0x14,0x24,0x64,0x0F,0x14,0x14,0x94,
0x54,0x34,0x1F,0x14,0x04,0x86,0x04,0x00,
0x08,0x09,0xFC,0x02,0x40,0x21,0x19,0x47,
0x21,0x19,0x47,0x81,0x41,0x3F,0x01,0x00}}
};
uint sz=
{
{0x00,0xF8,0xFC,0x04,0x04,0x04,0xFC,0xF8,0x00,0x1F,0x3F,0x20,0x20,0x20,0x3F,0x1F},
{0x00,0x00,0x30,0x18,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00},
{0x00,0x18,0x1C,0x04,0x84,0x84,0xFC,0x78,0x00,0x3E,0x3F,0x21,0x21,0x20,0x20,0x20},
{0x00,0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,0x10,0x30,0x20,0x20,0x20,0x3F,0x1F},
{0x00,0x80,0xC0,0x60,0x30,0xF8,0xFC,0x00,0x00,0x03,0x03,0x02,0x02,0x3F,0x3F,0x02},
{0x00,0xFC,0xFC,0x44,0x44,0x44,0xC4,0x80,0x00,0x10,0x30,0x20,0x20,0x20,0x3F,0x1F},
{0x00,0xF8,0xFC,0x44,0x44,0x44,0xCC,0x88,0x00,0x1F,0x3F,0x20,0x20,0x20,0x3F,0x1F},
{0x00,0x04,0x04,0x04,0x84,0xE4,0x7C,0x1C,0x00,0x00,0x00,0x3E,0x3F,0x01,0x00,0x00},
{0x00,0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,0x1F,0x3F,0x20,0x20,0x20,0x3F,0x1F},
{0x00,0xF8,0xFC,0x04,0x04,0x04,0xFC,0xF8,0x00,0x10,0x31,0x21,0x21,0x21,0x3F,0x1F},
{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00} //:
};
void Instruction(uchar data) //写指令函数
{
RS=0;
delay_50us(1);
E=1;
LCD_DATAOUT=data; //把数据准备好
delay_50us(8);
E=0;
delay_50us(2);
}
void Data(uchar data) //写数据函数
{
RS=1;
delay_50us(1);
E=1;
LCD_DATAOUT=data;
delay_50us(8);
E=0;
delay_50us(2);
}
void CleanScreen(unsigned char data) //清屏
{
unsigned char i=0,page=0;
for(page=0;page<8;page++)
{
CSA=0;
CSB=0;
Instruction(0xB8|page);//设置DDRAM地址(显示位置)、第一行:80H--87H、第二行:90H--97H
Instruction(0x40); //设置CGRAM地址(自定义字形)
for(i=0;i<64;i++)
{
Data(data);//设一个DDRAM地址送64次数据
}
}
}
void Initialization(void) //液晶初始化 上电等待40MS RST复位由低电平变成高电平,
{
delay_50ms(2);
Instruction(0x30); //功能设置
delay_50ms(4);
Instruction(0x30); //功能设置
delay_50ms(4);
Instruction(0x0f); //显示开关控制,D必须打开,否则屏幕什么都没有
delay_50ms(4);
Instruction(0x01); //清屏,清除显示
delay_50ms(240);
Instruction(0x06); //进入模式设置
delay_50ms(10);
}
void InitClock(void) //初始化系统时钟
{
//#defineSMCLK 0x10 //SMCLK Single output _ZHENG
//#defineMCLK 0x10 //MCLK Single output _ZHENG
//attach HF crystal (1.8432MHz) to XIN/XOUT
//BCSCTL1=DIVA1+DIVA0+XTS+XT2OFF; //ACLK 8分频(460.8KHz),XT2IN关闭,XTIN接外部晶振1.8432MHz
BCSCTL1=XTS+XT2OFF;
do
{
IFG1&=~OFIFG; //清除振荡器失效标志 、wait in loop until crystal is stable
}while(OFIFG&IFG1); //判断XT2是否起振
//P2DIR|=ACLK; //ACLK 四分频(460.8KHz),通过P2.0口输出,作为MODEM的输入时钟
IFG1&=~OFIFG; //Reset osc. fault flag again
BCSCTL2=SELM0+SELM1; //and MCLK = 1.8432MHz)
//USE MCLK AS INPUT CLOCK
//wait in loop until crystal is stable
do
{
IFG1&=~OFIFG;
}while(OFIFG&IFG1); //wait in loop until crystal is stable
}
void Init_LCD(void) //初始化液晶显示器
{
CSA=0;
CSB=0;
Instruction(0x3F);//功能设定、8位数据端口、扩充指令操作
Instruction(0xC0);//设置绘图RAM地址、先设置垂直(列)、再设水平(行)、将16位连续写入即可
CleanScreen(0X00); //清屏
}
/******************************************
显示函数、X为显示的列坐标、Y为显示的行坐标(显示在屏幕的位置)
******************************************/
void Show(unsigned char x,unsigned char y, unsigned char *code)
{
while(*code!='\0') //判断代码指针不为数组代码的结束标语
{
if(*code<0x80)//ascII码,机内码是小于128的
{
Show_Character(x,y,code); //显示字符
x++;
code++;
}
else if(*code>0xB0)// 汉字是GB2312码。大于176的
{
Show_hanzi(x,y,code); //显示汉字
x=x+2;
code=code+2;
}
}
}
/******************************************
显示字符函数、X为显示的列坐标、Y为显示的行坐标(显示在屏幕的位置)
******************************************/
void Show_Character(unsigned char x,unsigned char y, unsigned char *code)
{
unsigned char length=0,j=0;
unsigned char page=0,col=0;
Character * number; //定义字符结构指针number变量
number=shuzi; //将结构字符数组库的地址number指针变量
for(length=0;Character_array;length++)
{
if(*code==number->hanz) //结构体hanz成员与*code指针是否相等
{
for(page=0;page<2;page++)
{
col=x*8;
if(col<64)//左屏
{
CSA=0;
CSB=1;
}
else//右屏
{
CSA=1;
CSB=0;
col=col-64;
}
Instruction(0xB8|page|y); //显示的行,它是16*16的,显示时分二行如果为单数只显示一半
Instruction(0x40|col); //显示的列
for(j=0;j<8;j++)
{
Data(number->code); //将数据(汉字)写入
}
}break;
}
number++;
}
}
/******************************************
显示汉字函数、X为显示的列坐标、Y为显示的行坐标(显示在屏幕的位置)
******************************************/
void Show_hanzi(unsigned char x,unsigned char y, unsigned char *code)
{
unsigned char length=0,j=0,h=0;
unsigned char page=0,col=0;
hanzi * hz;
hz=zi;
for(length=0;length<Chinese_character;length++)
{
if((* code==hz->hanzi)&&(*(code+1)==hz->hanzi))//汉字内码
{
for(page=0;page<2;page++)//上下2页
{
for(h=0;h<2;h++)//左右半汉字
{
col=x*8+h*8;
if(col<64)//左屏
{
CSA=0;
CSB=1;
}
else//右屏
{
CSA=1;
CSB=0;
col=col-64;
}
Instruction(0xB8|page|y);
Instruction(0x40|col);
for(j=0;j<8;j++)
{
Data(hz->code);
}
}
}break;
}
hz++;
}
}
/*******************************************************************************
显示时、分、秒、毫秒
*******************************************************************************/
void Shi_jian(uchar x,uchar y,uchar shi1,uchar shi,uchar fen1,uchar fen,uchar miao1,uchar miao,uchar mmiao)
{
uchar length=0,j=0,h=0;
uchar page=0,col=0,t,d=0,m,n=10;
for(m=0;m<10;m++)
{
if(d==0)
{t=shi1; d++;}
else if(d==1)
{ t=shi;x++;y+2;d++;}
else if(d==2)
{ t=n;x++;y+2;d++;}
else if(d==3)
{ t=fen1;x++;y+2;d++;}
else if(d==4)
{ t=fen;x++;y+2;d++;}
else if(d==5)
{ t=n;x++;y+2;d++;}
else if(d==6)
{ t=miao1;x++;y+2;d++;}
else if(d==7)
{ t=miao;x++;y+2;d++;}
else if(d==8)
{ t=n;x++;y+2;d++;}
// else if(d==9)
// { t=mmiao1;x++;y+2;d++;}
else if(d==9)
{ t=mmiao;x++;y+2;d++;}
for(page=0;page<2;page++)
{
col=x*8;
if(col<64)//左屏
{
CSA=0;
CSB=1;
}
else//右屏
{
CSA=1;
CSB=0;
col=col-64;
}
Instruction(0xB8|page|y); //显示的行,它是16*16的,显示时分二行如果为单数只显示一半
Instruction(0x40|col); //显示的列
for(j=0;j<8;j++)
{
Data(sz); //将数据(汉字)写入
}
}
}
}
延时函数delay.c
#include "io430.h"
#include "lcd.h"
/**************************
延时函数,在12MHZ的晶振频率下
大约50US的延时
**************************/
void delay_50us(uint t)
{
uchar j ;
for(;t>0;t--)
for(j=19;j>0;j--);
}
/**************************
延时函数,在12MHZ的晶振频率下
大约50US的延时
**************************/
void delay_50ms(uint t)
{
uchar j ;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
呵呵、菜鸟献丑了,不足之处还望高手多多指点、
程序打包
MSP430F149驱动不带中文字库12864液晶显示时钟ourdev_678553VUNGNT.rar(文件大小:330K) (原文件名:lcd1.rar) 不错,要做到精准是件难事。 想请教一下,如果你的12864是电源电压为5v的,其引脚可以和430直接相连吗?能把你的电路图发上来看看吗? 回复【楼主位】fanhuamin1988
-----------------------------------------------------------------------
我本想用msp430驱动一块12864液晶,能够使它计时也能显示字幕。谢谢楼主,为我减轻了不少负担!!! 回复【2楼】swordman000
-----------------------------------------------------------------------
430引脚是3.3V的。这个我也没有试过。怕是不行的吧!电路我是参照这个设计的。自己画的找不到了你可以参考一下
http://cache.amobbs.com/bbs_upload782111/files_49/ourdev_704670ZJPRZY.jpg
(原文件名:5552E2}CW7Z(%0FB@J[%VSH.jpg)
其背光可以用三极管控制
页:
[1]