**//单片机stc89c58Rd+
//main.c文件**
#include"config.h"
#include"delay.h"
#include"lcd1602.h"
//uint8 Table[8]={0x00,0x13,0x04,0x08,0x08,0x04,0x03,0x00};//自定义温度负符号
void main()
{
Lcd1602_Init();
Write_Com(0x80);
Write_Data('D');
// Dip_Str("welA");
while(1);
}
//delay.c
#include"config.h"
#include"delay.h"
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 9;
j = 244;
do
{
while (--j);
} while (--i);
}
void Delay15ms() //@11.0592MHz
{
unsigned char i, j;
i = 27;
j = 226;
do
{
while (--j);
} while (--i);
}
//delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay15ms();
void Delay5ms();
#endif
//lcd1602.c
#include"config.h"
#include"lcd1602.h"
#include"delay.h"
//#include"config.h"
extern uint8 Table[8];
void Lcd1602_Init()
{
Delay15ms();
Write_Com(0x38);
Delay5ms();
Write_Com(0x38);
Delay5ms();
Write_Com(0x38);
//显示设置
Write_Com(0x38);
Write_Com(0x08);//显示关闭
Write_Com(0x01);//显示清屏
//显示光标移动设置
Write_Com(0x06);
Write_Com(0x0c);//显示开及光标设置
}
//写指令函数
void Write_Com(uint8 comm)
{
while(Busy_Check() == 1);//如果忙就等待
RS = 0;
RW = 0;
E = 0;
P0 = comm;
_nop_();
E = 1;
_nop_();
E = 0;
_nop_();
_nop_();
}
//写数据函数
void Write_Data(uint8 Data)
{
while(Busy_Check() == 1);//如果忙就等待
RS = 1;
RW = 0;
E = 0;
P0 = Data;//syntax error near'data',换成Data不报错,data是关键字,data数据空间
_nop_();
E = 1;
_nop_();
E = 0;
_nop_();
_nop_();
}
//时序延时要求不严,可以不加延时。
/*void Write_Data(int data)
{
while(Busy_Check() == 1);//如果忙就等待
RS = 0;
RW = 0;
E = 0;
P0 = data;
E = 1;
E = 0;
}*/
bit Busy_Check()
{
bit result;
P0 = 0xff;//读数据前,将P0口拉高。
RS = 0;
RW = 1;
E = 0;
E = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0&0x80);//1:bit没用括号报错。2:lcd的D0-D7中,D7=1为忙碌,0为空闲.
E = 0;
return result;
}
//忙检测也可以这样写。
/*
void Lcd1602_Busy_Check(void){
uint8 tmp;
lcdPort = 0xff;//读数据前,将P0口拉高.
do{
RS = 0;
RW = 1;
EN = 0;
EN = 1;
_nop_();
_nop_();//??CP
tmp = lcdPort;
_nop_();//??PQ
EN = 0;
_nop_();
}while(tmp&0x80);
}
*/
//写字符串函数
void Dip_Str(uint8 *Str)
{
while(*Str !='\0')
{
Write_Data(*Str++);
}
}
//字定义字符
void Ziding(void)
{
uint8 i;
for(i=0;i<8;i++)
{
Write_Com(0x40+i);
Write_Data(Table[i]);
}
Write_Com(0x80);
Write_Data(0x00);
}
//lcd1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__
//写指令函数
void Write_Com(uint8 comm);
//写数据函数
//void Write_Data(int data);
void Write_Data(uint8 Data);
bit Busy_Check();
void Lcd1602_Init();
void Dip_Str(uint8 *Str);
void Ziding(void);
#endif
//config.h
#ifndef __CONFIG_H__
#define __CONFIG_H__
//包含头文件
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
//类型定义
#define uint8 unsigned char
//typedef unsigned char uint8;
//lcd1602引脚配置
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
#endif