#include "reg52.h" #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define IO_ADDR P2 #define delayNOP();{_nop_();_nop_();_nop_();_nop_();}; sbit RS=P1^0; sbit RW=P1^1; sbit EN=P1^2; sbit RST=P1^3; sbit PSB=P1^5; sbitmode=P0^0; //key1 模式 sbitinc=P0^1; //kye2 分 sbitdec=P0^2; //key3 时 sbitfmq=P3^4; //蜂鸣器接口 //============================================= code uchar data1[16]={"作息时间控制系统"}; code uchar data2[]={"某某某 2011026103"}; code uchar data3[]={"时间: : : "}; code uchar data4[]={"打铃: : : "}; uchar disp_buff[4][16];//定义一个二维数组,4行,16个字符 uchar hour,min,sec,minisec; uchar mode_value=0 ,xf; //调节模式 uchar ds[20][2] = { {8,0},{8,45},{8,55},{9,40},{10,0},{10,45},{10,55},{11,40},{14,0},{14,45}, {14,55},{15,40},{16,0},{16,45},{16,55},{17,40},{19,0},{19,45},{19,55},{20,40} }; //====================================================== /*******************************************************************/ void delay(int ms) { while(ms--) { uchar i; for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } //========================= void delayus(uint i) { uchar y; while(--i) for(y=0;y<2;y++) {;} } //====================================================== uchar read_data(void)//读状态。//返回值1---空。0-----忙。 { uchar temp; RS=0; RW=1; delayus(2); EN=1; delayNOP(); IO_ADDR=0XFF; temp=IO_ADDR;//读输入口。 temp=temp&0x80; EN=0; if(temp==0x00) { return(0); } else { return(1);}//注:如需软件仿真,需要将此处改为1 } //============================ void write_data(uchar type,uchar date)//写命令或写数据。 { while(read_data()); //delayus(100); if(type)//写数据1 { RS=1; } else//0//写命令 { RS=0; } delayus(1);//1。5US RW=0; delayus(1);//1。5US EN=0; delayus(1); delayus(1); delayus(1); IO_ADDR=date; delayNOP(); EN=1; delayNOP(); EN=0; delayus(10); } //*************************************************************** voidinit_system()//12864初始化部分。 { PSB=1; RST=1; delayus(4); RST=0; delay(3); RST=1; delay(3); write_data(0,0x30);//功能设定,8位并行接口 delay(5); write_data(0,0x30);//功能设定,基本指令集。 delay(5); write_data(0,0x30);//功能设定,8位并行接口 delay(5); write_data(0,0x01);//清屏, delay(5); write_data(0,0x01);//清屏, delay(5); write_data(0,0x02);//将地址指针移到开头位置。 write_data(0,0x0c);//整体显示开。 write_data(0,0x01);//清屏, write_data(0,0x01);//清屏, } //========================================= //============================================== void display_buff()//显示2维数组内的内容。 { uchar i; uchar *point; point=&disp_buff[0][0]; //write_data(0,0x01);//清屏, //delayus(5); //write_data(0,0x02);//地址归0 //delayus(10); //write_data(0,0x06);//地址归0 ///////////////一行一行的显示//////////////// //行地址:0X80 0X90 0X88 0X98 write_data(0,0X80);//移到0X80位置。 delayus(1); for(i=0;i<16;i++) { write_data(1,*point); point++; delayus(1); } //======================================= //========================================= write_data(0,0X90); delayus(1); for(i=0;i<16;i++) { write_data(1,disp_buff[1]); delayus(1); } write_data(0,0X88); for(i=0;i<16;i++) { write_data(1,disp_buff[2]); delayus(1); } write_data(0,0X98); for(i=0;i<16;i++) { write_data(1,disp_buff[3]); delayus(1); } } //===================================== voidtime0() interrupt 1 { TH0=0X4C; TL0=0X00; if(minisec++>20) { minisec=0; if(++sec>59) {sec=0; if(++min>59) {min=0; if(++hour>24) { hour=0; min=0; sec=0; } } } } } voiddelaysj(unsigned char j)//延时程序 { unsignedchar i; while(j--) { for(i=0;i<50;i++); } } //蜂鸣器 voids_fmq() { unsignedchar j=2; //蜂鸣器叫 while(j--) { fmq=0; delaysj(200); } } /*************************闹铃判断**********************************/ void nling() { uchar i ; for(i=0;i<20;i++) { if(hour==ds[0]&&min==ds[1]) //判断是否到闹铃时间 { if(sec<10) s_fmq(); //调用蜂铃 } } } //调节模块 voidtiaojie() { uchar i; if(mode==0) { while(!mode); mode_value++; } //zifu(0xbc,0xb8,2,mode_value,&shu); switch(mode_value) { //模式0:正常工作。显示“天天向上” case0:{//uchar i; for(i=0;i<16;i++) { disp_buff[0]=data1; disp_buff[1]=data2; }} break ; case1:{ // 模式1:可以修改时间,其中inc是改分钟,dec是改小时 if(inc==0){while(!inc);min++;if(min==60) min=0;} if(dec==0){while(!dec);if(min==0) min=60; min--;} //if(dec==0){while(!dec);hour++; if(hour==24) hour=0;} // uchar i; for(i=0;i<16;i++) { disp_buff[2]=data3; } disp_buff[2][5]=(hour/10)+0x30; disp_buff[2][6]=(hour%10)+0x30; disp_buff[2][8]=(min/10)+0x30; disp_buff[2][9]=(min%10)+0x30; disp_buff[2][11]=(sec/10)+0x30; disp_buff[2][12]=(sec%10)+0x30; display_buff(); };break; case2:{if(inc==0){ while(!inc);hour++;if(hour==24) hour=0; } // 模式2:选择一个需要改变的闹铃 //if(inc==0){while(!inc);min+;if(min==60) min=0;} if(dec==0){while(!dec);if(hour==0) hour=24;hour--; } // uchar i; for(i=0;i<16;i++) { disp_buff[2]=data3; } disp_buff[2][5]=(hour/10)+0x30; disp_buff[2][6]=(hour%10)+0x30; disp_buff[2][8]=(min/10)+0x30; disp_buff[2][9]=(min%10)+0x30; disp_buff[2][11]=(sec/10)+0x30; disp_buff[2][12]=(sec%10)+0x30; display_buff(); //zifu(0xbe,0x40,2,xf/10,&shu); // zifu(0xbe,0x48,2,xf%10,&shu); // zifu(0xbe,0x68,2,2,&fuhao); // zifu(0xbe,0x70,2,ds[xf][1]/10,&shu); // zifu(0xbe,0x78,2,ds[xf][1]%10,&shu); /// zifu(0xbe,0x50,2,0,&fuhao); // zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); // 显示“调整后的闹铃时间” // zifu(0xbe,0x60,2,ds[xf][0]%10,&shu); } ;break; case3: { // 模式3:修改选定的闹铃的分钟 if(inc==0){while(!inc);ds[xf][1]++;if(ds[xf][1]==60) ds[xf][1]=0;} if(dec==0){while(!dec);if(ds[xf][1]==0) ds[xf][1]=60;ds[xf][1]--;} // uchari; for(i=0;i<16;i++) { disp_buff[3]=data4; } disp_buff[3][5]=ds[xf][0]/10+0x30; disp_buff[3][6]=ds[xf][0]%10+0x30; disp_buff[3][8]=ds[xf][1]/10+0x30; disp_buff[3][9]=ds[xf][1]%10+0x30; disp_buff[3][11]=0+0x30; disp_buff[3][12]=0+0x30; display_buff();// 显示“调整后的闹铃时间” } ;break ; case4:{ // 模式4:修改选定的闹铃的小时 if(inc==0){ while(!inc);ds[xf][0]++;if(ds[xf][0]==24)ds[xf][0]=0;} if(dec==0){ while(!dec);ds[xf][0]--;if(ds[xf][0]==0) ds[xf][0]=23;} // uchari; //for(i=0;i<16;i++) // { // disp_buff[3]=data4; // } disp_buff[3][5]=ds[xf][0]/10+0x30; disp_buff[3][6]=ds[xf][0]%10+0x30; disp_buff[3][8]=ds[xf][1]/10+0x30; disp_buff[3][9]=ds[xf][1]%10+0x30; disp_buff[3][11]=0+0x30; disp_buff[3][12]=0+0x30; display_buff(); //hanzi(0xbe,0x40,2,2,&zi); // 显示“时” // zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); // 显示“调整后的闹铃时间” // zifu(0xbe,0x60,2,ds[xf][0]%10,&shu); // zifu(0xbe,0x68,2,2,&fuhao); // zifu(0xbe,0x70,2,ds[xf][1]/10,&shu); // zifu(0xbe,0x78,2,ds[xf][1]%10,&shu); } ;break; case5:{ mode_value=0 ;};break; //模式5:确认修改,返回正常工作状态 default:break; } } //从打铃时间表中找出下一个要打铃的时间 uchar Locate (void) {//uchar xf;//n; xf=0; while(xf<20) { if(hour<ds[xf][0]) break; else if((hour==ds[xf][0])&&(min<=ds[xf][1])) break; xf++; //n++; } if(xf==20) xf=0;//xf=0; return(xf); } void shizhong() { uchar i; for(i=0;i<16;i++) { disp_buff[0]=data1; disp_buff[1]=data2; disp_buff[2]=data3; disp_buff[3]=data4; } disp_buff[2][5]=(hour/10)+0x30; disp_buff[2][6]=(hour%10)+0x30; disp_buff[2][8]=(min/10)+0x30; disp_buff[2][9]=(min%10)+0x30; disp_buff[2][11]=(sec/10)+0x30; disp_buff[2][12]=(sec%10)+0x30; //闹铃 disp_buff[3][5]=ds[xf][0]/10+0x30; disp_buff[3][6]=ds[xf][0]%10+0x30; disp_buff[3][8]=ds[xf][1]/10+0x30; disp_buff[3][9]=ds[xf][1]%10+0x30; disp_buff[3][11]=0+0x30; disp_buff[3][12]=0+0x30; display_buff(); } /*******************************************************************/ /* */ /* 延时函数 */ /* //========================================== */ //******************************************************************* voidmain(void) { P0=0XFF; P2=0XFF; EA=1; ET0=1; TH0=0X4C; TL0=0X00; TMOD=0X01; TR0=1; init_system(); while(1) { tiaojie(); shizhong(); nling(); Locate (); //s_fmq(); } }
|