?? lcd.h
字號:
#include "main.h"
#include<reg52.h>
sbit cs=P1^0;
sbit sclk=P1^2;
sbit sid=P1^1;
unsigned char LCDBusyWait()
{
unsigned char states;
unsigned char i;
cs=1;
sclk=0;
for(i=0;i<6;i++)
{
sid=1;
sclk=1;
sclk=0;
}
sid=0;
sclk=1;
sclk=0;
sid=0;
sclk=1;
sclk=0;
for(i=0;i<16;i++)
{
sclk=1;
if(i==0)
states=sid;
sclk=0;
}
while(states&0x01)
{
for(i=0;i<6;i++)
{
sid=1;
sclk=1;
sclk=0;
}
sid=0;
sclk=1;
sclk=0;
sid=0;
sclk=1;
sclk=0;
for(i=0;i<16;i++)
{
sclk=1;
if(i==0)
states=sid;
sclk=0;
}
cs=0;
}
return states;
}
void WriteLCD_Data(unsigned char Data) //向LCD寫入一個字節的數據
{
unsigned char i;
LCDBusyWait();
cs=1;
sclk=0;
for(i=0;i<5;i++)
{
sid=1;
sclk=1;
sclk=0;
}
sid=0; //置為寫
sclk=1;
sclk=0;
sid=1; //寫數據標志
sclk=1;
sclk=0;
sid=0;
sclk=1;
sclk=0;
for(i=0;i<16;i++)
{
switch(i)
{
case 0:
sid=Data&0x80;
break;
case 1:
sid=Data&0x40;
break;
case 2:
sid=Data&0x20;
break;
case 3:
sid=Data&0x10;
break;
case 8:
sid=Data&0x08;
break;
case 9:
sid=Data&0x04;
break;
case 10:
sid=Data&0x02;
break;
case 11:
sid=Data&0x01;
break;
default:
sid=0;
break;
}
sclk=1;
sclk=0;
}
cs=0;
}
void WriteLCD_Command(unsigned char Command) //向LCD寫入一個字節的命令
{
unsigned char i;
LCDBusyWait();
cs=1;
sclk=0;
for(i=0;i<5;i++)
{
sid=1;
sclk=1;
sclk=0;
}
sid=0; //置為寫
sclk=1;
sclk=0;
sid=0; //寫命令標志
sclk=1;
sclk=0;
sid=0;
sclk=1;
sclk=0;
for(i=0;i<16;i++)
{
switch(i)
{
case 0:
sid=Command&0x80;
break;
case 1:
sid=Command&0x40;
break;
case 2:
sid=Command&0x20;
break;
case 3:
sid=Command&0x10;
break;
case 8:
sid=Command&0x08;
break;
case 9:
sid=Command&0x04;
break;
case 10:
sid=Command&0x02;
break;
case 11:
sid=Command&0x01;
break;
default :
sid=0;
break;
}
sclk=1;
sclk=0;
}
cs=0;
}
/*****************************改變地址,實現了逐行顯示*************************/
unsigned char ChangeAddress(unsigned char StartAddress)
{
switch(StartAddress)
{
case 0x87:WriteLCD_Command(0x90);StartAddress=0x90;break;
case 0x8F:WriteLCD_Command(0x98);StartAddress=0x98;break;
case 0x97:WriteLCD_Command(0x88);StartAddress=0x88;break;
default:StartAddress+=1;
}
return StartAddress;
}
/*
WriteLCD 從LCD輸出一個字符串:
StartAddress為起始地址;
Size為字符串大小;
Size==0 時由程序自己判斷字符串結束標志,否則輸出 Size 個字符,不夠則填充空格;
Charactors為要求輸出的字符串;
*/
void WriteLCD(unsigned char StartAddress,unsigned char Size,unsigned char Charactors[])
{
unsigned char *i=Charactors; //字符串的首地址
WriteLCD_Command(StartAddress);
if(Size) //Size不為0
{
bit Over=0;
while(i<(Charactors+Size)) //判斷字符串結尾
{
if(Over)
{
WriteLCD_Data(' ');i++;
if(i>=(Charactors+Size)) break;
WriteLCD_Data(' ');i++;
}
else
{
switch(((*i)*256)+(*(i+1)))
{
}
}
StartAddress=ChangeAddress(StartAddress); //改變地址,實現了逐行顯示
}
}
else //Size為0
{
while(*i) //判斷字符串結尾,*i為0代表結束
{
WriteLCD_Data(*i);
i++;
WriteLCD_Data(*i);
i++;
StartAddress=ChangeAddress(StartAddress);
}
}
}
/**********************功能:寫入數字Number, Number為0-99的兩位數字********************/
void WriteLCD_Number(unsigned char Address,unsigned char Number)
{
if(Address) WriteLCD_Command(Address); //如果地址為0則自動接著原來的位置寫. 否則按指定地址寫
if((Number/10)!=0)
WriteLCD_Data((Number/10)+0x30); //取商,取出十位數字
WriteLCD_Data((Number%10)+0x30); //取余,取出個位數字
}
/******************************功能:顯示ASSIC碼****************************/
void WriteLCD_CharNumber(unsigned char Address,unsigned char CharNumber)
{
if(Address)
WriteLCD_Command(Address); //如果地址為0則自動接著原來的位置寫. 否則按指定地址寫
WriteLCD_Data(CharNumber);
}
/****************************功能: 數據轉換(十六進制轉十進制)*****************/
unsigned long Data_Process(unsigned char Msb,unsigned char Lsb)
{
unsigned int Buffer2;
unsigned long Buffer1;
Buffer1=0;
Buffer2=0;
Buffer1=(unsigned long)Lsb;
Buffer2=(unsigned int)Msb;
Buffer2<<=8;
Buffer1=(Buffer1+Buffer2)<<4;
return(Buffer1); //返回頻率值
}
/*******************************功能:顯示多位數據*****************************/
void WriteLCD_HalfCharNumber(unsigned char Address,unsigned long HalfCharNumber)
{
unsigned char Buffer[16];
unsigned char j;
unsigned char i=0;
if(Address)
WriteLCD_Command(Address);
do
{
Buffer[i++]=HalfCharNumber%10; //對每一位進行存儲
HalfCharNumber=HalfCharNumber/10;
}while(HalfCharNumber!=0);
for(j=i;j>0;j--)
WriteLCD_Number(0x00,Buffer[j-1]);
}
/************************功能:小數顯示.精確到小數點后面四位**********************/
void WriteLCD_FloatNumber(unsigned char Address,unsigned long Float_Number)
{
static unsigned char Buffer[6];
unsigned char i=0;
if(Address)
WriteLCD_Command(Address);
do
{
Buffer[i++]=Float_Number%10; //對每一位進行逆序存儲
Float_Number=Float_Number/10;
}while(Float_Number!=0);
if(6==i)
{
WriteLCD_Number(0x00,Buffer[i-1]); //顯示整數
WriteLCD_Number(0x00,Buffer[i-2]); //顯示整數
WriteLCD_CharNumber(0x00,0x2E); //小數點顯示
for(i=i-2;i>0;i--)
{
WriteLCD_Number(0x00,Buffer[i-1]); //顯示整數
}
}
if(5==i)
{
WriteLCD_Number(0x00,Buffer[i-1]); //顯示整數
WriteLCD_CharNumber(0x00,0x2E); //小數點顯示
for(i=i-1;i>0;i--)
{
WriteLCD_Number(0x00,Buffer[i-1]); //顯示整數
}
}
if(4==i)
{
WriteLCD_CharNumber(0x00,0x30); //顯示零
WriteLCD_CharNumber(0x00,0x2E); //小數點顯示
for(i=i;i>0;i--)
WriteLCD_Number(0x00,Buffer[i-1]); //顯示整數
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -