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

📄 1602.c

📁 51单片机做的万年历
💻 C
字号:
#include <REGX51.H>
#include "delay.h"
#include "type.h"
#include "1602.h"
#include "wnl.h"
#include "display.h"
#include "interupt.h"    
/*----------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
带背光的液晶模块TC1602A采用标准的16脚接口,其引脚功能如下:
  第1脚:VSS为电源地,接GND。
  第2脚:VDD接5V正电源。
  第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,
           使用时可以通过一个10K的电位器调整对比度。
  第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
  第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
           当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
  第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
  第7~14脚:D0~D7为8位双向数据线。
  第15脚:BLA背光电源正极(+5V)输入引脚。
  第16脚:BLK背光电源负极,接GND。  
----------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------ */

sbit TC1602_RW=P3^0; //定义TC1602的引脚定义
sbit TC1602_RS=P3^1;
sbit TC1602_E=P3^7;

#define TC1602_Data P1
#define Busy 0x80           //用于检测TC1602状态字中的Busy标识 

//unsigned char code net[] = {"www.tq.com.cn"};
//unsigned char code email[] = {"ken831001"};

//写数据
void WriteDataTC1602(unsigned char WDTC1602)
{
    ReadStatusTC1602();                 //检测忙
    TC1602_Data = WDTC1602;             //写数据到P1口
    TC1602_RS = 1;                      //选择数据寄存器
    TC1602_RW = 0;                      //低电平是为写状态
    TC1602_E = 1;
    delay_ms(2);
    TC1602_E = 0;                       //若晶振速度太高可以在这后加小的延时
    TC1602_Data = 0xff;
}

//写指令
void WriteCommandTC1602(unsigned char WCTC1602,BuysC) //BuysC为0时忽略忙检测
{
    if (BuysC) 
    {
        ReadStatusTC1602();             //根据需要检测忙
    }    
    TC1602_RS = 0;                      //选择指令寄存器
    TC1602_RW = 0; 
    TC1602_E = 1;
    TC1602_Data = WCTC1602;
    delay_ms(2);
    TC1602_E = 0;
    TC1602_Data = 0xff;    
}
/*
//读数据
unsigned char ReadDataTC1602(void)
{
    unsigned char temp_data;
    TC1602_RS = 1; 
    TC1602_RW = 1;
    TC1602_E = 1;
    temp_data = TC1602_Data;
    delay_ms(2);
    TC1602_E = 0;
    TC1602_Data = 0xff;
    return temp_data;
}
*/
//读状态
void ReadStatusTC1602(void)
{
    TC1602_E = 1;
    TC1602_Data = 0xFF; 
    TC1602_RS = 0 ;                      //当RS为低电平RW为高电平时可以读忙信号
    TC1602_RW = 1;
    //delay_ms(2);    
    while (TC1602_Data & Busy)
    {
      TC1602_E = 0;
      delay_ms(1);                       //产生一条NOP指令,延时1us
      TC1602_E = 1;                      //检测忙信号
    }
    TC1602_E = 0;
    TC1602_Data = 0xff;
}

void TC1602Init(void)                    //TC1602初始化
{
    TC1602_Data = 0x00;
    WriteCommandTC1602(0x38,0); //设定LCD为16×2显示,5×7点阵,8位数据接口,不检测忙信号
    delay_ms(5); 
    WriteCommandTC1602(0x38,0);
    delay_ms(5); 
    WriteCommandTC1602(0x38,0);
    delay_ms(5); 
    WriteCommandTC1602(0x38,1); //显示模式设置,开始要求每次检测忙信号
    WriteCommandTC1602(0x08,1); //关闭显示
    WriteCommandTC1602(0x01,1); //显示清屏
    WriteCommandTC1602(0x06,1); //写指令06H,文字不动,光标自动右移
    WriteCommandTC1602(0x0c,1); //写指令0CH,显示ON,光标OFF,闪烁OFF
    
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, uchar DData)
{
    TC1602_E = 1;
    Y &= 0x1;
    X &= 0xF; //限制X不能大于15,Y不能大于1
    if (Y) 
    {
        X |= 0x40; //当要显示第二行时地址码 0x40;
    }
    X |= 0x80; //算出指令码,因为写入显示地址时要求最高位D7恒定为高电平1
    WriteCommandTC1602(X, 0); //这里不检测忙信号,发送地址码
    WriteDataTC1602(DData);
    TC1602_E = 0;
    TC1602_Data = 0xff;
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, uchar *DData)
{   
    Y &= 0x1;
    X &= 0xF; //限制X不能大于15,Y不能大于1
    while (*DData>=0x20) //若到达字串尾则退出
    {
        if (X <= 0xF) //X坐标应小于0xF
        {
            DisplayOneChar(X, Y,*DData++); //显示单个字符
            X++ ;   
        }    
    }
    Y++ ;
}
/*
void DisplaySet(unsigned char X, unsigned char Y)
{
  WriteCommandTC1602(0x0f,1); //写指令0CH,显示ON,光标ON,闪烁ON
  TC1602_E = 1;
  Y &= 0x1;
  X &= 0xF; //限制X不能大于15,Y不能大于1
  if (Y) 
  {
    X |= 0x40; //当要显示第二行时地址码 0x40;
  }
  X |= 0x80; //算出指令码,因为写入显示地址时要求最高位D7恒定为高电平1
  WriteCommandTC1602(X, 1); //这里不检测忙信号,发送地址码
  TC1602_E = 0;
  TC1602_Data = 0xff;  
}
*/

⌨️ 快捷键说明

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