?? lcd1602.h
字號:
/*********************************************************************************************************
** 文件功能 :LCD1602驅動程序
** 工程作者 :Blue Sky Teams——ZZL
** 工程版本 :V1.0
*********************************************************************************************************/
#include<intrins.h>
/*********************************************************************************************************
** LCD1602接口定義
*********************************************************************************************************/
sbit RS_1602 = P0^5; //數據命令選擇端
sbit RW_1602 = P0^6; //寫選擇端
sbit EN_1602 = P0^7; //使能信號
#define LCD_PORT P2 //LCD1602數據接口
/*********************************************************************************************************
** LCD1602宏定義指令集
*********************************************************************************************************/
#define CLEAR_SCREEN 0X01 //清屏
#define CURSOR_RESET 0X02 //光標復位
/*******************************************輸入方式設置**************************************************/
#define SET_MOD 0X04 //配合一下兩位來配置模式
#define SET_MOD_AC_ADD 0X02 //數據讀寫操作后AC自加一
#define SET_MOD_AC_DEC 0X00 //數據讀寫操作后AC自減一
#define SET_MOD_MOVE_ON 0X01 //數據讀寫操作后畫面移動
#define SET_MOD_MOVE_OFF 0X00 //數據讀寫操作后畫面不動
/*******************************************顯示開關控制**************************************************/
#define DISPLAY_SET 0X08 //配合下面三位來配置模式
#define DISPLAY_SET_ON 0X04 //顯示開
#define DISPLAY_SET_OFF 0X00 //顯示關
#define DISPLAY_SET_CURSOR_ON 0X02 //光標顯示開
#define DISPLAY_SET_CURSOR_OFF 0X00 //光標顯示關
#define DISPLAY_SET_BLINK_ON 0X01 //光標閃爍
#define DISPLEY_SET_BLINK_OFF 0X00 //光標不閃爍
/*******************************************光標,畫面位移************************************************/
#define COURSOR_SHIFT_LEFT 0X10 //光標左移一個字符位,AC減一
#define COURSOR_SHIFT_RIGHT 0X14 //光標右移一個字符位,AC加一
#define FRAME_SHIFT_LEFT 0X18 //畫面左移一個字符位,光標不變
#define FRAME_SHIFT_RIGHT 0X1C //畫面右移一個字符位,光標不變
/*******************************************顯示功能設置**************************************************/
#define DISPLAY_MOD 0X30 //默認設置為8位數據口,配合一下兩個位來時配置模式
#define DISPLAY_MOD_TWO_LINE 0X08 //兩行顯示
#define DISPLAY_MOD_ONE_LINE 0X00 //一行顯示
#define DISPLAY_MOD_5_10 0X04 //5*10的點陣字符顯示
#define DISPLAY_MOD_5_7 0X00 //5*7的點陣字符顯示
/*******************************************自定義字符*****************************************************/
unsigned char code self_definition_char[] = {
0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00, //"一"代碼
0x00,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00, //"二"代碼
0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,0x00, //"三"代碼
0x00,0x1F,0x15,0x15,0x1B,0x11,0x1F,0x00, //"四"代碼
0x1F,0x04,0x04,0x1E,0x0A,0x12,0x1F,0x00, //"五"代碼
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00, //"年"代碼
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00, //"月"代碼
0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00, //"日"代碼
};
/*******************************************CGRAM起始地址**************************************************/
const unsigned char CGRAM_ADD = 0X40;
/*********************************************************************************************************
** 函數功能 :讀寫LCD1602時用于讀寫時序的時鐘延時
** 入口參數 :z:延時長度
** 出口參數 :無
*********************************************************************************************************/
void LCD_Delay(unsigned char z)
{
unsigned char x,y;
for(x = z;x > 0;x --)
for(y = 50;y>0;y--);
}
/*********************************************************************************************************
** 函數功能 :LCD1602忙碌查詢
** 函數說明 :每次讀寫液晶時需要事先檢測芯片是否處于忙碌狀態
** 入口參數 :無
** 出口參數 :返回值為1:等待超時
** 返回值為0:芯片處于空閑狀態
*********************************************************************************************************/
unsigned char Check_1602_Busy(void)
{
unsigned int time=0;
RS_1602 = 0;
RW_1602 = 1;
EN_1602 = 1;
while( (LCD_PORT&0X80) != 0X00)
{
time ++;
if(time > 1000) return 1;
}
return 0;
}
/*********************************************************************************************************
** 函數功能 :向液晶寫入指令
** 函數說明 :
** 入口參數 :待寫入的指令
** 出口參數 :無
*********************************************************************************************************/
void Write_1602_Com(unsigned char zhiling)//寫指令
{
Check_1602_Busy();
RS_1602 = 0;
RW_1602 = 0;
LCD_PORT = zhiling;
LCD_Delay(1);
EN_1602 = 1;
LCD_Delay(1);
EN_1602 = 0;
}
/*********************************************************************************************************
** 函數功能 :向液晶寫入數據
** 函數說明 :
** 入口參數 :待寫入的數據
** 出口參數 :無
*********************************************************************************************************/
void Write_1602_Data(unsigned char shuju)//寫數據
{
Check_1602_Busy();
RS_1602 = 1;
RW_1602 = 0;
LCD_PORT = shuju;
LCD_Delay(1);
EN_1602 = 1;
LCD_Delay(1);
EN_1602 = 0;
}
/*********************************************************************************************************
** 函數功能 :在指定位置連續寫入一串字符
** 函數說明 :注意寫入字符串的長度,不要超過屏幕單行的顯示范圍
** 入口參數 :number:待寫入字符串地址
** addr: 寫入整數的地址
** 出口參數 :無
*********************************************************************************************************/
void Write_1602_String(unsigned char *str,unsigned char addr)
{
Write_1602_Com(addr);
while(*str)
{
Write_1602_Data(*str);
str++;
}
}
/*********************************************************************************************************
** 函數功能 :在指定位置寫入一個整數
** 函數說明 :整數的范圍從0~65535,更大的需要采用long整型的進行擴展,注意整數的位數和地址不要超出顯示范圍
** 入口參數 :number:待寫入的整數
** addr: 寫入整數的地址
** 出口參數 :無
*********************************************************************************************************/
void Write_Num(unsigned int number,unsigned char addr)
{
Write_1602_Com(addr);
if(number/10000 != 0)
{
Write_1602_Data(0x30 + number/10000);
Write_1602_Data(0x30 + number%10000/1000);
Write_1602_Data(0x30 + number%1000/100);
Write_1602_Data(0x30 + number%100/10);
Write_1602_Data(0x30 + number%10);
}
else if(number/1000 != 0)
{
Write_1602_Data(0x30 + number/1000);
Write_1602_Data(0x30 + number%1000/100);
Write_1602_Data(0x30 + number%100/10);
Write_1602_Data(0x30 + number%10);
}
else if(number/100 != 0)
{
Write_1602_Data(0x30 + number/100);
Write_1602_Data(0x30 + number%100/10);
Write_1602_Data(0x30 + number%10);
}
else if(number/10 != 0)
{
Write_1602_Data(0x30 + number/10);
Write_1602_Data(0x30 + number%10);
}
else Write_1602_Data(0x30 + number);
}
/*********************************************************************************************************
** 函數功能 :向CGRAM寫入自定義字符
** 函數說明 :DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
** | 0 | 1 | CGRAM的地址(6位) |
**
** DB5 DB4 DB3 為字符號,即要寫入的第幾個自定義字符
** DB2 DB1 DB0 為行號,即要定義的字符點陣的第幾行,其字符取模方式為高位在前,從上到下,而且只有低5位有效,對應字符大小為5*8
** 自定義的字符數據存放在self_definition_char[]數組中
** 目前測試結果,寫入CGRAM的地址0和1的數據無效,原因不詳,其他6個字符可用
** 入口參數 :無
** 出口參數 :無
*********************************************************************************************************/
void Write_CGRAM(void)
{
unsigned char i,j;
for (i = 0; i < 8; i ++)
{
for(j = 0;j < 8;j ++)
{
Write_1602_Com(CGRAM_ADD+i*8+j);
Write_1602_Data(self_definition_char[i*8+j]);
}
}
}
/*********************************************************************************************************
** 函數功能 :液晶初始化
** 函數說明 :用液晶之前需要先初始化液晶,配置對應的顯示模式
** 入口參數 :time:需要延時的時間,單位ms
** 出口參數 :無
*********************************************************************************************************/
void LCD_1602_Init()//初始化
{
EN_1602=0;
Write_1602_Com(DISPLAY_MOD | DISPLAY_MOD_TWO_LINE | DISPLAY_MOD_5_7);//設置顯示模式,兩行顯示,字符點陣大小為5*7:0X38
Write_1602_Com(DISPLAY_SET | DISPLAY_SET_ON | DISPLAY_SET_CURSOR_OFF | DISPLEY_SET_BLINK_OFF);//開顯示,不顯示光標,光標不閃爍:0X0F
Write_1602_Com(SET_MOD | SET_MOD_AC_ADD | SET_MOD_MOVE_OFF);//設置寫入數據后指針AC加一,畫面不動:0X06
Write_1602_Com(CLEAR_SCREEN);//清屏
Write_1602_Com(CURSOR_RESET);
Write_CGRAM();
Write_1602_Com(0x80);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -