原创 JM12864 程序(并行方式)

2008-3-31 21:05 6003 13 13 分类: MCU/ 嵌入式
这是12864型lcd的驱动和测试程序,采用并行方式。LCD型号是:JM12864M,支持串、并两种接口
//FileName:12864lcdp.h

/*************************************
** start51 study board test software
** test 12864LCD
** using parallel interface
** author:bluehacker<kernelpaniccrash AT gmail.com>
** QQ:282074921
** Date:2007-11-17
**************************************/
#ifndef _LZP_START51_12864LCDP_H
#define _LZP_START51_12864LCDP_H
#include "reg52.h"
//设置波特率
#define OSC_FREQ                11059200L

#define BAUD_115200             256 - (OSC_FREQ/192L)/115200L   // 255
#define BAUD_57600              256 - (OSC_FREQ/192L)/57600L    // 254
#define BAUD_38400              256 - (OSC_FREQ/192L)/38400L    // 253
#define BAUD_28800              256 - (OSC_FREQ/192L)/28800L    // 252
#define BAUD_19200              256 - (OSC_FREQ/192L)/19200L    // 250
#define BAUD_14400              256 - (OSC_FREQ/192L)/14400L    // 248
#define BAUD_9600               256 - (OSC_FREQ/192L)/9600L     // 244

#define LCD_DATA  P0

sbit LCDRS="P2"^0;
sbit LCDRW="P2"^1;
sbit LCDE="P2"^2;
//12864LCD指令定义
#define CMD_CLEAR  0x01
#define CMD_RESET  0x02

void Delay_us(unsigned char nUs);
void Delay_ms(unsigned int nMs);

void lcd_busy(void);
void write_command(unsigned char cmd);
unsigned char read_data(void);
void write_data(unsigned char dat);
void clear_lcd();
void lcd_init();
void lcd_setxy(unsigned char x,unsigned char y);
void lcd_display_str(unsigned char x, unsigned char y,unsigned char *str);

#endif

//FileName:delay.c
/********************************************
** start51 study board
** delay function implementation
** author:bluehacker<kernelpaniccrash AT gmail.com>
** QQ:282074921
**********************************************/
#include "12864lcdp.h"

void Delay_us(unsigned char nUs)//微秒级延时<255us
{
    TH0=0;
    TL0=0;
    TR0=1;
    while(TL0<nUs)//利用T0做定时计数器,循环采样,直到达到定时值
    {
    }
    TR0=0;
}

void Delay_ms(unsigned int nMs)//豪秒级的延时<65535ms
{
    unsigned int cnt="0";
    TR0=1;
    while(cnt<nMs)////利用T0做定时计数器,循环采样,直到达到定时值
    {
        TH0=0;
        TL0=20;
        while(TH0<4)
        {
        }
        cnt++;
    }
    TR0=0;
}

//FileName:12864lcdp.c

/*************************************
** start51 study board test software
** test 12864LCD
** using parallel interface
** author:bluehacker<kernelpaniccrash AT gmail.com>
** QQ:282074921
** Date:2007-11-17
**************************************/
#include "12864lcdp.h"
void lcd_busy(void)
{
    unsigned char dat="0";
    LCDRS=0;
    LCDRW=1;
    LCDE=0;
    do{
        LCD_DATA=0xff;
        LCDE=1;
        dat=LCD_DATA;
        LCDE=0;
    }while(dat&0x80);
}
        
void write_command(unsigned char cmd)
{
    lcd_busy();
    LCDRS=0;
    LCDRW=0;
    LCD_DATA=cmd;
    LCDE=1;
    
    Delay_us(1);
    LCDE=0;
}

unsigned char read_data(void)
{
    unsigned char dat;
    lcd_busy();
    LCDRS=1;
    LCDRW=1;
    LCDE=1;
    Delay_us(1);
    dat=LCD_DATA;
    LCDE=0;
    return dat;
}

void write_data(unsigned char dat)
{
    lcd_busy();
    LCDRS=1;
    LCDRW=0;
    LCD_DATA=dat;
    LCDE=1;

    Delay_us(1);
    LCDE=0;
}


void clear_lcd()
{
    write_command(CMD_CLEAR);
}

void lcd_setxy(unsigned char x,unsigned char y)
{
    unsigned char addr;
    switch(y)
    {
        case 0:
        addr=0x80+x;
        break;
        case 1:
        addr=0x90+x;
        break;
        case 2:
        addr=0x88+x;
        break;
        case 3:
        addr=0x98+x;
        break;
    }
    write_command(addr);
}

void lcd_display_str(unsigned char x, unsigned char y,unsigned char *str)
{
    unsigned char i;
    lcd_setxy(x,y);
    for(i=0;str!='\0';i++)
    {
        write_data(str);
    }
}


void lcd_init()
{
    write_command(CMD_RESET);
    write_command(0x0d);//设置显示状态,整体显示ON,游标与游标位置ON
    write_command(0x30);//功能设置,基本指令
    write_command(0x18);//游标与显示移位控制
    clear_lcd();
    //write_command(0x80);//设置DDRAM位址,并不必须
}

void main()
{
    TCON=0;
    SCON=0x50;/*mode 1,1 start bit ,8 data bit ,1 stop bit,enable receive*/
    PCON=0x80;/*SMOD=1, Baud Rate twice*/
    TMOD=0x21;/*timer 0--mode 1 and timer 1 ---mode2*/
    //set baud rate,use timer 1 as baud rate generator
    TH1=BAUD_19200;
    TL1=TH1;
    TR1=1;
//    ET1=0;//disable timer 1 interrupt
    EA=0;
    lcd_init();
    //显示武林外传
    lcd_setxy(1,2);
    write_data(0xce);
    write_data(0xe4);
    lcd_setxy(2,2);
    write_data(0xc1);
    write_data(0xd6);
    lcd_setxy(3,2);
    write_data(0xcd);
    write_data(0xe2);
    lcd_setxy(4,2);
    write_data(0xb4);
    write_data(0xab);
    Delay_ms(5000);
    clear_lcd();
    write_command(CMD_RESET);
    Delay_ms(5000);
    lcd_display_str(1,0,"bluehacker");
    lcd_display_str(0,1,"QQ:282074921");
    lcd_display_str(3,2,"李正平");
    while(1)
    {
    }
}
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /1 下一条