⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12232.c

📁 msp430与图形液晶接口(12232),需要自己定义字库
💻 C
字号:

/*************************************************
       TMS430F149 LCD122x32 驱动程序( Ver 1.0 )
        2007/10/15   王昊民
**************************************************/
#pragma language=extended

#include  <msp430x14x.h>
#include  <stdio.h>
// #include <rtc.h>
#include "zk.h"

#define LCD_left_E1()    {P1OUT|=0x20;P1OUT&=~0x10;}		// P1.5=CS1
#define LCD_right_E2()   {P1OUT|=0x10;P1OUT&=~0x20;}		// P1.4=CS2
#define LCD_no_E1E2()      {P1OUT&=~0x30;}
#define LCD_pin_rd()     {P1OUT|=0x80;}		// P1.7=R/W
#define LCD_pin_wt()     {P1OUT&=~0x80;}
#define LCD_pin_dat()    {P1OUT|=0x40;}		// D/I=P1.6
#define LCD_pin_cmd()    {P1OUT&=~0x40;}

#define LCD_LEFT      0
#define LCD_RIGHT     1
#define LCD_CMD       0
#define LCD_DAT       1


INT16U LCD_rd(INT16U left_righr,INT16U data_cmd);
void   LCD_wt_char(INT16U data_cmd,INT16U left_righr,INT16U c);
void   LCD_on();
void   LCD_off();
void   LCD_wt_byte(INT16U x,INT16U y,INT16U c);
void   LCD_clear();
void   LCD_black();
void   Lprint_asc(INT16U x,INT16U y,char c,INT16U md);
void   Lprint_hz(INT16U x,INT16U y,INT16U c,INT16U md);
void   Lprint(INT16U x,INT16U y,char const *str,INT16U md);
INT16U hz_seek(INT16U s);
void   delay(INT16U i);




void   LCD_wt(INT16U data_cmd,INT16U left_righr,INT16U c)
{
/***************************
 i=0x80;
 while((i&0x80)!=0){
    if(left_right==LCD_LEFT)
      i=LCD_rd(LCD_LEFT,LCD_CMD_ADDR);
    else
      i=LCD_rd(LCD_RIGHT,LCD_CMD_ADDR);
 }
 读状态似乎有问题,暂时不管了
 **************************/
 LCD_no_E1E2();

 delay(1);
 LCD_pin_wt();
 if(data_cmd==LCD_CMD)         // D/I
    LCD_pin_cmd()
 else
    LCD_pin_dat();

 delay(3);
 if (left_righr==LCD_LEFT)    // E1/E2
    LCD_left_E1()
 else
    LCD_right_E2();

 delay(1);
 P2DIR = 0xFF;               // P2 to output
 P2OUT = c;
 delay(1);
 LCD_no_E1E2();
 delay(2);
 P2DIR = 0x00;               // P2 to input
}

INT16U LCD_rd(INT16U left_right,INT16U data_cmd)
{INT8U c;

 c=0;
 LCD_no_E1E2();
 P2DIR = 0x00;                // P2 to input
 delay(1);
 LCD_pin_rd();

 delay(3);
 if(data_cmd==LCD_CMD)         // D/I address
    LCD_pin_cmd()
 else
    LCD_pin_dat();
 delay(3);

 if (left_right==LCD_LEFT)    // E1/E2
    LCD_left_E1()
 else
    LCD_right_E2();

 P2OUT=0xFF ;
 delay(2);
 c= P2IN ;                   // read P2
 LCD_no_E1E2();
 delay(2);
 return   c&0xFF;

}

void  LCD_on()
{
 P5OUT|=0x2;    // LCD POWER P5.1
 P4OUT&=~0x2;   // 245 pin P4.1
 delay(5000);
 LCD_wt(LCD_CMD,LCD_LEFT,0xAF);   // LCD on
 LCD_wt(LCD_CMD,LCD_RIGHT,0xAF);
 LCD_wt(LCD_CMD,LCD_LEFT,0xE2);   // LCD reSet
 LCD_wt(LCD_CMD,LCD_RIGHT,0xE2);
 LCD_wt(LCD_CMD,LCD_LEFT,0xA4);   // LCD normal
 LCD_wt(LCD_CMD,LCD_RIGHT,0xA4);
 LCD_wt(LCD_CMD,LCD_LEFT,0xA9);   // LCD 1/32 duty
 LCD_wt(LCD_CMD,LCD_RIGHT,0xA9);
 //LCD_wt(LCD_CMD,LCD_LEFT,0xE0);   // LCD read modify write mode
 //LCD_wt(LCD_CMD,LCD_RIGHT,0xE0);
}

void  LCD_off()
{
  LCD_wt(LCD_CMD,LCD_LEFT,0xAE);
  LCD_wt(LCD_CMD,LCD_RIGHT,0xAE);
  delay(255);
	P5OUT&=~0x2;		// LCD POWER P5.1
	P4OUT|=0x2;	 // 245 pin P4.1

	}

void   LCD_wt_byte(INT16U x,INT16U y,INT16U c)
{
 if(x>121) return;
 if(y>3)   return;


 if(x<=60){
    LCD_wt(LCD_CMD,LCD_LEFT,0xC0);
    LCD_wt(LCD_CMD,LCD_LEFT,0xB8+y);
    LCD_wt(LCD_CMD,LCD_LEFT,0x00+x);
    LCD_wt(LCD_DAT,LCD_LEFT,c);
    }
 else{
    LCD_wt(LCD_CMD,LCD_RIGHT,0xC0);
    LCD_wt(LCD_CMD,LCD_RIGHT,0xB8+y);
    LCD_wt(LCD_CMD,LCD_RIGHT,0x00+x-61);
    LCD_wt(LCD_DAT,LCD_RIGHT,c);
    }
}

void LCD_clear()
{INT16U i,j;
    for(i=0;i<4;i++)
       for(j=0;j<122;j++)
       LCD_wt_byte(j,i,0x00);
}

void LCD_black()
{INT16U i,j;
    for(i=0;i<4;i++)
       for(j=0;j<122;j++)
       LCD_wt_byte(j,i,0xFF);
}

void Lprint_asc(INT16U x,INT16U y,char c,INT16U md)
{INT16U i;
 INT8U const *p;

 if(x>121) return;
 if(y>3)   return;

    p=&zu_asc[c*16];
    for(i=0;i<8;i++){
       c=*p++;
       if(md==1) c=~c;
       LCD_wt_byte(x+i,y,c);
       c=*p++;
       if(md==1) LCD_wt_byte(x+i,y+1,~c);
       else if(md==2) LCD_wt_byte(x+i,y+1,c|0x80);
       else LCD_wt_byte(x+i,y+1,c);
       }
}

void Lprint_hz(INT16U x,INT16U y,INT16U c,INT16U md)
{INT16U i;
 INT8U const *p;

 if(x>121)   return;
 if(y>3)   return;

    p=&zk_hz[c];
    for(i=0;i<16;i++){
       c=*p++;
       if(md==1) c=~c;
       LCD_wt_byte(x+i,y,c);
       c=*p++;
       if(md==1) LCD_wt_byte(x+i,y+1,~c);
       else if(md==2) LCD_wt_byte(x+i,y+1,c|0x80);
       else LCD_wt_byte(x+i,y+1,c);
       }
}

void Lprint(INT16U x,INT16U y,char const *str,INT16U md)
{INT16U n,t;

 y*=2;x*=8;
 if(x>121)   return;
 if(y>3)     return;

 n=0;
 while((*str)!=0){
    if(n++>15) break;
    if(*str<128){      // is ASC
       Lprint_asc(x,y,*str++,md);
       x+=8;
       }
    else{
       t=(str[0]<<8)+str[1];  // 中文内码: 2 bytes
       str+=2;
       t=hz_seek(t);
       Lprint_hz(x,y,t,md);
       x+=16;
       }
    }
}

INT16U hz_seek(INT16U s)
{INT16U i,n,c;
 INT8U const *p;

 c=0;
 p=zk_hz;
 n=sizeof(zk_hz);
 n=n/34;
 for(i=0;i<n;i++){
     if(s==((p[0]<<8)+p[1])){
        c=i*34+2;
        break;
       }
     p+=34;
    }
 return c;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -