?? lcd1602.c
字號:
/*********************淘寶:http://quanmao.taobao.com **************************
程序名: LCD1602.C
編寫人: 李全茂
編寫時間: 2010年7月15日
硬件支持: WJ-4.0開發板,單片機M0516,通過跳線連接
接口說明:
修改日志:
NO.1- 移植到新塘的M0516上
*******************************************************************************
說明:
*****************技術論壇:http://www.wang1jin.com/bbs*************************/
#include "LCD1602.H"
//#include "M051Series.h"
#include "NUC1xx.h"
#include "DrvGPIO.h"
/*******************************************************************************
// 引腳定義 // (使用者根據實際更改)
******************************************************************************/
#define LCD_DB_Port E_GPA
//#define LCD_Ctr_Port E_PORT1
//#define LCD_PW_GND E_GPE,5,E_IO_OUTPUT //接LCD1602 VSSPin,需要強制輸出0,做GND用
#define LCD_RS E_GPC,15
#define LCD_RW E_GPC,6
#define LCD_EN E_GPC,7
#define LCD_POWER_ON DrvGPIO_ClrBit(E_GPE,5); //接LCD1602 VSSPin,需要強制輸出0,做GND用
#define LCD_VO_Adj DrvGPIO_ClrBit(E_GPC,14); //對比度調節
#define LCD_RS_Data DrvGPIO_SetBit(LCD_RS); // 數據寄存器
#define LCD_RS_Reg DrvGPIO_ClrBit(LCD_RS); // 指令寄存器
#define LCD_RW_Read DrvGPIO_SetBit(LCD_RW); // 讀
#define LCD_RW_Write DrvGPIO_ClrBit(LCD_RW); // 寫
#define LCD_EN_Set DrvGPIO_SetBit(E_GPC,7); // 高
#define LCD_EN_Clr DrvGPIO_ClrBit(E_GPC,7); // 低
//sbit LCD_RS = P1^0; //寄存器選擇:1 數據;0 指令
//sbit LCD_RW = P1^1; //讀寫選擇:1 讀;0 寫
//sbit LCD_EN = P1^2; //使能,讀時為高電平,寫時為高脈沖
//sbit LCD_Bsy= P0^7; //LCD DB7為忙檢測端,1為忙,0為空閑
/*******************************************************************************
// 定義LCD1602指令集 // (詳細請見技術手冊)
******************************************************************************/
#define CMD_clear 0x01 // 清除屏幕
#define CMD_back 0x02 // DDRAM回零位
#define CMD_dec1 0x04 // 讀入后AC(指針)減1,向左寫
#define CMD_add1 0x06 // 讀入后AC(指針)加1,向右寫
#define CMD_dis_gb1 0x0f // 開顯示_開光標_開光標閃爍
#define CMD_dis_gb2 0x0e // 開顯示_開光標_關光標閃爍
#define CMD_dis_gb3 0x0c // 開顯示_關光標_關光標閃爍
#define CMD_OFF_dis 0x08 // 關顯示_關光標_關光標閃爍
#define CMD_set82 0x38 // 8位總線_2行顯示
/*============================================================
液晶指令說明:
0x01-------------->清除屏幕,置AC為0,光標回位。
0x02-------------->DDRAM 地址為0,顯示回原位,DDRAM內容不變.
0x03-------------->DDRAM 地址為0,顯示回原位,DDRAM內容不變.
**********MODE指令************
0x04-------------->設置光標移動方向減量方式,并指定顯示不移動。
0x05-------------->設置光標移動方向減量方式,并指定顯示移動。
0x06-------------->設置光標移動方向增量方式,并指定顯示不移動。
0x07-------------->設置光標移動方向增量方式,并指定顯示移動。
**********DSPOFF指令************
0x08-------------->設置顯示關、光標關、光標所在字符不閃爍.
**********DSPON指令************
0x0c-------------->顯示開
0x0e-------------->顯示開,光標開
0x0f-------------->顯示開,光標開,光標閃爍
0x10-------------->光標移位,左移
0x14-------------->光標移位,右移
0x18-------------->顯示移位,左移
0x1c-------------->顯示移位,右移
**********INIT指令************
0x20-------------->4BIT模式,顯示一行,5x7字體
0x24-------------->4BIT模式,顯示一行,5x10字體
0x28-------------->4BIT模式,顯示兩行,5x7字體
0x2c-------------->4BIT模式,顯示兩行,5x10字體
0x30-------------->8BIT模式,顯示一行,5x7字體
0x34-------------->8BIT模式,顯示一行,5x10字體
0x38-------------->8BIT模式,顯示兩行,5x7字體
0x3c-------------->8BIT模式,顯示兩行,5x10字體
============================================================*/
unsigned char Table[] = {0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00 // 日
};
static void LCD_GPIO_Init()
{
//DrvGPIO_Open(LCD_PW_GND); // 1602上電
LCD_POWER_ON;
LCD_VO_Adj;
}
void delaynms(unsigned char n)
{
unsigned char i,j;
unsigned int k;
i=2; //主頻多少i就多少
//延時用這個很無奈,不同的系統有不同的方法
//好在只有初始化時使用,對系統影響不大
for(;i>0;i--)
{
for(j=0;j<n;j++)
{
for(k=0;k<980;k++);
}
}
}
/**********************************************************************
延時
**********************************************************************/
void delay_nus(unsigned int t)
{
unsigned int i=0;
while(t--)
{
for(i=0;i<1;i++);
}
}
/*******************************************************************************
描 述:忙檢測 ,直到空閑時退出
參 數:無
返回值:無
備 注:LCD1602 DB7為1是,LCD1602忙,否則空閑。
******************************************************************************/
static void Checkbsy()
{
unsigned char temp;
do{
temp = ReadRegister(Com_Reg);
}while(temp & 0x80);
// LCD_RS = Com_Reg;
// LCD_RW = READ;
// LCD_DB = 0xff; //通過往端口寫1,使單片機進入讀模式
// LCD_EN = 1;
// while(LCD_Bsy); //等到LCD1602空閑時退出
// LCD_EN = 0;
}
/*******************************************************************************
描 述:寫寄存器
參 數:_Register 要操作的寄存器(Com_reg 指令寄存器,Data_Reg 數據寄存器)
_Data 要寫入的數據
返回值:無
備 注:
******************************************************************************/
static void WriteRegister(unsigned char _Register,int32_t _Data)
{
Checkbsy();
if(_Register != Data_Reg){
LCD_RS_Reg;
}else{
LCD_RS_Data;
}
// delay_nus(2);
LCD_RW_Write;
// delay_nus(2);
// LCD_RS = _Register;
// LCD_RW = WRITE;
// LCD_EN = 1;
DrvGPIO_SetPortBits(LCD_DB_Port,_Data<<2);
LCD_EN_Set;
//delay_nus(2);
// delay_nus(2);
//LCD_DB = _Data; //送數據
//LCD_EN = 0;
LCD_EN_Clr;
}
/*******************************************************************************
描 述:寫CGROM
參 數:_len 要寫入crgrom區的數據長度,_len最大為64
返回值:無
備 注:將預先定義好的字模寫入cgram
******************************************************************************/
void CgramWrite(unsigned char _len)
{
unsigned char i;
WriteRegister(Com_Reg,0x06); // 設置cgrom地址自動加1
WriteRegister(Com_Reg,0x40); // cgrom 起始地址
for(i=0;i<_len;i++)
{
WriteRegister(Data_Reg,Table[i]); // 按數組寫入數據
}
}
/*******************************************************************************
描 述:初始化LCD1602
參 數:
返回值:
備 注:8位2行顯示,顯示光標,閃爍
*******************************************************************************/
void LCD1602_Init(void)
{
LCD_GPIO_Init();
delaynms(15);
WriteRegister(Com_Reg,CMD_set82);//8位點陣模式
//delaynms(150);
WriteRegister(Com_Reg,CMD_set82);
//delaynms(150);
WriteRegister(Com_Reg,CMD_set82);//8位點陣模式
//delaynms(150);
WriteRegister(Com_Reg,CMD_set82);//8位點陣模式
WriteRegister(Com_Reg,CMD_clear);// 清屏
delaynms(15);
WriteRegister(Com_Reg,CMD_dis_gb1);// 開顯示,顯示光標,閃爍
CgramWrite(8);
WriteRegister(Com_Reg,CMD_clear);// 清屏
delaynms(15);
}
/*******************************************************************************
描 述:設置顯示位置
參 數:x 列, y 行
返回值:
備 注:x和y均從0開始,y最大為1
*******************************************************************************/
static void LCD1602_SetXY(unsigned char x,unsigned char y)
{
if(y == 0)
{
WriteRegister(Com_Reg,0x80+x); // 第一行
}else{
WriteRegister(Com_Reg,0xC0+x); // 第二行
}
}
/*******************************************************************************
描 述:在指定位置顯示一個字符
參 數:x 列, y 行 ,Data為要顯示的字符
返回值:
備 注:x和y均從0開始,y最大為1
*******************************************************************************/
void LCD1602_WriteByte(unsigned char x,unsigned char y,unsigned char Data)
{
LCD1602_SetXY(x,y); // 設置地址
WriteRegister(Data_Reg,Data); // 將要顯示的字符寫入數據寄存器
}
/*******************************************************************************
描 述:從指定位置開始顯示字符串
參 數:x 列, y 行 ,*String為要顯示的字符串
返回值:
備 注:x和y均從0開始,y最大為1
*******************************************************************************/
void LCD1602_WriteString(unsigned char x,unsigned char y,unsigned char *String)
{
LCD1602_SetXY(x,y);
while(*String) // 判斷是否已經寫完
{
WriteRegister(Data_Reg,*String++); // 寫入當前指向的字符,并將指針指向下一個字符
}
}
/*******************************************************************************
描 述:讀寄存器
參 數:_Register 要操作的寄存器(Com_reg 指令寄存器,Data_Reg 數據寄存器)
返回值:數據寄存器或指令寄存器的內容
備 注:
******************************************************************************/
unsigned char ReadRegister(unsigned char _Register)
{
int32_t Data; //聲明一個變量,用來保存從lcd1602讀取到的值
int32_t temp;
if(_Register != Data_Reg){
LCD_RS_Reg;
}else{
LCD_RS_Data;
}
//delay_nus(2);
LCD_RW_Read;
delay_nus(2);
// LCD_RS = _Register;
// LCD_RW = READ;
//DrvGPIO_SetPortBits(LCD_DB_Port,0xff);
//LCD_DB = 0xff; //通過往端口寫1,使單片機進入讀模式
//LCD_EN = 1;
LCD_EN_Set;
delay_nus(2);
Data = DrvGPIO_GetPortBits(LCD_DB_Port);
//delay_nus(2);
LCD_EN_Clr;
//delay_nus(2);
temp=Data>>2;
return (int8_t)(Data>>2); //返回到的值
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -