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

📄 main.c

📁 FYD12864-0402B液晶驱动程序
💻 C
字号:

#include <msp430x16x.h>

typedef unsigned char uchar;
typedef unsigned int uint ;
typedef unsigned long ulong;

#define LCD_CS_SEL P3OUT
#define LCD_CS_DIR P3DIR
#define LCD_CS_OUT P3OUT
#define LCD_CS_PIN 0x20 //00100000 p3.5

#define LCD_CLK_SEL P3OUT
#define LCD_CLK_DIR P3DIR
#define LCD_CLK_OUT P3OUT
#define LCD_CLK_PIN 0x80   //p3.7

#define LCD_SID_SEL P3OUT
#define LCD_SID_DIR P3DIR
#define LCD_SID_OUT P3OUT
#define LCD_SID_IN  P3IN
#define LCD_SID_PIN 0x40  //p3.6

#define LCD_RESET_SEL P4OUT
#define LCD_RESET_DIR P4DIR
#define LCD_RESET_OUT P4OUT
#define LCD_RESET_PIN 0x00  //p4.0

void delay_us(ulong n);
void busy_delay();
void io_initial();
void lcd_initial();
void lcd_clear();
void lcd_gra_clear();
void lcd_locat(uchar x,uchar y);
void write_command(uchar command);
void write_data(uchar data);




void delay_us(ulong n)
{
  ulong i;
  for(i=0;i<n;i++);
}

void busy_delay()
{
  delay_us(1000);
}


void io_initial()         //初始化端口
{
  LCD_CS_SEL &= ~LCD_CS_PIN;            //CS
  LCD_CS_OUT |= LCD_CS_PIN;
  LCD_CS_DIR |= LCD_CS_PIN;
  
  LCD_CLK_SEL &= ~LCD_CLK_PIN;         //CLK
  LCD_CLK_OUT &= ~LCD_CLK_PIN;
  LCD_CLK_DIR |= LCD_CLK_PIN;
  
  LCD_SID_SEL &= ~LCD_SID_PIN;         //SID
  LCD_SID_OUT |= LCD_SID_PIN;
  LCD_SID_DIR |= LCD_SID_PIN;

  
  LCD_RESET_SEL &= ~LCD_RESET_PIN;     //RESET
  LCD_RESET_OUT |= LCD_RESET_PIN;
  LCD_RESET_DIR |= LCD_RESET_PIN;
}


void write_command(uchar command)
{
    uchar command_tem,i;
    busy_delay();                    //延时,等忙
    command_tem=command;

    LCD_CS_OUT |= LCD_CS_PIN;        //cs=1
    LCD_SID_OUT |= LCD_SID_PIN;      //data=1;

    for(i=0;i<5;i++)                //发5个连续1 '11111'
    {
        LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
        LCD_CLK_OUT |= LCD_CLK_PIN;         //clk=1,上升沿写入
    }        
     
    LCD_CLK_OUT &= ~LCD_CLK_PIN;           //clk=0  
  
    LCD_SID_OUT &= ~LCD_SID_PIN;           //data=0;
    for(i=0;i<3;i++)                  //再发RW,RS,0,  RS=RW=0   即000 write command
    {
        LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
        LCD_CLK_OUT |= LCD_CLK_PIN;          //clk=1,上升沿写入
    }        
    /*上面是发送一个完整的启动数据'11111000'*/

    for(i=0;i<4;i++)      //发送高4位,用的command
    {
       if(command&0x80)   //如果x的msb是1
         LCD_SID_OUT |= LCD_SID_PIN;    //则data=1;
       else
         LCD_SID_OUT &= ~LCD_SID_PIN;    //否则data=0;
       
       LCD_CLK_OUT &= ~LCD_CLK_PIN;         //clk=0 
       LCD_CLK_OUT |= LCD_CLK_PIN;          //clk=1,上升沿写入
       command=command << 1;          //左移一位
     }

    LCD_SID_OUT &= ~LCD_SID_PIN;         //data=0;
    for(i=0;i<4;i++)      //发送4个0;
    {
       LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
       LCD_CLK_OUT |= LCD_CLK_PIN;          //clk=1,上升沿写入
    }         
   
    for(i=0;i<4;i++)      //发送低4位,用的command_tem
    {
       if(command_tem&0x08)   //msb=1?
         LCD_SID_OUT |= LCD_SID_PIN;    //data=1;
       else
         LCD_SID_OUT &= ~LCD_SID_PIN;    //data=0;
       
       LCD_CLK_OUT &= ~LCD_CLK_PIN;         //clk=0 
       LCD_CLK_OUT |= LCD_CLK_PIN;          //clk=1,上升沿写入
       command_tem = command_tem << 1;         //左移
     }
    
    LCD_SID_OUT &= ~LCD_SID_PIN;    //data=0;
    for(i=0;i<4;i++)     //发送4个0;
    {
       LCD_CLK_OUT &= ~LCD_CLK_PIN;         //clk=0 
       LCD_CLK_OUT |= LCD_CLK_PIN;          //clk=1,上升沿写入
    }        
    
    LCD_CS_OUT |= LCD_CS_PIN;  //i think it should be cs=0 ???
    delay_us(100);
}

void write_data(uchar data)
{
    uchar data_tem,i;
    busy_delay();
    data_tem = data;
    LCD_CS_OUT |= LCD_CS_PIN;        //cs=1
    LCD_SID_OUT |= LCD_SID_PIN;      //data=1;
    for(i=0;i<5;i++)                //发5个连续1 '11111'
    {
        LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
        LCD_CLK_OUT |= LCD_CLK_PIN;         //clk=1,上升沿写入
    }        
    
    LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
    LCD_SID_OUT &= ~LCD_SID_PIN;           //RW=0,write
    LCD_CLK_OUT |= LCD_CLK_PIN;         //clk=1,上升沿写入
    
    LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
    LCD_SID_OUT |= LCD_SID_PIN;           //RS=1, select data mode
    LCD_CLK_OUT |= LCD_CLK_PIN;         //clk=1,上升沿写入
    
    LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
    LCD_SID_OUT &= ~LCD_SID_PIN;           //deat=0
    LCD_CLK_OUT |= LCD_CLK_PIN;         //clk=1,上升沿写入
   /*上面是发送一个完整的启动数据'11111010'*/

    for(i=0;i<4;i++)        //发送高4位
    {
       if(data&0x80)   	     //1
         LCD_SID_OUT |= LCD_SID_PIN;     	 //data=1;
       else
         LCD_SID_OUT &= ~LCD_SID_PIN;   	 //data=0;
       LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
       LCD_CLK_OUT |= LCD_CLK_PIN;         //clk=1,上升沿写入
       data = data << 1;
     }
    LCD_SID_OUT &= ~LCD_SID_PIN;   	 //data=0;
    for(i=0;i<4;i++)  //发送4个0;
    {
      LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
      LCD_CLK_OUT |= LCD_CLK_PIN;         //clk=1,上升沿写入
    }        
  
    for(i=0;i<4;i++)     	 //发送低4位
    {
       if(data_tem&0x08) 	//1
         LCD_SID_OUT |= LCD_SID_PIN;     	 //data=1;
       else
         LCD_SID_OUT &= ~LCD_SID_PIN;   	 //data=0;
       LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
       LCD_CLK_OUT |= LCD_CLK_PIN;         //clk=1,上升沿写入
       data_tem = data_tem << 1;
     }
    
    LCD_SID_OUT &= ~LCD_SID_PIN;   	 //data=0;
    for(i=0;i<4;i++)               //发送4个0;
    {
      LCD_CLK_OUT &= ~LCD_CLK_PIN;        //clk=0 
      LCD_CLK_OUT |= LCD_CLK_PIN;         //clk=1,上升沿写入
    }        
    
    LCD_CS_OUT |= LCD_CS_PIN;  //i think it should be cs=0 ???
    delay_us(100);  
}

void lcd_initial() //lcd initial
{
  LCD_RESET_OUT &= ~LCD_RESET_PIN;          //复位
  delay_us(40000);	                   //复位延时
  LCD_RESET_OUT |= LCD_RESET_PIN;           //rst=1
  delay_us(40000);     
  write_command(0x30);                //30:设定8位数据基本功能  
  delay_us(6000);
  //write_command(0x30); 
  //delay_us(200);
  //write_command(0x30);
  //write_command(0x30);                    //写这么多次啊?

  write_command(0x0c);          //设显示状态,开显示,无游标
  
  delay_us(100);
  write_command(0x01);          //清显示
  delay_us(2000);
  write_command(0x06);         //设定进入点//??????
}

void lcd_clear()
{
  write_command(0x01);  // 01:清除显示
  //write_command(0x34);  // 34:设定8位数据扩展功能  ???
  //write_command(0x30);  // 30:设定8位数据基本功能
}

/*void lcd_gra_clear()
{
  uchar hang,lie;
  write_command(0x34); 
  write_command(0x36);
  
  write_command(0x80);
  for(lie=0;lie<32;lie++)
  {
    write_command(0x80+lie);
    for(hang=0;hang<16;hang++)
    {
      
      //write_command(0x80+hang);
      write_data(0x00);
      write_data(0x00);
    }
  }
      write_command(0x32);// 保持开图
}*/

void lcd_locat(uchar x,uchar y)
{
  switch(x)
  {
  case 1: write_command(0x7f + y);break;
  case 2: write_command(0x8f + y);break;
  case 3: write_command(0x87 + y);break;
  case 4: write_command(0x97 + y);break;
  default:break;
  }
}

void mo_shi(void)
{
  lcd_locat(1,1);
  write_data(0xC4);
  write_data(0xA3);
  write_data(0xCA);
  write_data(0xBD);
  write_data(0xA1);
  write_data(0xC3);
}

void zi_dong(void)
{
  write_data(0xD7);
  write_data(0xD4);
  write_data(0xB6);
  write_data(0xAF);
}

void yao_kong(void)
{
  write_data(0xD2);
  write_data(0xA3);
  write_data(0xBF);
  write_data(0xD8);
}
 
void direc(void)
{
  lcd_locat(2,1);
  write_data(0xB7);
  write_data(0xBD);
  write_data(0xCF);
  write_data(0xF2);
  write_data(0xA1);
  write_data(0xC3);
}

void zuo_you(void)
{
  write_data(0xD7);
  write_data(0xF3);
  write_data(0xD3);
  write_data(0xD2);
  write_data(0xA1);
  write_data(0xFB);
  write_data(0xA1);
  write_data(0xFA);
}

void zuo(void)
{
  write_data(0xD7);
  write_data(0xF3);
  write_data(0xA1);
  write_data(0xFB);
}

void you(void)
{
  write_data(0xD3);
  write_data(0xD2);
  write_data(0xA1);
  write_data(0xFA);
}

void up_down(void)
{
  write_data(0xC9);
  write_data(0xCF);
  write_data(0xCF);
  write_data(0xC2);
  write_data(0xA1);
  write_data(0xFC);
  write_data(0xA1);
  write_data(0xFD);
}

void up(void)
{
  write_data(0xC9);
  write_data(0xCF); 
  write_data(0xA1);
  write_data(0xFC);
}

void down(void)
{
  write_data(0xCF);
  write_data(0xC2);
  write_data(0xA1);
  write_data(0xFD);
}

void xie_shang(void)
{
  write_data(0xD0);
  write_data(0xB1);
  write_data(0xC9);
  write_data(0xCF); 
  write_data(0x2F);
  write_data(' ');
  write_data(0x18);
}

void xie_xia(void)
{
  write_data(0xD0);
  write_data(0xB1);
  write_data(0xCF);
  write_data(0xC2); 
  write_data(0x2F);
  write_data(' ');
  write_data(0x19);
}

void designer(void)
{
  //Designer:
  lcd_locat(3,1);
  write_data('D');  
  write_data('e'); 
  write_data('s'); 
  write_data('i'); 
  write_data('g');  
  write_data('n'); 
  write_data('e'); 
  write_data('r'); 
  write_data(0xA1);
  write_data(0xC3);
  write_data(0xCB);
  write_data(0xD5);
  write_data(0xD6);
  write_data(0xDE);
  //苏洲费文超孙日明
  lcd_locat(4,1);
  write_data(0xB7);
  write_data(0xD1);
  write_data(0xCE);
  write_data(0xC4);
  write_data(0xB3);
  write_data(0xAC);
  write_data(0xA1);
  write_data(0xA2);
  write_data(0xCB);
  write_data(0xEF);
  write_data(0xC8);
  write_data(0xD5);
  write_data(0xC3);
  write_data(0xF7);
}

void moshi_11(void)
{
  //模式:自动
  mo_shi();
  zi_dong();
  //方向:左右
  direc();
  zuo_you();
  //Designer:
  designer();
}

void moshi_12(void)
{
  //模式:自动
  mo_shi();
  zi_dong();
  //方向:上下
  direc();
  up_down();
  //Designer:
  designer();
}

void moshi_13(void)
{
  //模式:自动
  mo_shi();
  zi_dong();
  //方向:左上
  direc();
  xie_shang();
  //Designer:
  designer();
}

void moshi_14(void)
{
  //模式:自动
  mo_shi();
  zi_dong();
  //方向:斜下
  direc();
  xie_xia();
  //Designer:
  designer();
}

void moshi_21(void)
{
  //模式:遥控
  mo_shi();
  yao_kong();
  //方向:左
  direc();
  zuo();
  //Designer:
  designer();
}

void moshi_22(void)
{
  //模式:遥控
  mo_shi();
  yao_kong();
  //方向:右
  direc();
  you();
  //Designer:
  designer();
}

void moshi_23(void)
{
  //模式:遥控
  mo_shi();
  yao_kong();
  //方向:上
  direc();
  up();
  //Designer:
 designer();
}

void moshi_24(void)
{
  //模式:遥控
  mo_shi();
  yao_kong();
  //方向:下
  direc();
  down();
  //Designer:
  designer();
}

void moshi_25(void)
{
  //模式:遥控
  mo_shi();
  yao_kong();
  //方向:斜上
  direc();
  xie_shang();
  //Designer:
  designer();
}

void moshi_26(void)
{
  //模式:遥控
  mo_shi();
  yao_kong();
  //方向:斜下
  direc();
  xie_xia();
  //Designer:
  designer();
}

void main()
{
  
  do
  {
    IFG1 &= ~OFIFG;
    delay_us(333);
  }while(IFG1&OFIFG);
  
  WDTCTL = WDTPW+WDTHOLD;
  
  io_initial();
  lcd_initial();                
  lcd_clear();    
  
  moshi_11();
  
   _BIS_SR(LPM3_bits + GIE);
}
  
  



⌨️ 快捷键说明

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