?? lcd.c
字號:
#include<p18f452.h>
#include"delays.h"
/**
* LCD.[R/W] RC5 1=讀 0=寫
* LCD.[R/S] RC7 1=數據 0=指令
//* LCD.[E] RC6 1->0 寫數據或指令 1=讀數據或指令
* LCD.[DATA] PORTD
**/
#define LCD_Data PORTD
#define DIR_Data TRISD
#define DIR_Con TRISC
#define LCD_RS PORTCbits.RC5 // 命令或數據
#define LCD_WR PORTCbits.RC6 // 讀寫控制
#define LCD_E PORTCbits.RC7 // 使能控制
/***********************************************************************
** 函數名稱: lcdbusywait()
** 功能描述: 等待液晶空閑
** 輸 入: 無
** 輸 出: 狀態
***********************************************************************/
char lcdbusywait(void) //等待LCD就緒
{
char Status;
DIR_Data=0XFF;
LCD_RS=0;
LCD_WR=1;
LCD_Data=0xFF;
LCD_E=1;
Status=LCD_Data;
LCD_E=0;
while(Status & 0x80)
{
LCD_E=1;
Status=LCD_Data;
LCD_E=0;
}
LCD_WR=0;
DIR_Data=0X00;
return Status;
}
/***********************************************************************
** 函數名稱: writedatalcd( char lcd_data)
** 功能描述: 寫入一字節數據
** 輸 入: unsigned char lcd_data
** 輸 出: 無
***********************************************************************/
void writedatalcd( char date)
{
// lcdbusywait();
LCD_WR=0;
LCD_RS= 1;
Nop();
Nop();
LCD_E = 1;
Nop();
Nop();
LCD_Data= date;
LCD_E = 0;
delays(20,2); // delay for more than X uS
}
/***********************************************************************
** 函數名稱: writecmdlcd(char lcd_cmd)
** 功能描述: send command
** 輸 入: unsigned char LCD_Cmd
** 輸 出: 無
***********************************************************************/
void writecmdlcd(char cmd)
{
// lcdbusywait();
LCD_WR=0;
LCD_RS = 0;
Nop();
Nop();
LCD_E = 1;
Nop();
Nop();
LCD_Data= cmd;
LCD_E = 0;
delays(20,2); // delay for more than X uS
}
/*********************************************************************
** 函數名稱: lcd_initial()
** 功能描述: LCD初始化
** 輸 入: 無
** 輸 出: 無
** 備注 :
***********************************************************************/
void lcd_initial(void)
{
DIR_Data = 0x00;
DIR_Con = DIR_Con&0x1f;
LCD_E = 0;
LCD_WR = 0;
LCD_RS = 0;
writecmdlcd(0x3B); //數據選擇8位
delays( 60,2 );
writecmdlcd(0x3B); //數據選擇8位
delays( 60,2 );
writecmdlcd(0x0f); // 顯示開,光標開, 游標位置反白允許
delays( 60,2 );
writecmdlcd(0x01); //清屏
delays( 60,2 );
}
/***********************************************************************
** 函數名稱: lcd_set_cursor( char CurY, char CurX)
** 功能描述: set position
** 輸 入: char CurY, char CurX
** 輸 出: 無
***********************************************************************/
void lcd_set_cursor( char CurY, char CurX)
{
switch(CurY)
{
case 1: writecmdlcd(0X80+CurX-1);
break; // 寫入第一行CurX列的地址
case 2: writecmdlcd(0X90+CurX-1);
break; // 寫入第二行CurX列的地址
case 3: writecmdlcd(0X88+CurX-1);
break; // 寫入第三行CurX列的地址
case 4: writecmdlcd(0X98+CurX-1);
break; // 寫入第四行CurX列的地址
default: break;
}
}
/***********************************************************************
** 函數名稱: putslcd( char *Str)
** 功能描述: 輸出字符串
** 輸 入: *Str
** 輸 出: 無
***********************************************************************/
void putslcd( char *Str)
{
char Str_Temp;
while (1)
{
Str_Temp = *Str ;
if (Str_Temp != 0x00 )
{
writedatalcd(Str_Temp) ;
Str ++ ;
}
else
return ;
}
}
/***********************************************************************
** 函數名稱: display_int
** 功能描述: 在指定位置顯示一個整數
** 輸 入: int intdata
** 輸 出:
***********************************************************************/
void display_int(int intdata)
{
char i=0;
char temp[5];
char lenghth;
if (intdata==0)
{
writedatalcd('0');
}
while (intdata>0)
{
temp[i]=intdata%10+48;
intdata/=10;
i++;
}
lenghth = i;
for (i=lenghth;i-- ;)
{
writedatalcd(temp[i]);
}
}
/***********************************************************************
** 函數名稱: display_float
** 功能描述: 在指定位置顯示一個小數
** 輸 入: int fltdata
** 輸 出:
** 備注 : 顯示四位小數
***********************************************************************/
void display_float(float fltdata)
{
float fltfrag;
char temp[4];
char i;
fltfrag = fltdata -(int)fltdata;
display_int((int)fltdata);
writedatalcd('.');
for (i=0 ;i<4 ;i++)
{
fltfrag*=10;
temp[i]=(int)(fltfrag)+48;
fltfrag-=(int)fltfrag;
}
for (i=0 ; i<4; i++)
{
writedatalcd(temp[i]);
}
}
/***********************************************************************
** 函數名稱: display_float
** 功能描述: 在指定位置顯示一個小數
** 輸 入: int fltdata
** 輸 出:
** 備注 : 顯示四位小數
***********************************************************************/
void display_float3bit(float fltdata)
{
float fltfrag;
char temp[3];
char i;
fltfrag = fltdata -(int)fltdata;
display_int((int)fltdata);
writedatalcd('.');
for (i=0 ;i<3 ;i++)
{
fltfrag*=10;
temp[i]=(int)(fltfrag)+48;
fltfrag-=(int)fltfrag;
}
for (i=0 ; i<3; i++)
{
writedatalcd(temp[i]);
}
}
/***********************************************************************
** 函數名稱: clearlcd(void)
** 功能描述: 清除液晶顯示
** 輸 入: 無
** 輸 出: 無
***********************************************************************/
void clearlcd(void)
{
writecmdlcd(0x01); //清屏
delays( 60,2 );
}
/***********************************************************************
** 函數名稱: lcd_picture(void)
** 功能描述: 圖片液晶顯示
** 輸 入: 無
** 輸 出: 無
***********************************************************************/
void lcd_picture( const rom char *puts )
{
char i,j,k;
int bb=0;
clearlcd();
writecmdlcd(0x40); //Set Display Start Line = com0
for(i=0;i<=0x1F;i++)
{
for(j=0;j<0x08;j++)
{
writecmdlcd(0x36);
writecmdlcd((0x80|i)); //Set Page Address
writecmdlcd((0x80|j)); //Set Column Address = 0
writecmdlcd(0x32);
for(k=0;k<2;k++)
{
writedatalcd(puts[bb]);
bb++;
}
}
}
for(i=0;i<=0x1F;i++)
{
for(j=0x08;j<0x10;j++)
{
writecmdlcd(0x36);
writecmdlcd((0x80|i)); //Set Page Address
writecmdlcd((0x80|j)); //Set Column Address = 0
writecmdlcd(0x32);
for(k=0;k<2;k++)
{
writedatalcd(puts[bb]);
bb++;
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -