|
#include<stc12.h> //共需要三個按鍵 一個是功能選擇鍵(時,分。秒的選擇) 一個加 一個減
#define uint unsigned int //我并沒用時鐘芯片 只使用的定時器中斷
#define uchar unsigned char
uchar code table[]={"0123456789:"};
uchar shi,fen,miao; // 全局變量
sbit beep1=P3^1; // 蜂鳴器 按鍵是響
sbit key1=P3^4; // 功能選擇按鍵
sbit key2=P3^3; // 時間加按鍵
sbit key3=P3^2; // 時間減按鍵
sbit lcden=P1^2; // 使能信號
sbit RW=P1^1; // 讀/寫選擇端
sbit lcdrs=P1^0; // 數(shù)據(jù)或者命令選擇端
void delay(uint); // 延時函數(shù)
void key(); // 按鍵掃描
void beep(); // 蜂鳴器
void show(); // 顯示函數(shù)
void init_T1(); // 定時器初始函數(shù)
void init_1602(); // 1602初始函數(shù)
void write_com(uchar com); // 命令選擇端
void write_data(uchar date); // 數(shù)據(jù)選擇端
void main() // 主函數(shù)
{
init_1602();
init_T1();
while(1)
{
key();
show();
}
}
//##############定時器1的使用############
void init_T1()
{
TMOD=0x10;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET1=1;
TR1=1;
}
void ser_50() interrupt 3
{
uchar a;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
a++;
if(a>=20) //用>=比用==好
{miao++;a=0;}
if(miao>=60)
{fen++;miao=0;}
if(fen>=60)
{fen=0;shi++;}
if(shi>=24)
shi=0;
}
//###############顯示時間##########
void show()
{ uchar shi1,ge1,shi2,ge2,shi3,ge3;
shi1=shi/10;
ge1=shi%10;
shi2=fen/10;
ge2=fen%10;
shi3=miao/10;
ge3=miao%10;
write_com(0x80);
write_data(table[shi1]);
write_data(table[ge1]);
write_data(table[10]);
write_data(table[shi2]);
write_data(table[ge2]);
write_data(table[10]);
write_data(table[shi3]);
write_data(table[ge3]);
}
//###############按鍵掃描###################
void key()
{
uchar num;
if(key1==0)
{
delay(20);
if(key1==0)
{
num++;
while(!key1);
beep();
if(num==1)
{
TR1=0; //關(guān)定時器 否則會無法調(diào)節(jié)
write_com(0x80+7);
write_com(0x0f);
}
if(num==2)
write_com(0x80+4);
if(num==3)
write_com(0x80+1);
if(num==4)
{
num=0;
write_com(0x0c); //關(guān)光標
TR1=1;
}
}
}
if(num!=0) //只有功能按鍵按下去的時候才可以調(diào)節(jié)
{
if(key2==0) //加時間
{
delay(5);
if(key2==0)
{
while(!key2);
beep();
if(num==1)
{
miao++;
if(miao==60)
miao=0;
show();
write_com(0x80+7);
}
if(num==2)
{
fen++;
if(fen==60)
fen=0;
show();
write_com(0x80+4);
}
if(num==3)
{
shi++;
if(shi==24)
shi=0;
show();
write_com(0x80+1);
}
}
}
if(key3==0) //減時間
{
delay(5);
if(key3==0)
{
while(!key3);
beep();
if(num==1)
{
miao--;
if(miao==-1)
miao=59;
show();
write_com(0x80+7);
}
if(num==2)
{
fen--;
if(fen==-1)
fen=59;
show();
write_com(0x80+4);
}
if(num==3)
{
shi--;
if(shi==-1)
shi=23;
show();
write_com(0x80+1);
}
}
}
}
}
//###########################1602部分###############
void write_com(uchar com)//寫命令的狀態(tài)
{
lcdrs=0;//選擇寫命令模式
P0=com; // 將要寫入的命令送到數(shù)據(jù)總線上
delay(5);// 稍作延時以待數(shù)據(jù)穩(wěn)定
lcden=1; //
delay(5);//
lcden=0; //
}
void write_data(uchar date)//寫數(shù)據(jù)的狀態(tài)
{
lcdrs=1; // 寫數(shù)據(jù)
P0=date; // p0使顯示數(shù)據(jù)總線
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_1602() // 初始化的狀態(tài)
{ RW=0;
lcden=0;//
write_com(0x38); // 設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接口
write_com(0x0c); // 設(shè)置開顯示,不顯示光標
write_com(0x06); // 寫一個字符后地址自動加1
write_com(0x01); // 清除所有
write_com(0x80);
}
//蜂鳴器
void beep()
{
beep1=0;
delay(100);
beep1=1;
}
//延時函數(shù)
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
|
評分
-
查看全部評分
|