fanhuamin1988 发表于 2011-9-22 11:56:32

用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)

w_wei0817 发表于 2011-9-28 10:50:50

不错,要做到精准是件难事。

swordman000 发表于 2011-10-13 17:34:17

想请教一下,如果你的12864是电源电压为5v的,其引脚可以和430直接相连吗?能把你的电路图发上来看看吗?

dongweitai 发表于 2011-12-8 09:18:57

回复【楼主位】fanhuamin1988
-----------------------------------------------------------------------

我本想用msp430驱动一块12864液晶,能够使它计时也能显示字幕。谢谢楼主,为我减轻了不少负担!!!

fanhuamin1988 发表于 2011-12-14 16:14:23

回复【2楼】swordman000
-----------------------------------------------------------------------

430引脚是3.3V的。这个我也没有试过。怕是不行的吧!电路我是参照这个设计的。自己画的找不到了你可以参考一下
http://cache.amobbs.com/bbs_upload782111/files_49/ourdev_704670ZJPRZY.jpg
(原文件名:5552E2}CW7Z(%0FB@J[%VSH.jpg)
其背光可以用三极管控制
页: [1]
查看完整版本: 用MSP430F149驱动不带中文字库12864液晶显示时钟