?? lcd1.c
字號:
#include<reg51.h> //包含常用頭文件
#include<stdio.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char //定義常用數據類型
int cnt;
void LCD_INIT(void); //LCD的初始化函數
void LCD_DISPLAY_STR(uchar x,uchar y,char *DATA);//在指定的位置顯示字符串
void LCD_CLR(uchar y); //清除LCD指定的行
void LCD_SEND_COMMAND(uchar COMMAND); //向LCD發送命令
void LCD_SEND_DATA(uchar DATA); //向LCD發送數據
void LCD_WAIT(void); //檢查LCD空閑
uchar LCD_GET_FLAG(void); //檢查LCD狀態
/*定義所要顯示的數據*/
char code PLAY_1[]="Finished time:";
char code PLAY_2[]="2007.07.23.21:16";
char code PLAY_3[]="desiger:";
char code PLAY_4[]="Li Xijang";
char code PLAY_5[]="When I finish it";
char code PLAY_6[]="I very happy!";
/*定義LCD控制字*/
#define LCD_MODE 0x3C /* 接口數據8位,顯示2行,字體為1號 */
#define LCD_NO_FLASH 0x0C /* 屏幕顯示開,無光標 */
#define LCD_HIDE 0x08 /* 屏幕顯示關 */
#define LCD_FLASH 0x0D /* 屏幕顯示開,并打開閃爍光標 */
#define LCD_SHIFT 0x07 /* 模塊數據輸入為增量方式,顯示內容移動 */
#define LCD_NO_SHIFT 0x06 /* 模塊數據輸入為增量方式,顯示光標移動 */
#define LCD_SH 0x14 /* 移動光標及整體顯示 */
#define LCD_LINE1 0x80 /*第一行DDRAM起始地址*/
#define LCD_LINE2 0xc0 /*第二行DDRAM起始地址*/
#define SEND_IN XBYTE[0xff00] /*定義LCD的實際地址*/
sbit LCD_RS=P3^4; //定義LCD的RS控制位
sbit LCD_RW=P3^5; //定義LCD的RW控制位
//*************************************************
//LCD顯示字符串的主程序
//利用中斷間隔循環顯示
//
//*************************************************
main()
{
TMOD=0x02; //設置中斷T0工作于方式2(自動裝載)
TH0=0x06;
TL0=0X06;
TR0=1;
ET0=1;
EA=1;
LCD_INIT(); //初始化LCD
LCD_DISPLAY_STR(1,1,PLAY_1); //在第一行顯示第一行字符串
LCD_DISPLAY_STR(1,2,PLAY_2); //在第二行顯示第一行字符串
while(1); //等待中斷
}
void timer0(void) interrupt 1 using 0 //進入中斷T0函數
{
cnt++;
if(cnt==4000) //使蟒顯示停留1S
{ //清除LCD第一行
LCD_CLR(1); //清除LCD第二行
LCD_CLR(2);
LCD_DISPLAY_STR(1,1,PLAY_3); //在第一行顯示第三行字符串
LCD_DISPLAY_STR(1,2,PLAY_4); //在第一行顯示第四行字符串
}
if(cnt==8000)
{
LCD_CLR(1); //清除LCD第一行
LCD_CLR(2); //清除LCD第二行
LCD_DISPLAY_STR(1,1,PLAY_5); //在第一行顯示第五行字符串
LCD_DISPLAY_STR(1,2,PLAY_6); //在第一行顯示第六行字符串
}
if(cnt==12000)
{
cnt=0;
LCD_CLR(1); //清除LCD第一行
LCD_CLR(2); //清除LCD第二行
LCD_DISPLAY_STR(1,1,PLAY_1);
LCD_DISPLAY_STR(1,2,PLAY_2);
}
}
//*************************************************
//函數功能:LCD初始化
//輸入變量:無
//輸出變量:無
//調用模塊:LCD_SEND_COMMAND(),LCD_CLR()
//*************************************************
void LCD_INIT(void)
{
LCD_SEND_COMMAND(LCD_MODE); //設置工作方式
LCD_SEND_COMMAND(LCD_NO_FLASH); //設置顯示方式
LCD_SEND_COMMAND(LCD_NO_SHIFT); //設置光標畫面滾動方式
LCD_SEND_COMMAND(LCD_SH); //設置輸入方式
LCD_CLR(1); //清除LCD第一行
LCD_CLR(2); //清除LCD第二行
}
//*************************************************
//函數功能:清除LCD指定行
//輸入變量:y
//輸出變量:無
//調用模塊:LCD_SEND_COMMAND(),LCD_SEND_DATA()
//*************************************************
void LCD_CLR(uchar y)
{
uchar i;
i=0;
if(y==1)
{
LCD_SEND_COMMAND(LCD_LINE1); //發送命令使LCD指向第一行
i=16;
}
if(y==2)
{
LCD_SEND_COMMAND(LCD_LINE2); //發送命令使LCD指向第二行
i=16;
}
if(i!=0)
{
do
{
LCD_SEND_DATA(' '); //讓LCD的相應位置顯示空格
}while(--i!=0);
}
}
//*************************************************
//函數功能:向LCD發送命令
//輸入變量:COMMAND
//輸出變量:無
//調用模塊:LCD_WAIT()
//*************************************************
void LCD_SEND_COMMAND(uchar COMMAND)
{
LCD_WAIT(); //等待空閑
LCD_RS=0; //命令方式
LCD_RW=0; //寫方式
SEND_IN=COMMAND;//寫實際的命令到LCD
}
//*************************************************
//函數功能:向LCD發送數據
//輸入變量:DATA
//輸出變量:無
//調用模塊:LCD_WAIT()
//*************************************************
void LCD_SEND_DATA(uchar DATA)
{
LCD_WAIT(); //等待空閑
LCD_RS=1; //數據方式
LCD_RW=0; //寫方式
SEND_IN=DATA;//寫實際的數據到LCD
}
//*************************************************
//函數功能:等待LCD空閑
//輸入變量:無
//輸出變量:無
//調用模塊:LCD_GET_FLAG()
//*************************************************
void LCD_WAIT(void)
{
uchar i;
i=1000; //定義等待時間,可以防止由于LCD損壞而使程序死循環
do
{
if((LCD_GET_FLAG()&0x80)==0) //判斷BF是否為0
{
break;
}
}while(--i!=0);
}
//*************************************************
//函數功能:檢查LCD狀態
//輸入變量:無
//輸出變量:LCD顯示的當前狀態
//調用模塊:無
//*************************************************
uchar LCD_GET_FLAG(void)
{
LCD_RS=0;
LCD_RW=1;
return(SEND_IN);
}
//*************************************************
//函數功能:檢查LCD狀態
//輸入變量:無
//輸出變量:LCD顯示的當前狀態
//調用模塊:無
//*************************************************
void LCD_DISPLAY_STR(uchar x,uchar y,char *DATA)
{
if(y==1)
{
if(x<(16+1)) //判斷顯示位置是否超出第一行
{
LCD_SEND_COMMAND(LCD_LINE1-1+x);//發送顯示位置命令
for(;x<(16+1)&&*DATA!='\0';x++)
{
LCD_SEND_DATA(*DATA++); //發送數據
}
if(*DATA!='\0') //判斷是否發送完畢
{
x=1;
y=2; //未完畢轉到第二行顯示
}
}
}
if(y==2)
{
LCD_SEND_COMMAND(LCD_LINE2-1+x);
for(;x<(16+1)&&*DATA!='\0';x++)
{
LCD_SEND_DATA(*DATA++);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -