菜鸟做的一个用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 const struct
{
const signed char hanz;
const signed char code[16];
}Character;
//汉字点阵数据结构
typedef const struct
{
const unsigned char hanzi[2]; //汉字
const unsigned char code[32]; //代码
}hanzi;
/*******************************************
结构字符数组库、由hanzi类型定义的ChineseCharacter数组库
*******************************************/
Character shuzi[Character_array]=
{
{'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[Chinese_character]=
{
{"有", {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[11][16]=
{
{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) //初始化系统时钟
{
//#define SMCLK 0x10 //SMCLK Single output _ZHENG
//#define MCLK 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[j+8*page]); //将数据(汉字)写入
}
}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[0])&&(*(code+1)==hz->hanzi[1]))//汉字内码
{
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[j+h*8+page*16]);
}
}
}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[t][j+8*page]); //将数据(汉字)写入
}
}
}
}
延时函数 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) |