总电路图:
单片机电路图:
1602 接线图:
1302 接线图:(I/O 接单片机 3.5 脚)
按键接线图:
程序清单:
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit t=P1^0;//进入调时按键
sbit jia=P1^1;//加一按键
sbit jian=P1^2;//减一按键
sbit m=P1^3;//退出调时按键
sbit BEEP=P2^0;//蜂鸣器
sbit jtod=P1^4;//矩阵按键转独立按键,该脚置 0
sbit T_CLK = P1^6; /*实时时钟时钟线引脚 */
sbit T_IO = P3^5; /*实时时钟数据线引脚 */
sbit T_RST = P1^7; /*实时时钟复位线引脚 */
sbit E=P2^7;
sbit RW=P2^6;
sbit RS=P2^5;
uchar
code
hanzi[][8]={{0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02},{0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,
0x11},{0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}};
//1602 数据/命令选择引脚
//1602 使能引脚
//1602 读写引脚
void v_W1302(uchar ucAddr, uchar ucDa);
uchar uc_R1302(uchar);
uchar dectobcd(uchar bcd);
uchar bcdtodec(uchar);
void beep();
void delay(uchar x)
{
uchar i;
while(x--)
for(i=0;i<110;i++);
}
/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602 命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void enable(uchar del)
{
}
RS = 0;
RW = 0;
P0 = del;
E = 1;
delay(3);
E=0;
/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602 写数据函数
* 输入 : 需要写入 1602 的数据
* 输出 : 无
***********************************************************************/
void write(uchar del)
{
RS = 1;
RW = 0;
P0 = del;
E = 1;
delay(3);
E=0;
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602 初始化,请参考 1602 的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x06);
enable(0x0c);
E=0;
}
//装入自定义字符(汉字)
void writch()
{
uchar i,j;
enable(0x40);
for(i=0;i<8;i++)
for(j=0;j<8;j++)
write(hanzi[i][j]);
}
/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
L1602_char(1,5,'b')
* 输入 : 行,列,需要输入 1602 的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign);
}
/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该
函数如下
L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入 1602 的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == '\0') break;
write(*p);
p++;
}
}
//时钟调节//
void timechange()
{
uchar a,num=1;
uchar year,mon,day,hour,min,sec;
//进入调时循环
while(num)
{
if(t==0)
delay(5);
if(t==0)
{
num++;
beep();
while(!t);
}
//退出调时按键 m
if(m==0)
delay(5);
if(m==0)
num=0;
enable(0x0f);
a=uc_R1302(0x81)|0x80;
v_W1302(0x8e,0);
v_W1302(0x80,a);
//调时到年以后退出调时
if(num==7)
num=0;
//num=1 调秒
if(num==1)
{
enable(0xc0+12);
if(jia==0)
delay(5);
if(jia==0)
{
//秒加一
while(!jia);
sec=bcdtodec(uc_R1302(0x81)&0x7f);
sec++;
if(sec>59)
sec=0;
L1602_char(2, 12, sec/10%10+48);
L1602_char(2, 13, sec%10 + 48);
v_W1302(0x80,dectobcd(sec)|0x80);
}
if(jian==0)
delay(5);
if(jian==0)
{
//秒减一
while(!jian);
sec=bcdtodec(uc_R1302(0x81));
sec--;
if(sec==-1)
sec=59;
L1602_char(2, 12, sec/10%10+48);
L1602_char(2, 13, sec%10 + 48);
v_W1302(0x80,dectobcd(sec)|0x80);
//调分钟
}
}
if(num==2)
{
enable(0xc0+9);
if(jia==0)
delay(5);
if(jia==0)
{
min = bcdtodec(uc_R1302(0x83));
min++;
while(!jia);
if(min>59)
min=0;
L1602_char(2, 9, min / 10 % 10 + 48);
L1602_char(2, 10, min % 10 + 48);
v_W1302(0x82,dectobcd(min));
}
if(jian==0)
delay(5);
if(jian==0)
{
min = bcdtodec(uc_R1302(0x83));
min--;
while(!jian);
if(min==-1)
min=59;
L1602_char(2, 9, min / 10 % 10 + 48);
L1602_char(2, 10, min % 10 + 48);