当前位置:首页 > 单片机 > 单片机
[导读] 配置:ATMega16L@3.3V@7.3728MHz1602BLCD@5.0V@6linesCompiler:WinAVR20060125我自己搭的万用板,1602用5V供电,M16用3.3V供电。为了使LCD尽快投入运转,同时也因为懒惰...便参考了网站上很多的1602的帖

配置:

ATMega16L@3.3V@7.3728MHz
1602BLCD@5.0V@6lines
Compiler:WinAVR20060125

我自己搭的万用板,1602用5V供电,M16用3.3V供电。为了使LCD尽快投入运转,同时也因为懒惰...便参考了网站上很多的1602的帖子,包括网站收集帖,程序下载后稍加修改,编译通过,下载到M16中,总是没有反应。

在这个过程中,我确信我的1602硬件是没有问题的,因为我手头上有个以前用51做的时间温度计(1602+18B20),放到上面都能正常显示。

整个过程中,感觉不管是网站收集的精华帖,还是普通帖子里面的1602程序,冗长繁杂...比如我在一个帖子中,看到的一个1602的初始化函数,居然用了10几行代码!我在51中,不过也就4句而已啊...


后来,遇到了下面的程序,简明扼要,一次成功。当然,这也是从论坛中COPY的,我做了一些修改:


#include

#defineLCD_EN_PORTPORTC
#defineLCD_RW_PORTPORTC
#defineLCD_RS_PORTPORTC
#defineLCD_DATA_PORTPORTA
#defineLCD_DATA_DDRDDRA
#defineLCD_DATA_PINPINA

//LCD的r/w脚直接接GND
#defineLCD_EN0x80//portd7out
#defineLCD_RS0x40//portc6out
#defineLCD_DATA0xF0//porta4/5/6/7out

/*--------------------------------------------------------------------------------------------------
PublICfunctionprototypes
--------------------------------------------------------------------------------------------------*/
voidLCD_init(void);
voidLCD_en_write(void);
voidLCD_write_char(unsignedcommand,unsigneddata);
voidLCD_set_xy(unsignedcharx,unsignedchary);
voidLCD_write_string(unsignedcharX,unsignedcharY,unsignedchar*s);
voiddelay_nus(unsignedintn);
voiddelay_nms(unsignedintn);


voidLCD_init(void)//液晶初始化
{
delay_nms(15);

DDRA|=LCD_DATA;//数据为输出
DDRC|=LCD_RS|LCD_EN;//置位RS.EN

LCD_write_char(0x28,0);//4位显示
LCD_write_char(0x0c,0);//显示开
LCD_write_char(0x01,0);//清屏

delay_nms(60);
}

voidLCD_write_string(unsignedcharX,unsignedcharY,unsignedchar*s)
{
LCD_set_xy(X,Y);//写地址

while(*s){
LCD_write_char(0,*s);
s++;
}
}

voidLCD_set_xy(unsignedcharx,unsignedchary)//写地址函数
{
unsignedcharaddress;

if(y==0)
address=0x80+x;
else
address=0xc0+x;

LCD_write_char(address,0);
}

voidLCD_en_write(void)//液晶使能
{
LCD_EN_PORT|=LCD_EN;
delay_nus(1);
LCD_EN_PORT&=~LCD_EN;
}
voidLCD_write_char(unsignedcommand,unsigneddata)//写数据
{
unsignedcommand_temp,data_temp;

command_temp=command;
data_temp=data;
delay_nus(16);

if(command==0){
LCD_RS_PORT|=LCD_RS;//RS=1
LCD_DATA_PORT&=0X0f;
LCD_DATA_PORT|=data_temp&0xf0;//写高四位

LCD_en_write();

data_temp=data_temp<<4;
LCD_DATA_PORT&=0X0f;
LCD_DATA_PORT|=data_temp&0xF0;//写低四位

LCD_en_write();
}
else{
LCD_RS_PORT&=~LCD_RS;//RS=0
LCD_DATA_PORT&=0X0f;
LCD_DATA_PORT|=command_temp&0xF0;//写高四位

LCD_en_write();

command_temp=command_temp<<4;
LCD_DATA_PORT&=0x0F;
LCD_DATA_PORT|=command_temp&0xF0;//写低四位

LCD_en_write();
}
}



intmain(void)
{

LCD_init();

LCD_write_string(0,0,"Hello,AVRWORLD!!!");
LCD_write_string(0,1,"hitro@tom.com");

while(1);

}
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
voiddelay_1us(void)//1us延时函数
{
asm("nop");
}

voiddelay_nus(unsignedintn)//Nus延时函数
{
unsignedinti=0;
for(i=0;idelay_1us();
}

voiddelay_1ms(void)//1ms延时函数
{
unsignedinti;
for(i=0;i<1356;i++);
}

voiddelay_nms(unsignedintn)//Nms延时函数
{
unsignedinti=0;
for(i=0;idelay_1ms();
}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭