关于1602lcd显示的问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4943|回复: 5

关于1602lcd显示的问题

[复制链接]
发表于 2013-4-5 12:51 | 显示全部楼层 |阅读模式
求解下面程序,其中PORTC的低四位和1602的高四位数据口相连,rw直接接地了!驱动方式采用四线驱动!

#include <mega16.h>
#include <delay.h>
#define uint unsigned int
#define uchar unsigned char
#define lcden PORTC.4
#define lcdrs PORTC.5

void write_com(uchar com)
{
   lcdrs=0;
   PORTC=PORTC&0xf0;
   PORTC=(com>>4)&0x0f;
   delay_us(1);
   lcden=1;
   delay_us(1);
   lcden=0;  

   PORTC=PORTC&0xf0;
   PORTC=com&0x0f;
   delay_us(1);
   lcden=1;
   delay_us(1);
   lcden=0;   
}

void write_date(uchar date)
{
   lcdrs=1;
   PORTC=PORTC&0xf0;
   PORTC=(date>>4)&0x0f;
   delay_us(1);
   lcden=1;
   delay_us(1);
   lcden=0;  

   PORTC=PORTC&0xf0;
   PORTC=date&0x0f;
   delay_us(1);
   lcden=1;
   delay_us(1);
   lcden=0;   
}

void lcd_init()
{
    DDRC=0xff;
    lcden=0;
    write_com(0x28);
    write_com(0x06);
    write_com(0x0c);
    write_com(0x01);
}

void main()
{
    lcd_init();
    DDRA=0xff;
    PORTA=0xff;
    while(1)
    {  
        write_date('a');
    }
}


发表于 2013-4-5 13:16 | 显示全部楼层
参考下arduino的

[mw_shl_code=cpp,true]int LCD1602_RS=12;//数据/命令选择端   

int LCD1602_RW=11;//读写选择端   

int LCD1602_EN=10;//使能信号   

int DB[] = { 6, 7, 8, 9};//数据输入输出端

char str1[]="Coloz's";

char str2[]="Robot";
/********************************************************************/



/********************************************************************/
void LCD_Command_Write(int command)//LCD指令控制,
{
int i,temp;
digitalWrite( LCD1602_RS,LOW);
digitalWrite( LCD1602_RW,LOW);//RS低,RW低,E高脉冲(下面为脉冲信号生成),写指令
digitalWrite( LCD1602_EN,LOW);

temp=command & 0xf0;//0xf0,设置数据D4-7方向为输出,D0-3为输入
for (i=DB[0]; i <= 9; i++)
{
   digitalWrite(i,temp & 0x80);//0x80+地址,设置LCD第一行的数据指针初始地址
   temp <<= 1;
}

digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);//生成脉冲信号

temp=(command & 0x0f)<<4;
for (i=DB[0]; i <= 10; i++)
{
   digitalWrite(i,temp & 0x80);//0x80+地址,设置LCD第一行的数据指针初始地址
   temp <<= 1;
}

digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);//生成脉冲信号
}


/********************************************************************/
void LCD_Data_Write(int dat)
{

int i=0,temp;
digitalWrite( LCD1602_RS,HIGH);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW);

temp=dat & 0xf0;
for (i=DB[0]; i <= 9; i++)
{
   digitalWrite(i,temp & 0x80);//0x80+地址,设置LCD第一行的数据指针初始地址
   temp <<= 1;
}

digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);//生成脉冲信号

temp=(dat & 0x0f)<<4;
for (i=DB[0]; i <= 10; i++)
{
   digitalWrite(i,temp & 0x80);//0x80+地址,设置LCD第一行的数据指针初始地址
   temp <<= 1;
}

digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);//生成脉冲信号
}


/********************************************************************/
void LCD_SET_XY( int x, int y )//设置光标位置,X为横,Y为竖
{
int address;
if (y ==0)    address = 0x80 + x;//0x80+地址,设置LCD第一行的数据指针初始地址,表示在1602第一行显示
else          address = 0xc0 + x;//0xc0+地址,设置LCD第二行的数据指针初始地址,表示在1602第二行显示
LCD_Command_Write(address);
}


/********************************************************************/
void LCD_Write_Char( int x,int y,int dat)
{
LCD_SET_XY( x, y );
LCD_Data_Write(dat);
}


/********************************************************************/
void LCD_Write_String(int X,int Y,char *s)//打印*s,X为横,Y为竖,*s为输出字符
{
    LCD_SET_XY( X, Y );    //设置地址
    while (*s)             //写字符串
    {
      LCD_Data_Write(*s);
      s ++;
    }
}



/********************************************************************/
void setup (void)
{
int i = 0;
for (i=6; i <= 12; i++)
   {
     pinMode(i,OUTPUT);
   }
//delay(100);
LCD_Command_Write(0x01);//0x01清屏:数据指针清零,所有显示清零
//delay(50);
LCD_Command_Write(0x28);//0x28设置4位数据接口
//delay(50);
LCD_Command_Write(0x06);//0x06显示开,当读或写一个字符后,地址指针自动加1,
//delay(50);
LCD_Command_Write(0x0c);//0x0c+地址,设置LCD第二行的数据指针初始地址
//delay(50);
LCD_Command_Write(0x80);//0x80+地址,设置LCD第一行的数据指针初始地址
//delay(50);

}


/********************************************************************/
void loop (void)
{
   LCD_Command_Write(0x02);//回车,数据指针清零
   delay(50);
   LCD_Write_String(3,0,str1);//第1行,第4个地址起,打印str1
   delay(50);
   LCD_Write_String(1,1,str2);//第2行,第2个地址起,打印str2
   while(1);
}[/mw_shl_code]
 楼主| 发表于 2013-7-15 10:34 | 显示全部楼层
顶一个哈!
发表于 2013-7-16 16:22 | 显示全部楼层
发表于 2013-7-16 18:17 | 显示全部楼层
{:soso_e113:}
 楼主| 发表于 2013-7-17 19:20 | 显示全部楼层
奈何col 发表于 2013-4-5 13:16
参考下arduino的

[mw_shl_code=cpp,true]int LCD1602_RS=12;//数据/命令选择端   

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-29 06:46 , Processed in 0.077551 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表