?? clock.c
字號(hào):
#include"reg51.h"
#define SELECT_LCD() CS0=0; CS1=1; CS2=0
#define SELECT_NONE() CS0=1; CS1=1; CS2=1
sbit LED=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit CS0 = P2^5 ;
sbit CS1 = P2^6 ;
sbit CS2 = P2^7 ;
sbit Lcd_RW = P2^4 ;
sbit Lcd_RS = P2^3 ;
typedef struct _data
{
unsigned char datah;
unsigned char datal;
}DATA2;
unsigned char data msecond,second,minute,hour;
bit flag;
DATA2 data tmp;
unsigned char clockstr[]=" 00-00-00 ";
/******************* 函數(shù)聲明 ********************/
void LcdWrite(unsigned char value , bit RS);
unsigned char LcdRead(bit RS);
void LcdWriteCmd(unsigned char value , unsigned char attrib);
void LcdWriteData(unsigned char value);
unsigned char LcdReadData();
void delay(unsigned int time);
void LcdInit(void);
void LocateXY(char x , char y);
void PutChar(char x , char y , char value);
void PutStr(char x , char y , char* str);
//void dispaly(unsigned char next);
void display_minute();
void display_second();
void VariableInit(void);
void Hex2Int(unsigned char hex);
unsigned char Hex2Ascii(unsigned char hex);
void TimerInit(void);
void LcdWrite(unsigned char value , bit RS)
{
/* 1. 設(shè)置RS信號(hào)線 */
Lcd_RS = RS ;
/* 2. 設(shè)置RW信號(hào)線為讀 */
Lcd_RW = 0 ;
/* 3. 設(shè)置LCD片選 */
SELECT_LCD();
/* 4. 通過(guò)P0端口寫(xiě)值 */
P0 = value ;
/* 5. 鎖存 */
SELECT_NONE();
}
/***************************************
說(shuō)明: LCD讀函數(shù),完成LCD讀操作的物理時(shí)序
RS: 0 - 寫(xiě)指令
1 - 寫(xiě)數(shù)據(jù)
return: 讀出的具體值
*****************************************/
unsigned char LcdRead(bit RS)
{
unsigned char rt ;
/* 1. 設(shè)置RS信號(hào)線 */
Lcd_RS = RS ;
/* 2. 設(shè)置RW信號(hào)線為讀 */
Lcd_RW = 1 ;
/* 3. 釋放P0口 */
P0 = 0xff ;
/* 4. 設(shè)置LCD片選 */
SELECT_LCD();
SELECT_LCD();
SELECT_LCD();
SELECT_LCD();
/* 5. 通過(guò)P0端口讀值 */
rt = P0 ;
/* 6. 鎖存 */
SELECT_NONE();
return rt ;
}
/***************************************
說(shuō)明: LCD寫(xiě)指令
value: 寫(xiě)的具體值
attrib: 0 - 不檢測(cè)忙信號(hào)
1 - 監(jiān)測(cè)忙信號(hào)
*****************************************/
void LcdWriteCmd(unsigned char value , unsigned char attrib)
{
/* 監(jiān)測(cè)忙狀態(tài) */
if(attrib)
while( LcdRead(0)&0x80 ) ;
LcdWrite(value , 0);
}
/***************************************
說(shuō)明: LCD寫(xiě)數(shù)據(jù)
*****************************************/
void LcdWriteData(unsigned char value)
{
/* 監(jiān)測(cè)忙狀態(tài) */
while( LcdRead(0)&0x80 ) ;
LcdWrite(value , 1);
}
/***************************************
說(shuō)明: LCD讀數(shù)據(jù)
*****************************************/
unsigned char LcdReadData()
{
/* 監(jiān)測(cè)忙狀態(tài) */
while( LcdRead(0)&0x80 ) ;
return LcdRead(1);
}
/***************************************
說(shuō)明: LCD初始化函數(shù),需要按照產(chǎn)品
說(shuō)明書(shū)完成
*****************************************/
void LcdInit(void)
{
delay(800);
/* 寫(xiě)指令0x38連續(xù)3次, 不檢測(cè)忙信號(hào)*/
LcdWriteCmd(0x38 , 0 );
delay(10);
LcdWriteCmd(0x38 , 0 );
delay(10);
LcdWriteCmd(0x38 , 0 );
delay(10);
/* 以后的讀寫(xiě)操作均要判斷忙信號(hào) */
LcdWriteCmd(0x38 , 1 );
/* 先設(shè)置關(guān)屏 */
LcdWriteCmd(0x08 , 1 );
/* 清屏 */
LcdWriteCmd(0x01 , 1 );
/* 設(shè)置光標(biāo)顯示模式 */
LcdWriteCmd(0x06 , 1 );
/* 開(kāi)屏并顯示光標(biāo) */
LcdWriteCmd(0x0c , 1 );
}
/***************************************
說(shuō)明: 設(shè)置光標(biāo)定位
*****************************************/
void LocateXY(char x , char y)
{
unsigned char temp;
temp = x & 0xf;
y &= 0x1;
if ( y )temp |= 0x40;
temp |= 0x80;
LcdWriteCmd(temp,1);
}
/***************************************
說(shuō)明: 顯示字符
x: 橫坐標(biāo) y: 縱坐標(biāo)
value: 顯示的字符
*****************************************/
void PutChar(char x , char y , char value)
{
LocateXY(x,y);
LcdWriteData(value);
}
/***************************************
說(shuō)明: 顯示字符串
*****************************************/
void PutStr(char x , char y , char* str)
{
unsigned char i,len=0;
/* 計(jì)算字符串長(zhǎng)度 */
while (str[len] >31)
len++;
/* 顯示字符串 */
for (i=0;i<len;i++)
{
PutChar(x++,y,str[i]);
if ( x == 16 )
{
x = 0; y ^= 1;
}
}
}
void delay(unsigned int time) // time*0.5ms延時(shí)
{
unsigned int i,j;
for(j=0;j<time;j++)
{
for(i=0;i<60;i++)
{;}
}
}
void VariableInit()
{
msecond=0;
second=0;
minute=0;
hour=0;
flag=0;
}
void Hex2Int(unsigned char hex)
{
tmp.datah=hex/10;
tmp.datal=hex%10;
}
unsigned char Hex2Ascii(unsigned char hex)
{
if(hex>9)
return' ';
else
return(hex+'0');
}
void TimerInit(void)
{
TMOD=0x00;
TH1=0x3c;
TL1=0xb0;
EA=1;
ET1=1;
}
void timer(void) interrupt 3 using 2
{
TH1=0x3c;
TL1=0xb0;
TF1=0;
msecond++;
if(msecond==148)
{
msecond=0;
flag=1;
}
if(msecond<1)
LED=0;
else
LED=1;
}
void main()
{
VariableInit();
TimerInit();
LcdInit();
PutStr(0,0,"BEJING CLOCK");
PutStr(0,1,clockstr);
// delay(100);
TR1=1;
EA=1;
while(1)
{
if(flag==1)
{
second++;
if(second!=60)
{
goto display_second;
}
else
{
second=0;
minute++;
if(minute!=60)
{
goto display_minute;
}
else
{
minute=0;
hour++;
if(hour==24)
hour=0;
}
}
Hex2Int(hour);
clockstr[3]=Hex2Ascii(tmp.datah);
clockstr[4]=Hex2Ascii(tmp.datal);
display_minute:
P11=0;
Hex2Int(minute);
clockstr[6]=Hex2Ascii(tmp.datah);
clockstr[7]=Hex2Ascii(tmp.datal);
display_second:
Hex2Int(second);
clockstr[9]=Hex2Ascii(tmp.datah);
clockstr[10]=Hex2Ascii(tmp.datal);
PutStr(0,1,clockstr);
flag=0;
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -