⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602.c

📁 基于lcd1602的lcd液晶显示器
💻 C
字号:
//头文件
#include<reg52.h>
#include<absacc.h>

//所用的端口
#define WI_1602 XBYTE[0xd000]//写指令 
#define WD_1602 XBYTE[0xd100]//写数据
#define RI_1602 XBYTE[0xd200]//读状态
#define RD_1602 XBYTE[0xd300]//读数据


//需要用的定义
typedef unsigned char uchar;
typedef unsigned int uint;



/* ************      函数声明域       ************** */

void delay1ms(uint i);//延时1ms子程序
uchar Read_1602(void);//读状态,返回一个uchar类型的数据,当此数据为0x80时,为忙,否则不忙
void WriteI_1602(uchar i);//写指令
void InitWriteI_1602(uchar i);//初始时写指令,不用判忙
void WriteD_1602(uchar i,uchar address);//写数据,address为要写入的地址
void Init_ts1602(void);//初始化1602

/**************       全局变量域        *****************/
uchar code dzxh[]={' ',0xfa,0xfb,' ','D','o','n','\'','t',' ','G','o','!','O','K','?'};//字符数组,字符库是ASCII码
uchar code dzxh1[]=" Hello!!!  My name is Tang Xiaozheng,I'm from China.Nice to meet you!      ";//字符数组,字符库是ASCII码



/*************        主程序域         **************/
main()
{
    uchar i,j;
    Init_ts1602();//首先一定要初始化
    while(1)
	for(j=0;j<55;j++)//j是用来移动的
	{
	    WriteI_1602(0x01);//显示清屏
        for(i=0x0;i<=16;i++)//显示字符
	       WriteD_1602(dzxh[i],i);//在当前位置写入数据
	    
	    for(i=0x40;i<0x50;i++)//带移动显示字符组
 	    	WriteD_1602(dzxh1[i-0x40+j],i);//在当前位置写入数据

		delay1ms(500);//决定移动的时间间隔
	}

   

    
       while(1);//最好写上这个,否则屏幕会一闪一闪
}

/************************************************************/

//                    以下是函数部分                        //

/************************************************************/


void delay1ms(uint i)//延时1ms子程序
{                    //当i取uint,y取uchar,y=150,晶振为12M时,比较准确
    uchar y;
    while(i--)
	{
	    for(y=0;y<150;y++);
	}
}

//读状态,返回一个uchar类型的数据,当此数据为0x80时,为忙,否则不忙
uchar Read_1602(void)
{
    uchar busy;//用来判断是否忙,0x80为忙
    busy=(RI_1602&0x80);//读取状态,最高位为判忙,提取最高位
	return busy;
}

//写指令
void WriteI_1602(uchar i)
{
    while(Read_1602()==0x80);//不忙了再写指令
    WI_1602=i;   
}

//初始时写指令,不用判忙
void InitWriteI_1602(uchar i)
{
  WI_1602=i;
}

//写数据
void WriteD_1602(uchar i,uchar address)//写数据,address为要写入的地址
{
    WriteI_1602(0x80|address);
    while(Read_1602()==0x80);//不忙了再写数据
	WD_1602=i;
}

void Init_ts1602(void)//严格按照液晶的文档来写的,所以会有刚开始的3个delay1ms()函数
{
    delay1ms(15);
	InitWriteI_1602(0x38);//显示模式设置
	delay1ms(5);
	InitWriteI_1602(0x38);
	delay1ms(5);
	InitWriteI_1602(0x38);
	WriteI_1602(0x38);
	WriteI_1602(0x08);//关闭显示
	WriteI_1602(0x01);//显示清屏
    WriteI_1602(0x06);//显示光标移动设置
	WriteI_1602(0x0f);//显示开及光标设置
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -