?? lcd 1602.h
字號:
#ifndef _lcd_1602_h
#define _lcd_1602_h
#include<reg52.h>
#include<intrins.h>
#include"delay.h"
#define uchar unsigned char
#define uint unsigned int
#define lint long int
#define busy 0x80
#define HIGH 1
#define LOW 0
sbit LCD1602_RS=P0^0; //RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。
sbit LCD1602_RW=P0^1; //RW為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。
sbit LCD1602_EN=P0^2; //E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。
//***********//LCD1602的接線//*****************************
#define LCD_IO P0 //LCD1602的高四位接在P0口的高四位
//*****************************************
#define DATA_MODE 0x28 //LCD顯示模式設置,0x28表示“四位數據線”模式
#define OPEN_SCREEN 0x0f //打開LCD顯示,無光標且顯示雙行
#define SET_ADDRESS 0x80 //寫地址指令
#define CLEARSCREEN LCD_en_com(0x01) //清屏
//**********************************************************************
void LCD_en_write(void); //EN控制端產生一高電平,使能寫LCD
void LCD_en_com(uchar command); //寫命令指令
void LCD_en_dat(uchar dat); //寫數據指令
void LCD_read_dat(uchar dat); //讀數據指令
void LCD_set_xy(uchar x,uchar y); //設置顯示地址:X為橫軸(0-15),Y為縱軸(0-1).
void LCD_write_char(uchar x,uchar y,uchar dat); //寫一個字符
void LCD_write_string(uchar x,uchar y,uchar *s); //寫一個字符串
void LCD_write_int(uchar x,uchar y,uint intdat); //寫無字符型整形數
void LCD_init(void); //lcd初始化
void LCD_Read_BF(void); //LCD讀忙信號
void movesreen_rl_1602(uint time,uchar direction); //整頻左移、右移
void LCD_write_float(unsigned char row,unsigned char col,float n); //顯示單精度浮點數n
void LCD_write_defchar(void); //顯示自定義字符
void num(uchar x,uchar y,uint n);
//**********************************************************************
void LCD_write_defchar(void) //???怎么寫自定義的字符到CGRAM中去??*/*
{
LCD_en_com(0x40+0x00);
LCD_en_dat(0x0f);
LCD_en_com(0x40+0x01);
LCD_en_dat(0x09);
LCD_en_com(0x40+0x02);
LCD_en_dat(0x0f);
LCD_en_com(0x40+0x03);
LCD_en_dat(0x09);
LCD_en_com(0x40+0x04);
LCD_en_dat(0x0f);
LCD_en_com(0x40+0x05);
LCD_en_dat(0x09);
LCD_en_com(0x40+0x06);
LCD_en_dat(0x03);
LCD_en_com(0x40+0x07);
LCD_en_dat(0x00);
}
void LCD_en_write(void)
{
LCD1602_EN=HIGH;
_nop_();
LCD1602_EN=LOW;
}
void LCD_Read_BF(void)
{
LCD1602_RS=LOW;
LCD1602_RW=HIGH;
LCD1602_EN=HIGH;
LCD_IO=LCD_IO&0x0f|0xf0; //將P0的高四位置0,保留低四位的原數據
while(LCD_IO&busy);
LCD1602_EN=LOW;
}
void LCD_en_com(uchar command)
{
LCD_Read_BF();
LCD1602_RS=LOW;
LCD1602_RW=LOW;
LCD_IO=LCD_IO&0x0f;
LCD_IO=command&0xf0|LCD_IO&0x0f;
LCD_en_write();
command=command<<4;
LCD_IO=LCD_IO&0x0f; //從P0寫入command高四位數據后,要給P0清零,否則之后寫入的command的低四位錯誤
LCD_IO=command&0xf0|LCD_IO&0x0f;
LCD_en_write();
}
void LCD_en_dat(uchar dat)
{
LCD_Read_BF();
LCD1602_RS=HIGH;
LCD1602_RW=LOW;
LCD_IO=LCD_IO&0x0f;
LCD_IO=dat&0xf0|LCD_IO&0x0f;
LCD_en_write();
dat=dat<<4;
LCD_IO=LCD_IO&0x0f; //從P0寫入dat高四位數據后,要給P0清零,否則之后寫入的dat的低四位錯誤
LCD_IO=dat&0xf0|LCD_IO&0x0f;
LCD_en_write();
}
//*****************從CGRAM或DDRAM中讀數*****************//
void LCD_read_dat(uchar dat)
{
LCD_Read_BF();
LCD1602_RS=HIGH;
LCD1602_RW=HIGH;
LCD_IO=LCD_IO&0x0f;
LCD_IO=dat&0xf0|LCD_IO&0x0f;
LCD_en_write();
dat=dat<<4;
LCD_IO=LCD_IO&0x0f; //從P0讀出dat高四位數據后,要給P0清零,否則之后寫入的dat的低四位錯誤
LCD_IO=dat&0xf0|LCD_IO&0x0f;
LCD_en_write();
}
//**************設置顯示地址:X為橫軸(0-15),Y為縱軸(0-1)********************
void LCD_set_xy(uchar x, uchar y)
{
uchar address;
if(!y)
address=0x80+x;
else
address=0xc0+x;
LCD_en_com(address);
}
//***************寫一個字符:X為橫軸(0-15),Y為縱軸(0-1)**********
void LCD_write_char(uchar x,uchar y,uchar dat)
{
LCD_set_xy(x,y);
LCD_en_dat(dat);
}
//****************寫一個字符串***************************************
void LCD_write_string(uchar x,uchar y,uchar *s)
{
LCD_set_xy(x,y);
while(*s)
{
LCD_en_dat(*s);
s++;
}
}
//****************寫一個無字符整數***************************************
void LCD_write_int(uchar x,uchar y,uint intdat)
{
uchar i,temp[5];
while(intdat/10||intdat%10)
{
temp[i]=intdat%10;
intdat/=10;
i++;
}
LCD_set_xy(x,y);
while(i--)
LCD_en_dat(temp[i]+0x30);
}
//*******time為每移動一格時所需要的時間,direction為移動方向:0為左移,1為右移***//
//*******函數功能:循環左(右)移動屏幕上的所有字符*******//
void movesreen_rl_1602(uint time,uchar direction)
{
uint i=0,j=0;
for(i=0;i<16;i++)
{
if(direction==0)
LCD_en_com(0x18);
else if(direction==1)
LCD_en_com(0x1c);
for(j=0;j<time;j++)
delayms(10);
}
}
//*********寫一個小數*******************//
void LCD_write_float(uchar row,uchar col,float n)
{
uchar i=0,numlength=0,xlength=0,zlength=0,a[9]={0,0,0,0,0,0,0,0}; //numlength是數長,xlength是小數長度,zlength是整數長度
float ftemp;
lint ltemp=0;
ftemp=n;
for(i=0;i<6;i++) //該循環計算出小數長度
{
ltemp=ftemp; //去掉小數
if(ftemp>ltemp)
{
ftemp=ftemp*10;
ltemp=ftemp;
xlength++;
}
}
ltemp=n; //去掉小數
for(i=0;i<6;i++) //該循環計算出整數長zlength
{
if(ltemp>=1)
{
ltemp=ltemp/10;
zlength++;
}
}
if(n<1)
zlength=1;
numlength=zlength+xlength; //計算原數字及小數點的長度
ftemp=n; //將n去掉小數點放進ftemp
for(i=xlength;i>0;i--)
ftemp=ftemp*10;
ltemp=ftemp; //將ftemp變為長整型放進字符數組a[]
for(i=numlength;i>zlength;i--)
{
a[i]=ltemp%10+0x30;
ltemp/=10;
}
for(i=zlength;i>0;i--)
{
a[i-1]=ltemp%10+0x30;
ltemp/=10;
}
if(xlength==0) //小數部分為0是,去掉小數點
{
a[zlength]=' ';
a[numlength]='%';
}
if(xlength!=0)
{
a[zlength]='.';
a[numlength+1]='%';
} //項目所用,數組a只應該有8哥元素,而不是9個元素,%在頭文件中應該舍去
LCD_write_string(row,col,a);
}
void num(uchar x,uchar y,uint n)
{
unsigned char i,length,a[6]={0,0,0,0,0,0};
uint nx=n;
if(n==0){LCD_write_char(x,y,'0');return;}
for(i=0;i<6;i++)
{
if(nx>=1)length++;
nx/=10;
}
nx=n;
for(;length>0;length--)
{
a[length-1]=nx%10+48;
nx/=10;
}
LCD_write_string(x,y,a);
}
void LCD_init(void)
{
LCD_en_com(DATA_MODE);
LCD_en_com(DATA_MODE);
LCD_en_com(OPEN_SCREEN);
LCD_en_com(SET_ADDRESS);
CLEARSCREEN;
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -