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

📄 lcddriver.c

📁 MSP430单片机的液晶驱动程序
💻 C
字号:
#include  "msp430x12x2.h"

#define uint unsigned int
#define uchar unsigned char

#define send_0 P2OUT&=~BIT1;
#define send_1 P2OUT|=BIT1;
#define clk_0 P2OUT&=~BIT2;
#define clk_1 P2OUT|=BIT2;

#define SysPoweron P2OUT|=BIT5;
#define SysPoweroff P2OUT&=~BIT5;

#define data_in P2DIR&=~BIT1;
#define data_out P2DIR|=BIT1;

//P2.2——SCLK——时钟脉冲
//P2.1——SID——串口数据

/*漫天纷飞的花语
  落在春的泥土里*/
const uchar chunni[]={0xc2,0xfe,0xcc,0xec,0xb7,0xd7,0xb7,0xc9,0xb5,0xc4,0xbb,0xa8,0xd3,0xef,
                0xc2,0xe4,0xd4,0xda,0xb4,0xba,0xb5,0xc4,0xc4,0xe0,0xcd,0xc1,0xc0,0xef};

const uchar rectangle[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0};

void delay(uint v);
void write_data(uchar lcdata);
void write_command(uchar command);
void cgram_make_word(void);
void fill_with_cgram(void);
void ddram_clear(void);
void init_lcm(void);
void gdram_clear(void);
void gdram_test(void);

void main(void)
{
	uchar i;
	WDTCTL=WDTPW+WDTHOLD;
	BCSCTL1=0x80;
    P2DIR|=BIT5;
	P2DIR|=BIT2;
    P2DIR|=BIT1;
    SysPoweron;
	init_lcm();
	//ddram_clear();
	_NOP(); 
	write_command(0x80);
	i=0;
	write_data(0xA1);
	write_data(0xF1);	
    do
    {
        write_data(chunni[i]);
    }while(++i<14);
    write_command(0x90);
	i=0;
	write_data(0xA1);
	write_data(0xF1);	    
    do
    {
        write_data(chunni[i+14]);
    }while(++i<14);
    _NOP();
    delay(65534);
	
    /*画矩形*/
    ddram_clear();
    gdram_clear();
    gdram_test();
}

//初始化lcd
void init_lcm(void)
{
    delay(1000);                 //延时超过40ms
    write_command(0x30);        //功能设定
    delay(3);                  //延时超过100us
    write_command(0x30);        //功能设定
    delay(3);
    write_command(0x08);        //关显示
    delay(3);
    write_command(0x02);        //位址归位
    delay(3);
    write_command(0x0c);        //开显示
    delay(3);
    write_command(0x01);        //清显示
    delay(300);                 //延时超过10ms
    write_command(0x06);
}

void gdram_clear(void)
{
    uchar cur_x,cur_y;
    cur_x=0;
    cur_y=0;
    write_command(0x34);        //扩展功能设置
    do{
        do
        {
            write_command(0x80+cur_y);  //y坐标
            write_command(0x80+cur_x);  //x坐标
            write_data(0);
            write_data(0);
        }while(++cur_x<16);
        cur_x=0;
    }while(++cur_y<64);
}

void gdram_test(void)
{
    uchar cur_x,cur_y;
    uchar bm_width,bm_height;
    uchar temp1,i,temp2;
    bm_width=16;
    bm_height=16;
    cur_x=0;
    cur_y=0;
    temp1=cur_x;
    i=0;
    do{
        write_command(0x34);        //关显示
        write_command(0x80+cur_y);  //y坐标
        write_command(0x80+cur_x);  //x坐标
        write_data(rectangle[i++]);
        write_data(rectangle[i++]);
        write_command(0x36);        //开图形显示
        cur_x++;
        temp2=bm_width;
        temp2=temp2>>1;
        if((temp1+temp2)==cur_x)
        {
            cur_x=temp1;
            cur_y++;
            if(--bm_height==0)
                break;
        }
    }while(1);
}

void write_command(uchar command)
{
    uchar i;
    send_1;
    i=5;
    while(i-->0)
    {
        clk_0;                  //发送五个1
        clk_1;
    }
                                //write RW=0
    clk_0;
    send_0;
    clk_1;
                                //write RS=0
    clk_0;
    clk_1;
    clk_0;                      //0
    clk_1;                      
                                //发送D7~D4
    i=4;
    while(i-->0)
    {                                
        clk_0;
        if((command|0x7f)==0xff)
           P2OUT|=BIT1;                           
        else
           P2OUT&=~BIT1;
        command=command<<1;
        clk_1;
    }
                                //发送四个0
    send_0;                                
    i=4;
    while(i-->0)
    {
        clk_0;
        clk_1;
    }
                                //发送D3~D0
    i=4;                                                                                                         
    while(i-->0)
    {
        clk_0;
        if((command|0x7f)==0xff)
           P2OUT|=BIT1;
        else
           P2OUT&=~BIT1;
        command=command<<1;
        clk_1;
    }
                                //发送四个0
    send_0;                                
    i=4;
    while(i-->0)
    {
        clk_0;
        clk_1;
    }
    delay(10);
}


void write_data(uchar lcddata)
{
    uchar i;
    send_1;
    i=5;
    while(i-->0)
    {
        clk_0;                  //发送五个1
        clk_1;
    }
                                //write RW=0
    clk_0;
    send_0;
    clk_1;
                                //write RS=1
    clk_0;
    send_1;
    clk_1;
    clk_0;
    send_0;                     //0
    clk_1;                      
                                //发送D7~D4
    i=4;
    while(i-->0)
    {                                
        clk_0;
        if((lcddata|0x7f)==0xff)
            P2OUT|=BIT1;                             
        else
            P2OUT&=~BIT1;
        lcddata=lcddata<<1;
        clk_1;
    }
                                //发送四个0
    send_0;                                
    i=4;
    while(i-->0)
    {
        clk_0;
        clk_1;
    }
                                //发送D3~D0
    i=4;                                                                                                         
    while(i-->0)
    {
        clk_0;
        if((lcddata|0x7f)==0xff)
           P2OUT|=BIT1;   
        else
           P2OUT&=~BIT1;
        lcddata=lcddata<<1;
        clk_1;
    }
                                //发送四个0
    send_0;                                
    i=4;
    while(i-->0)
    {
        clk_0;
        clk_1;
    }
    delay(10);
}

void delay(uint v)
{
    while(v!=0)v--;
}


void ddram_clear(void)
{
    write_command(0x30);        //基本功能设置
    write_command(0x01);        //清显示
    write_command(0x36);        //扩展功能设置,绘图模式on
    write_command(0x30);        //基本功能设置
}
/*
void fill_with_cgram(void)
{
    cgram_make_word();
    write_command(0x08);        //关显示
    write_command(0x01);        //清显示
    write_command(0x0c);        //开显示
    write_command(0x80);        //设定ddram显示地址
    write_data(0x00);
    write_data(0x00);           //调用字模代码,显示字模数据 ??

}

void cgram_make_word(void)
{
    uchar i;
    write_command(0x34);        //扩展功能设置
    write_command(0x20);        //允许输入IRAM位址
    write_command(0x30);        //基本功能设置
    write_command(0x40);        //设定CGRAM位址
    i=0;
    do{
        write_data(m3h_table[i]);
    }while(++i<32);
}*/

⌨️ 快捷键说明

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