标题:
红外遥控器+DS1320+89C52+1602的电子时钟程序 95%是自己写的
[打印本页]
作者:
daxiao
时间:
2015-3-22 02:35
标题:
红外遥控器+DS1320+89C52+1602的电子时钟程序 95%是自己写的
本帖最后由 daxiao 于 2015-3-22 02:36 编辑
功能
1.时间显示(完成) RAM2.5KB
2.整点报时 (完成) RAM2.5KB
3.量程为24小时的秒表(完成)RMA3.5KB
4.时间调整 (完成)RMA 4.5KB
5.闹钟 (完成)RAM4.8K
6.防盗警戒(未完成)
7.计算机 (未完成)
8.逻辑分析仪(未完成)
#include<reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
volatile char ws;
uchar lcd6;
uchar jm;
uchar n,y,r,s,f,m,z;
uchar ns,nf,nm;
uchar we;
uchar bla,blb,blc;
sbit ACC_7=ACC^7; //位寄存器
sbit SCLK=P1^3; //时钟引脚定义
sbit DIO=P1^4; //IO引脚定义
sbit CE=P1^5; //读、写数据期间,必须为高
sbit LCD_RS=P1^0; //寄存器选择位
sbit LCD_RW=P1^1; //读写控制位
sbit LCD_EN=P1^2; //开关
sbit FMQ=P3^7; //定义蜂鸣引脚
uchar code LCD[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46}; //LCD的数字整形码
uchar code LCDDZ[13]={0x02,0x03,0x05,0x06,0x08,0x09,0x43,0x48,0x49,0x4b,0x4c,0x4e,0x4f};
uchar code LCD7_1[16]={"1.clock shows "}; //界面1入口,“时钟显示”
uchar code LCD7_2[16]={"2.second clock "}; //界面2入口,“秒的时钟”
uchar code LCD7_3[16]={"3.alarm clock "}; //界面3入口,“闹钟”
uchar code LCD7_4[16]={"4.onguard "}; //界面4入口,“值班警戒”
uchar code LCD7_5[16]={"5.news "}; //界面5人口,"信息"
uchar code LCD7_6[16]={"6.time alter "}; //界面6修改时间
uchar code LCD8_0[16]={" 09 DZ1B "};
uchar code LCD1_0[16]={"20 . . "}; //界面1,时间显示
uchar code LCD1_1[16]={"WEEK : : "}; //界面1,时间显示
uchar code LCD2_0[16]={" 00:00:00 "}; //界面2,秒表
uchar code LCD3_0[16]={"alarm 00:00:00 "}; //界面3,时间设置
uchar code LCD4_0[16]={"00:00 - 00:00"}; //界面4,警戒时间设置
uchar code LCD5_0[16]; //界面5,信息栏记录陌生人进人情况
uchar code LCD5_1[16]; //界面5,信息栏记录陌生人进人情况
uchar code LCD5_2[16]; //界面5,信息栏记录陌生人进人情况
uchar code LCD5_3[16]; //界面5,信息栏记录陌生人进人情况
uchar code LCD5_4[16]; //界面5,信息栏记录陌生人进人情况
uchar code LCD6_0[16]={"20 . . "};
uchar code LCD6_1[16]={"WEEK : : "};
uchar code LCDY[5];
uchar code LCDR[5];
uchar code LCDS[5];
uchar code LCDF[5];
uchar code LCDM[5];
//-------------------延时子函数 ---//
void delay(uint ms)
{
uchar ii,jj;
for(ii=0;ii<ms;ii++)
{
for(jj=0;jj<121;jj++)
{;}
}
}
//------------------X1302------//
void X1302(uchar add,uchar dat) //地址,数据
{
uchar aa;
CE=0; //关闭读写使能,读、写数据期间,必须为高
SCLK=0; //拉低时钟线
CE=1; //开启读写使能
for(aa=0;aa<8;aa++) //写入地址
{
DIO=add&0x01; //把add的最低位送给数据线
SCLK=1; //时钟拉高
add>>=1; //累加器右移1位
SCLK=0; //时钟拉
}
for(aa=0;aa<8;aa++) //写入数据
{
DIO=dat&0x01; //把要写入1302的数据地位送到数据线
SCLK=1; //时钟拉高,把数据发送出去
dat>>=1; //数据右移1位,把最低位去掉
SCLK=0; //把时钟拉低,准备下一次发数据
}
SCLK=1; //写完数据要把时钟线拉高,要是读完数据的话就要拉低时钟线
CE=0; //关闭读写使能
return;
}
//-------------------D1302-------------//
uchar D1302(uchar addr) //读数据子函数 输入地址,返回数据
{
uchar ab,temp,dat1,dat2; //定义变量
CE=0; //关闭读写数据使能
SCLK=0; //时钟拉低,准备要接收数据
CE=1; //开读写数据使能
for(ab=8;ab>0;ab--) //发地址
{
SCLK=0; //时钟拉低,准备接收数据
temp=addr; //把地址送给变量temp
DIO=(bit)(temp&0x01); //传送低字节
addr>>=1; //地址addr右移1位
SCLK=1; //时钟拉高 ,让1302读入地址
}
for(ab=8;ab>0;ab--) //读数据
{
ACC_7=DIO; // ACC-7=接收新的一位数据
SCLK=1; //时钟拉高,告诉1302我接收到数据了!!
ACC>>=1; //ACC右移1位,把刚接到的数据移到低位去
SCLK=0; //时钟拉低,告诉1302,请为我准备下一个数据
}
CE=0; //关闭读写数据使能
dat1=ACC; //把ACC的数据送给dat1
dat2=dat1/16; //数据转换 dat2=数据的 "十六位"
dat1=dat1%16; //数据转换 dat1=数据的 "个位"
dat1=dat1+dat2*10; //再一次数据转换(把接收到的BCD码转换成十进制码)
return(dat1); //反回读到的数据
}
//-----------检查LCD忙状态 --//
void lcd_busy()
{
P0=0xff;
LCD_RS=0; //选择指令寄存器
LCD_RW=1; //进行读操作
LCD_EN=1; //使能
while((P0&0x80)==0x80);
LCD_EN=0; //关使能
}
//-----------------------------读LCD显示的数字--//
uchar lcd_sz(uchar sxs)
{
uchar xx;
delay(2);
LCD_RS=0; //选择指令
LCD_RW=0; //选择写操作
LCD_EN=0; //关使能 ,让P0数据线上数据
P0=(sxs|0x80); //DDRAM数据指针=80+地址变量
delay(2);
LCD_EN=1; //开使能 ,让LCD读单片机的指令
delay(5);
LCD_EN=0; //关使能
P0=0xff; //置高电平
LCD_RS=1; //选择指令寄存器
LCD_RW=1; //进行读操作
LCD_EN=1; //开使能
delay(2);
xx=P0; //记录数据
LCD_EN=0; //关使能
return xx;
}
//----------------------写指令数据到LCD --//
void lcd_wcmd(uchar cmd)
{
lcd_busy();
LCD_RS=0; //选择写操作
LCD_RW=0; //进行写操作
LCD_EN=0; //关使能 ,让数据线上数据
P0=cmd; //送指令代码
delay(2);
LCD_EN=1; //开使能 ,让单片机读指令
delay(5);
LCD_EN=0; //关使能
return;
}
//-------------------------写显示数据到LCD --//
void lcd_wdat(uchar dat)
{
lcd_busy(); //读忙
LCD_RS=1; //选择数据寄存器
LCD_RW=0; //进行读操作
LCD_EN=0; //关使能
P0=dat; //写入要显示的字符
LCD_EN=1; //开使能 ,让LCD读进数据
delay(2);
LCD_EN=0; //关使能 ,不让LCD操作
return;
}
//----------------------设定显示位置 pos是屏幕的地址 --//
void lcd_pos(uchar pos)
{
lcd_busy();
LCD_RS=0; //选择写操作
LCD_RW=0; //进行写操作
LCD_EN=0; //关使能 ,让数据线上数据
P0=(pos|0x80); //DDRAM数据指针=80+地址变量
delay(2);
LCD_EN=1; //开使能 ,让单片机读指令
delay(5);
LCD_EN=0; //关使能
return;
}
//-----------------------LCD初始化设定 --//
void lcd_init()
{
lcd_busy(); //读忙
lcd_wcmd(0x3c); //工作方式设置8位长,两行,5*7
delay(5); //延时5ms
lcd_wcmd(0x02);
delay(5); //延时5ms
lcd_wcmd(0x06); //设置输入方式为AC是加1计数器,画面禁止滚动
delay(5); //延时5ms
lcd_wcmd(0x0c); //显示开,关光标
delay(5); //延时5mS
return;
}
//---------------闪动子程序 //
void fengming(uchar fm)
{
for(;fm<0;fm--)
{
FMQ=0;
lcd_wcmd(0x08); //关闭显示
delay(200);
FMQ=1; //延时
lcd_wcmd(0x0c); //开显示
delay(200);
}
return;
}
//----------------------- 红外--//
void int_init(void) //初始化
{
EX0=1; //开外部中断0
EX1=1; //INT1开
IT1=1; //负跳变触发
EA=1; //开总开关
return;
}
//------------------------------------------------//
void interrupt0()interrupt 0 //总断子函数
{
uchar i=0,j=0,k=0,us=0; //定义字符变量i j k us
uchar addr[4]={0}; //定义字符型数组
EX0=0; //关中断总开关
for(i=0;i<255;i++) //9ms内有高电平认为是干扰
{
if(P3&0x04) //255的值实际时间为800us
{
EX0=1;
return;
}
}
while(!(P3&0x04)); //等待9ms低电平过去
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(P3&0x04); //等待4.5ms高电平过去
while(!(P3&0x04)); //等待0.56ms低电平后面的高电平
while(P3&0x04) //计算这个高电平的时间
{
for(us=0;us<=32;us++); //100us的延时语句
if((k++)>=30) //高电平时间过长退出程序
{
EX0=1;
return;
}
}
addr[i]=addr[i]>>1; //接收一位数据
if(k>=8)
addr[i]=addr[i]|0x80; //高电平大于0.56ms,则为1
k=0;
}
}
ws=addr[2];
FMQ=0;
for(j=5;j>0;j++)
{
for(i=0;i<121;i++)
{;}
}
FMQ=1;
EX0=1;
}
//------------------------------------------//
void interrupt2()interrupt 2 //总断子函数
{
uchar d,e;
EX0=0;
FMQ=0;
for(bla=0;bla<3;bla++)
{
for(blb=0;blb<121;blb++)
{for(d=0;d<1000;d++)
{
for(e=0;e<40;e++)
{
;
}
FMQ=~FMQ;
}
for(d=0;d<350;d++)
{
for(e=0;e<140;e++)
{
;
}
FMQ=~FMQ;
}
}
}
FMQ=1;
EX0=1;
}
//---------------------------------主菜单 JM7---------/
void JM7CD()
{
uchar K7=1;
uchar i;
if(jm==0x70)
{
jm=0x71;
}
lcd_wcmd(0x0f);
delay(2);
ws=0x01;
while(K7)
{
while(ws==0x00);
{
switch(ws)
{
case 0x43: //确认
jm%=16;
jm*=16;
K7=0;
break;
case 0x47: //确认
jm%=16;
jm*=16;
K7=0;
break;
case 0x44: //上一条
if(jm>0x71)
{
jm-=0x01;
}
break;
case 0x07: //上一条
if(jm>0x71)
{
jm-=0x01;
}
break;
case 0x19: //上一条
if(jm>0x71)
{
jm-=0x01;
}
break;
case 0x40: //下一条
if(jm<0x76)
{
jm+=0x01;
}
break;
case 0x15: //下一条
if(jm<0x76)
{
jm+=0x01;
}
break;
case 0x0d: //下一条
if(jm<0x76)
{
jm+=0x01;
}
break;
case 0x0c: //第1界面
jm=0x10;
K7=0;
break;
case 0x18: //第2界面
jm=0x20;
K7=0;
break;
case 0x5e: //第3界面
jm=0x30;
K7=0;
break;
case 0x08: //第4界面
jm=0x40;
K7=0;
break;
case 0x1c: //第5界面
jm=0x50;
K7=0;
break;
case 0x5a: //第6界面
jm=0x60;
K7=0;
break;
default:
break;
}
}
delay(10);
{
switch(jm)
{
case 0x71:
lcd_pos(0x00);
delay(2);
for(i=0;i<16;i++)
{
lcd_wdat(LCD7_1[i]); // 1.clock shows 界面1入口,“时钟显示”
delay(2);
}
lcd_pos(0x40);
delay(2);
for(i=0;i<16;i++)
{
lcd_wdat(LCD7_2[i]); //2.second clock
delay(2);
}
break;
case 0x72:
for(i=0;i<16;i++)
{
lcd_wdat(LCD7_2[i]); //2.second clock
delay(2);
}
lcd_pos(0x40);
for(i=0;i<16;i++)
{
lcd_wdat(LCD7_3[i]); //3.alarm clock 界面3入口,“闹钟”
delay(2);
}
break;
case 0x73:
for(i=0;i<16;i++)
{
lcd_wdat(LCD7_3[i]); //3.second clock
delay(2);
}
lcd_pos(0x40);
for(i=0;i<16;i++)
{
lcd_wdat(LCD7_4[i]); //4.alarm clock 界面3入口,“闹钟”
delay(2);
}
break;
case 0x74: //4.alarm clock 界面3入口,“闹钟”
for(i=0;i<16;i++)
{
lcd_wdat(LCD7_4[i]);
delay(2);
}
lcd_pos(0x40);
for(i=0;i<16;i++) //5
{
lcd_wdat(LCD7_5[i]);
delay(2);
}
break;
case 0x75:
for(i=0;i<16;i++)
{ // 5
lcd_wdat(LCD7_5[i]);
delay(2);
}
lcd_pos(0x40);
for(i=0;i<16;i++)
{ //6
lcd_wdat(LCD7_6[i]);
delay(2);
}
break;
case 0x76:
for(i=0;i<16;i++)
{ // 5
lcd_wdat(LCD7_6[i]);
delay(2);
}
lcd_pos(0x40);
for(i=0;i<16;i++)
{ //6
lcd_wdat(LCD8_0[i]);
delay(2);
}
break;
default:break;
}
lcd_pos(0x00);
delay(2);
}
ws=0x00;
}
lcd_wcmd(0x0c);
return;
}
//-------------------------------------------JM1 显示时间//
void JM1SJ()
{
uchar K1=1;
lcd_pos(0x00);
for(K1=0;K1<16;K1++)
{
lcd_wdat(LCD1_0[K1]);
delay(2);
}
lcd_pos(0x40);
for(K1=0;K1<16;K1++)
{
lcd_wdat(LCD1_1[K1]);
delay(2);
}
K1=1;
while(K1)
{
n=D1302(0x8d); //读1302的年
delay(1);
y=D1302(0x89); //读1302的月
delay(1);
r=D1302(0x87); //读1302的日
delay(1);
s=0x1f&D1302(0x85); //读1302的时
delay(1);
f=0x7f&D1302(0x83); //读1302的分
delay(1);
m=0x7f&D1302(0x81); //读1302的秒
delay(1);
z=D1302(0x8b); //读1302的星期
delay(1);
lcd_pos(0x02); //定位
delay(2);
lcd_wdat(LCD[n/10]); //写 LCD1602显示十位年
delay(1);
lcd_wdat(LCD[n%10]); //写LCD1602显示年
delay(1);
lcd_pos(0x05); //定位
delay(2);
lcd_wdat(LCD[y/10]); //写显示十位月
delay(1);
lcd_wdat(LCD[y%10]); //写显示月
delay(1);
lcd_pos(0x08); //定位
delay(2);
lcd_wdat(LCD[r/10]); //写显示十位日
delay(1);
lcd_wdat(LCD[r%10]); //写显示日
delay(1);
lcd_pos(0x44); //定位
delay(2);
lcd_wdat(LCD[z]); //写显示星期
delay(1);
lcd_pos(0x48); //定位
delay(2);
lcd_wdat(LCD[s/10]); //显示十位时
delay(1);
lcd_wdat(LCD[s%10]); //显示时
delay(1);
lcd_pos(0x4b); //定位
delay(2);
lcd_wdat(LCD[f/10]); //显示十位分
delay(1);
lcd_wdat(LCD[f%10]); //显示分
delay(1);
lcd_pos(0x4e); //定位
delay(2);
lcd_wdat(LCD[m/10]); //显示秒的十位
delay(2);
lcd_wdat(LCD[m%10]); //显示秒的个位
delay(2);
while(s==ns&&f==nf&&m==nm&&we==1) //闹钟
{
while(ws==0x00)
{
FMQ=0;
for(s=5;s>0;s++)
{
for(m=0;m<121;m++)
{;}
}
FMQ=1;
}
ws=0x99;
s++;
}
while(f==0x00||f==0x1e) //整点报时
{
while(m<0x01)
{
FMQ=0;
delay(3);
m=0x03;
}
FMQ=1;
f++;
}
while(ws==0x45||ws==0x46) // 退出
{
K1=0;
jm=0x70;
ws=0x00;
}
}
return;
}
//------------------------------------------JM2MB 秒表//
void JM2MB()
{
uchar K2=1; //定义变量K2
uint bs,bf,bm; //定义变量bs,bf,bm 时分秒
uchar i,j; //定义变量i,j
lcd_wcmd(0x01); // 写清屏指令到LCD
lcd_pos(0x00); //设定LCD的显示位置0x00
for(i=0;i<16;i++) //把秒表的摸块显示出来 00:00:00
{
lcd_wdat(LCD2_0[i]);
}
while(K2) //进入K2函数循环
{
bs=0x1f&D1302(0x85); //读当前时间时
bf=0x7f&D1302(0x83); //读当前时间分
bm=0x7f&D1302(0x81); //读当前时间秒
delay(10);
while(ws==0x43) //开始计时循环
{
j=0x7f&D1302(0x81); //变量j赋值时间秒
i=j;
if(j<bm) //判断j和bm那个大
{j=bm-j;
j=0x3c-j;
}
else{j-=bm;}
lcd_pos(0x0a); //定位
delay(2);
lcd_wdat(LCD[j/0x0a]); //显示秒的十位
delay(2);
lcd_wdat(LCD[j%0x0a]); //显示秒的个位
delay(2);
delay(2);
j=0x7f&D1302(0x83); //变量j赋值时间分
if(j<bf&&i<bm)
{j=bf-j;
j=0x3c-j;
j-=0x01;
}
else if(j<bf&&i>=bm)
{
j=bf-j;
j=0x3c-j;
}
else if(j>bf&&i<bm)
{
j-=bf;
j-=0x01;
}
else {j-=bf;}
lcd_pos(0x07); //定位
delay(2);
lcd_wdat(LCD[j/0x0a]); //显示十位分
delay(1);
lcd_wdat(LCD[j%0x0a]); //显示分
delay(1);
delay(2);
i=0x7f&D1302(0x83); //读当前时间分
j=0x1f&D1302(0x85); //读当前时间时
if(j<bs&&i<bf)
{j=bs-j;
j=0x3c-j;
j-=0x01;
}
else if(j<bs&&i>=bf)
{
j=bs-j;
j=0x3c-j;
}
else if(j>bs&&i<bf)
{
j-=bs;
j-=0x01;
}
else {j-=bs;}
lcd_pos(0x04); //定位
delay(2);
lcd_wdat(LCD[j/0x0a]); //显示十位分
delay(1);
lcd_wdat(LCD[j%0x0a]); //显示分
delay(1);
}
switch(ws)
{
case 0x46:jm=0x70;ws=0x00;K2=0;break; //主菜单
case 0x45:jm=0x70;ws=0x00;K2=0;break; //退出
default:break;
}
}
return;
}
//--------------------------闹钟设置 ----//
void JM3NZ()
{
uchar K3; //定义K3开关
bit K3x1=1,K3x2=0,K3x3=0,K3x4=0,K3x5=0,K3x6=0,K3x7=0; //定义光标标志位
lcd_wcmd(0x01); //清屏
lcd_pos(0x00); //设定显示的位置
for(K3=0;K3<16;K3++)
{
lcd_wdat(LCD3_0[K3]); //显示摸
}
lcd_pos(0x06); //设定LCD的显示位置
lcd_wcmd(0x0f); //写指令到LCD显示光标
K3=1;
while(K3)
{
while(K3x1)
{
lcd_pos(0x06);
switch(ws) //十小时设定
{
case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x1=0;K3x2=1;break; //按下0
case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x1=0;K3x2=1;break; //按下1
case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x1=0;K3x2=1;break; //按下2
case 0x0d:ws=0x00;K3x1=0;K3x2=1;break; //下一个
case 0x40:ws=0x00;K3x1=0;K3x2=1;break; //下一个
case 0x44:ws=0x00;K3x1=0;K3x7=1;break; //上一个
case 0x19:ws=0x00;K3x1=0;K3x7=1;break; //上一个
case 0x43:ws=0x00;K3x1=0;K3=0;break; //确定
case 0x45:ws=0x00;K3x1=0;K3=0;break; //退出
case 0x46:ws=0x00;K3x1=0;K3=0;break; //主菜单
default:break;
}
}
while(K3x2&&lcd_sz(0x06)==LCD[2])
{
lcd_pos(0x07);
switch(ws) //个小时设定
{
case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x2=0;K3x4=1;break; //按下0
case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x2=0;K3x4=1;break; //按下1
case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x2=0;K3x4=1;break; //按下2
case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x2=0;K3x4=1;break; //按下3
case 0x0d:ws=0x00;K3x2=0;K3x4=1;break; //下一个
case 0x40:ws=0x00;K3x2=0;K3x4=1;break; //下一个
case 0x44:ws=0x00;K3x2=0;K3x1=1;break; //上一个
case 0x19:ws=0x00;K3x2=0;K3x1=1;break; //上一个
case 0x43:K3x2=0;K3=0;break; //确定
case 0x45:ws=0x00;K3x2=0;K3=0;break; //退出
case 0x46:ws=0x00;K3x2=0;K3=0;break; //主菜单
default:break;
}
}
while(K3x2)
{
lcd_pos(0x07);
switch(ws) //个小时设定
{
case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x2=0;K3x4=1;break; //按下0
case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x2=0;K3x4=1;break; //按下1
case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x2=0;K3x4=1;break; //按下2
case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x2=0;K3x4=1;break; //按下3
case 0x08:ws=0x00;lcd_wdat(LCD[4]);K3x2=0;K3x4=1;break; //按下4
case 0x1c:ws=0x00;lcd_wdat(LCD[5]);K3x2=0;K3x4=1;break; //按下5
case 0x5a:ws=0x00;lcd_wdat(LCD[6]);K3x2=0;K3x4=1;break; //按下6
case 0x42:ws=0x00;lcd_wdat(LCD[7]);K3x2=0;K3x4=1;break; //按下7
case 0x52:ws=0x00;lcd_wdat(LCD[8]);K3x2=0;K3x4=1;break; //按下8
case 0x4a:ws=0x00;lcd_wdat(LCD[9]);K3x2=0;K3x4=1;break; //按下9
case 0x0d:ws=0x00;K3x2=0;K3x4=1;break; //下一个
case 0x40:ws=0x00;K3x2=0;K3x4=1;break; //下一个
case 0x19:ws=0x00;K3x2=0;K3x1=1;break; //上一个
case 0x44:ws=0x00;K3x2=0;K3x1=1;break; //上一个
case 0x43:K3x2=0;K3=0;break; //确定
case 0x45:ws=0x00;K3x2=0;K3=0;break; //退出
case 0x46:ws=0x00;K3x2=0;K3=0;break; //主菜单
default:break;
}
}
while(K3x4)
{
lcd_pos(0x09);
switch(ws) //十分设定
{
case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x4=0;K3x5=1;break; //按下0
case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x4=0;K3x5=1;break; //按下1
case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x4=0;K3x5=1;break; //按下2
case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x4=0;K3x5=1;break; //按下3
case 0x08:ws=0x00;lcd_wdat(LCD[4]);K3x4=0;K3x5=1;break; //按下4
case 0x1c:ws=0x00;lcd_wdat(LCD[5]);K3x4=0;K3x5=1;break; //按下5
case 0x0d:ws=0x00;K3x4=0;K3x5=1;break; //下一个
case 0x40:ws=0x00;K3x4=0;K3x5=1;break; //下一个
case 0x19:ws=0x00;K3x4=0;K3x2=1;break; //上一个
case 0x44:ws=0x00;K3x4=0;K3x2=1;break; //上一个
case 0x43:K3x4=0;K3=0;break; //确定
case 0x45:ws=0x00;K3x4=0;K3=0;break; //退出
case 0x46:ws=0x00;K3x4=0;K3=0;break; //主菜单
default:break;
}
}
while(K3x5)
{
lcd_pos(0x0a);
switch(ws) //个分设定
{
case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x5=0;K3x6=1;break; //按下0
case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x5=0;K3x6=1;break; //按下1
case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x5=0;K3x6=1;break; //按下2
case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x5=0;K3x6=1;break; //按下3
case 0x08:ws=0x00;lcd_wdat(LCD[4]);K3x5=0;K3x6=1;break; //按下4
case 0x1c:ws=0x00;lcd_wdat(LCD[5]);K3x5=0;K3x6=1;break; //按下5
case 0x5a:ws=0x00;lcd_wdat(LCD[6]);K3x5=0;K3x6=1;break; //按下6
case 0x42:ws=0x00;lcd_wdat(LCD[7]);K3x5=0;K3x6=1;break; //按下7
case 0x52:ws=0x00;lcd_wdat(LCD[8]);K3x5=0;K3x6=1;break; //按下8
case 0x4a:ws=0x00;lcd_wdat(LCD[9]);K3x5=0;K3x6=1;break; //按下9
case 0x0d:ws=0x00;K3x5=0;K3x6=1;break; //下一个
case 0x40:ws=0x00;K3x5=0;K3x6=1;break; //下一个
case 0x19:ws=0x00;K3x5=0;K3x4=1;break; //上一个
case 0x44:ws=0x00;K3x5=0;K3x4=1;break; //上一个
case 0x43:K3x5=0;K3=0;break; //确定
case 0x45:ws=0x00;K3x5=0;K3=0;break; //退出
case 0x46:ws=0x00;K3x5=0;K3=0;break; //主菜单
default:break;
}
}
while(K3x6)
{
lcd_pos(0x0c);
switch(ws) //十秒设定
{
case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x6=0;K3x7=1;break; //按下0
case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x6=0;K3x7=1;break; //按下1
case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x6=0;K3x7=1;break; //按下2
case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x6=0;K3x7=1;break; //按下3
case 0x08:ws=0x00;lcd_wdat(LCD[4]);K3x6=0;K3x7=1;break; //按下4
case 0x1c:ws=0x00;lcd_wdat(LCD[5]);K3x6=0;K3x7=1;break; //按下5
case 0x0d:ws=0x00;K3x6=0;K3x7=1;break; //下一个
case 0x40:ws=0x00;K3x6=0;K3x7=1;break; //下一个
case 0x19:ws=0x00;K3x6=0;K3x5=1;break; //上一个
case 0x44:ws=0x00;K3x6=0;K3x5=1;break; //上一个
case 0x43:K3x6=0;K3=0;break; //确定
case 0x45:ws=0x00;K3x6=0;K3=0;break; //退出
case 0x46:ws=0x00;K3x6=0;K3=0;break; //主菜单
default:break;
}
}
while(K3x7)
{
lcd_pos(0x0d);
switch(ws) //个秒设定
{
case 0x16:ws=0x00;lcd_wdat(LCD[0]);K3x7=0;K3x1=1;break; //按下0
case 0x0c:ws=0x00;lcd_wdat(LCD[1]);K3x7=0;K3x1=1;break; //按下1
case 0x18:ws=0x00;lcd_wdat(LCD[2]);K3x7=0;K3x1=1;break; //按下2
case 0x5e:ws=0x00;lcd_wdat(LCD[3]);K3x7=0;K3x1=1;break; //按下3
case 0x08:ws=0x00;lcd_wdat(LCD[4]);K3x7=0;K3x1=1;break; //按下4
case 0x1c:ws=0x00;lcd_wdat(LCD[5]);K3x7=0;K3x1=1;break; //按下5
case 0x5a:ws=0x00;lcd_wdat(LCD[6]);K3x7=0;K3x1=1;break; //按下6
case 0x42:ws=0x00;lcd_wdat(LCD[7]);K3x7=0;K3x1=1;break; //按下7
case 0x52:ws=0x00;lcd_wdat(LCD[8]);K3x7=0;K3x1=1;break; //按下8
case 0x4a:ws=0x00;lcd_wdat(LCD[9]);K3x7=0;K3x1=1;break; //按下9
case 0x0d:ws=0x00;K3x7=0;K3x1=1;break; //下一个
case 0x40:ws=0x00;K3x7=0;K3x1=1;break; //下一个
case 0x19:ws=0x00;K3x7=0;K3x6=1;break; //上一个
case 0x44:ws=0x00;K3x7=0;K3x6=1;break; //上一个
case 0x43:K3x7=0;K3=0;break; //确定
case 0x45:ws=0x00;K3x7=0;K3=0;break; //退出
case 0x46:ws=0x00;K3x7=0;K3=0;break; //主菜单
default:break;
}
}
while(ws==0x43) //按下确定键,保存闹钟时间
{
while(lcd_sz(0x06)==LCD[0]){ns=0x00;}
while(lcd_sz(0x07)==LCD[1]){ns+=0x01;}
}
}
jm=0x70;
lcd_wcmd(0x0c);
}
//------------------------警戒设置-----//
void JM4JJ()
{
uchar K4;
lcd_wcmd(0x01);
lcd_pos(0x00);
for(K4=0;K4<16;K4++)
{
lcd_wdat(LCD4_0[K4]);
}
while(1);
}
//--------------------------入侵信息---//
void JM5XX()
{
uchar K5;
lcd_wcmd(0x01);
lcd_pos(0x00);
for(K5=0;K5<16;K5++)
{
lcd_wdat(LCD6_0[K5]);
}
delay(2);
lcd_pos(0x40);
for(K5=0;K5<16;K5++)
{
lcd_wdat(LCD6_1[K5]);
}
while(1);
}
//------------------------------修改时间-----//
void JM6SJ()
{
uchar K6;
lcd_wcmd(0x01);
lcd_pos(0x00);
for(K6=0;K6<16;K6++)
{
lcd_wdat(LCD6_0[K6]);
}
delay(2);
lcd_pos(0x40);
for(K6=0;K6<16;K6++)
{
lcd_wdat(LCD6_1[K6]);
}
K6=1;
while(K6)
{
;
}
}
//------------------------------主函数 //
void main()
{
uchar bl;
int_init(); //中断 初始化
bl=D1302(0x81);
bl=0x7f&bl;
X1302(0x80,bl);
delay(1);
X1302(0x8e,0x00);
X1302(0x90,0xa5);
X1302(0x8e,0x80); //关闭写,但可以读
lcd_init(); //LCD初始化
delay(2);
lcd_pos(0x00); //设定显示的位置
jm=0x10;
while(1)
{
if(jm==0x70){JM7CD();}
else if(jm==0x10){JM1SJ();} //时间
else if(jm==0x20){JM2MB();} // 秒表
else if(jm==0x30){JM3NZ();} // 闹钟
else if(jm==0x40){JM4JJ();} // 警戒
else if(jm==0x50){JM5XX();} // 信息
else if(jm==0x60){JM6SJ();} //时间修改
else{;}
}
}
复制代码
作者:
miuifen
时间:
2015-3-22 16:36
感谢分享
作者:
miuifen
时间:
2015-3-22 16:38
有原理图 就完美了
作者:
lesson18
时间:
2015-4-16 23:30
学习一下<><><><><><><><><><><><><><><><
>
作者:
miskel
时间:
2015-4-17 17:06
1602太耗电了点,要是用段码液晶的应该省电点
作者:
kico
时间:
2015-4-23 21:11
这么多代码,头都看晕了
作者:
XiaoBei
时间:
2015-5-10 11:29
挺好的~
作者:
嘉辉先生
时间:
2015-5-24 15:05
楼主我有个问题,这个红外遥控器键值是怎么知道的,比如按某一个键显示第一个界面,这个按键是怎么定义的?
作者:
牵只羊
时间:
2015-5-28 14:14
代码应该还可以精简吧
作者:
kico
时间:
2015-11-16 21:12
只有源程序,怎么没电路图了
作者:
neemxyang
时间:
2015-11-19 21:19
把资源打包吧?
作者:
wc86110
时间:
2015-11-22 13:06
LZ 好有耐心哦,洞洞板都能焊接得如此工整。
作者:
keke1304843512
时间:
2017-6-2 09:25
原理图有吗?
作者:
jialishoushi
时间:
2017-6-18 02:32
谢谢分享 下载收藏了
作者:
未来可期
时间:
2019-4-13 14:42
怎么收藏
作者:
rayin
时间:
2020-11-15 14:32
本坛有你更精彩,期待楼主更多力作
作者:
kiccleaf
时间:
2020-12-2 23:20
能写这么多代码,值得学习
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1