|
#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; // 数据或者命令选择端
void delay(uint); // 延时函数
void key(); // 按键扫描
void beep(); // 蜂鸣器
void show(); // 显示函数
void init_T1(); // 定时器初始函数
void init_1602(); // 1602初始函数
void write_com(uchar com); // 命令选择端
void write_data(uchar date); // 数据选择端
void main() // 主函数
{
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; //关定时器 否则会无法调节
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); //关光标
TR1=1;
}
}
}
if(num!=0) //只有功能按键按下去的时候才可以调节
{
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)//写命令的状态
{
lcdrs=0;//选择写命令模式
P0=com; // 将要写入的命令送到数据总线上
delay(5);// 稍作延时以待数据稳定
lcden=1; //
delay(5);//
lcden=0; //
}
void write_data(uchar date)//写数据的状态
{
lcdrs=1; // 写数据
P0=date; // p0使显示数据总线
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_1602() // 初始化的状态
{ RW=0;
lcden=0;//
write_com(0x38); // 设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); // 设置开显示,不显示光标
write_com(0x06); // 写一个字符后地址自动加1
write_com(0x01); // 清除所有
write_com(0x80);
}
//蜂鸣器
void beep()
{
beep1=0;
delay(100);
beep1=1;
}
//延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
|
评分
-
查看全部评分
|