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

📄 新建 文本文档 (3).txt

📁 用msp430控制12864点阵液晶---------的原程序哦!
💻 TXT
字号:
MSP430F449驱动128*64液晶调试成功 C语言   作者:wjguo888 


#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标识
      }

}

⌨️ 快捷键说明

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