?? lcd.c
字號:
//********************** 使用 Lcd 硬件 工作 通信 ****************
#include "msp430x14x.h"
#include "main.h"
//********************** extern 區****************extern 區****************
//********************** extern 區****************extern 區****************
//from lcdshow.c
extern unsigned char g_chMainLcdProcess_Stat;
//********************** extern 區****************extern 區****************
//********************** extern 區****************extern 區****************
void LcdDrive(void);
unsigned char g_chLcdDrive_Stat;
unsigned char g_chLcdDriveBuf[33];
unsigned char g_chLcdDriveHead;
unsigned char g_chLcdDriveTail;
unsigned char g_chLcdDrive_50ms;
void WriteInstruction(unsigned char chData);
void WriteData(unsigned char chData);
void InitLcd(void);
void initBuf(void);
/**************************************
*功能: 初始化 。。。
*參數:
*返回:
*備注:
**************************************/
void initBuf(void)
{
unsigned char chI;
for(chI = 0; chI < 33; chI++)
{
g_chLcdDriveBuf[chI] = 0x20;//保證是空格
}
}
/**************************************
*功能: 處理LCD 顯示驅動,負責把緩沖中的信息顯示
*參數:
*返回:
*備注: 實時運行
**************************************/
void LcdDrive(void)
{
//忙嗎?
//讀忙狀態子程序
P1OUT &= ~LCDrs;//CLR RS 指令
P2OUT |= LCDrw; //SETB RW
P3OUT |= LCDenb;//SETB E
//245
P5OUT &= ~LCDcs;//低 選通 該 片
//讀數據
P4DIR = 0;
if(P4IN & BIT7)//BIT7=1 忙;=0 不忙
{//忙
//忙
P3OUT &= ~LCDenb;//CLR E
//245
P5OUT |= LCDcs;//高 關閉該片
return;
}
//不忙
P3OUT &= ~LCDenb;//CLR E
//245
P5OUT |= LCDcs;//高 關閉該片
switch(g_chLcdDrive_Stat)
{
case 0://
if(g_chLcdDriveTail == 32)
{//啟動!
g_chLcdDrive_Stat = 1;//
}
break;
case 1://定光標位置 在第一行
//不忙
WriteInstruction(0x80);
//定光標位置 在第一行
g_chLcdDriveHead = 0;
g_chLcdDrive_Stat = 2;
break;
case 2://顯示1----16
//不忙
if(g_chLcdDriveHead < 16)
{
//處理
g_chLcdDriveHead++;
//寫數據 g_chLcdDriveBuf[g_chLcdDriveHead]
WriteData(g_chLcdDriveBuf[g_chLcdDriveHead]);
}
else
{
g_chLcdDrive_Stat = 3;
}
//顯示1----16
break;
case 3://定光標位置 在第二行
//不忙
WriteInstruction(0x90);
//定光標位置 在第二行---沒有信息要填空格!以便于驅動層的處理
g_chLcdDrive_Stat = 4;
break;
case 4://顯示17----32
//不忙
if(g_chLcdDriveHead < 32)
{
//處理
g_chLcdDriveHead++;
//寫數據 g_chLcdDriveBuf[g_chLcdDriveHead]
WriteData(g_chLcdDriveBuf[g_chLcdDriveHead]);
}
else
{
g_chLcdDrive_Stat = 5;
}
//顯示16----31
break;
case 5://等待
//根據應用層 定義 等待的時間 1 s 3 s
if(g_chMainLcdProcess_Stat == 0)
{
if(g_chLcdDrive_50ms > 1)
{//等待 50--100 ms
g_chLcdDrive_Stat = 6;
}
}
else if((g_chMainLcdProcess_Stat > 10) && (g_chMainLcdProcess_Stat <= 20))
{
if(g_chLcdDrive_50ms > 1)
{//等待 50--100 ms
g_chLcdDrive_Stat = 6;
}
}
else if((g_chMainLcdProcess_Stat > 20) && (g_chMainLcdProcess_Stat < 120))
{
if(g_chLcdDrive_50ms > 40)
{//等待 2s
g_chLcdDrive_Stat = 6;
}
}
else
{
if(g_chLcdDrive_50ms > 80)
{//等待 1s
g_chLcdDrive_Stat = 6;
}
}
break;
case 6://等待后清理戰場
//根據應用層 定義 等待的時間 1 s 3 s
g_chLcdDriveTail = 0;
g_chLcdDriveHead = 0;
g_chLcdDrive_Stat = 0;
g_chLcdDrive_50ms = 0;
initBuf();//全部為空格!
break;
default:
g_chLcdDrive_Stat = 0;
break;
}
}
void InitLcd(void)
{
//MOV A, #30H ;30---功能設定--基本指令操作--72 us
WriteInstruction(0x30);
initBuf();
//MOV A, #01H ;指令#01H為:清除屏幕文字,把地址指針指向00H單元--4.6 ms
WriteInstruction(0x01);
//延長時間
{
unsigned int i;
for(i = 0; i < 0xFFF; i++);
}
//MOV A, #06H ;指定在資料寫入或讀取時,設定游標的移動方向及指定顯示的移位
WriteInstruction(0x06); //整體顯示不移動
//延長時間
initBuf();
//MOV A, #0CH ;開顯示,關游標
WriteInstruction(0x0C);
//延長時間
initBuf();
//MOV A, #01H ;DDRAM清零,DDRAM地址計數器到00H
WriteInstruction(0x01);
//延長時間
initBuf();
}
//;--------------------------------------
//;寫數據子程序
//;----------------------------
void WriteData(unsigned char chData)
{
P1OUT |= LCDrs;//SETB RS --數據
P2OUT &= ~LCDrw; //CLR RW
P3OUT |= LCDenb;//SETB E
//245
P5OUT &= ~LCDcs;//低 選通 該 片
//寫數據
P4DIR = 0xFF;
P4OUT = chData;
//延長時間
{
unsigned int i;
for(i = 0; i < 0x0F; i++);
}
P3OUT &= ~LCDenb;//CLR E
//245
P4OUT = 0xFF;
P5OUT |= LCDcs;//高 關閉該片
}
//;--------------------------------------
//;寫指令子程序
//;----------------------------
void WriteInstruction(unsigned char chData)
{
P1OUT &= ~LCDrs;//CLR RS 指令
P2OUT &= ~LCDrw; //CLR RW
P3OUT |= LCDenb;//SETB E
//245
P5OUT &= ~LCDcs;//低 選通 該 片
//寫數據
P4DIR = 0xFF;
P4OUT = chData;
//延長時間
{
unsigned int i;
for(i = 0; i < 0x0F; i++);
}
P3OUT &= ~LCDenb;//CLR E
//245
P4OUT = 0xFF;
P5OUT |= LCDcs;//高 關閉該片
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -