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

2020-02-05 09:28发布

花了比較長的時間才理解明白,當中還受到了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);
}


     
     

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
onlyer
1楼-- · 2020-02-05 13:48
mark,帮顶
raxb
2楼-- · 2020-02-05 15:26
其实也还容易了,坛里有高手用1个IO口搞定的
renmin
3楼-- · 2020-02-05 16:51
支持一下,谢谢分享
downtoearth
4楼-- · 2020-02-05 22:36
 精彩回答 2  元偷偷看……

一周热门 更多>