📄 1302.c
字号:
/********************************************************************************************
Create By: he jia xing
Date:2007/12/1
*********************************************************************************************
Modified By:
Date:
*********************************************************************************************
说明:按K3键进行日期,时间设置
按下K2使能或取消闹铃功能,闹铃响时按下K2可以消除铃声
按下K1和K2查看闹铃时间
按下K1和K4设置闹铃时间
**********************************************************************************************
Email: hejiaxing13@yahoo.com.cn
QQ:752957222
**********************************************************************************************/
#include<reg51.h>
#include<intrins.h>
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit LCD_EN = P1^2;
sbit RESET = P2^3;
sbit CLK = P2^1;
sbit DATA = P2^2;
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar inter,flag,flag1,inter1,alarm_flag;
uchar alarm_time[6]={0x30,0x37,0x33,0x30,0x30,0x30};
// 十时 时 十分 分 十秒 秒
uchar code str[] = " / / Week: ";
uchar code str1[] ="Time: ";
uchar code str2[] =" Set Alarmtime: ";
uchar code str3[] =" - - ";
uchar code str4[] =" Alarmtime Is: ";
uchar code str5[] ="Time Is coming !";
sbit K1 = P1^3;
sbit K2 = P1^4;
sbit K3 = P1^5;
sbit K4 = P1^6;
sbit BEEP = P1^7;
uchar code init[8] = {0x12,0x10,0x17,0x01,0x12,0x6,0x07};
// 秒 分 时 日 月 周 年
uchar init1[7] = {0x12,0x10,0x02,0x03,0x01,0x09,0x08};//该数组用于存放读取的时间值
// 秒 分 时 日 月 周 年
uchar init2[16] = {0x12,0x10,0x02,0x03,0x01,0x09,0x08,0x07,0x12,0x10,0x02,0x03,0x01,0x09,0x08,0x07};
// 十秒 秒 十分 分 十时 时 十日 日 十月 月 无 星期 十年 年
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13
//用于存放转换后的时间值
uchar time[2] = {0x00,0x00};
uchar ok,week;
uchar code tab[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//小喇叭
//存放设置过程中的值
unsigned char n=0; //n为节拍常数变量
unsigned char code music_code[] ={
0x7F, 0x16, 0x72 , 0x16, //格式为: 频率常数, 节拍常数, //两只老虎
0x65, 0x16, 0x80 , 0x16,
0x7F, 0x16, 0x72 , 0x16,
0x65, 0x16, 0x80 , 0x16,
0x65, 0x16, 0x60 , 0x16,
0x55, 0x32, 0x65 , 0x16,
0x60, 0x16, 0x55 , 0x32,
0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,
0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,
0x72, 0x16, 0xAB , 0x16,
0x80, 0x32, 0x72 , 0x16,
0xAB, 0x16, 0x80 , 0x32,
0x7F, 0x16, 0x72 , 0x16, //格式为: 频率常数, 节拍常数, //两只老虎
0x65, 0x16, 0x80 , 0x16,
0x7F, 0x16, 0x72 , 0x16,
0x65, 0x16, 0x80 , 0x16,
0x65, 0x16, 0x60 , 0x16,
0x55, 0x32, 0x65 , 0x16,
0x60, 0x16, 0x55 , 0x32,
0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,
0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,
0x72, 0x16, 0xAB , 0x16,
0x80, 0x32, 0x72 , 0x16,
0xAB, 0x16, 0x80 , 0x32,
0x7F, 0x16, 0x72 , 0x16, //格式为: 频率常数, 节拍常数, //两只老虎
0x65, 0x16, 0x80 , 0x16,
0x7F, 0x16, 0x72 , 0x16,
0x65, 0x16, 0x80 , 0x16,
0x65, 0x16, 0x60 , 0x16,
0x55, 0x32, 0x65 , 0x16,
0x60, 0x16, 0x55 , 0x32,
0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,
0x55, 0x10, 0x4c , 0x10,
0x55, 0x10, 0x60 , 0x10,
0x65, 0x16, 0x80 , 0x16,
0x72, 0x16, 0xAB , 0x16,
0x80, 0x32, 0x72 , 0x16,
0xAB, 0x16, 0x80 , 0x32,
0x00
};
void key_set(uchar row,uchar col,uchar max);
void set_flash(uchar row,uchar col);
void key_set_xq(uchar row,uchar col);
void set_alarm_time();
void flash(uchar row,uchar col);
void see_alarm_time(void);
void time_campare();
/************************************************************************************
函数描述:延时
入口参数: ms:延时毫秒数
出口参数:无
*************************************************************************************/
void delay1(int ms)
{
unsigned char y;
while(ms--)
{
for(y = 0; y<250; y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*****************************************************************
函数描述:检查LCD忙状态
入口参数:无
出口参数:无
说明:向lcd写入指令或代码要进行忙状态检测
*****************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/********************************************************
函数描述:写指令数据到LCD
入口参数:cmd:指令代码
出口参数:无
*********************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************
函数描述:写显示数据到LCD
入口参数:dat:要写入的数据
出口参数: 无
*********************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/******************************************************
函数描述:LCD初始化设定
入口参数:无
出口参数:无
说明:lcd显示前,调用该函数
*********************************************************/
void init_lcd()
{
delay1(15);
lcd_wcmd(0x01); //清除LCD的显示内容
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c); //显示开,关光标
delay1(5);
lcd_wcmd(0x06); //移动光标
delay1(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay1(5);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void write_position(uchar row,uchar col)
{
uchar place;
if(row==1)
{
place=0x80+col-1;
lcd_wcmd(place);
}
else
{
place=0xc0+col-1;
lcd_wcmd(place);
}
}
/*******************************************************
函数描述:写自定义字符到指定位置
入口参数:tab:字符代码起始地址(8个代码一个字符)
num: 自定义字符代号,(范围1~8,1号存放在40h,2号存放在48h....
********************************************************/
void writetab(uchar num,uchar *tab)
{
unsigned char i;
lcd_wcmd(64+(num-1)*8); //写CGRAM
for (i = 0; i< 8; i++)
lcd_wdat(*tab++);
}
/*********************************************************************
函数描述:显示自定义字符
入口参数:row:显示位置(行)
col:显示位置(列)
num:自定义字符代码,范围1~8
出口参数:无
***********************************************************************/
void xianshitab(uchar row,uchar col,uchar num)
{ write_position(row,col);
lcd_wdat(num-1);
}
/*********************************************************
函数描述:写入指定n个字符到指定位置(位置向增加方向变化)
入口参数:num:指定字符数目
row:行(范围1~2)
col:列(范围1~16)
str:显示字符的起始地址
出口参数:无
********************************************************/
void write_str1(uchar row,uchar col,uchar *str,uchar num)
{
uchar i=0;
lcd_wcmd(0x06); //移动右移光标
delay1(5);
write_position(row,col);
for(i=0;i<num;i++)
{ lcd_wdat(*str++);
}
}
/*****************************************************************
函数描述:指定位置显示指定字符
入口参数:dat:显示的字符
row:行(范围1~2)
col:列(范围1~16)
出口参数:无
*******************************************************************/
void write_str3(uchar row,uchar col,uchar dat)
{ write_position(row,col);
lcd_wdat(dat);
}
void int1(void) interrupt 3 //采用中断0 控制节拍//10ms
{ TH1=0xd8;
TL1=0xef;
n--;
}
void delay2 (unsigned char m) //控制频率延时,基本延时为1ms
{
unsigned i=m;
while(--i);
}
void delayms(unsigned char a) //毫秒延时子程序
{
while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
}
/*************************************************************************************************
函数描述:播放音乐两只老虎
入口参数:无
出口参数:无
调用模块: time_campare()
***************************************************************************************************/
void playmusic()
{ unsigned char p,m; //m为频率常数变量
unsigned char i=0;
TR1 = 1;
while(1)
{ if(!K2)
break;
a: p=music_code[i];
if(p==0x00)
{ i=0;
delayms(1000);
break;
} //如果碰到结束符,延时1秒,回到开始再来一遍
else if(p==0xff)
{ i=i+1;
delayms(100);
TR1=0;
goto a;
} //若碰到休止符,延时100ms,继续取下一音符
else
{
m=music_code[i++];
n=music_code[i++];
} //取频率常数 和 节拍常数
TR1=1; //开定时器1
while(n!=0)
{
BEEP=!BEEP;
delay2(m);
} //等待节拍完成, 通过P2口输出音频(p2口任何一个口均可接蜂鸣器的输入端)
TR1=0; //关定时器1
} //等待节拍完成, 通过P2口输出音频(p2口任何一个口均可接蜂鸣器的输入端)
TR1=0;
//关定时器1
BEEP = 1;
}
/**************************************************************************
函数描述:向ds1302写一字节数据
入口参数:dat:所写的数据
出口参数:无
***************************************************************************/
void write_dat(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
CLK = 0; //写的时候低电平改变数据
if((dat&0x01)==0x01)
DATA = 1;
else
DATA = 0; //写的时候高电平,把数据写入ds1302
CLK = 1;
_nop_();
dat=dat>>1;
}
}
/*********************************************************************************
函数描述:从ds1302读一字节数据
入口参数:无
出口参数:dat:读到的数据
***************************************************************************/
uchar read_dat()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -