有人用过用ATMEGA32L 连接OCMJ15*20D吗,我做了个无法显示啊
有做过的人帮个忙啊1、OCMJ15*20D的复位脚与CPU的复位脚共用。
2、都是由IO控制的,我已经设置了IO的方向。
3、采用的是CVAVR。
4、我无法判断我是否开启了外部晶振。 仔细看看使用手册,应该可以的 myhome 有做过是吗,能给些建议,哪里需要更加注意的地方,复位共用行吗?可是我读回来的都是BUSY都是为1啊,你用过这款LCD吗? 我把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++);
}
} 建议LCM的复位脚不要和MCU的共用,而是用MCU的IO口去控制,金鹏的那个复位搞了我很久,我那个OCMJ4*12B的,后来找了他们要的源代码自己改的。 是啊,我打了电话去问了,复位脚我已经把它断开了,技术部人员说是LCD自动有阻容可以复位的,我也是从他那里下的源代码改的,他的是51的,我就把它转换成AVR的了,因为第一次用AVR,怕有错的地方,麻烦你帮我看一下有没有错,就是连两个函数,是底层的:void lcd_datawrite(uchar wrdata)和void lcd_regwr(uchar regnada),帮我看下,我已经做了PCB板了。 将DDRB=0xDF; 改成DDRB=0x7F; 试试.
哈哈,看错了,不用改,我倒是有8X10D的CVAVR例子.不知和15X20D有什么区别? 可能错在你将PA口设成了OUT,将它改成DDRA=0;读写PINA口看看. 好啊,发到我邮箱ericli_60@126.com,谢谢你了。
还有其他的问题吗,那些打了注释符的是原本的C51程序的。
用#define 定义IO的位可以这样定义吗?还有在烧写程序时要注意哪些啊,我用EASYPRO直接烧的,没有用ISP PORTA是数据端口,数据就是从PORTA发给LCD的啊,PINA只能读出此时IO的状态,能发送数据吗?将PORTA定义为输出应该也对,我觉得。 肯请大家帮忙再看看啊 把我的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问题.
}
} 好的,谢谢。
我的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);的话就停在这里,如果用延时就蜂鸣器响 昨天晚上又搞了2个小时,还是不行啊,就是没有显示啊,改的动作
1、LCDRESET用IO控制,拉低约200ms,再置高,约1秒后在初始化LCD
2、严格按照例程写的。
还是不行啊,请求帮忙,anylon,程序会死在while(LCDBUSY==1);上,BUSY信号一直都是为1啊 ,不知道怎么回事。
我怀疑跟我烧写时的熔丝位有关系,等下我把电路图贴出来 这个是LCD部分的原理图 1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_202615.GIF 改动我给你的例子试了吗?他的"清屏程序"会将你的LCD_Init(void)//初始化 的内容毁掉,使你的LCDBUSY一直等于1(个人认为,可参照RA8822说明书),我第一次用D系列的时候就在这里卡了将近一天.其实你可以在一些怀疑有问题的地方做些标志,如LED/蜂鸣器等,这样就很容易知道程序问题出在哪. 我看过了你的程序,应该是大体来说跟15*20D的差别不大,因为我是第一次用AVR,担心的是这里,况且哪些熔丝位怕错误,会搞成是第二功能,而不是IO的话就没有得搞了,对吧!你帮我看下原理图是否有问题。 原理图是没什么错误.R10的电阻太大,你没用ADC,就将他直接接VCC.
AVR单片机的I/O第二功能,在你将I/O的DDRx设成0,并在你使用了第二功能才有效.熔丝位按ISP软件默认设置应该出不了大事的.
你下载程序后是否拔下了ISP线,
甩开LCM,写一个简单的程序控制LED闪烁,看你的M32运行是否正常. 我只写一个蜂鸣器是没有问题的,关键就是LCD,但是我好象外部的晶振没有启振,有点象是用的内部的,我用的不是ISP下载的,用的是烧些器直接下载的,型号为EasyPro 90B的,所以在烧写时有很多设置,我不敢乱设啊
JTAEEN =0 等等,ISPEN等等,是不是这个设置的问题啊。 你看数据手册有误,只有CS1为低,CS2为高时,命令才有用,从你的原理图和程序来看看,你认为CS1,CS2均为低电平有效,导致了错误,LCD根本都没有接受你的命令 这个不是我写的程序,我只是从他给的例程里搬过来的,因为手册上没有什么时序图啊,你有做过吗jecylx,我先试下。 我的熔丝位还是没有搞定,谁能帮我下,我用内部4M晶振,程序烧进去后,全部为IO控制
附熔丝位配置图
1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_203676.GIF 楼主你好
我也遇到了你的问题 我是用atmag32,不知你的问题最后是怎么解决的?
能否指点一下!谢谢 mark....................ocmj8x10d mark!mark!
页:
[1]