代碼如下
//LCD1602液 晶
/********************************************************************************************/
#include <reg52.h>
#include<intrins.h>
/********************************************************************************************/
typedef unsigned char uint8; // 無符號8位整型變量 //
/********************************************************************************************
// 引腳定義 //
/********************************************************************************************/
#define LCD1602_DBP1
// 數(shù)據(jù)總線,如果P1.0~P1.7在八線驅(qū)動時分別對應DB0~DB7,則在四線傳輸時候只需要接P1.4~P1.7
sbit LCD1602_RS=P2^5; /* Data Command Pin 1 data 0 command pin 4 */
sbit LCD1602_RW=P2^6; /* Read Write Pin 1 read 0 write pin 5 */
sbit LCD1602_E=P2^7; /* LCD Enable Signal pin 6 */
sbit LCD1602_BUSY_status = P1^7;
/********************************************************************************************
// 指令集 //將所有可能用到的指令先預定義一下,方面以后的使用
/********************************************************************************************/
#define CMD_clear0x01 // 清除屏幕
#define CMD_back0x02 // DDRAM回零位
#define CMD_dec10x04 // 讀入后AC(指針)減1,向左寫
#define CMD_add10x06 // 讀入后AC(指針)加1,向右寫
#define CMD_dis_gb10x0f // 開顯示_開光標_開光標閃爍
#define CMD_dis_gb20x0e // 開顯示_開光標_關(guān)光標閃爍
#define CMD_dis_gb30x0c // 開顯示_關(guān)光標_關(guān)光標閃爍
#define CMD_OFF_dis0x08 // 關(guān)顯示_關(guān)光標_關(guān)光標閃爍
#define CMD_set820x38 // 8位總線_2行顯示
#define CMD_set810x30 // 8位總線_1行顯示(上邊行)
#define CMD_set420x28 // 4位總線_2行顯示
#define CMD_set410x20 // 4位總線_1行顯示(上邊行)
#define lin_1 0x80 // 4位總線_1行顯示(上邊行)
#define lin_2 0xc0 // 4位總線_1行顯示(上邊行)
/********************************************************************************************/
/********************************************************************************************/
//讀忙信號
/********************************************************************************************/
void LCD1602_TestBusy(void){
LCD1602_DB = 0xff;
LCD1602_RS = 0;
LCD1602_RW = 1;
LCD1602_E = 1;
while(LCD1602_BUSY_status);//當1602內(nèi)部操作完成后,才可以接受下一條指令
LCD1602_E = 0;
}
/********************************************************************************************
// 寫指令程序 //
/********************************************************************************************/
void LCD1602_WriteCMD(uint8 LCD1602_command) {
LCD1602_TestBusy();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB=(LCD1602_command/16)<<4;
// 將傳輸過來的指令先取高四位 (為什么要除以16?因為2的4次方為16,比如1010 0100,除以16后,用8位2進制表示就為0000 1010
//再向左移動4位,就是1010 0000,傳輸時候,由于只連接了高4為那幾根線,于是1602就收到1010
LCD1602_E = 1;
LCD1602_E = 0;
LCD1602_DB=(LCD1602_command%16)<<4;//同理,取低四位,傳輸?shù)?602中
LCD1602_E = 1;
LCD1602_E = 0;
}
/********************************************************************************************
// 寫數(shù)據(jù)程序 //
/********************************************************************************************/
void LCD1602_WriteData(uint8 LCD1602_data){
LCD1602_TestBusy();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB=(LCD1602_data/16)<<4;//將傳輸過來的數(shù)據(jù)先取高四位
LCD1602_E = 1;
LCD1602_E = 0;
LCD1602_DB=(LCD1602_data%16)<<4;//將傳輸過來的數(shù)據(jù)先取低四位
LCD1602_E = 1;
LCD1602_E = 0;
}
/********************************************************************************************
// 打印字符串程序 // (本函數(shù)調(diào)用指針函數(shù))
// 第一行位置 0x00~0x0f 第二行位置 0x40~0x4f
/********************************************************************************************/
void print_str(uint8 a,uint8 *str){
LCD1602_WriteCMD(a | 0x80);
while(*str != '\0'){
LCD1602_WriteData(*str++);
}
*str = 0;
}
/********************************************************************************************
// 打印單字符程序 //
/********************************************************************************************/
void print_char(uint8 a,uint8 t){
LCD1602_WriteCMD(a | 0x80);
LCD1602_WriteData(t);
}
/********************************************************************************************
// 初始化
/********************************************************************************************/
void LCD1602_Init(void){
LCD1602_WriteCMD(CMD_set42);
LCD1602_WriteCMD(CMD_set42);
LCD1602_WriteCMD(CMD_clear);
LCD1602_WriteCMD(CMD_back);
LCD1602_WriteCMD(CMD_add1);
LCD1602_WriteCMD(CMD_dis_gb3);
}
/********************************************************************************************/
/*********************************************************************************************/
void main()
{
LCD1602_Init();
print_str(0x80,"hello!");
print_char(0x40,'.');
while(1);
} |