LCD1602程序

配置:

ATMega16L @3.3V @7.3728MHz

1602B LCD @5.0V @6 lines

Compiler: WinAVR 20060125

#include <avr/io.h>

#define LCD_EN_PORT     PORTC

#define LCD_RW_PORT     PORTC

#define LCD_RS_PORT     PORTC

#define LCD_DATA_PORT   PORTA

#define LCD_DATA_DDR    DDRA

#define LCD_DATA_PIN    PINA

//LCD的 r/w 脚直接接 GND

#define LCD_EN          0x80    //portd7         out

#define LCD_RS          0x40    //portc6         out

#define LCD_DATA        0xF0    //porta 4/5/6/7    out

/*--------------------------------------------------------------------------------------------------

Public function prototypes

--------------------------------------------------------------------------------------------------*/

void LCD_init          (void);

void LCD_en_write      (void);

void LCD_write_char    (unsigned command,unsigned data);

void LCD_set_xy        (unsigned char x, unsigned char y);

void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);

void delay_nus         (unsigned int n);

void delay_nms         (unsigned int n);

void LCD_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);

}

void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)

{

LCD_set_xy( X, Y ); //写地址

   

while (*s) {

     LCD_write_char( 0, *s );

    s ++;

}

}

  

void LCD_set_xy( unsigned char x, unsigned char y )   //写地址函数

{

unsigned char address;

if (y == 0)

    address = 0x80 + x;

else

    address = 0xc0 + x;

      

LCD_write_char(address, 0 );

}

void LCD_en_write(void)   //液晶使能

{

   LCD_EN_PORT |= LCD_EN;

   delay_nus(1);

   LCD_EN_PORT &= ~LCD_EN;

}

void LCD_write_char(unsigned command,unsigned data) // 写数据

{

unsigned command_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();

   }

}

int main(void)

{

LCD_init();

LCD_write_string(0,0,"Hello,AVR WORLD!!!");

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

while(1);

}

    /*-----------------------------------------------------------------------

延时函数

系统时钟:8M

-----------------------------------------------------------------------*/

void delay_1us(void)                  //1us延时函数

   {

    asm("nop");

   }

void delay_nus(unsigned int n)        //N us延时函数

   {

    unsigned int i=0;

    for (i=0;i<n;i++)

    delay_1us();

   }

  

void delay_1ms(void)                  //1ms延时函数

   {

    unsigned int i;

    for (i=0;i<1356;i++);

   }

  

void delay_nms(unsigned int n)        //N ms延时函数

   {

    unsigned int i=0;

    for (i=0;i<n;i++)

    delay_1ms();

   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值