繁体中文
设为首页
加入收藏
当前位置:技术文章首页 >> 接口技术 >> MSP430F449单片机与128*64液晶的接口驱动 C函数

MSP430F449单片机与128*64液晶的接口驱动 C函数

2007-02-17 10:49:18  作者:  来源:[网络]  浏览次数:201  文字大小:【】【】【

MSP430F449单片机与128*64液晶的接口驱动 C函数:

#i nclude "msp430x44x.h"
// RS__P2.0; R/W_P2.1; EN_P2.2; CS1_P2.3; CS2_P2.6; RST_P2.7;DB0~7_P3.0~7;  
#define DI   BIT0
#define RW   BIT1
#define EN   BIT2
#define CS1  BIT3
#define CS2  BIT6
#define NORST  BIT7
unsigned char TOP=0,BOTTOM=64,LEFT=0,RIGHT=128,CHN_num=7,ENG_num=5,CHN_num1=3;
unsigned char width,PX,PY,*data_buf,word_num;
unsigned char key_Pressed,      // 是否有键值按下
              key_val,          // 存放键值
              key_Flag;         // 是否一个按下的按键已经松开,
                                // 即是按键的键值可以读取
                                 
unsigned char key_Map[12] ={    //设置键盘逻辑键值与程序计算键值的映射
                           1,2,3,10,4,5,
                           6,0,7,8,9,11
                           };
/***********************16*8点阵的"hello"****************************/
unsigned char ENG_data[]={
         
          0x08,0x20,0xF8,0x3F,0x08,0x21,0x00,0x01,
          0x00,0x01,0x08,0x21,0xF8,0x3F,0x08,0x20,//H (0)
          
          0x00,0x00,0x00,0x1F,0x80,0x22,0x80,0x22,
          0x80,0x22,0x80,0x22,0x00,0x13,0x00,0x00,//e (1)
          
          0x00,0x00,0x08,0x20,0x08,0x20,0xF8,0x3F,
          0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,//l (2)
          
          0x00,0x00,0x08,0x20,0x08,0x20,0xF8,0x3F,
          0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,//l (3)
          
          0x00,0x00,0x00,0x1F,0x80,0x20,0x80,0x20,
          0x80,0x20,0x80,0x20,0x00,0x1F,0x00,0x00,//o (4)
        
};

unsigned char CHN_data1[]={
//王[16*16]下半列排
   0x00,0x02,0x82,0x82,0x82,0x82,0x82,0xFE,
0x82,0x82,0x82,0x82,0xC3,0x82,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,
0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,


//建[16*16]下半列排
   0x04,  0x04,  0x44,  0x74, 0xCC,  0x10,  0x54,  0x54,
   0x54, 0xFF,  0x54,  0x54,  0x7E,  0x14,  0x10,  0x00,
   0x41,  0x26,  0x18,  0x2E,  0x41,  0x88,  0x89,  0x89,
   0x89, 0xFF,  0x89,  0x89,  0x8D, 0xC8,  0x40,  0x00,

//国[16*16]下半列排
   0x00, 0xFE,  0x02,  0x0A,  0x8A,  0x8A,  0x8A, 0xFA,
   0x8A, 0xCA,  0x8E,  0x0A,  0x02, 0xFF,  0x02,  0x00,
   00, 0xFF,  0x40,  0x50,  0x50,  0x50,  0x50,  0x5F,
   0x50,  0x52,  0x54,  0x50,  0x40, 0xFF,  0x00,  0x00,
};
unsigned char CHN_data[]={
//江[16*16]下半列排
   0x10,  0x21,  0x62,  0x06,  0x80,  0x04,  0x04,  0x04,
   0x04, 0xFC,  0x04,  0x04,  0x06,  0x04,  0x00,  0x00,
   0x04,  0x04, 0xFE,  0x01,  0x20,  0x20,  0x20,  0x20,
   0x20,  0x3F,  0x20,  0x20,  0x20,  0x30,  0x20,  0x00,

//苏[16*16]下半列排
   0x04,  0x04,  0x44,  0x44,  0x5F,  0x44, 0xF4,  0x44,
   0x44,  0x44,  0x5F,  0xE4,  0x44,  0x06, 0x04,  0x00,
   0x00,  0x88,  0x46,  0x20,  0x10,  0x0C,  0x03,  0x00,
   0x00,  0x40,  0x80,  0x7F,  0x02,  0x04,  0x0C,  0x00,

//环[16*16]下半列排
   0x42,  0x42, 0xFE,  0x43,  0x42,  0x04,  0x04,  0x04,
   0x84, 0xE4,  0x1C,  0x84,  0x04,  0x06,  0x04,  0x00,
   0x20,  0x60,  0x3F,  0x10,  0x10,  0x04,  0x02,  0x01,
   0x00, 0xFF,  0x00,  0x00,  0x01,  0x03,  0x06,  0x00,

//能[16*16]下半列排
   0x10, 0xD8,  0x54, 0x53,  0x50, 0xDC,  0x30,  0x00,
   0x7F, 0x90,  0x88,  0x84,  0x86, 0xE0,  0x00,  0x00,
   0x00, 0xFF,  0x09,  0x49,  0x89, 0x7F, 0x00,  0x00,
   0x7E, 0x90,  0x88,  0x84,  0x86,  0x80, 0xE0,  0x00,

//欢[16*16]下半列排
   0x04,  0x34, 0xC4,  0x04, 0xC4,  0x3C,  0x20,  0x10,
   0x0F, 0xE8,  0x08,  0x08,  0x28,  0x18,  0x00,  0x00,
   0x10,  0x08,  0x06,  0x01,  0x82,  0x8C,  0x40,  0x30,
   0x0C,  0x03,  0x0C,  0x10,  0x60, 0xC0,  0x40,  0x00,

//迎[16*16]下半列排
   0x40,  0x42,  0x44, 0xC8,  0x00, 0xFC,  0x04,  0x02,
   0x82, 0xFC,  0x04,  0x04,  0x04, 0xFE,  0x04,  0x00,
   0x00,  0x40,  0x20,  0x1F,  0x20,  0x47,  0x42,  0x41,
   0x40,  0x7F,  0x40,  0x42,  0x44,  0x63,  0x20,  0x00,

//你[16*16]下半列排
   0x40,  0x20, 0xF8,  0x07,  0x40,  0x20,  0x18,  0x0F,
   0x08, 0xC8,  0x08,  0x08,  0x28,  0x18,  0x00,  0x00,
   0x00,  0x00, 0xFF,  0x00,  0x00,  0x08,  0x04,  0x43,
   0x80,  0x7F,  0x00,  0x01,  0x06,  0x0C,  0x00,  0x00,

};

//******************************************************************//
//  用于取得一个字节的低N位的数组
//*****************************************************************//
const unsigned char maptbl[]=
{
          0x01,0x03,0x07,0x0f,
          0x1f,0x3f,0x7f,0xff
}; 
void init_sys(void);
void init_lcd(void);
void write_command(unsigned int CMD);
void write_data(unsigned int DATA);
void move_to(char page,char lie);
void view_start(char hang,char lie);
void clear_lcd(char page,char lie,char page_num,char lie_num);
void view_chinese(void);
void view_english(void);
void move_up(void);
void move_down(void);
void move_left(void);
void move_right(void);
void ddelay(void);
void init_Keyboard(void);
void check_Key(void);
void delay(void);
void key_Event(void);
void view_chinese1(void);
//******************************************************************//
void main(void)
{   init_sys();
    init_lcd();
    init_Keyboard();
    view_chinese();
    view_start(PX,PY);
    view_chinese1();
    view_start(PX,PY);
    while(1)
    { key_Event();                         
             if(key_Flag== 0x01) 
             {                
                key_Flag=0x00;                    
                if(key_val==5)                 
                { 
                    move_up(); 
                                
                }else if (key_val==7)          
                    {         
                        move_left();
                        
                    }else if (key_val==8)          
                        {   
                            move_down();
                                  
                         }else if (key_val==9)          
                            {  
                                move_right();
                                
                            }
               }
     }
         
       
}

//******************************************************************//
void init_sys(void)
{   WDTCTL=WDTPW+WDTHOLD;
    FLL_CTL0 |= XCAP14PF;
  
}
//******************************************************************//
void init_lcd(void)
{   WDTCTL=WDTPW+WDTHOLD;
    P3DIR|=0XFF;
    P3OUT=0X00;
    P2DIR|=0XCF;
    P2OUT|=CS1+CS2;     
    P2OUT&=~NORST;
    delay();
    P2OUT|=EN;
    P2OUT|=NORST;
    write_command(0xc0);        //显示起始行
    write_command(0x3f);        //显示器开
    clear_lcd(0,0,8,64);
    clear_lcd(0,64,8,64);
}
//*******************************************************************//
void write_command(unsigned int CMD)
{   P2OUT&=~EN;
    P3DIR =  0xff;
    P2OUT&=~DI;
    P2OUT&=~RW;
    P3OUT=CMD;
    P2OUT|=EN;
    P2OUT&=~EN;   
}
//*******************************************************************//
void write_data(unsigned int DATA)
{   P3DIR=0X00;                     //判断LCD_MCU是否忙?
    P2OUT|=RW;
    P2OUT|=EN;
    while((P3IN&BIT7)==BIT7);
    P2OUT&=~EN;                     //开始写数据
    P3DIR=0XFF;
    P2OUT|=DI;
    P2OUT&=~RW;
    P3OUT=DATA;
    P2OUT|=EN;
    P2OUT&=~EN;   
}
//******************************************************************//
void move_to(char page,char lie)
{   unsigned char temp;
    temp=(lie&0x7f);
    if(temp<64)
        {   P2OUT|=CS1;
            P2OUT&=~CS2;
            write_command(0xb8+page);
            write_command(0x40+temp);
        }
    else if(temp>63)
        {   P2OUT|=CS2;
            P2OUT&=~CS1;
            write_command(0xb8+page);
            write_command(0x40+temp-64);
        }
}
//*******************************************************************//
void view_start(char hang,char lie)
{   unsigned char temp,temp1,t1,t2,t3;
    if((hang&0x07)==0x00)
        {   for(temp=0;temp<word_num;temp++)
               {  for(temp1=lie;temp1<lie+width;temp1++)
                 {  move_to(hang/8,temp1);               //移到指定页
                    write_data(data_buf[temp1-lie+32*temp]);
                    move_to(hang/8+1,temp1);                 //移到下一页
                    write_data(data_buf[temp1-lie+width+32*temp]);
                 }
                 lie+=width;
                 
               }
        }
    else{   t1=(hang&0x07);
            for(temp=0;temp<word_num;temp++)
               {    for(temp1=lie;temp1<lie+width;temp1++)
                {   move_to(hang/8,temp1);
                    t2=data_buf[temp1-lie+32*temp];          //低位显示在上面
                    t2=t2 & maptbl[8-t1];
                    t2<<=t1;                            //移到高位去显示
                    write_data(t2);
                    move_to(hang/8+1,temp1);             //移到下一页
                    t2=data_buf[temp1-lie+32*temp];
                    t2>>=(8-t1);
                    t3=data_buf[temp1-lie+width+32*temp];
                    t3=t3 & maptbl[8-t1];
                    t3<<=t1;
                    t2=(t2+t3);
                    write_data(t2);
                    move_to(hang/8+2,temp1);
                    t2=data_buf[temp1-lie+width+32*temp];          
                    t2>>=(8-t1);                            
                    write_data(t2);
                 }
                 lie+=width;
                }
        }
}
//*******************************************************************//
//page=开始页,lie=开始列,page_num=页数,lie_num=列数//(要擦除的)****//
//**************选择的区域在同一片上CHIP1或NHIP2*********************//
//*******************************************************************//
void clear_lcd(char page,char lie,char page_num,char lie_num)
{   unsigned char tempage,temlie;
    for(tempage=page;tempage<(page_num+page);tempage++)
        {   for(temlie=lie;temlie<(lie+lie_num);temlie++)
                {   move_to(tempage,temlie);
                    write_data(0x00);               
                }   
        }
}
//********************************************************************//
void view_chinese(void)
{   word_num=CHN_num;
    PX=10;
    PY=8;
    width=16;
    data_buf=CHN_data;
}
void view_chinese1(void)
{   word_num=CHN_num1;
    PX=46;
    PY=70;
    width=16;
    data_buf=CHN_data1;
}
void view_english(void)
{   word_num=ENG_num;
    PX=46;
    PY=70;
    width=8;
    data_buf=ENG_data;
}
//********************************************************************//
void move_up(void)
{   if(PX>TOP)
        {   clear_lcd(PX/8,0,3,64);
            clear_lcd(PX/8,64,3,64);
            view_start(PX-1,PY);ddelay();
            PX--;
        }
}
void move_down(void)
{   if(PX<BOTTOM-16)
        {   clear_lcd(PX/8,0,3,64);
            clear_lcd(PX/8,64,3,64);
            view_start(PX+1,PY);ddelay();
            PX++;
        }
}
void move_left(void)
{   if(PY>LEFT)
        {   clear_lcd(PX/8,0,3,64);
            clear_lcd(PX/8,64,3,64);
            view_start(PX,PY-1);ddelay();
            PY--;
        }
}
void move_right(void)
{   if(PY<RIGHT-width)
        {   clear_lcd(PX/8,0,3,64);
            clear_lcd(PX/8,64,3,64);
            view_start(PX,PY+1);ddelay();
            PY++;
        }
}
//*********************************************************************//
void ddelay(void)
{   _NOP();
    _NOP();
    _NOP();
}
/********************************************************
*  初始化键盘设备
********************************************************/
void init_Keyboard(void)
{
      P1DIR &= 0x01;  // P1.4~P1.8 设置为输入模式
      P1DIR |= 0x0E;  // set p1.1~p1.3 设置为输出模式
      P1OUT |= 0x0E;  // p1.1~p1.3 输出值清零
      key_Flag    = 0;// 初始化key_Flag 
      key_Pressed = 0;// 初始化key_Pressed 
      
}
/*********************************************
* Check_Key(),检查按键,确认键值
*********************************************/
void check_Key(void)
{
    unsigned char row ,col,tmp1,tmp2;
    // tmp1用来设置P1OUT的值,使P1.1~P1.3中有一个为0
    tmp1 = 0x08;
    for(row=0;row<3;row++){
        P1OUT |= 0x0E;                          // p1.1~P1.3=1
        P1OUT -= tmp1;                          // P1.1~p1.3中有一个为0
        tmp1 = tmp1/2;                          // tmp1 右移一位      
        if ((P1IN & 0xf0) < 0xf0){              // 是否P1IN的P1.4~P1.7中有一位为0         
           tmp2 = 0x80;                         // tmp2用于检测出那一位为0  
           for(col =0;col<4;col++){          // 列检测 
              if((P1IN & tmp2)==0x00){          // 是否是该列
                key_val =key_Map[ row*4 +col] ; // 获取键值
                return;                         // 退出循环
              }
              tmp2 /= 2;                        // tmp2右移 
           }
        }
    }
         
}
/***********************************************************
* 延迟,用于消除抖动
************************************************************/
void delay(void)
{
      unsigned char tmp;
      for(tmp=0xff;tmp>0;tmp--);
}
/************************************************************
*  key_Event(),检测键盘是否有键按下,如果有获取键值
*************************************************************/
void key_Event(void)
{
     unsigned char tmp;
     P1OUT &= 0x01;         // 设置P1OUT输出值
     tmp = P1IN;            // 获取 p1IN
     if ((key_Pressed ==0x00)&&((tmp & 0xf0) < 0xf0)) 
     {                      //是否有键按下
         key_Pressed = 1;   // 如果有按键按下,设置key_Pressed标识
         delay();           //消除抖动
         check_Key();       // 调用check_Key(),获取键值
     }else if ((key_Pressed ==1)&&((tmp & 0xf0) == 0xf0))
     {                      //是否按键已经释放
         key_Pressed = 0;   // 清除key_Pressed标识
         key_Flag    = 1;   // 设置key_Flag标识
      }

}

责任编辑:


相关文章
 

最新文章

更多

· 基于MC13213设计短距离无...
· uln2003应用电路
· cd4069应用电路(由CD40...
· 基于现场总线的埋弧焊接...
· 基于小波包和分形相结合...
· 基于小波包和分形相结合...
· 基于无线局域网的城市视...
· 基于51单片机和SJA1000设...
· PC机与嵌入式系统的多线...
· Linux下PCI设备驱动程序开发

推荐文章

更多

· 基于MC13213设计短距离无...
· uln2003应用电路
· cd4069应用电路(由CD40...
· 基于现场总线的埋弧焊接...
· 基于小波包和分形相结合...
· 基于小波包和分形相结合...
· 基于无线局域网的城市视...
· 基于51单片机和SJA1000设...
· PC机与嵌入式系统的多线...
· Linux下PCI设备驱动程序开发
. MSP430F449单片机与128*64液晶的接口驱动 C函数

热点文章

更多

· uln2003应用电路
· cd4069应用电路(由CD40...
· 基于51单片机和SJA1000设...
· 基于MC13213设计短距离无...
· 基于无线局域网的城市视...
· 基于小波包和分形相结合...
· 基于现场总线的埋弧焊接...
· 基于小波包和分形相结合...
. MSP430F449单片机与128*64液晶的接口驱动 C函数