jaky80000 发表于 2008-1-15 12:19:11

有人用过用ATMEGA32L 连接OCMJ15*20D吗,我做了个无法显示啊

有做过的人帮个忙啊
1、OCMJ15*20D的复位脚与CPU的复位脚共用。
2、都是由IO控制的,我已经设置了IO的方向。
3、采用的是CVAVR。
4、我无法判断我是否开启了外部晶振。

myhome 发表于 2008-1-15 12:31:48

仔细看看使用手册,应该可以的

jaky80000 发表于 2008-1-15 13:17:38

myhome 有做过是吗,能给些建议,哪里需要更加注意的地方,复位共用行吗?可是我读回来的都是BUSY都是为1啊,你用过这款LCD吗?

jaky80000 发表于 2008-1-17 09:25:48

我把51翻译过来的程序贴出来,看下是不是我的程序有问题,谢谢,第一次用,请前辈指教。
CPU:ATMEGA32L
环境:CVAVR
#include <mega32.h>

               
#define uchar        unsigned char
#define uint        unsigned int                     
#define        LCDRS                        PORTB.0
#define LCDWR                        PORTB.1
#define        LCDRD                        PORTB.2
#define        LCDCS1                        PORTB.3
#define        LCDCS2                        PORTB.4
#define        LCDBUSY                        PINB.5
#define        LCDDATA                        PORTA
#define        Beer                        PORTC.5

void lcd_regwrite(uchar regname,uchar regdata);
void lcd_regwr(uchar regnada);
void lcd_datawrite(uchar wrdata);
void lcd_character(uchar flash *cha,int count);//显示中文或字符   
void gotoxy(uchar x,uchar y);
void InitLcd(void);
void delay1ms(int ms);
void delayus(int us);
void SystemInit(void);

//=============================================
uchar flash tab1[]={
"支持文字与绘图两种混和显示模式          "
"支持2 Page 显示模式(And, Or, Nor, Xor)"
"内建两个显示 RAM,可做成4 灰阶的显示效果"
"内建中文字库储存7602个标准GB码的简体中文"
"提供全角(16x16)与半角(8x16) 文字显示模式"
"内建8x8 键盘扫瞄界面(Key Scan)          "
"光标、反白、闪烁功能,光标高度与宽度可调"
"支持屏幕水平卷动及垂直卷动功能          "
"内建512Byte SRAM 可自行造字             "
"提供中/英文文字对齐功能               "
"显示字型可放大到32x32、48x48 或64x64    "
"支持可将字型由ROM 直接读出使用          "
"内建粗体字形与行距设定                  "
"内建10-Bit ADC 支持触控屏幕应用         "
"可使用3V/5V 供电而不需外接负电压      "
};


// Timer 0 overflow interrupt service routine
interrupt void timer0_ovf_isr(void)
{
    // Reinitialize Timer 0 value
    TCNT0=0x10;
    // Place your code here

}

// Declare your global variables here

void main(void)
{
   
    delay1ms(1000);
    SystemInit();
    while (1)
    {            
            // Place your code here
      lcd_regwrite(0x10,0x29);
            lcd_regwrite(0x00,0xcd);
            gotoxy(0x00,0x00);
            lcd_character(tab1,600);                   
        Beer=0;
            delay1ms(30);                   
            Beer=1;
            delay1ms(1000);
    }
}
void SystemInit(void)
{
   // Declare your local variables here
   
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTA=0x00;
    DDRA=0xff;
   
    // Port B initialization
    // Func7=Out Func6=Out Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=0 State6=0 State5=T State4=0 State3=0 State2=0 State1=0 State0=0
    PORTB=0x00;
    DDRB=0xDF;
   
    // Port C initialization
    // Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=In Func1=In Func0=In
    // State7=T State6=T State5=0 State4=T State3=0 State2=T State1=T State0=T
    PORTC=0x20;
    DDRC=0x20;
   
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;
   
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 16000.000 kHz
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x01;
    TCNT0=0x10;
    OCR0=0x00;
   
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
   
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
   
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
   
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;
   
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
   
    InitLcd();
    // Global enable interrupts
//#asm("sei")
}
void lcd_regwrite(uchar regname,uchar regdata)// small
{                                 //写资料到缓存器
        lcd_regwr(regname);
        delay1ms(1);
        lcd_regwr(regdata);
}

void lcd_regwr(uchar regnada) //small
{
    LCDDATA = regnada;
    LCDCS1=0;
    delayus(2);
    //lcd_cs1 =0; // chip enable.
    LCDRD=1;
    delayus(2);   
    //lcd_rd = 1; //
    LCDRS=0;
    delayus(2);
    //lcd_rs = 0; // rs = 0;//这些是51的例程,由于频率不一样,所以我在后面加了约2US的延时
    LCDWR=0;
    delayus(2);
    //lcd_wr = 0; // wr = 0;
    ;
    LCDWR=1;
    delayus(2);
    //lcd_wr = 1; // wr = 1;
    LCDRS=1;
    delayus(2);
    //lcd_rs = 1; // rs = 1;
    LCDCS1=1;
    delayus(2);
    //lcd_cs1 =1; // chip disable.
}

void lcd_datawrite(uchar wrdata)// small
{                                                //写资料到DDRAM

        while(LCDBUSY==1);
        //delay1ms(1);
        LCDDATA = wrdata;
        //lcd_data = wrdata;
        LCDCS1=0;
        delayus(2);
        //lcd_cs1 =0; // chip enable.
        LCDRD=1;
        delayus(2);
        //lcd_rd = 1; //
        LCDRS=1;
        delayus(2);
        //lcd_rs = 1; // rs = 1;
        LCDWR=0;
        delayus(2);
        //lcd_wr = 0; // wr = 0;
        ;
        LCDWR=1;
        delayus(2);
        //lcd_wr = 1; // wr = 1;
        LCDRS=1;
        delayus(2);
        //lcd_rs = 1; // rs = 1;
        LCDCS1=1;
        delayus(2);
        //lcd_cs1 =1; // chip disable.
}
//.............................................
void lcd_character(uchar flash *cha,int count)
{                                    //显示中文或字符
        int i;
        for(i=0;i<count;i++)
        {
            lcd_datawrite(*cha);
            ++cha;
        }
}

//.............................................
void gotoxy(uchar x,uchar y)
{                              //定坐标
        lcd_regwrite(0x60,x); // active window top register(awtr)
        lcd_regwrite(0x70,y); // active window top register(awtr)
}

void InitLcd(void)
{
        lcd_regwrite(0x00,0xcd); // lcd control register(lcr)
        lcd_regwrite(0x01,0xf2); // misc.register(mir)
        lcd_regwrite(0x02,0x10); // advance power setup register(apsr)
        lcd_regwrite(0x03,0x80); // advance display setup regiser(adsr)
        lcd_regwrite(0x10,0x6b); // cursor control register(ccr)
        lcd_regwrite(0x11,0x00); // distance of word or lines register(dwlr)
        lcd_regwrite(0x12,0x91); // memory access mode register(awrr)
        lcd_regwrite(0x21,0x27); // display window right register(dwrr)
        lcd_regwrite(0x31,0xef); // display window bottom register(dwbr)
        lcd_regwrite(0x41,0x00); // display window left register(dwlr)
        lcd_regwrite(0x51,0x00); // display window top register(dwtr)
        lcd_regwrite(0x20,0x27); // active window right register(awrr)
        lcd_regwrite(0x30,0xef); // active window bottom register(awbr)
        lcd_regwrite(0x40,0x00); // active window left register(awlr)
        lcd_regwrite(0x50,0x00); // active window top register(awtr)
        lcd_regwrite(0x60,0x00); // cursor position x register(cpxr)
        lcd_regwrite(0x61,0x00); // begin segment position register(bgsg)
        lcd_regwrite(0x70,0x00); // cursor position y register(cpyr)
        lcd_regwrite(0x71,0x00); // shift action range,begin commom register(bgcm)
        lcd_regwrite(0x72,0xef); // shift action range,end commom register(edcm)
        lcd_regwrite(0x80,0xaa); // blink time register(btr)
        lcd_regwrite(0x81,0x00); // frame rate polarity change at common_fa register(fdca)
        lcd_regwrite(0x91,0x00); // frame rate polarity change at common_fb register(fdcb)
        lcd_regwrite(0x90,0x06); // shift clock control register(sccr)
        lcd_regwrite(0xa0,0x11); // interrupt setup & status register(frcb)
        lcd_regwrite(0xa1,0x00); // key scan control register(kscr)
        lcd_regwrite(0xa2,0x00); // key scan data register(ksdr)
        lcd_regwrite(0xa3,0x00); // key scan data expand register(kser)
        lcd_regwrite(0xb0,0x27); // interrupt column setup register(intx)
        lcd_regwrite(0xb1,0xef); // interrupt row setup register(inty)
        lcd_regwrite(0xc0,0x00); // touch panel control register(tpcr)
        lcd_regwrite(0xc1,0x0a); // adc status register(adcs)
        lcd_regwrite(0xc8,0x80); // touch panel segment high byte data register(tpxr)
        lcd_regwrite(0xc9,0x80); // touch panel common high byte data register(tpyr)
        lcd_regwrite(0xca,0x00); // touch panel segment/common low byte data register(tpzr)
        lcd_regwrite(0xd0,0x80); // lcd contrast control register (lccr)
        lcd_regwrite(0xe0,0x00); // pattern data register(pdr)
        lcd_regwrite(0xf0,0xa0); // font control register(fcr)
        lcd_regwrite(0xf1,0x0f); // font size control register
}


void delay1ms(int ms)
{
        int i,j;
        for(i=0;i<ms;i++)
        {
                for(j=0;j<123;j++);
        }
}
            
void delayus(int us)
{
        int i,j;
        for(i=0;i<us;i++)
        {
               for(j=0;j<10;j++);
        }
}




我已把RESET脚断开了,还是不行,我用的是ATMEGA32L,下面的程序是由例程的51 C文件翻译过来的,麻烦看看错在哪里,谢谢!
#include <mega32.h>            
#define uchar        unsigned char
#define uint        unsigned int                     
#define        LCDRS                        PORTB.0
#define LCDWR                        PORTB.1
#define        LCDRD                        PORTB.2
#define        LCDCS1                        PORTB.3
#define        LCDCS2                        PORTB.4
#define        LCDBUSY                        PINB.5
#define        LCDDATA                        PORTA
#define        Beer                        PORTC.5

void lcd_regwrite(uchar regname,uchar regdata);
void lcd_regwr(uchar regnada);
void lcd_datawrite(uchar wrdata);
void lcd_character(uchar flash *cha,int count);//显示中文或字符   
void gotoxy(uchar x,uchar y);
void InitLcd(void);
void delay1ms(int ms);
void delayus(int us);
void SystemInit(void);

//=============================================
uchar flash tab1[]={
"支持文字与绘图两种混和显示模式          "
"支持2 Page 显示模式(And, Or, Nor, Xor)"
"内建两个显示 RAM,可做成4 灰阶的显示效果"
"内建中文字库储存7602个标准GB码的简体中文"
"提供全角(16x16)与半角(8x16) 文字显示模式"
"内建8x8 键盘扫瞄界面(Key Scan)          "
"光标、反白、闪烁功能,光标高度与宽度可调"
"支持屏幕水平卷动及垂直卷动功能          "
"内建512Byte SRAM 可自行造字             "
"提供中/英文文字对齐功能               "
"显示字型可放大到32x32、48x48 或64x64    "
"支持可将字型由ROM 直接读出使用          "
"内建粗体字形与行距设定                  "
"内建10-Bit ADC 支持触控屏幕应用         "
"可使用3V/5V 供电而不需外接负电压      "
};


// Timer 0 overflow interrupt service routine
interrupt void timer0_ovf_isr(void)
{
    // Reinitialize Timer 0 value
    TCNT0=0x10;
    // Place your code here

}

// Declare your global variables here

void main(void)
{
   
    delay1ms(1000);
    SystemInit();
    while (1)
    {            
            // Place your code here
      lcd_regwrite(0x10,0x29);
            lcd_regwrite(0x00,0xcd);
            gotoxy(0x00,0x00);
            lcd_character(tab1,600);                   
        Beer=0;
            delay1ms(30);                   
            Beer=1;
            delay1ms(1000);
    }
}
void SystemInit(void)
{
   // Declare your local variables here
   
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTA=0x00;
    DDRA=0xff;
   
    // Port B initialization
    // Func7=Out Func6=Out Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=0 State6=0 State5=T State4=0 State3=0 State2=0 State1=0 State0=0
    PORTB=0x00;
    DDRB=0xDF;
   
    // Port C initialization
    // Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=In Func1=In Func0=In
    // State7=T State6=T State5=0 State4=T State3=0 State2=T State1=T State0=T
    PORTC=0x20;
    DDRC=0x20;
   
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;
   
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 16000.000 kHz
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x01;
    TCNT0=0x10;
    OCR0=0x00;
   
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
   
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
   
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
   
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;
   
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
   
    InitLcd();
    // Global enable interrupts
//#asm("sei")
}
void lcd_regwrite(uchar regname,uchar regdata)// small
{                                 //写资料到缓存器
        lcd_regwr(regname);
        delay1ms(1);
        lcd_regwr(regdata);
}

void lcd_regwr(uchar regnada) //small
{
    LCDDATA = regnada;
    LCDCS1=0;
    delayus(2);
    //lcd_cs1 =0; // chip enable.
    LCDRD=1;
    delayus(2);   
    //lcd_rd = 1; //
    LCDRS=0;
    delayus(2);
    //lcd_rs = 0; // rs = 0;
    LCDWR=0;
    delayus(2);
    //lcd_wr = 0; // wr = 0;
    ;
    LCDWR=1;
    delayus(2);
    //lcd_wr = 1; // wr = 1;
    LCDRS=1;
    delayus(2);
    //lcd_rs = 1; // rs = 1;
    LCDCS1=1;
    delayus(2);
    //lcd_cs1 =1; // chip disable.
}

void lcd_datawrite(uchar wrdata)// small
{                                                //写资料到DDRAM

        while(LCDBUSY==1);
        //delay1ms(1);
        LCDDATA = wrdata;
        //lcd_data = wrdata;
        LCDCS1=0;
        delayus(2);
        //lcd_cs1 =0; // chip enable.
        LCDRD=1;
        delayus(2);
        //lcd_rd = 1; //
        LCDRS=1;
        delayus(2);
        //lcd_rs = 1; // rs = 1;
        LCDWR=0;
        delayus(2);
        //lcd_wr = 0; // wr = 0;
        ;
        LCDWR=1;
        delayus(2);
        //lcd_wr = 1; // wr = 1;
        LCDRS=1;
        delayus(2);
        //lcd_rs = 1; // rs = 1;
        LCDCS1=1;
        delayus(2);
        //lcd_cs1 =1; // chip disable.
}
//.............................................
void lcd_character(uchar flash *cha,int count)
{                                    //显示中文或字符
        int i;
        for(i=0;i<count;i++)
        {
            lcd_datawrite(*cha);
            ++cha;
        }
}

//.............................................
void gotoxy(uchar x,uchar y)
{                              //定坐标
        lcd_regwrite(0x60,x); // active window top register(awtr)
        lcd_regwrite(0x70,y); // active window top register(awtr)
}

void InitLcd(void)
{
        lcd_regwrite(0x00,0xcd); // lcd control register(lcr)
        lcd_regwrite(0x01,0xf2); // misc.register(mir)
        lcd_regwrite(0x02,0x10); // advance power setup register(apsr)
        lcd_regwrite(0x03,0x80); // advance display setup regiser(adsr)
        lcd_regwrite(0x10,0x6b); // cursor control register(ccr)
        lcd_regwrite(0x11,0x00); // distance of word or lines register(dwlr)
        lcd_regwrite(0x12,0x91); // memory access mode register(awrr)
        lcd_regwrite(0x21,0x27); // display window right register(dwrr)
        lcd_regwrite(0x31,0xef); // display window bottom register(dwbr)
        lcd_regwrite(0x41,0x00); // display window left register(dwlr)
        lcd_regwrite(0x51,0x00); // display window top register(dwtr)
        lcd_regwrite(0x20,0x27); // active window right register(awrr)
        lcd_regwrite(0x30,0xef); // active window bottom register(awbr)
        lcd_regwrite(0x40,0x00); // active window left register(awlr)
        lcd_regwrite(0x50,0x00); // active window top register(awtr)
        lcd_regwrite(0x60,0x00); // cursor position x register(cpxr)
        lcd_regwrite(0x61,0x00); // begin segment position register(bgsg)
        lcd_regwrite(0x70,0x00); // cursor position y register(cpyr)
        lcd_regwrite(0x71,0x00); // shift action range,begin commom register(bgcm)
        lcd_regwrite(0x72,0xef); // shift action range,end commom register(edcm)
        lcd_regwrite(0x80,0xaa); // blink time register(btr)
        lcd_regwrite(0x81,0x00); // frame rate polarity change at common_fa register(fdca)
        lcd_regwrite(0x91,0x00); // frame rate polarity change at common_fb register(fdcb)
        lcd_regwrite(0x90,0x06); // shift clock control register(sccr)
        lcd_regwrite(0xa0,0x11); // interrupt setup & status register(frcb)
        lcd_regwrite(0xa1,0x00); // key scan control register(kscr)
        lcd_regwrite(0xa2,0x00); // key scan data register(ksdr)
        lcd_regwrite(0xa3,0x00); // key scan data expand register(kser)
        lcd_regwrite(0xb0,0x27); // interrupt column setup register(intx)
        lcd_regwrite(0xb1,0xef); // interrupt row setup register(inty)
        lcd_regwrite(0xc0,0x00); // touch panel control register(tpcr)
        lcd_regwrite(0xc1,0x0a); // adc status register(adcs)
        lcd_regwrite(0xc8,0x80); // touch panel segment high byte data register(tpxr)
        lcd_regwrite(0xc9,0x80); // touch panel common high byte data register(tpyr)
        lcd_regwrite(0xca,0x00); // touch panel segment/common low byte data register(tpzr)
        lcd_regwrite(0xd0,0x80); // lcd contrast control register (lccr)
        lcd_regwrite(0xe0,0x00); // pattern data register(pdr)
        lcd_regwrite(0xf0,0xa0); // font control register(fcr)
        lcd_regwrite(0xf1,0x0f); // font size control register
}


void delay1ms(int ms)
{
        int i,j;
        for(i=0;i<ms;i++)
        {
                for(j=0;j<123;j++);
        }
}
            
void delayus(int us)
{
        int i,j;
        for(i=0;i<us;i++)
        {
               for(j=0;j<10;j++);
        }
}

ilikemcu 发表于 2008-1-17 10:07:37

建议LCM的复位脚不要和MCU的共用,而是用MCU的IO口去控制,金鹏的那个复位搞了我很久,我那个OCMJ4*12B的,后来找了他们要的源代码自己改的。

jaky80000 发表于 2008-1-17 11:06:26

是啊,我打了电话去问了,复位脚我已经把它断开了,技术部人员说是LCD自动有阻容可以复位的,我也是从他那里下的源代码改的,他的是51的,我就把它转换成AVR的了,因为第一次用AVR,怕有错的地方,麻烦你帮我看一下有没有错,就是连两个函数,是底层的:void lcd_datawrite(uchar wrdata)和void lcd_regwr(uchar regnada),帮我看下,我已经做了PCB板了。

anylon 发表于 2008-1-17 11:39:58

将DDRB=0xDF; 改成DDRB=0x7F; 试试.

哈哈,看错了,不用改,我倒是有8X10D的CVAVR例子.不知和15X20D有什么区别?

anylon 发表于 2008-1-17 11:47:09

可能错在你将PA口设成了OUT,将它改成DDRA=0;读写PINA口看看.

jaky80000 发表于 2008-1-17 12:17:00

好啊,发到我邮箱ericli_60@126.com,谢谢你了。
还有其他的问题吗,那些打了注释符的是原本的C51程序的。
用#define 定义IO的位可以这样定义吗?还有在烧写程序时要注意哪些啊,我用EASYPRO直接烧的,没有用ISP

jaky80000 发表于 2008-1-17 12:18:56

PORTA是数据端口,数据就是从PORTA发给LCD的啊,PINA只能读出此时IO的状态,能发送数据吗?将PORTA定义为输出应该也对,我觉得。

jaky80000 发表于 2008-1-17 14:36:54

肯请大家帮忙再看看啊

anylon 发表于 2008-1-17 15:43:09

把我的OCMJ8x10驱动给你参考一下,要是还有问题那是你的硬件问题,因为在我的设备里运行的很好.
你没有贴出你的main部分,是不是你用了厂家给你的程序中的"清屏程序"?千万别用,
LCM外置的电位器你是用多大的?
我的这些都是基于OCMJ8x10D的,15*20D的没用过,所以只能供你参考了.
/********以下为OCMJ8x10D驱动******************/
#include <mega64.h>
#define LED PORTB.7
#define DataPortPORTA
#define ComdPortPORTC
#define DdrDataDDRA
#define DdrComdDDRC
#define LCD_RST    PORTC.0
#define RD         PORTC.1
#define WR         PORTC.2
#define RS         PORTC.3
#define CS2      PORTC.4
#define CS1      PORTC.5
#define TOUCH_INT      PORTC.6
#define BUSY       PINC.7

// *** 延迟 子程序******//
void delay_1ms(void)               //1ms延时函数
{
      unsigned int i;
      for (i=0;i<1000;i++)
            #asm("wdr");
}
void delay_nms(unsigned int n)       //N ms延时函数
{
      unsigned int i=0;
      for (i=0;i<n;i++)
            delay_1ms();
}

void LCD_CmdWrite(unsigned char regnada)       //写入缓存器 (命令)
{
      CS1=0;   
      RD=1;   
      RS=0;   
      DataPort=regnada;
      WR=0;   
      #asm("nop");
      #asm("nop");
      #asm("nop");
      #asm("nop");
      #asm("nop");
      #asm("nop");
      #asm("nop");
      WR=1;
      CS1=1;
}
void LCD_DataWrite(unsigned char wrdata) //写资料到DDRAM
{                                               
      while(BUSY == 1)
            #asm("wdr");
      CS1=0;
      RD=1;
      RS=1;                                 
      DataPort=wrdata;
      WR=0;
      #asm("nop");
      #asm("nop");
      #asm("wdr");
      #asm("nop");
      #asm("nop");
      #asm("nop");
      WR=1;
      CS1=1;
}

void Write_Command(unsigned char regname,unsigned char regdata) //写资料到缓存器
{                                 
      LCD_CmdWrite(regname);
      #asm("nop");
      #asm("nop");
      LCD_CmdWrite(regdata);
}
void Place_XY(unsigned char x,unsigned char y)//定坐标
{                              
      Write_Command(0x60,x*16);
      Write_Command(0x70,y*16);
}


void Display_Text(char flash *ptr)//显示文本
{
      Write_Command(0x10,0x2b);       //常规       
      Write_Command(0x00,0xcd);
      while(*ptr != '\0')
      {
            LCD_DataWrite(*ptr);
            ++ptr;
            #asm("nop");   
            #asm("wdr")
      }
}

void LCD_Reset(void)//上电复位
{
      ComdPort = 0x00;            
      delay_nms(120);
      ComdPort = 0xff;
}
void LCD_Clear(void)//清屏
{
      Place_XY(0,0);         
        Display_Text("                     ");
        Place_XY(0,1);         
        Display_Text("                     ");
        Place_XY(0,2);         
        Display_Text("                     ");
        Place_XY(0,3);         
        Display_Text("                     ");
        Place_XY(0,4);         
        Display_Text("                     ");
        Place_XY(0,5);         
        Display_Text("                     ");
        Place_XY(0,6);         
        Display_Text("                     ");
        Place_XY(0,7);         
        Display_Text("                     ");
}

void LCD_Init(void)      //初始化
{
      DdrData=0xff;               
      DdrComd=0x3f;                  
      LCD_Reset();//上电复位   
      Write_Command(0x00,0xcd);         
      Write_Command(0x02,0x10);
      Write_Command(0x03,0x80);
      Write_Command(0x10,0x2b);         
      Write_Command(0x11,0x00);
      Write_Command(0x12,0x91);         
      Write_Command(0x21,0x13);
      Write_Command(0x31,0x7f);
      Write_Command(0x41,0x00);
      Write_Command(0x51,0x00);
      Write_Command(0x20,0x13);
      Write_Command(0x30,0x7f);      
      Write_Command(0x72,0x7f);
      Write_Command(0x80,0xaa);
      Write_Command(0x81,0x04);      
      Write_Command(0x90,0x2d);
      Write_Command(0xa0,0x11);         
      Write_Command(0xb0,0x13);
      Write_Command(0xb1,0x7f);            
      Write_Command(0xc8,0x80);
      Write_Command(0xc9,0x80);                  
      Write_Command(0xd0,0x20);
      Write_Command(0xf0,0xa8);
      Write_Command(0xf1,0x0f);
}
void main(void)
{                        
    DDRB=0x80;      
    ACSR=0x80;
    SFIOR=0x00;   
    Lcd_Initial();             //液晶初始化      
    Place_XY(0,0) ;         
    Write_Text("当你看到这些文字时,说明LCM工作正常.");         
    while(1)
    {      
      delay_nms(5000);      
      LED^=1;//判断是程序问题还是LCM问题.
    }   
}

jaky80000 发表于 2008-1-17 16:42:01

好的,谢谢。
我的main程序
void main(void)
{
      
    delay1ms(1000);
    SystemInit();
    while (1)
    {            
            // Place your code here
      lcd_regwrite(0x10,0x29);
            lcd_regwrite(0x00,0xcd);
            gotoxy(0x00,0x00);
            lcd_character(tab1,600);                     
         Beer=0;
            delay1ms(30);                     
            Beer=1;
            delay1ms(1000);
    }
}
对的,就是用它的清屏的,他那个清屏有问题吗,但是我在卖的地方试过了是没有问题的。
我的那个main程序,如果是判断LCD用WHILE(LCDBUSY==1);的话就停在这里,如果用延时就蜂鸣器响

jaky80000 发表于 2008-1-18 08:28:33

昨天晚上又搞了2个小时,还是不行啊,就是没有显示啊,改的动作
1、LCDRESET用IO控制,拉低约200ms,再置高,约1秒后在初始化LCD
2、严格按照例程写的。
还是不行啊,请求帮忙,anylon,程序会死在while(LCDBUSY==1);上,BUSY信号一直都是为1啊 ,不知道怎么回事。
我怀疑跟我烧写时的熔丝位有关系,等下我把电路图贴出来

jaky80000 发表于 2008-1-18 08:32:17

这个是LCD部分的原理图

jaky80000 发表于 2008-1-18 08:33:09

1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_202615.GIF

anylon 发表于 2008-1-18 09:10:57

改动我给你的例子试了吗?他的"清屏程序"会将你的LCD_Init(void)//初始化 的内容毁掉,使你的LCDBUSY一直等于1(个人认为,可参照RA8822说明书),我第一次用D系列的时候就在这里卡了将近一天.其实你可以在一些怀疑有问题的地方做些标志,如LED/蜂鸣器等,这样就很容易知道程序问题出在哪.

jaky80000 发表于 2008-1-18 10:50:48

我看过了你的程序,应该是大体来说跟15*20D的差别不大,因为我是第一次用AVR,担心的是这里,况且哪些熔丝位怕错误,会搞成是第二功能,而不是IO的话就没有得搞了,对吧!你帮我看下原理图是否有问题。

anylon 发表于 2008-1-18 12:08:46

原理图是没什么错误.R10的电阻太大,你没用ADC,就将他直接接VCC.
AVR单片机的I/O第二功能,在你将I/O的DDRx设成0,并在你使用了第二功能才有效.熔丝位按ISP软件默认设置应该出不了大事的.

你下载程序后是否拔下了ISP线,
甩开LCM,写一个简单的程序控制LED闪烁,看你的M32运行是否正常.

jaky80000 发表于 2008-1-18 12:26:56

我只写一个蜂鸣器是没有问题的,关键就是LCD,但是我好象外部的晶振没有启振,有点象是用的内部的,我用的不是ISP下载的,用的是烧些器直接下载的,型号为EasyPro 90B的,所以在烧写时有很多设置,我不敢乱设啊
JTAEEN =0 等等,ISPEN等等,是不是这个设置的问题啊。

jeccylx 发表于 2008-1-18 21:48:22

你看数据手册有误,只有CS1为低,CS2为高时,命令才有用,从你的原理图和程序来看看,你认为CS1,CS2均为低电平有效,导致了错误,LCD根本都没有接受你的命令

jaky80000 发表于 2008-1-19 10:58:28

这个不是我写的程序,我只是从他给的例程里搬过来的,因为手册上没有什么时序图啊,你有做过吗jecylx,我先试下。

jaky80000 发表于 2008-1-20 11:27:00

我的熔丝位还是没有搞定,谁能帮我下,我用内部4M晶振,程序烧进去后,全部为IO控制
附熔丝位配置图
1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_203676.GIF

lxm21 发表于 2008-4-18 11:23:18

楼主你好
    我也遇到了你的问题 我是用atmag32,不知你的问题最后是怎么解决的?

能否指点一下!谢谢

wpami 发表于 2014-3-6 23:04:01

mark....................ocmj8x10d

jcsasm 发表于 2014-3-10 01:03:39

mark!mark!
页: [1]
查看完整版本: 有人用过用ATMEGA32L 连接OCMJ15*20D吗,我做了个无法显示啊