📄 calendar.c
字号:
#include <REG52.H>
#include <intrins.h>
//#include "SoundPlay.h"
#define uchar unsigned char
#define uint unsigned int
sbit CS = P1^0; //片选 高电平有效 单片LCD使用时可固定高电平
sbit SID = P1^1; //数据
sbit SCLK= P1^2; //时钟
sbit KEY_1=P2^0;
sbit KEY_2=P2^1;
sbit KEY_3=P2^2;
sbit KEY_4=P2^3;
sbit bz=P3^5;
void write(bit start, uchar ddata);
void sendbyte(uchar bbyte);
void delay1ms(uint di);
void lcdinit(void);
void lcdtest(void);
void lcdcls(void);
void write(bit start, uchar ddata) //写指令或数据
{
uchar start_data,Hdata,Ldata;
if(start==0) start_data=0xf8; //写指令
else start_data=0xfa; //写数据
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
sendbyte(start_data); //发送起始信号
delay1ms(5); //延时是必须的
sendbyte(Hdata); //发送高四位
delay1ms(1); //延时是必须的
sendbyte(Ldata); //发送低四位
delay1ms(1); //延时是必须的
}
void sendbyte(uchar bbyte) //发送一个字节
{
uchar i;
for(i=0;i<8;i++)
{
SID=bbyte&0x80; //取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1; //左移
}
}
void delay1ms(uint k) //延时
{
uint m,n;
for(m=0;m<k;m++)
for(n=0;n<10;n++);
}
/*****************************************************************************/
//清屏函数
void lcm_clr(void)
{
write(0,0x01);
delay1ms(40); //启动等待,等LCM进入工作状态
}
/*****************************************************************************/
void set_function(uchar c)//功能设定基本功能0X30H,绘图功能开0x36h 绘图关0X34H
{
c=c+0x30;
write(0,c);
}
void addr_zero(void)/*地址归零*/
{
write(0,0x02);
}
void dis_on_off(uchar c)/*显示状态*/
{
c=c+0x08;
write(0,c);
}
void lcdinit(void)
{
write(0,0x01); //清除显示
write(0,0x30); //功能设置 基本功能
write(0,0x02); //地址归零
write(0,0x04); // 鼠标移动和 显示内容同步
write(0,0x0c); // 游标或显示控制
write(0,0x01);
write(0,0x80); //显示首地址
}
//设定字符和汉字坐标。水平方向x:0~7,垂直方向y:0~3
void set_pos(uchar x,uchar y)/*设定行列*/
{write(0,(y%2)*0x10+(y/2)*0x08+x+0x80);}
// 向LCM发送一个字符串,长度64字符之内
void lcm_w_word(uchar *str)
{
while(*str!='\0')
{
write(1,*str++);
}
*str=0;
}
//显示作品信息
void disp_message(void)
{
write(0,0x80);write(1,4);write(1,4);write(1,4);write(1,4);
write(0,0x86);write(1,4);write(1,4);write(1,4);write(1,4);
write(0,0x80);lcm_w_word("****欢迎使用****") ;
write(0,0x90);lcm_w_word("--多功能万年历--");
write(0,0x88);lcm_w_word("作者:xxx ");
write(0,0x98);lcm_w_word("指导老师:刘炽辉") ;
}
/****************************************************************************/
// DS1302 驱动
/*****************************************************************************/
//定义DS1302时钟接口
sbit clock_clk = P1 ^ 3;//ds1302_clk(时钟线)
sbit clock_dat = P1 ^ 4;//ds1302_dat(数据线)
sbit clock_Rst = P2 ^ 7;//ds1302_Rst(复位线?//为了编程方便定义的位变量
sbit a0 = ACC ^ 0;
sbit a1 = ACC ^ 1;
sbit a2 = ACC ^ 2;
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;
/****************************************************************************/
//定义全局变量
uchar yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bit w = 0; //调时标志位
//1302驱动程序
/*void clock_out(unsigned char dd)
{
unsigned char i;
ACC=dd;
for(i=8;i>0;i--)
{
clock_dat=a0;
clock_clk=1;
clock_clk=0;
ACC=ACC>>1;
}
}*/
/******************************************************************************/
/*unsigned char clock_in(void)
{
unsigned char i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
a7=clock_dat;
clock_clk=1;
clock_clk=0;
}
return(ACC);
}*/
//1302驱动程序(底层协议)
void clock_out(uchar dd){
ACC=dd;
clock_dat=a0; clock_clk=1; clock_clk=0;
clock_dat=a1; clock_clk=1; clock_clk=0;
clock_dat=a2; clock_clk=1; clock_clk=0;
clock_dat=a3; clock_clk=1; clock_clk=0;
clock_dat=a4; clock_clk=1; clock_clk=0;
clock_dat=a5; clock_clk=1; clock_clk=0;
clock_dat=a6; clock_clk=1; clock_clk=0;
clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
uchar clock_in(void){
clock_dat=1;
a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
uchar read_clock(uchar ord){
uchar dd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}
/*****************************************************************************/
/*****************************************************************************/
//常用时钟数据读取
void read_clockS(void){
ss = read_clock(0x81);//读取秒数据
mm = read_clock(0x83);//读取分钟数据
hh = read_clock(0x85);//小时
dd = read_clock(0x87);//日
mo = read_clock(0x89);//月
xq = read_clock(0x8b);//星期
yy = read_clock(0x8d);//年
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(uchar ord, uchar dd){
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
/*****************************************************************************/
//调时用加1程序(上层应用)
void Set_time(uchar sel){ //根据选择调整的相应项目加1并写入DS1302
uchar address,item;
uchar max,mini;
write(0,0x9a);
if(sel==7) {address=0x80; max=0;mini=0;} //秒7
if(sel==6) {address=0x82; max=59;mini=0;} //分钟6
if(sel==5) {address=0x84; max=23;mini=0;} //小时5
if(sel==4) {address=0x8a; max=7;mini=1;} //星期4
if(sel==3) {address=0x86; max=31;mini=1;} //日3
if(sel==2) {address=0x88; max=12;mini=1;} //月2
if(sel==1) {address=0x8c; max=99; mini=0;} //年1
//读取1302某地址上的数值转换成10进制赋给item
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(KEY_3 == 0){
delay1ms(10);
if(KEY_3 == 0){
item++;//数加 1
}
}
if(KEY_4 == 0){
delay1ms(10);
if(KEY_4 == 0){
item--;//数减 1
}
}
if(item>max) item=mini;//查看数值有效范围
if(item<mini) item=max;
write_clock(0x8e,0x00);//允许写操作
write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
write_clock(0x8e,0x80);//写保护,禁止写操作
}
/*****************************************************************************/
//设置1302的初始时间
void Init_1302(void){//(2007年1月1日00时00分00秒星期一)
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x08);//年
write_clock(0x8a,0x03);//星期
write_clock(0x88,0x09);//月
write_clock(0x86,0x17);//日
write_clock(0x84,0x23);//小时
write_clock(0x82,0x59);//分钟
write_clock(0x80,0x56);//秒
write_clock(0x90,0xa5);//充电
write_clock(0x8e,0x80);//禁止写操作
}
/*****************************************************************************/
/*****************************************************************************/
//温度传感器定义
sbit DQ = P3 ^ 7;//定义ds18B20总线IO
/******************************************************************************/
void Delay(int num)//延时函数
{
while(num--) ;
}
/******************************************************************************/
void Init_DS18B20(void)//初始化ds1820
{
uchar x=0;
DQ = 1; //DQ复位
Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay(20);
}
/******************************************************************************/
uchar ReadOneChar(void)//读一个字节
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/******************************************************************************/
void WriteOneChar(uchar dat)//写一个字节
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
/******************************************************************************/
uint ReadTemperature(void)//读取温度
{
uchar a=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -