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

📄 1602.c

📁 用C语言编写的1602lcd模块驱动程序
💻 C
字号:
/*=======================================
                         1602lcd模块驱动程序
==========================================

说明:1.晶体:11.0592MHz
     2.1602驱动:ks0066
    
******************************************/
#include <reg52.h>
#include <string.h>

#define uchar unsigned char
#define uint  unsigned int 
#define lcd_data  P0			//定义P2口为数据口

sbit  lcd_rs  = P2^0 ;           //寄存器选择
sbit  lcd_rw  = P2^1 ;       //读/写控制
sbit  lcd_e   = P2^2 ;           //读/写使能
//sbit  lcd_blk = P1^0 ;      //背光led   1.off 0.on



//函数声明
void delay5ms(void);
void delay400ms(void);
void lcd_write_command(uchar wc_lcd,busy_c);


/***********************************
//函数名称:    void lcd_ini(void)
//传递参数:    无
//返 回 值:    无
//函数功能:    LCD初始化
//函数说明:
***********************************/
void lcd_ini(void)
{
    lcd_data = 0;
    lcd_write_command(0x38,0);        //16*2显示,5*7点阵,8位数据接口,不检测忙
    delay5ms();
//    lcd_write_command(0x38,0);
//    delay5ms();
//    lcd_write_command(0x38,0);        //三次显示模式, 不检测忙
//    delay5ms();
    lcd_write_command(0x38,1);        //16*2显示,5*7点阵,8位数据接口,需要检测忙
//    lcd_write_command(0x80,1);        //关闭显示
    lcd_write_command(0x01,1);        //clear显示    
    lcd_write_command(0x06,1);        //指针和光标+1,不滚屏
    lcd_write_command(0x0c,1);        //开显示,不显示光标
}

/***********************************
//函数名称:    uchar lcd_read_status(void)
//传递参数:    无
//返 回 值:    uchar
//函数功能:    读lcm状态,等待lcd空闲
//函数说明:    DB7=1,忙
***********************************/
uchar lcd_read_status(void)
{
    lcd_data=0xff;
    lcd_rs=0;
    lcd_rw=1;
    lcd_e=0;
    lcd_e=0;
    lcd_e=1;
    while(lcd_data & 0x80);	  //如果DB7为1表示忙,则死循环等待
    return lcd_data;
}

/***********************************
//函数名称:    void lcd_write_data(uchar wd_lcd)
//传递参数:    uchar  wd_lcd
//返 回 值:    无
//函数功能:    lcd写数据
//函数说明:    
***********************************/
void lcd_write_data(uchar wd_lcd)
{
    lcd_read_status();            //判断lcd忙标志
    lcd_data = wd_lcd;
    lcd_rs = 1;
    lcd_rw = 0;
    lcd_e = 0;
    lcd_e = 0;
    lcd_e = 1;
}

/***********************************
//函数名称:    void lcd_write_command(uchar wc_lcd, busy_c)
//传递参数:    uchar wc_lcd, busy_c
//返 回 值:    无
//函数功能:    lcd写命令
//函数说明:    busy_c=0 是表示不用检测忙信号
***********************************/
void lcd_write_command(uchar wc_lcd, busy_c)
{
    if (busy_c)
        lcd_read_status();
    lcd_data = wc_lcd;
    lcd_rs=0;
    lcd_rw = 0;
    lcd_e = 0;
    lcd_e = 0;
    lcd_e = 1;
}

/***********************************
//函数名称:    void disp_one_char(uchar x, uchar y,uchar disp_data)
//传递参数:    uchar x, uchar y,uchar disp_data
//返 回 值:    无
//函数功能:    指定位置显示 一个 字符
//函数说明:    
***********************************/
void disp_one_char(uchar x,uchar y,uchar disp_data)
{
    y = y&0x01;
    x = x&0x0f;                  //限制2行,没行15个字
    if (y)
      x =x + 0x40;          //算RAM地址,假如y为1则表示第二行,x地址就从40H开始
    x = x + 0x80;			//两行的地址的最高位DB7都要恒为1
    lcd_write_command(x,0);
    lcd_write_data(disp_data);
}

/***********************************
//函数名称:    void disp_one_char(uchar x, uchar y,uchar *disp_data)
//传递参数:    uchar x, uchar y,uchar *disp_data
//返 回 值:    无
//函数功能:    指定位置显示 一串 字符
//函数说明:    
***********************************/    
void disp_list_char(uchar x,uchar y,uchar *disp_data)  //x表示列位置,从0到15共16位,y表示行,从0到1共2行
{
    uchar char_length,j;
    char_length = strlen(disp_data);
    y = y&0x01;
    x = x&0x0f;
    for (j=0;j<char_length;j++)
    {
        disp_one_char( x,y,disp_data[j]);        //显示一个字符
        x++;
    }
}

/***********************************
//函数名称:    void delay5ms(void)
//传递参数:    无
//返 回 值:    无
//函数功能:    延时5MS
//函数说明:
***********************************/
void delay5ms(void)
{
    uint TempCyc = 5552;
    while(TempCyc--);
}


/***********************************
//函数名称:    void delay400ms(void)
//传递参数:    无
//返 回 值:    无
//函数功能:    L延时400MS
//函数说明:    LCD开机延时
***********************************/

/*					    
void delay400ms(void)
{
    uchar TempCycA = 5;
    uint  TempCycB;
    while(TempCycA--)
    {
        TempCycB=7269;
        while(TempCycB--);
    };
}							 

/*****d******************************
//函数名称:    void main(void)
//传递参数:    无
//返 回 值:    无
//函数功能:    主函数
//函数说明:    
************************************/
void main(void)
{ 
   	uint key,x=0;
    delay5ms();	
    lcd_ini();				    //lcd初始化
	while((key=P2&0xf0)==0xf0)		   //Wellcome流动效果
	{								  
    disp_list_char(x,0,"->Wellcome->    ");	  // 开机首屏幕
	x++;
	
    disp_list_char(0,1,"^Happy new year^");	  // 问候语	
	delay5ms();delay5ms();delay5ms();delay5ms();delay5ms();
	delay5ms();delay5ms();delay5ms();delay5ms();delay5ms();	  //10个delay5毫秒

	}														  //要按定任一键约1秒才跳出循环
  
    while(1)
	{
	 key=0;
	 key=P2&0xf0;	  //键盘扫描

	 switch(key)
	  { case  0xe0:
	      {
           disp_list_char(0,0," Do you want to ");
		   disp_list_char(0,1,"send Record 01 ?");	  

		   }break; 
	  }
	} 	 	   
	  
}



⌨️ 快捷键说明

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