📄 2402test.txt
字号:
return(t);
}
//*******************写一个字节**************************************************************
void printTemperature(void)
{
unsigned int i=0;
unsigned char a=0,b=0,c=0;
i=ReadTemperature(); //读温度并送显
a=i/100;
if(a>0x09)
{
print(0xc0,"--.-");
}
else
{
print2(0xc0,a+0x30); //显示温度十位
b=i/10-a*10;
print2(0xc1,b+0x30); //个位
print(0xc2,"."); //"."
c=i-a*100-b*10;
print2(0xc3,c+0x30); //小数点后1位
}
print2(0xc4,0x00); //度C
print(0xc5,"C");
}
//=================================DS1302时钟驱动=============================================
//注释DS1302寄存器
// DS1302内部RAM分址:00 = 0xc0(写) = 0xc1(读) 奇数是读,偶数是写
//*******************定义DS1302时钟接口*******************************************************
sbit clock_clk = P3 ^ 5; //ds1302_clk(时钟线)
sbit clock_dat = P3 ^ 6; //ds1302_dat(数据线)
sbit clock_Rst = P3 ^ 7; //ds1302_Rst(复位线)
//*******************定义累加器A中的各位******************************************************
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;
//*******************定义全局变量************************************************************
//unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bit w = 0; //调时标志位
//*******************1302驱动程序(底层协议)************************************************
void clock_out(unsigned char 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写入字节(底层协议)**********************************************
unsigned char 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写数据(底层协议)************************************************
void write_clock(unsigned char ord, unsigned char dd)
{
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
//*******************DS1302读数据(底层协议)************************************************
unsigned char read_clock(unsigned char ord)
{
unsigned char 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 Set_time(unsigned char sel,bit a) //根据选择调整的相应项目加1并写入DS1302
{
signed char address,item,item2;
signed char max,mini;
write_clock(0x8e,0x00); //允许写操作
if(sel==7) {address=0x80; max=59;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=0;} //日3
if(sel==2) {address=0x88; max=12;mini=0;} //月2
if(sel==1) {address=0x8c; max=99;mini=0;} //年1
if(a==0) //如果a是0则表示现在键入的是 十位 数据
{
write_clock(address,0x00); //将 个位 的数据清0 防止数值范围计算有错
item = DT; //键值数给 十位
item2 = 0; // 个位 填入 0
}
else //否则是 个位数据
{
item = (read_clock(address+1))/16; //先读出 十位 数据
item2 = DT; //键值放入 个位
}
item=(item)*10+(item2); //将 十位 和 个位 数据合成
if(item>max)
item=mini; //查看数值有效范围
if(item<mini)
item=max;
write_clock(address,(item/10)*16+item%10); //转换成16进制写入1302
write_clock(0x8e,0x80); //写保护,禁止写操作
}
//*******************检测时钟芯片是否未被初始化,如是则设置1302的初始时间******************
void Init_1302(void) //2008年1月1日00时00分00秒星期二
{
menu=0;
if(read_clock(0xc1)!=0xaa)
{
write_clock(0x8e,0x00); //允许写操作
write_clock(0x8c,0x08); //年
write_clock(0x8a,0x02); //星期
write_clock(0x88,0x01); //月
write_clock(0x86,0x01); //日
write_clock(0x84,0x00); //小时
write_clock(0x82,0x00); //分钟
write_clock(0x80,0x00); //秒
write_clock(0x90,0xa5); //充电
write_clock(0xc0,0xaa); //写入初始化标志RAM(第00个RAM位置)
write_clock(0x8e,0x80); //禁止写操作
AT24C02_Write1Byte(0x03,0x00); //初始化24C00中的报警开关选择寄存器
menu=1; //如果初始化则直接提示调时
}
}
//*******************定义小汉字**************************************************************
uint8 code Xword[]={
0x02,0x05,0x05,0x02,0x00,0x00,0x00,0x00,
//0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00, //C,代码 0x03
0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, //一,代码 0x04
0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00, //二,代码 0x05
0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00, //三,代码 0x06
0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00, //四,代码 0x07
0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00, //五,代码 0x08
0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00, //六,代码 0x09
0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00, //日,代码 0x0a
//0x08,0x0f,0x14,0x0f,0x0c,0x1f,0x04,0x00, //年
//0x07,0x09,0x0f,0x09,0x0f,0x0b,0x11,0x00, //月
//0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00, //日
//星
//期
};
//*******************装入cgram***************************************************************
void CgramWrite(void)
{
uint8 i;
LCM2402_WriteCMD(0x06); // CGRAM地址自动加1
LCM2402_WriteCMD(0x40); // CGRAM地址设为00处
for(i=0;i<64;i++)
{
LCM2402_WriteData(Xword[i]);
}
}
//=================================红外遥控接收==============================================
sbit KBS=P3^2;
/********************************************************************************************
* 函数名称:keyboard_int
* 功 能:中断 红外遥控器数据接收初始化
********************INT0中断0 P3.2引脚,不能更改********************************************/
void keyboard_int(void)
{
TMOD=0x01; //定时器0方式1
EA=1; //允许CPU中断
IT0=1; //INT0下降沿有效
EX0=1; //开INT0中断
DT=0xff;
}
/********************************************************************************************
* 函数名称:keyboard
* 功 能:中断 红外遥控器数据接收
* 入口参数:无
* 出口参数:无
********************定时器0中断处理**********************************************************/
void timeint(void) interrupt 1 using 2
{
TH0=0xFC;
TL0=0xE0; //设定时值为800us
if(IRCON<3)
{
if(IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
{
IRCON2++;
IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
IRCode[IRCON]=IRCode[IRCON]|KBS; //每八次填满一个字节,一个字节存放遥控编码4个位
//LED1=~LED1;
}
else
{
IRCON++; //填满一个字节,指向下一个变量
IRCON2=0; //计数清零
}
}
else
{
TR0 = 0; //关闭定时器
ET0 = 0; //定时器0中断关闭
if((IRCode[1]!=0xff)&&(IRCode[2]!=0xff))
{
if(IRCode[1]==0x55)
{
LED1=0;
switch(IRCode[2])
{
case 0xD2: DT = 0X4C;break; //POWER ON
case 0xD3: DT = 0X2F;break; //MUTE OFF
case 0xAB: DT = 0x01;break; //1键控制
case 0xAC: DT = 0x02;break; //2键控制
case 0xAD: DT = 0x03;break; //3键控制
case 0xB2: DT = 0x04;break; //4键控制
case 0xB3: DT = 0x05;break; //5键控制
case 0xB4: DT = 0x06;break; //6键控制
case 0xB5: DT = 0x07;break; //7键控制
case 0xCA: DT = 0x08;break; //8键控制
case 0xCB: DT = 0x09;break; //9键控制
case 0xAA: DT = 0x00;break; //0键控制
case 0xCC: DT = 0X11;break; // -/--
case 0x54: DT = 0X12;break; // SEARCH
case 0x2A: DT = 0X17;break; // vol+
case 0x2B: DT = 0X1A;break; // vol-
case 0xD5: DT = 0X19;break; // RECALL
case 0xD4: DT = 0X1B;break; // PP
}
}
if(IRCode[1]==0x56)
{
LED1=0;
switch(IRCode[2])
{
case 0xAA: DT=0x13;
break; //PR+
case 0xAB: DT=0x14;
break; //PR-
case 0xCD: DT=0x15;
break; //FT+
case 0xD2: DT=0x16;
break; //FT-
case 0xCB: DT=0x18;
break; //STORE
case 0xB4: DT=0x1C;
break; //SLEEP
case 0x4A: DT=0X1D;
break; //AV
}
}
}
EX0=1; //开INT0中断;
}
}
void INT0Fun(void) interrupt 0 using 3 //INT0中断
{
EX0=0; //外部中断0关闭
ET0=1; //定时器0中断打开
TH0=0xFC;
TL0=0xE0; //设定时值为800us
for(IRCON=0;IRCON<3;IRCON++)
{
IRCode[IRCON]=0;
}
IRCON=0;
IRCON2=0; //计数清零
TR0=1; //开始计数
}
//=================================BEEP驱动==================================================
sbit Bell_Out=P3 ^ 0; //元件是动圈式扬声器(并非有源蜂鸣器),需要MCU驱动发声
//*******************************************************************************************
void beep(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
{
for(;a>0;a--) //第一个声音的长度
{
Bell_Out=~Bell_Out; //取反扬声器驱动口,以产生音频
Delay(b); //音调设置延时
}
for(;c>0;c--) //同上
{
Bell_Out=~Bell_Out;
Delay(d);
}
Bell_Out=1;
}
//*******************************************************************************************
//---------------------------扬声器--按键音
void beep_k(void)
{
beep(10,60,5,250);
}
//---------------------------扬声器--闹钟报警
void beep_a(void)
{
beep(250,16,150,40);
}
//---------------------------扬声器--成功音
void beep_y(void)
{
beep(50,30,100,50);
}
//---------------------------扬声器--无效音
void beep_n(void)
{
beep(50,80,100,100);
}
//================================纯软件部分=================================================
//显示项目 时间部分 在第一行全行显示时间
//*******************************************************************************************
void RealTime_Display(void)
{
print(0x80,"20");
print2(0x82,(read_clock(0x8d)/16)+0x30);
print2(0x83,(read_clock(0x8d)%16)+0x30);
print(0x84,"/"); // 显示年
print2(0x85,(read_clock(0x89)/16)+0x30);
print2(0x86,(read_clock(0x89)%16)+0x30);
print(0x87,"/"); // 显示月
print2(0x88,(read_clock(0x87)/16)+0x30);
print2(0x89,(read_clock(0x87)%16)+0x30);
print(0x8a," ["); // 显示[
print2(0x8c,read_clock(0x8b)%16); // 星期
print(0x8d,"] "); // 显示]
print2(0x8f,(read_clock(0x85)/16)+0x30); // 小时
print2(0x90,(read_clock(0x85)%16)+0x30);
print(0x91,":"); // 显示cgram第一个字模":"
print2(0x92,(read_clock(0x83)/16)+0x30); // 分钟
print2(0x93,(read_clock(0x83)%16)+0x30);
print(0x94,":"); // 显示cgram第一个字模":"
print2(0x95,(read_clock(0x81)/16)+0x30); // 秒
print2(0x96,(read_clock(0x81)%16)+0x30);
// print(0x8a," "); //在主显示区空白处写入空格 防止乱码
// print(0x8e," ");
// print(0xc0," ");
}
/********************************************************************************************
//显示项目 定时时间部分 在第一行全行显示时间
*********************************************************************************************/
void alarm_Display(void)
{
print(0x80,"AL");
print2(0x82,(AT24C02_Read1Byte(0x05+(rom*10))/16)+0x30);
print2(0x83,(AT24C02_Read1Byte(0x05+(rom*10))%16)+0x30);
print(0x84,"/"); // 显示年
print2(0x85,(AT24C02_Read1Byte(0x06+(rom*10))/16)+0x30);
print2(0x86,(AT24C02_Read1Byte(0x06+(rom*10))%16)+0x30);
print(0x87,"/"); // 显示月
print2(0x88,(AT24C02_Read1Byte(0x07+(rom*10))/16)+0x30);
print2(0x89,(AT24C02_Read1Byte(0x07+(rom*10))%16)+0x30);
print(0x8b,"["); // 显示[
if(AT24C02_Read1Byte(0x08+(rom*10))==0xff)
{
print(0x8c,"?");
}
else
{
print2(0x8c,AT24C02_Read1Byte(0x08+(rom*10))%16); //星期
}
print(0x8d,"]"); // 显示]
print2(0x8f,(AT24C02_Read1Byte(0x09+(rom*10))/16)+0x30); //小时
print2(0x90,(AT24C02_Read1Byte(0x09+(rom*10))%16)+0x30);
print(0x91,":"); // 显示cgram第一个字模":"
print2(0x92,(AT24C02_Read1Byte(0x0a+(rom*10))/16)+0x30); //分钟
print2(0x93,(AT24C02_Read1Byte(0x0a+(rom*10))%16)+0x30);
print(0x94,":"); // 显示cgram第一个字模":"
print2(0x95,(AT24C02_Read1Byte(0x0b+(rom*10))/16)+0x30); //秒
print2(0x96,(AT24C02_Read1Byte(0x0b+(rom*10))%16)+0x30);
print2(0xc0,AT24C02_Read1Byte(0x04+(rom*10))/16+0x30); //显示控制项值
print2(0xc1,AT24C02_Read1Byte(0x04+(rom*10))%16+0x30);
}
/********************************************************************************************
清屏+刷新显示+延时+清空DT 一体函数
LRDD()
*********************************************************************************************/
void LRDD (void)
{
LCM2402_Init();
RealTime_Display();
DelayS(500);
DT=0xff;
}
/********************************************************************************************
清屏+刷新定时值显示+延时+清空DT 一体函数
LADD()
*********************************************************************************************/
void LADD (void)
{
LCM2402_Init();
alarm_Display();
DT=0xff;
}
/********************************************************************************************
闹钟呜响查寻程序
BEEPing();
********************************************************************************************/
void BEEPing(void) //闹钟呜响查寻程序
{
uint8 a;
LADD();
print(0xc4,"{Time's up} AV: Stop");
for(a=0;a<250&&DT==0xff;a++)
{
beep_a();
}
DT=0xff;
}
/********************************************************************************************
闹钟和无线遥控的键值处理
ALARMing();
*********************************************************************************************/
void ALARMing(void)
{
uint8 alarm_bit;
alarm_bit = AT24C02_Read1Byte(0x03); // 从AT24C02的地址0x03读出定时报警设置数据
if(AT24C02_Read1Byte(0x04+(rom*10))<2&&alarm_bit==1||alarm_bit==3)//键值值为0则是闹钟,不为0则是无线控制
{
if(AT24C02_Read1Byte(0x04+(rom*10))==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -