打印
[AVR单片机]

用AVR GCC 编写的1602驱动程序 为什么总是不显示

[复制链接]
1250|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
激昂的青春|  楼主 | 2012-11-13 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<avr/io.h>
#define  uchar unsigned char
#define  uint  unsigned int
void delay(uint ms)
{
        uint i,j;
for(i=0;i<ms;i++)
    {
    for(j=0;j<1141;j++);
       }
}
void write_com(uchar com)
{
    PORTC&=~_BV(0);//rs为低电平
    PORTC&=~_BV(1);//rw为低电平
    PORTA=com;
    PORTC&=_BV(2);//开使能
    delay(5);
    PORTC&=~_BV(2);//关使能
}
void write_dat(uchar dat)
{   
    PORTC|=_BV(0);//rs为高电平
    PORTC&=~_BV(1);//rw为低电平
    PORTA=dat;
    PORTC&=_BV(2);//开使能
    delay(5);
    PORTC&=~_BV(2);//关使能
}

void lcd_init()
{
      
   PORTC&=~_BV(2);//关使能
  
   write_com(0X38);
delay(5);
   write_com(0X01);//清零指令
delay(5);
   write_com(0X0C);//0X0F 显示光标并闪烁
  delay(5);
   write_com(0X06);
  delay(5);
}
int main()
{
  
   lcd_init();
   DDRA=0XFF;
   DDRC=0XFF;
    while(1)
     {
        MCUCSR|=(1<<7);   //关闭JTAG
        MCUCSR|=(1<<7);
        write_com(0X80+0X10);//显示起始位
        delay(5);
        write_dat(0X41);
     
     }
}

相关帖子

沙发
john_lee| | 2012-11-13 23:26 | 只看该作者
首先一个问题,楼主写的delay,可能被编译器优化掉,从而造成时序错误。
解决方法是,使用 avr gcc 自带的 _delay_ms() 函数,这个函数的详解:http://www.nongnu.org/avr-libc/u ... p__util__delay.html

使用特权

评论回复
板凳
激昂的青春|  楼主 | 2012-11-14 13:08 | 只看该作者
#include<avr/io.h>
#define  uchar unsigned char
#define  uint  unsigned int
#include <util/delay.h>


void write_com(uchar com)
{
    PORTC&=~_BV(0);//rs为低电平
    PORTC&=~_BV(1);//rw为低电平
    PORTA=com;
    PORTC&=_BV(2);//开使能
    _delay_ms(5);
    PORTC&=~_BV(2);//关使能
}

void write_dat(uchar dat)
{   
    PORTC|=_BV(0);//rs为高电平
    PORTC&=~_BV(1);//rw为低电平
    PORTA=dat;
    PORTC&=_BV(2);//开使能
   _delay_ms(5);
    PORTC&=~_BV(2);//关使能
}



void lcd_init()
{
      
   PORTC&=~_BV(2);//关使能
  
   write_com(0X38);
_delay_ms(5);
   write_com(0X01);//清零指令
_delay_ms(5);
   write_com(0X0C);//0X0F 显示光标并闪烁
_delay_ms(5);
   write_com(0X06);
_delay_ms(5);
}

int main()
{
  
   lcd_init();
   DDRA=0XFF;
   DDRC=0XFF;
    while(1)
     {
        MCUCSR|=(1<<7);   //关闭JTAG
        MCUCSR|=(1<<7);
        write_com(0X80+0X10);//显示起始位
       _delay_ms(5);
        write_dat(0X41);

     
     }
}
改了还是不行   我用的是AVRSTUDIO 内嵌GCC编译的

使用特权

评论回复
地板
john_lee| | 2012-11-14 13:30 | 只看该作者
要先定义一个_FCPU的宏,不知楼主定义没有,如果定义了,那就只有对照时序逻辑检查代码了。

使用特权

评论回复
5
激昂的青春|  楼主 | 2012-11-14 13:32 | 只看该作者
定义了 8000000

使用特权

评论回复
6
john_lee| | 2012-11-14 13:37 | 只看该作者
还有,
PORTC&=~_BV(0);//rs为低电平
PORTC&=~_BV(1);//rw为低电平
这种写法虽然是标准的通用写法,但正是因为通用,所以抽象的层次太高,离项目的理想要求比较远,看着太累,并且还要辅以注释。
如果能这样写:
RS = 0;
RW = 0;
是不是看起来要好得多?

使用特权

评论回复
7
激昂的青春|  楼主 | 2012-11-14 13:46 | 只看该作者
我刚学AVR要学的东西很多 谢谢指教  51能驱动的   为什么AVR不可以了:dizzy:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

4

帖子

0

粉丝