查看: 2029|回复: 1
打印 上一主题 下一主题

發個剛弄好的1602 4線驅動,仿真通過

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-23 20:31:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
花了比較長的時間才理解明白,當中還受到了1份錯誤的文檔導至設定4線模式寄存器錯誤.
以下是1602頭文件代碼:
#ifndef __lcd1602_H__
#define __lcd1602_H__

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit rs=P1^1;//RS接P1.1
sbit rw=P1^2;//RW接1.2
sbit en=P1^3;//EN接P1.3
#define lcdbus P1//LCD總線接P1高4位,P1.4-DB4/P1.5-DB5/P1.6-DB6/P1.7-DB7/


uchar code table2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0,1,2,3,4,5,6,7,8,9



//--------延時
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}

//////////查忙
/*void chk_bus(void)
{
        rs=0;
        rw=1;
        en=1;
        while(lcdbus&0x80);
        en=0;
}
*/
//--------1602寫命令4bit
void write_com(uchar com)
{
    //chk_bus();
        rs=0;//RS=0寫命令
        rw=0;
        en=1;
        lcdbus=(com&0xf0)|(lcdbus&0xf);//將高4位命令與P1低4位組合后送出到LCD
        en=0;        
        delay(5);
        en=1;
        lcdbus=((com&0xf)<<4)|(lcdbus&0xf);//將低4位命令與P1低4位組合后送出到LCD
        en=0;
        

}
//--------1602寫數據4bit
void write_date(uchar date)
{   
    //chk)bus();
        rs=1;//RS=1寫數據
        rw=0;
        en=1;
        lcdbus=(date&0xf0)|(lcdbus&0xf);//將高4位數據與P1低4位組合后送回lcdbus端口
        en=0;        
        delay(5);
        en=1;
        lcdbus=((date&0xf)<<4)|(lcdbus&0xf);//將低4位數據與P1低4位組合后送回lcdbus端口
        en=0;
}

//--------1602初始化
void lcdinit()
{   

    write_com(0x02);//光標復位
        write_com(0x28);//28=4bit模式/38=8bit模式
        write_com(0x0c);//1100//11開顯示/光開開關/閃爍開關
        write_com(0x06);//110//1=AC+1,0=AC-1,/1=畫面平移,0=畫面不動
        write_com(0x01);//清屏*/
}
//--------1602确定位置
void LcdPos(uchar xPos,uchar yPos)   
{   
        uchar tmp;
    if(xPos>15)xPos=15;//x位置不能達於15      
    if(yPos>1)yPos=1;  //Y位置不能大於1
    if(yPos==0)        
                tmp=xPos+0x80; //第1行從0x80開始
    else
       tmp=xPos+0xc0; //第2行從0xC開始
       write_com(tmp); //將地址寫入LCD
}
//--------1602指定位置輸入單個字符
void write_char(uchar xPos,uchar yPos,uchar c)
{     
    LcdPos(xPos,yPos); //調用位置確定程序
    write_date(c); //寫入數據
}

//---------1602指定位置寫字符串
void write_char1(uchar xPos,uchar yPos,uchar *date)
{        
        LcdPos(xPos,yPos); //調用位置確定程序
    while(*date>0)write_date(*date++);//連續寫入字符串
}
//////////////////////////////////////////////

#endif

主程序測試代碼:

#include"lcd1602.h"//調用LCD1602頭文件

void main()
{
    lcdinit(); //LCD初始化        
    write_char1(1,0,"Heoll LCD1602!"); //第1行寫入字符串
    write_char1(1,1,"2012.5.5");  //第2行寫入字符串         

        while(1);
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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