ATMEGA8L 驱动1602屏的问题
本帖最后由 文少 于 2014-2-18 11:40 编辑原来用的ATMEGA168,1602接的4线方式,工作良好,百分百能够初始化成功。因为要做一些别的东西,用M168成本太高,于是用M8L,外部晶振8M,Bootloader也没有问题。但用同样的1602代码却没有办法成功初始化,开机基本是乱码,有时按多几次按键(有刷新屏显的内容人)却又显示正常;有时乱按正常了,再按复位又是初始化正常的,很奇怪。
曾分析如下:
1. M8L的复位电路和M168的一样,上拉10K,104到地,换过102,103都一样。
2. 1602的EN使能延时原是3微秒,延时改来改去,再没有效果。
3. 修改驱动的指令延时,没有效果。
4. 开机时增加几百MS的延时再作初始化,没有效果。
5. 晶振,晶振电容都换了,不行。
6. 在原硬件基础上,装上M168和16M晶振,工作非常好,郁闷!
7. 人快疯了。。。求助!
原用的4线1602驱动代码如下:
void setup() {
for (i=8; i <= 13; i++){ //Pin8~13端口为LCD驱动输出
pinMode(i,OUTPUT);
}
lcd_init(); //LCD初始化
}
void loop(){
}
//-----------------------LCD 初始化----------------------------
void lcd_init(){
for (i=1;i <=51; i++){ //4线 2行 5x7
LCD_C_W(0x28);
delay(5);
}
LCD_C_W(0x06); //设定输入方式,增量不移位
delay(5);
LCD_C_W(0x0c);
delay(5);
LCD_C_W(0x80);
delay(5);
LCD_C_W(0x01); //清屏
delay(5);
}
//-------------------LCD命令写入 ------------------------
void LCD_C_W(int command){
int i,temp;
digitalWrite( lcd_RS,0);
digitalWrite( lcd_EN,0);
temp=command & 0xf0;
for (i=DB; i <= 11; i++){
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
en_down(); //EN下降沿
temp=(command & 0x0f)<<4;
for (i=DB; i <= 12; i++){
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
en_down(); //EN下降沿
}
//--------------------LCD数据写入-----------------------
void LCD_D_W(int dat)
{
int i,temp;
digitalWrite( lcd_RS,1);
digitalWrite( lcd_EN,0);
temp=dat & 0xf0;
for (i=DB; i <= 11; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
en_down(); //EN下降沿
temp=(dat & 0x0f)<<4;
for (i=DB; i <= 12; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
en_down(); //EN下降沿
}
//--------------------LCD X,Y轴------------------------
void LCD_xy( int x, int y )
{
int address;
if (y ==0) address = 0x80 + x;
else address = 0xC0 + x;
LCD_C_W(address);
}
//---------------------LCD字符写入------------------------
void LCD_W_C( int x,int y,int dat)
{
LCD_xy( x, y );
LCD_D_W(dat);
}
//----------------------LCD字符串写入---------------------
void LCD_W_S(int X,int Y,char *s)
{
LCD_xy( X, Y ); //设置地址
while (*s) //写字符串
{
LCD_D_W(*s);
s ++;
}
}
//---------------------- LCD的EN下降沿 --------------------
void en_down(){
digitalWrite( lcd_EN,1);
delayMicroseconds(3);
digitalWrite( lcd_EN,0);
}
按道理说应该是没什么问题的,你换一个芯片试试,这点程序才几K,用51都很轻松的控制它的。 本帖最后由 小小弧 于 2014-2-14 22:52 编辑
大哥。我和你一样的问题,上电后LCD不显示任何东西,按下reset。全部正常,再按下reset后LCD又恢复不显示,我总不能每次上电后再按reset吧,另外你按串口监视,和按reset可以起到相同的效果。郁闷。
补充一下,我也用的4线LCD。用mini板子或者nano板子,毛病都一样的。 小小弧 发表于 2014-2-14 22:51 static/image/common/back.gif
大哥。我和你一样的问题,上电后LCD不显示任何东西,按下reset。全部正常,再按下reset后LCD又恢复不显示, ...
你也用MEGA8L吗? 和你的情况不完全一样,这个问题一直没搞定~ 程序沒有定義接腳及一些設定,重要的 void loop 也漏了(),這程序理論上了無法過得編譯器的,為何可運行? 本帖最后由 文少 于 2014-2-18 11:39 编辑
eddiewwm 发表于 2014-2-16 18:39 static/image/common/back.gif
程序沒有定義接腳及一些設定,重要的 void loop 也漏了(),這程序理論上了無法過得編譯器的,為何可運行?
贴代码时把LOOP的内容delete了,删多了...我去补上.
贴中的问题不是这个原因~~
页:
[1]