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

📄 hd44780.c

📁 c51液晶显示程序,显示模块,可通用于基于HD44780内控器的液晶显示器.
💻 C
字号:
/*显示模块,可通用于基于HD44780内控器的液晶显示器*/

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char

bit bflag ;
sbit LIGHT = P0^4;
sbit E = P0^5;
sbit RW = P0^6;
sbit RS = P0^7;
sbit x5045_cs = P0^0;
sbit sclk = P0^3;
sbit din = P0^2;
sbit dout = P0^1;
uchar serial_time = 0;
uchar display[16] = {"Hi how are you"};

void send_byte ( uchar ucdata_1 );  /*发送一个字节*/
uchar receive_byte ( void );        /*接收一个字节*/
void write_std ( uchar ucstd_1 );   /*写状态寄存器*/
void write_data (uchar address_1, uchar ucdata_2);/*写一个字节数据*/
uchar read_data (uchar address_2);  /*读一个字节数据*/
void x5045_wait (void);      /*测试x5045是否处于写数据状态*/
void lcd_chekbusy ( void );     /*测试忙*/
void lcd_wrcmd ( unsigned char lcd_cmd );    /*写命令*/
void lcd_wrdata ( unsigned char lcd_data );    /*写数据*/
void lcd_moveto ( unsigned char position );    /*写要显示的地方*/
void lcd_init ( void );    /*初始化*/

void delay ( unsigned char x )
{   
    unsigned char i; 
    do
    {   
        for (i=0;i<125;i++) {;}
    }
    while ( x-- );
}

/*发送一个字节*/
void send_byte ( uchar ucdata_1 )
{   
    uchar i,temp1;
    temp1 = ucdata_1;
    for ( i = 0; i < 8; i++ )
    {   din = temp1&0x80;
        sclk = 0;
        sclk = 1;
        temp1<<=1;
    }
    din = 0;
}

/*接收一个字节*/
uchar receive_byte (void)
{   
    uchar i,temp2=0;
    for ( i = 0; i < 8; i++ )
    {   
        temp2<<=1;
        sclk = 1;
        sclk = 0;
        temp2|=dout;
    }
    return ( temp2 );
}

/*写状态寄存器*/
void write_std ( uchar ucstd_1 )
{   
    sclk = 0;
    x5045_cs = 0;
    send_byte ( 0x06 );
    sclk = 0;
    x5045_cs = 1;
    x5045_cs = 0;
    send_byte ( 0x01 );
    send_byte ( ucstd_1 );
    x5045_cs = 1;
    x5045_wait();
}

/*写一个字节到低半数据区*/
void write_data ( uchar address_1,uchar ucdata_2 )
{   
    sclk = 0;   /*address_1为要写字节的地址*/
    x5045_cs = 0;
    send_byte ( 0x06 );
    sclk = 0;
    x5045_cs = 1;
    x5045_cs = 0;
    send_byte ( 0x02 );/*若为高半数据区,则写入0x0a*/
    send_byte ( address_1 );
    send_byte ( ucdata_2 );
    x5045_cs = 1;
    x5045_wait();
}

    /*读一个字节从低半数据区*/
uchar read_data ( uchar address_2 )
{   
    uchar temp3 = 0;
    sclk = 0;
    x5045_cs = 0;
    send_byte ( 0x03 );/*若为高半数据区,则写入0x0b*/
    send_byte ( address_2 );
    temp3 = receive_byte();
    x5045_cs = 1;
    return ( temp3 );
}

void x5045_wait ( void )
{   
    uchar j = 0;
    do
    {   
        sclk = 0;
        x5045_cs = 0;
        send_byte ( 0x05 );
        j = receive_byte();
        sclk = 0;
        x5045_cs = 1;
        j = j&0x01;
     }
    while (j);
}

void lcd_chekbusy ( void )
{   
    unsigned char middle;
    do 
    {   
        RS = 0;
        RW = 1;
        E = 1;
        delay ( 10 ); 
        middle = P2;
        E = 0;          
    }
    while ( (0x80&middle)==1 );
}

void lcd_wrcmd ( unsigned char lcd_cmd )
{   
    delay ( 1 );
    lcd_chekbusy ();
    RS = 0;
    RW = 0;
    E = 1;
    P2 = lcd_cmd;
    E = 0;
    delay ( 1 );
}

void lcd_wrdata ( unsigned char lcd_data )  
{   
    unsigned char temp2;
    do 
    {   
        RS = 0;
        RW = 1;
        E = 1;
        delay ( 10 );
        temp2 = P2;
        E = 0;
    }
    while ( (0x80&temp2)==1 );  
    RS = 1;
    RW = 0;
    E  = 1;
    P2 = lcd_data;
    E  = 0;
    if ( temp2 == 0x07 ) 
        lcd_wrcmd ( 0xc0 );
}

void lcd_moveto ( unsigned char position )
{   
    unsigned char temp1;
    lcd_chekbusy ();
    if ( position < 8 ) 
        temp1 = ( position + 0x80 - 1 );
    else
        temp1 = ( ( position - 9 ) + 0xc0 );
    lcd_wrcmd ( temp1 );
    delay ( 1 );
}

void lcd_wrstr( unsigned char *p_disp_str_da )
{   
    unsigned char i;
    lcd_wrcmd ( 0x80 );
    for ( i = 0; i < 8; i++ )
    {   
        lcd_wrdata ( *p_disp_str_da );
        p_disp_str_da++;
    }
    lcd_wrcmd ( 0xc0 );
    for ( i = 0; i < 8; i++ )
    {   
        lcd_wrdata (*p_disp_str_da );
        p_disp_str_da++;
    }
}

void lcd_wrchar (unsigned char lcd_add,unsigned char lcd_data)
{   
    lcd_moveto ( lcd_add );
    lcd_wrdata ( lcd_data );
}   

void lcd_init ( void )
{   
    unsigned char i;
    delay ( 50 );
    for ( i = 0;i < 8;i++ )
    {   
        lcd_wrcmd ( 0x30 ); 
        delay ( 5 );
    }
    lcd_wrcmd ( 0x38 );
    lcd_wrcmd ( 0x0c ); 
    lcd_wrcmd ( 0x06 ); 
    lcd_wrcmd ( 0x01 ); 
}

void service (void) interrupt 2 
{   
    unsigned char code  key_string1[16]={"this is K1      "},
                        key_string2[16]={"this is K2      "},
                        key_string3[16]={"this is K3      "},
                        key_string4[16]={"this is K4      "},
                        key_string5[16]={"this is K5      "};
    unsigned char key,key2;
    EX1 = 0;
    delay (30);
    //if ( P1^0==1 ) goto ret;
    while ( P1^0==0)
    {
        P1=0xfe;
        key=P1;
        switch ( key )
        {
            case 0xfc:
            lcd_wrcmd ( 0x01 );
            lcd_wrstr ( key_string1 );
            break;
            
            case 0xfa:
            lcd_wrcmd ( 0x01 );
            lcd_wrstr ( key_string2 );
            break;
    
            case 0xf6:
            lcd_wrcmd ( 0x01 );
            lcd_wrstr ( key_string3 );
            break;
            
            case 0xee:
            lcd_wrcmd ( 0x01 );
            lcd_wrstr ( key_string4 );
            break;
            
            case 0xde:
            lcd_wrcmd ( 0x01 );
            lcd_wrstr ( key_string5 );
            break;
        }
    }
    EX1 = 1;
    IT1 = 1;
    EA  = 1;
    P1  = 0x01;
    _nop_();
}

void serial (void) interrupt 4
{   
    EA = 0;
    RI = 0;
    if ( serial_time == 16) 
        serial_time = 0;
    if (SBUF == 0xaa)//judge wheather is the request
    {   
        SBUF=0xbb;
        while (TI==0);//sent the ack 
            TI=0;
        do
        {
            while ( RI == 0 ); RI = 0;
            display[serial_time] = SBUF;//get the real date want to send
            SBUF = display[serial_time];//sent back the data just received
            while ( TI == 0 ); TI = 0;
            while ( RI == 0 ); RI = 0;
        }
        while ( SBUF!=0x77 );
    }
    else 
        EA=1;
}
    
void init_serial ( void )
{   
    TMOD = 0x20;
    TH1  = 0xfd;
    TL1  = 0xfd;
    PCON = 0x00;
    TR1  = 1;
    SCON =0x50;
}

void main()
{   
    unsigned char dis_string[16] = {"this is a test  "};
    unsigned char i,j,k;
    init_serial ();
    k  = 0;
    P1 = 0x01;
    P2 = 0xff;
    lcd_init ();
    lcd_moveto (1);
    lcd_wrdata ('a');
    lcd_wrstr ( dis_string );
    P1  = 0x01;
    IE  = 0;
    EX1 = 1;
    IT1 = 1;
    ES  = 1;/*开串行中断*/
    EA  = 1;
    while ( 1 )
    {   write_std ( 0x30 );
        lcd_wrstr (display);
    }
}
    

⌨️ 快捷键说明

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