弄了一天刚弄出来的OCMJ15x20D的初始化程序,WINAVR下调试通过
#include "public.h"//WINAVR20040214+AVRSTUDIO4.12下调试通过
//RS--PB5
//CS1--GND
//CS2--PB6
//BUSY--PE6
//INT--PE7
//RST--PG4
//DB0..7--PA0..7
//ATMEGA64@8MHz
const uint8_t init_paras[] PROGMEM =
{
0X00,0X01,0X02,0X03,0X10,0X11,0X12,0X21,0X31,0X41,0X51,0X20,0X30,0X40,0X50,0X60,
0X61,0X70,0X71,0X72,0X80,0X81,0X91,0X90,0XA0,0XA1,0XA2,0XA3,0XB0,0XB1,0XC0,0XC1,
0XC8,0XC9,0XCA,0XD0,0XE0,0XF0,0XF1,
0XC9,0XF2,0X10,0X80,0X6B,0X00,0X91,0X27,0XEF,0X00,0X00,0X27,0XEF,0X00,0X00,0X00,
0X00,0X00,0X00,0XEF,0XAA,0X00,0X00,0X06,0X11,0X00,0X00,0X00,0X27,0XEF,0X00,0X0A,
0X80,0X80,0X00,0X80,0X00,0XA0,0X0F
};
void lcm_reg_write(uint8_t reg_name,uint8_t reg_data)
{
DDRA = 0XFF;
/* PORTB |= (1<<PB6);
PORTB |= (1<<PB5);
PORTG |= (1<<PG0);
PORTG |= (1<<PG1);*/
lcm_reg_wr(reg_name);
for(reg_name=8;reg_name;reg_name--)
{
asm volatile ("nop"::);
}
lcm_reg_wr(reg_data);
}
void lcm_reg_wr(uint8_t d)
{
PORTA = d;
PORTB |= (1<<PB6); //cs2=1
PORTG |= (1<<PG1); //rd=1
PORTB &= (~(1<<PB5)); //rs=0
PORTG &= (~(1<<PG0)); //wr=0
for(d=8;d;d--)
{
asm volatile ("nop"::);
}
PORTG |= (1<<PG0);//wr=1
PORTB |= (1<<PB5);//rs=1
PORTB &= (~(1<<PB6));//cs2=0
}
void lcm_data_write(uint8_t data)
{
DDRA=0XFF;
/* PORTB |= (1<<PB6);
PORTB |= (1<<PB5);
PORTG |= (1<<PG0);
PORTG |= (1<<PG1);*/
while(PINE & (1<<PE6));
PORTA = data;
PORTB |= (1<<PB6); //cs2=1
PORTG |= (1<<PG1); //rd=1
PORTB |= (1<<PB5); //rs=1
PORTG &= (~(1<<PG0)); //wr=0
for(data=8;data;data--)
{
asm volatile ("nop"::);
}
PORTG |= (1<<PG0);//wr=1
PORTB |= (1<<PB5);//rs=1
PORTB &= (~(1<<PB6));//cs2=0
}
uint8_t lcm_reg_read(uint8_t reg_name)
{
DDRA = 0XFF;
/* PORTB |= (1<<PB6);
PORTB |= (1<<PB5);
PORTG |= (1<<PG0);
PORTG |= (1<<PG1);*/
lcm_reg_wr(reg_name);
for(reg_name=8;reg_name;reg_name--);
DDRA=0X00;
PORTA=0XFF;
PORTB |= (1<<PB6); //cs2=1
PORTG |= (1<<PG0); //wr=1
PORTB &= (~(1<<PB5)); //rs=0
PORTG &= (~(1<<PG1)); //rd=0
for(reg_name=8;reg_name;reg_name--)
{
asm volatile ("nop"::);
}
reg_name=PINA;
PORTG |= (1<<PG1);//rd=1
PORTB |= (1<<PB5);//rs=1
PORTB &= (~(1<<PB6));//cs2=0
return reg_name;
}
void lcm_init(void)
{
uint16_t addr=(uint16_t)init_paras;
uint8_t i;
PORTB |= (1<<PB6);
PORTB |= (1<<PB5);
PORTG |= (1<<PG0);
PORTG |= (1<<PG1);
lcm_timer=4;
while(lcm_timer);
PORTG |= (1<<PG4);
PORTG |= (1<<PG3);
lcm_timer=24;
while(lcm_timer);
for(i=39;i;i--)
{
lcm_reg_write(pgm_read_byte(addr),pgm_read_byte(addr+39));
addr++;
}
lcm_clr();
}
void lcm_clr(void)
{
// uint8_t i;
lcm_reg_write(LCMR_PNTR,0);
lcm_reg_write(LCMR_FNCR,(lcm_reg_read(LCMR_FNCR) | 0X08));
lcm_reg_write(LCMR_WLCR,0XC5);
set_position(0,0);
lcm_data_write(0);
}
void set_position(uint8_t x,uint8_t y)
{
lcm_reg_write(LCMR_CPXR,x);
lcm_reg_write(LCMR_CPYR,y);
}
//在x,y处显示置于flash中的字符串
//x,y--显示座标
//str 待显示字符串地址
//mode的456用于设置WCCR的456位
void display_rom_string(uint8_t x,uint8_t y,uint16_t str,uint8_t mode)
{
set_text_mode();
set_position(x,(y<<4));
lcm_reg_write(LCMR_WCCR,((lcm_reg_read(LCMR_WCCR) & 0X8F) | (mode & (~0x8f)) | 0x08));
mode=pgm_read_byte(str++);
while(mode)
{
lcm_data_write(mode);
mode=pgm_read_byte(str++);
}
}
const uint8_t the_str[] PROGMEM = "Hello!你好!";
void main(void)
{
init_devices();
lcm_init();
display_rom_string(0,0,(uint16_t) the_str,0x30);
while(1);
} 上过ATMEGA64试吗? 楼主的屏有触摸功能吗?我这两天正搞这个.那个7843读出的数据很不稳,头疼死了! 我用内部控制的更麻烦。没触摸也有中断信号出来 7843是个很成熟的IC,就是个AD转换器,是需要在软件下做下滤波! 3楼,内部中断是有问题的,芯片缺陷! 5楼正解,这是台湾控制ic的缺陷。所以模块制造厂家加了7843到板上去,不用模块内部的触摸功能。还是挺好用的。 我后来也知道是这个问题。。。。。只是浪费了不少时间而已。
不过金鹏的售后还是做得不错的 这程序贴的不全 请问楼主,那个手册里面不是有基本的读写程序吗?楼主是主要修改的哪里调试成功呢? 标记!mark
!!
页:
[1]