本帖最后由 文少 于 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[0]; i <= 11; i++){
- digitalWrite(i,temp & 0x80);
- temp <<= 1;
- }
- en_down(); //EN下降沿
- temp=(command & 0x0f)<<4;
- for (i=DB[0]; 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[0]; i <= 11; i++)
- {
- digitalWrite(i,temp & 0x80);
- temp <<= 1;
- }
- en_down(); //EN下降沿
- temp=(dat & 0x0f)<<4;
- for (i=DB[0]; 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);
- }
复制代码
|