📄 1602.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 + -