LCD1602driver_inside.c
/*本驅動依賴reg51.h頭文件*/
#include
/*根據實際電路連接修改宏定義和sbit語句*/
#define D0_D7 P3 //數據通訊總線,用于寫或讀指令、顯示地址和顯示數據
sbit RS = P2^5; //寄存器選擇引腳,設0選擇指令和顯示地址寄存器,設1選擇顯示數據寄存器
sbit RW = P2^6; //讀寫引腳,設0為寫,設1為讀
sbit E = P2^7; //信號使能引腳,設0允許寫,設1允許讀
sbit BF = P3^7; //忙信號,忙為1,不忙為0
/*根據實際電路連接修改宏定義和sbit語句*/
/*內部函數聲明*/
bit Busy_Check(); //1602忙信號檢測,忙返回1,不忙返回0(所有寫操作前均需要調用此函數
void Data_Write(char Data); //寫入8位顯示數據(支持直接接收1602字庫內字符或對應ASCII碼)
void Addr_Write(unsigned char Addr); //寫入8位顯示地址
void Command_Write(unsigned char Command); //寫入1602的各種命令
void Cursor_Reset(); //光標位置重置為左上角
unsigned char Coordinate_To_Addr(unsigned char X_Intercept,unsigned char Y_Intercept); //將輸入的顯示坐標轉換為相應顯示地址并返回
/*單行顯示時,0 <= X_Intercept <= 79,Y_Interce == 0;雙行顯示時,0 <= X_Intercept <= 39,0 <= Y_Interce <= 1;*/
void DelayMS(unsigned int MS_Num); //延時函數MS
void Open_Screen_Inside(); //屏幕顯示開啟函數
void Close_Screen_Inside(); //屏幕顯示關閉函數
void Move_Screen_Left_Inside(); //屏幕左移動函數
void Move_Screen_Right_Inside(); //屏幕右移動函數
void Reset_D0_D7(); //設置通訊總線為低電平
/*內部函數聲明*/
/*void main() //語法測試用,使用時取消語句注釋
{
Reset_D0_D7();
Command_Write(0x38);
DelayMS(5);
Command_Write(0x06);
Open_Screen_Inside();
DelayMS(5);
Command_Write(0x01);
DelayMS(5);
Addr_Write(Coordinate_To_Addr(0,0));
DelayMS(1);
Data_Write('5');
P3 = 0;
Close_Screen_Inside();
Open_Screen_Inside();
Data_Write('6');
Data_Write('7');
Data_Write('7');
Move_Screen_Inside(1);
Move_Screen_Inside(1);
Cursor_Reset();
Data_Write('7');
Data_Write('7');
Move_Screen_Inside(1);
while(1){P1 = 0;}
} */
/*內部函數定義*/
void Reset_D0_D7()
{
D0_D7 = 0;
}
void DelayMS(unsigned int MS_Num)
{
unsigned char a,b;
for(;MS_Num>0;MS_Num--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
bit Busy_Check()
{
// bit result;
// RS = 0;
// RW = 1;
// E = 1;
DelayMS(1); //偽忙檢查
// result = (bit)(P2&0x80);
// return result;
}
void Data_Write(char Data)
{
RS = 1;
RW = 0;
E = 0;
DelayMS(1);
D0_D7 = Data;
E = 1;
DelayMS(1);
E = 0;
}
void Addr_Write(unsigned char Addr)
{
RS = 0;
RW = 0;
E = 0;
DelayMS(1);
D0_D7 = Addr;
E = 1;
DelayMS(1);
E = 0;
}
void Command_Write(unsigned char Command)
{
RS = 0;
RW = 0;
E = 0;
DelayMS(1);
D0_D7 = Command;
E = 1;
DelayMS(1);
E = 0;
}
void Cursor_Reset()
{
RS = 0;
RW = 0;
E = 0;
DelayMS(1);
D0_D7 = 0x02;
E = 1;
DelayMS(1);
E = 0;
}
unsigned char Coordinate_To_Addr(unsigned char X_Intercept,unsigned char Y_Intercept)
{
unsigned char Addr;
if(Y_Intercept == 0)
{
Addr = 0x80 + X_Intercept;
}
if(Y_Intercept == 1)
{
Addr = 0xC0 + X_Intercept;
}
return Addr;
}
void Open_Screen_Inside()
{
RS = 0;
RW = 0;
E = 0;
Command_Write(0x0C);
E = 1;
DelayMS(1);
E = 0;
}
void Close_Screen_Inside()
{
RS = 0;
RW = 0;
E = 0;
Command_Write(0x08);
E = 1;
DelayMS(1);
E = 0;
}
void Move_Screen_Left_Inside()
{
RS = 0;
RW = 0;
E = 0;
Command_Write(0x18);
E = 1;
DelayMS(1);
E = 0;
}
void Move_Screen_Right_Inside()
{
RS = 0;
RW = 0;
E = 0;
Command_Write(0x1C);
E = 1;
DelayMS(1);
E = 0;
}
LCD1602driver_inside.h
#ifndef _LCD1602DRIVER_INSIDE_H_
#define _LCD1602DRIVER_INSIDE_H_
unsigned char Busy_Check(); //1602忙信號檢測,忙返回1,不忙返回0(所有寫操作前均需要調用此函數
void Data_Write(char Data); //寫入8位顯示數據(支持直接接收1602字庫內字符或對應ASCII碼)
void Addr_Write(unsigned char Addr); //寫入8位顯示地址
void Command_Write(unsigned char Command); //寫入1602的各種命令
void Cursor_Reset(); //光標位置重置為左上角
unsigned char Coordinate_To_Addr(unsigned char X_Intercept,unsigned char Y_Intercept); //將輸入的顯示坐標轉換為相應顯示地址并返回
/*單行顯示時,0 <= X_Intercept <= 79,Y_Interce == 0;雙行顯示時,0 <= X_Intercept <= 39,0 <= Y_Interce <= 1;*/
void DelayMS(unsigned int MS_Num);
void Open_Screen_Inside(); //屏幕顯示開啟函數
void Close_Screen_Inside(); //屏幕顯示關閉函數
void Move_Screen_Left_Inside(); //屏幕左移動函數
void Move_Screen_Right_Inside(); //屏幕右移動函數
void Reset_D0_D7(); //設置通訊總線為低電平
#endif
LCD1602.c
/*
unsigned char Busy_Check(); //1602忙信號檢測,忙返回1,不忙返回0(所有寫操作前均需要調用此函數
void Data_Write(unsigned char Data); //寫入8位顯示數據(支持直接接收1602字庫內字符或對應ASCII碼)
void Addr_Write(unsigned char Addr); //寫入8位顯示地址
void Command_Write(unsigned char Command); //寫入1602的各種命令
void Cursor_Reset(); //光標位置重置為左上角
unsigned char Coordinate_To_Addr(unsigned char X_Intercept,unsigned char Y_Intercept); //將輸入的顯示坐標轉換為相應顯示地址并返回
/雙行顯示時,0 <= X_Intercept <= 47,Y_Interce == 0;單行顯示時,0 <= X_Intercept <= 79,0 <= Y_Interce <= 1;/
void DelayMS(unsigned int MS_Num);
void Open_Screen_Inside(); //屏幕顯示開啟函數
void Close_Screen_Inside(); //屏幕顯示關閉函數
void Move_Screen_Left_Inside(); //屏幕左移動函數
void Move_Screen_Right_Inside(); //屏幕右移動函數
void Reset_D0_D7(); //設置通訊總線為低電平
*/
#include"LCD1602driver_inside.h"
#include
//包含內部函數,具體包含內容查閱LCD1602driver_inside.h和LCD1602driver內部函數.c,要了解函數功能也可以查看本文件開頭的大段注釋
/*可調用函數聲明*/
void LCD1602_Init(unsigned char Line_Num,unsigned char Char_Type); //初始化函數,接收行數(1或2)和點陣字符類型(1或2,對應5x7和5x10點陣字符)
void LCD1602_Clear_Screen();
void LCD1602_Write_Char_Screen(char ASCII_Data,unsigned char X_Intercept,unsigned char Y_Intercept); //單字符輸出函數;單行顯示時,0 <= X_Intercept <= 79,Y_Interce == 0;雙行顯示時,0 <= X_Intercept <= 39,0 <= Y_Interce <= 1;; 屏幕會顯示X坐標在15之前的字符,其他字符通過光標移動顯示
void LCD1602_Write_Line_Screen(char Line_Data[28],unsigned char Y_Intercept); //整行輸出函數;需接收16個字符到28個字符,0 <= Y_Interce <= 1;屏幕會顯示前16個字符,其他字符通過光標移動顯示
void LCD1602_Open_Screen(); //屏幕顯示開啟函數
void LCD1602_Close_Screen(); //屏幕顯示關閉函數
void LCD1602_Move_Left_Screen(); //屏幕左移一位
void LCD1602_Move_Right_Screen(); //屏幕右移一位
/*可調用函數聲明*/
/*void main() //語法測試用,使用時取消語句注釋
{
LCD1602_Init(2,1);
LCD1602_Write_Line_Screen("123456",0);
LCD1602_Write_Line_Screen("123456",1);
LCD1602_Move_Screen(1);
LCD1602_Move_Screen(0);
LCD1602_Move_Screen(1);
LCD1602_Move_Screen(1);
while(1);
} */
/*可調用函數定義*/
void LCD1602_Init(unsigned char Line_Num,unsigned char Char_Type)
{
Reset_D0_D7();
Command_Write(0x06);
if(Line_Num == 1)
{
if(Char_Type == 2)
{
Command_Write(0x34);
}
else
{
Command_Write(0x30);
}
}
else
{
if(Char_Type == 2)
{
Command_Write(0x3C);
}
else
{
Command_Write(0x38);
}
}
DelayMS(5);
LCD1602_Open_Screen();
DelayMS(5);
LCD1602_Clear_Screen();
DelayMS(5);
}
void LCD1602_Clear_Screen()
{
while(Busy_Check());
Command_Write(0x01);
}
void LCD1602_Write_Char_Screen(char ASCII_Data,unsigned char X_Intercept,unsigned char Y_Intercept)
{
while(Busy_Check());
Addr_Write(Coordinate_To_Addr(X_Intercept,Y_Intercept));
DelayMS(1);
Data_Write(ASCII_Data);
}
void LCD1602_Write_Line_Screen(char Line_Data[28],unsigned char Y_Intercept)
{
char Count;
while(Busy_Check());
Addr_Write(Coordinate_To_Addr(0,Y_Intercept));
for(Count = 0;Line_Data[Count] != '
主站蜘蛛池模板:
阳春市|
华容县|
中江县|
玛曲县|
丹巴县|
香港
|
镇巴县|
精河县|
黑河市|
濮阳县|
蓝田县|
辛集市|
南平市|
剑河县|
枣强县|
巴彦淖尔市|
资源县|
阳东县|
晋江市|
云霄县|
宁城县|
绥中县|
安庆市|
南汇区|
巴里|
株洲县|
卫辉市|
甘德县|
赤壁市|
宾阳县|
瓮安县|
巴青县|
旬阳县|
长汀县|
于都县|
景德镇市|
肇州县|
通州市|
盐山县|
唐山市|
望谟县|