//File1
#ifndef __ZHANGTYPE_H__
#define __ZHANGTYPE_H__
#define uint8 unsigned char
#define uint16 unsigned short int
#define uint32 unsigned long int
#define int8 signed char
#define int16 signed short int
#define int32 signed long int
#define uint64 unsigned long long int
#define int64 signed long long int
#endif
//File2
#ifndef __FUN_H__
#define __FUN_H__
#include "ZhangType.h"
#include
void Delay(uint16 time);
#endif
//File3
#include "fun.h"
void Delay(uint16 time)
{
while(time--);
}
//File4
#ifndef __1602_H__
#define __1602_H__
#include
#include "ZhangType.h" //變量類型
#include "fun.h" //常用函數
#define SETMODE 0x38 //16*2顯示,5*7點陣,8位數據接口
#define DISOPEN 0x0C //顯示開,不顯示光標,光標不閃爍
#define DISMODE 0x06 //讀寫字符後地址加1,屏顯不移動
#define SETADDR 0x80 //設置數據地址指針初始值
#define CLEAR 0x01 //清屏,數據指針清零
#define RET 0x02 //回車,數據指針清零
#define PORT P2 //I/O口
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
void Init1602(void); //初始化1602
void Write1602_Com(uint8 com); //寫命令
void Write1602_Dat(uint8 dat); //寫數據
void CheckBusy(void); //檢查忙
void Write1602_One_Dat(uint8 X,uint8 Y,uint8 dat);
//寫一個數據
void Write1602_Str(uint8 addr,uint8 length,uint8 *pbuf);
//寫一個數據串
#endif//
//File5
#include "1602.h"
void Write1602_Com(uint8 com)
{
E=0;
RS=0; //命令
Delay(50); //延時
RW=0; //寫
Delay(50);
PORT=com; //埠賦值
Delay(50);
E=1; //高脈衝
Delay(50);
E=0;
}
void Write1602_Dat(uint8 dat)
{
E=0;
RS=1; //數據
Delay(50); //延時
RW=0; //寫
Delay(50);
PORT=dat; //埠賦值
Delay(50);
E=1; //高脈衝
Delay(50);
E=0;
}
void CheckBusy(void)
{
uint8 temp;
RS=0; //命令
RW=1; //讀
E=0;
while(1)
{
PORT=0xFF; //埠為輸入
E=1; //高脈衝
temp=PORT;
E=0;
if ((temp&0x80)==0) //檢查BF位是否為0
break;
}
}
void Init1602(void)
{
Write1602_Com(SETMODE); //模式設置
Delay(500);
Write1602_Com(DISOPEN); //顯示設置
Delay(500);
Write1602_Com(DISMODE); //顯示模式
Delay(500);
Write1602_Com(CLEAR); //清屏
Delay(500);
}
void Write1602_One_Dat(uint8 x,uint8 y,uint8 dat)
{
x&=0x0f;
y&=0x01;
if(y)
x|=0x40;
x|=0x80;
Write1602_Com(x);
Write1602_Dat(dat);
}
void Write1602_Str(uint8 addr,uint8 length,uint8 *pbuf)
{
uint8 i;
Write1602_Com(addr);
for(i=0;i
{
Write1602_Dat(pbuf[i]);
}
}
//File6
/*******************************************************
*名稱:主文件(_main.c)
*功能:測試
*日期:2014/09/09
*******************************************************/
#include "1602.h"
#include "fun.h"
uint8 code hot[8]={ //攝氏溫度字模
0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00
};
uint8 code pi[8]={
0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00,0x00 //pai
};
uint8 code strMCU[]="I love MCU!";
uint8 code strTest[]="LCD1602 Test!";
uint8 code blog[]="Welcome to my blog!";
uint8 i;
void main()
{
Init1602(); //初始化1602
//自定義CGRAM
Write1602_Str(0x40,8,hot); //攝氏溫標
Write1602_Str(0x48,8,pi); //pai
Write1602_Str(0x80,strlen(strMCU),strMCU);
//"I love MCU!"
Write1602_Str(0x80+0x40,strlen(strTest),strTest);
//"LCD1602 Test!"
for(i=0;i<50;i++) //延時一段時間
Delay(10000);
Write1602_Com(CLEAR); //指令執行時間較長
Delay(500); //多加一些延時
for(i=0;i<16;i++)
Write1602_Dat(0);
Write1602_Com(0xc0); //設置DDRAM地址
for(i=0;i<16;i++)
Write1602_Dat(1);
for(i=0;i<50;i++) //延時一段時間
Delay(10000);
Write1602_Com(CLEAR); //指令執行時間較長
Delay(500); //多加一些延時
Write1602_Str(0x80+0x10,strlen(blog),blog);
//寫在顯示之外
while(1)
{
Write1602_Com(0x18); //左移
for(i=0;i<20;i++) //延時
Delay(10000);
}
}