?? clock_show_time_data.c
字號:
//*******************************************************
//該程序實現用液晶顯示器LCD顯示年,月,日和時間
//程序啟發:用查表法把數據送到LCD顯示
//不足之處:沒有考慮閏年,閏月等;年,月,日和時間不可調
//作者:李錫堅
//完成時間:2007.07.25.10:30
//*******************************************************
/********************************************************
控制說明:
sbit LCD_RS=P3^4; //定義LCD的RS控制位
sbit LCD_RW=P3^5; //定義LCD的RW控制位
sbit LCD_DISPLAY_START=P1^0; //LCD開始顯示的指示燈
sbit LCD_E=P1^1; //定義LCD的E控制位
寫操作時用:LCD_E=1;
_nop_();
LCD_E=0;
代替
*********************************************************/
//****************************************
#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_COLON(uchar *DATA);//在指定的位置顯示字符串
void LCD_DISPLAY_DATE(uchar *DATA); //在指定的位置顯示字符串
void LCD_DISPLAY_STR(void); //在指定的位置顯示字符串
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狀態
void DELAY(void); //延時
/*定義所要顯示的數據*/
char code DISPLAY[]="0123456789";//預先存放數字
char code DISPLAY_COLON[]="time: : :"; //顯示冒號
char code DISPLAY_DATE[]="date: . ."; //顯示日期
/*定義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 P0 /*XBYTE[0xff00] /*定義LCD的實際地址*/
sbit LCD_RS=P3^4; //定義LCD的RS控制位
sbit LCD_RW=P3^5; //定義LCD的RW控制位
sbit LCD_DISPLAY_START=P1^0; //LCD開始顯示的指示燈
sbit LCD_E=P1^1; //定義LCD的E控制位
int t=0; //中斷計數
int hour_2=1,hour_1=0,minute_2=3,minute_1=0,second_2=0,second_1=0;
int year_4=2,year_3=0,year_2=0,year_1=7,month_2=0,month_1=7,date_2=2,date_1=5;
//*************************************************
//LCD顯示字符串的主程序
//利用中斷間隔循環顯示
//
//*************************************************
main()
{
LCD_INIT(); //初始化LCD
LCD_CLR(1);
LCD_CLR(2);
LCD_DISPLAY_COLON(DISPLAY_COLON); //顯示冒號
LCD_DISPLAY_DATE(DISPLAY_DATE); //顯示日期
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
do
{
LCD_DISPLAY_STR();
}while(1);
}
//*************************************************
//函數功能: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; //寫方式
LCD_E=1;
SEND_IN=COMMAND;//寫實際的命令到LCD
LCD_E=0;
}
//*************************************************
//函數功能:向LCD發送數據
//輸入變量:DATA
//輸出變量:無
//調用模塊:LCD_WAIT()
//*************************************************
void LCD_SEND_DATA(uchar DATA)
{
LCD_WAIT(); //等待空閑
LCD_RS=1; //數據方式
LCD_RW=0; //寫方式
LCD_E=1;
SEND_IN=DATA;//寫實際的數據到LCD
LCD_E=0;
}
//*************************************************
//函數功能:等待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)
{
SEND_IN=0xff;
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
_nop_();
_nop_();
return(SEND_IN);
}
//*************************************************
//函數功能:在LCD第一行輸出“time: : :”
//輸入變量:*DATA
//輸出變量:無
//調用模塊:LCD_SEND_COMMAND(),LCD_SEND_DATA()
//*************************************************
void LCD_DISPLAY_COLON(uchar *DATA)
{
int x=1;
LCD_SEND_COMMAND(LCD_LINE1); //發送顯示位置命令
for(;x<(17)&&*DATA!='\0';x++)
{
LCD_SEND_DATA(*DATA++); //發送數據
}
}
//*************************************************
//函數功能:在LCD第二行輸出“date:”
//輸入變量:*DATA
//輸出變量:無
//調用模塊:LCD_SEND_COMMAND(),LCD_SEND_DATA()
//*************************************************
void LCD_DISPLAY_DATE(uchar *DATA)
{
int x=1;
LCD_SEND_COMMAND(LCD_LINE2); //發送顯示位置命令
for(;x<(17)&&*DATA!='\0';x++)
{
LCD_SEND_DATA(*DATA++); //發送數據
}
}
//*************************************************
//函數功能:顯示時,分,秒
//輸入變量:無
//輸出變量:無
//調用模塊:LCD_SEND_COMMAND(),LCD_SEND_DATA()
//*************************************************
void LCD_DISPLAY_STR(void)
{
LCD_SEND_COMMAND(LCD_LINE1+5); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[hour_2]); //發送時十位數據
LCD_SEND_COMMAND(LCD_LINE1+6); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[hour_1]); //發送時個位數據
LCD_SEND_COMMAND(LCD_LINE1+8); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[minute_2]); //發送分十位數據
LCD_SEND_COMMAND(LCD_LINE1+9); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[minute_1]); //發送分個位數據
LCD_SEND_COMMAND(LCD_LINE1+11); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[second_2]); //發送秒十位數據
LCD_SEND_COMMAND(LCD_LINE1+12); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[second_1]); //發送秒個位數據
LCD_SEND_COMMAND(LCD_LINE2+5); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[year_4]); //發送年千位數據
LCD_SEND_COMMAND(LCD_LINE2+6); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[year_3]); //發送年百位數據
LCD_SEND_COMMAND(LCD_LINE2+7); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[year_2]); //發送年十位數據
LCD_SEND_COMMAND(LCD_LINE2+8); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[year_1]); //發送個個位數據
LCD_SEND_COMMAND(LCD_LINE2+10); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[month_2]); //發送月十位數據
LCD_SEND_COMMAND(LCD_LINE2+11); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[month_1]); //發送月個位數據
LCD_SEND_COMMAND(LCD_LINE2+13); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[date_2]); //發送日十位數據
LCD_SEND_COMMAND(LCD_LINE2+14); //發送顯示位置命令
LCD_SEND_DATA(DISPLAY[date_1]); //發送日個位數據
}
//*****************************************
//
//定時器0的溢出中斷程序
//
//*****************************************
void timer0(void) interrupt 1 using 0
{
t++;
if(t==4000)
{
t=0;
second_1++;
if(second_1==10)
{
second_1=0;
second_2++;
if(second_2==6)
{
second_2=0;
minute_1++;
if(minute_1==10)
{
minute_1=0;
minute_2++;
if(minute_2==6)
{
minute_2=0;
hour_1++;
if(hour_1==10)
{
hour_1=0;
hour_2++;
}
if(hour_1==4&&hour_2==2)
{
hour_1=0;
hour_2=0;
date_1++;
if(date_1==10)
{
date_1=0;
date_2++;
}
if(date_2==3&&date_1==1)
{
date_2=0;
month_1++;
if(month_1==10)
{
month_1=0;
month_2++;
}
if(month_1==3&&month_2==1)
{
month_1=1;
month_2=0;
year_1++;
if(year_1==10)
{
year_1=0;
year_2++;
if(year_2==10)
{
year_2=0;
year_3++;
if(year_3==10)
{
year_3=0;
year_4++;
if(year_4==10)
{
year_4=0;
}
}
}
}
}
}
}
}
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -