?? disp_drive.c
字號:
/*
****************************************************
顯示
****************************************************
*/
#include<rtx51tny.h>
#include <reg52.H>
#include "Typedef.H"
#include "Disp_drive.h"
#include "UserDef.H"
/* 端口定義 */
#define DISPDATAPORT P0 //數據端口
sbit Pin_RS = P2^5; //指令、數據選擇(0=指令;1=數據)
sbit Pin_RW = P2^6; //讀寫選擇(0=寫,1=讀)
sbit Pin_E = P2^7; //鎖存(下降沿有效)
/* 全局變量 */
static INT8U idata DispBuffer[2][MAXDISPLEN]; //顯示內容緩沖區
static INT8U idata DispPro[2][MAXDISPLEN]; //顯示屬性緩沖區
//顯示屬性定義
#define PRO_BLINK (1<<1) //閃爍
/***************************************
LCD忙等待
****************************************/
void Busy(void)
{
INT8U bf;
Pin_E = 0;
DISPDATAPORT = 0xFF; //使端口為輸入狀態
Pin_RW = 1; //讀
Pin_RS = 0; //指令
while (1)
{
Pin_E = 1;
bf = DISPDATAPORT;
Pin_E = 0;
if ((bf & 0x80) == 0)
break;
}
}
/***************************************
LCD數據寫
****************************************/
void LCD_Data(INT8U Data)
{
Busy();
Pin_E = 0;
Pin_RW = 0; //寫
Pin_RS = 1; //數據
Pin_E = 1;
DISPDATAPORT = Data;
Pin_E = 0;
}
/***************************************
LCD命令寫
****************************************/
void LCD_Cmd(INT8U cmd)
{
Busy();
Pin_E = 0;
Pin_RW = 0; //寫
Pin_RS = 0; //指令
Pin_E = 1;
DISPDATAPORT = cmd;
Pin_E = 0;
}
/***************************************
顯示掃描刷新程序
****************************************/
void DispRef(void)
{
static INT8U BlinkCnt = 0; //閃爍顯示計數器
static BOOLEAN BlinkStatus = 0; //當前閃爍狀態
INT8U n;
/* 計算顯示閃爍狀態 */
BlinkCnt ++;
BlinkCnt %= T_BLINK;
if (BlinkCnt == 0)
BlinkStatus = !BlinkStatus;
/* 若當前閃爍狀態=0且當前顯示位允許閃爍 */
/* 輸出行0 */
LCD_Cmd(0x80);
for (n=0;n<MAXDISPLEN;n++)
{
if ((BlinkStatus == 0) && ((DispPro[0][n] & PRO_BLINK) != 0))
LCD_Data(' ');
else
LCD_Data(DispBuffer[0][n]);
}
/* 輸出行1 */
LCD_Cmd(0xC0);
for (n=0;n<MAXDISPLEN;n++)
{
if ((BlinkStatus == 0) && ((DispPro[1][n] & PRO_BLINK) != 0))
LCD_Data(' ');
else
LCD_Data(DispBuffer[1][n]);
}
}
/***************************************
獲取整數的長度
****************************************/
INT8U GetIntLen(INT32U val)
{
INT8U len;
len = 0;
while (val != 0)
{
val /= 10;
len ++;
}
if (len == 0)
len = 1;
return len;
}
/***************************************
顯示一個整數
入口參數:整數數值,起始顯示位置,長度
****************************************/
void DispInt(INT32U val,INT8U row,INT8U col,INT8U len)
{
INT8U n,end;
end = col + len - 1;
for (n=0;n<len;n++)
{
DispBuffer[row][end] = val % 10 + '0';
DispPro[0][end] = 0;
val /= 10;
end --;
}
}
/***************************************
顯示一個整數(可閃爍)
入口參數:整數數值,起始顯示位置,長度
****************************************/
void DispInt_blink(INT32U val,INT8U row,INT8U col,INT8U len,BOOLEAN blink)
{
INT8U n,end;
end = col + len - 1;
for (n=0;n<len;n++)
{
DispBuffer[row][end] = val % 10 + '0';
if (blink == TRUE)
DispPro[row][col+n] = PRO_BLINK;
else
DispPro[row][col+n] = 0;
// DispPro[0][end] = 0;
val /= 10;
end --;
}
}
/***************************************
顯示一個字符
入口參數:字符,顯示位置,是否閃爍
****************************************/
void DispChr(INT8U cv,INT8U row,INT8U col,BOOLEAN blink)
{
DispBuffer[row][col] = cv;
if (blink == TRUE)
DispPro[row][col] = PRO_BLINK;
else
DispPro[row][col] = 0;
}
/***************************************
顯示一個字符串
入口參數:字符串指針,顯示位置,是否閃爍
****************************************/
void DispStr(INT8U *str,INT8U row,INT8U col,BOOLEAN blink)
{
while ((*str)!=0)
{
DispBuffer[row][col] = *str;
if (blink == TRUE)
DispPro[row][col] = PRO_BLINK;
else
DispPro[row][col] = 0;
str ++;
col ++;
}
}
/***************************************
顯示一個浮點數
注:無超顯示范圍判斷
使用全部的顯示區域
****************************************/
void DispFloat(float val,INT8U row,INT8U col,INT8U Len)
{
INT8U IntLen,n;
INT32U iv,ivf;
/* 符號位處理 */
if (val < 0)
{
DispBuffer[row][col] = '-';
val = -val;
col ++;
Len --;
}
/* 整數位數計算 */
IntLen = GetIntLen((INT32U)val);
/* 整數部分 */
iv = (INT32U)val;
/* */
for (n=0;n<(Len-IntLen);n++)
{
val *= 10;
}
ivf = (INT32U)val;
ivf += 5;
ivf /= 10;
/* 顯示整數部分 */
DispInt(iv,row,col, IntLen);
/* 顯示小數點 */
DispChr('.',row,col+IntLen ,FALSE);
/* 顯示小數部分 */
for (n=0;n<(Len-IntLen-1);n++)
{
DispInt(ivf%10 , row , col + Len -n -1, 1);
ivf /= 10;
}
/* 計算實際有效位數,去掉小數部分尾數的所有0 */
n = col + Len - 1;
while (n >= IntLen)
{
if (DispBuffer[row][n] != '0')
{
break;
}
DispBuffer[row][n] = ' ';
n --;
}
}
/***************************************
顯示清屏
****************************************/
void DispCls(void)
{
INT8U col,row;
for (row=0;row<2;row++)
{
for (col=0;col<MAXDISPLEN;col++)
{
DispBuffer[row][col] = ' ';
DispPro[row][col] = 0;
}
}
}
/***************************************
屏初始化
****************************************/
void DispInit(void)
{
LCD_Cmd(0x38); //Function Set
//data bus length = 1 (8 bits)
//display lines = 1 (2 lines)
//character font = 0(5x7 Dot Font)
LCD_Cmd(0x06); //Entry Mode Set
//Sets DD RAM counter to increment
LCD_Cmd(0x0C); //Sets Display
LCD_Cmd(0x01); //Clears Display
//returns cursor to the Home Position (Address 00)
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -