新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 關于LCD1602顯示可調時鐘的程序

關于LCD1602顯示可調時鐘的程序

作者: 時間:2016-11-28 來源:網(wǎng)絡 收藏

//奉上,希望對初學者有幫助//

本文引用地址:http://butianyuan.cn/article/201611/322998.htm

#include
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^7;
sbit lcdrs=P2^6;
sbit W=P2^5;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
uchar num,count,k1num;
char miao,fen,shi;
uchar code table[]=" 2015-01-5 SAT" ;
uchar code table1[]=" 00:00:00";

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void write_com(uchar com) // 寫命令
{
W=0;
lcdrs=0; //RS選擇寫命令還是寫數(shù)據(jù),寫命令
P0=com; //將寫入的命令送到數(shù)據(jù)總線
delay(5); //稍作延時以待數(shù)據(jù)穩(wěn)定
lcden=1; //使能端給一個高脈沖,因為初始化函數(shù)已將lcden置為0
delay(5); //稍作延時
lcden=0; //將使能端置0以完成高脈沖
}

void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_sfm(uchar add,uchar date) //將數(shù)據(jù)寫到某個地址上
{
uchar shi,ge;
shi=date/10;
ge=date;
write_com(0x80+0x40+add); //地址指針指在第二行的第add+1個
write_data(0x30+shi); //送數(shù)據(jù),將數(shù)據(jù)data的十位數(shù)送過去
write_data(0x30+ge); //送數(shù)據(jù),將數(shù)據(jù)data的個位數(shù)送過去
}

void keyscan()
{
if(k1==0)
{
delay(5);
if(k1==0)//去抖
{
k1num++; //計數(shù),計算k1按了幾次
while(!k1); //松手檢測
if(k1num==1) //當按了一次
{
TR0=0; //計時器停止,時間停止
write_com(0x0f); //開顯示,顯示光標,光標閃爍
write_com(0x80+0x49); //數(shù)據(jù)指針指在第二行秒的個位
}

if(k1num==2) //當k1按了兩次
{

// write_com(0x0f);
write_com(0x80+0x46); //數(shù)據(jù)指針指在第二行分的個位

}
if(k1num==3) //當k1按了三次
{
// write_com(0x0f);
write_com(0x80+0x43); //數(shù)據(jù)指針指在第二行時的個位
}

if(k1num==4) //如果被按了四次
{
TR0=1; //啟動計時器
k1num=0; //清零
write_com(0x0c); //關閉光標
}
// if(k1num==5)
// {
// write_com(0x80+0x14)
// }
}
}
if(k1num!=0) //如果k1已經(jīng)按下過
{
if(k2==0) //如果k2按下
{
delay(5);
if(k2==0)
{
while(!k2); //松手檢測
if(k1num==1) //當k1按了一次,調秒
{
miao++; //每按一次k2秒加一
if(miao==60)
{
miao=0;
}
write_sfm(8,miao); //數(shù)據(jù)顯示在第二行第9位和第10位
write_com(0x80+0x40+9); //k1中已設置光標,數(shù)據(jù)指針指在0x48

}
if(k1num==2) //如果k1被按過兩次
{
fen++;
if(fen==60)
fen=0;
write_sfm(5,fen); //數(shù)據(jù)送到數(shù)據(jù)指針指在第六位++
write_com(0x80+0x40+6); //數(shù)據(jù)指針指在第七位
}
if(k1num==3) //如果k1被按過3次
{
shi++;
if(shi==24)
shi=0;
write_sfm(2,shi); // 數(shù)據(jù)送到第3++
write_com(0x80+0x40+3); //地址指針指在第四位
}

}
}
if(k3==0) //k1按過后,如果k3按下
{
delay(5);
if(k3==0)
{
while(!k3);
if(k1num==1) //如果k1按下一次
{
miao--;
if(miao==-1)
{
miao=59;
}
write_sfm(8,miao); //數(shù)據(jù)送到第二行第九位++
write_com(0x80+0x40+9); //指針指在第十位

}
if(k1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
write_com(0x80+0x40+6);
}
if(k1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(2,shi);
write_com(0x80+0x40+3);
}
}
}
}
}


void init() //初始化函數(shù)
{
// dula=0;
// wela=0;
lcden=0;
write_com(0x38); //設置16*2顯示,5*7點陣,8位數(shù)據(jù)接口
write_com(0x0c ); //開顯示,不顯示光標
write_com(0x06); //當寫一個數(shù)據(jù)后地址指針加1,且光標加1,當顯示一個數(shù)據(jù)時,整屏顯示不移動
write_com(0x01); //數(shù)據(jù)指針清0,顯示清0
write_com(0x80); //顯示在屏內
TMOD=0x01;
TH0=(655536-50000)/256;
TL0=(655536-50000)%6;
EA=1;
ET0=1;
TR0=1;
}


void main()
{
init(); //初始化
for(num=0;num<15;num++)
{
write_data(table[num]);
delay(10);
}

write_com(0x80+0x40); //開始時第二行顯s
for(num=0;num<10;num++)
{
write_data(table1[num]);
delay(5);
}
while(1)
{
keyscan();

}
}

void timer0() interrupt 1
{
TH0=(655536-50000)/256;
TL0=(655536-50000)%6;
count++;
if(count==18) //一秒時間到
{
count=0;
miao++;
if(miao==60)
{ miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(2,shi);
}
write_sfm(5,fen);
}
write_sfm(8,miao);
}
}



評論


技術專區(qū)

關閉