本帖最后由 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; //讀,、寫數(shù)據(jù)期間,,必須為高
- 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的數(shù)字整形碼
- 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];
-
- //-------------------延時子函數(shù) ---//
- 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) //地址,,數(shù)據(jù)
- {
- uchar aa;
- CE=0; //關閉讀寫使能,,讀、寫數(shù)據(jù)期間,,必須為高
- SCLK=0; //拉低時鐘線
- CE=1; //開啟讀寫使能
- for(aa=0;aa<8;aa++) //寫入地址
- {
- DIO=add&0x01; //把add的最低位送給數(shù)據(jù)線
- SCLK=1; //時鐘拉高
- add>>=1; //累加器右移1位
- SCLK=0; //時鐘拉
-
- }
- for(aa=0;aa<8;aa++) //寫入數(shù)據(jù)
- {
- DIO=dat&0x01; //把要寫入1302的數(shù)據(jù)地位送到數(shù)據(jù)線
- SCLK=1; //時鐘拉高,,把數(shù)據(jù)發(fā)送出去
- dat>>=1; //數(shù)據(jù)右移1位,把最低位去掉
- SCLK=0; //把時鐘拉低,,準備下一次發(fā)數(shù)據(jù)
- }
- SCLK=1; //寫完數(shù)據(jù)要把時鐘線拉高,,要是讀完數(shù)據(jù)的話就要拉低時鐘線
- CE=0; //關閉讀寫使能
- return;
- }
- //-------------------D1302-------------//
- uchar D1302(uchar addr) //讀數(shù)據(jù)子函數(shù) 輸入地址,返回數(shù)據(jù)
- {
- uchar ab,temp,dat1,dat2; //定義變量
- CE=0; //關閉讀寫數(shù)據(jù)使能
- SCLK=0; //時鐘拉低,,準備要接收數(shù)據(jù)
- CE=1; //開讀寫數(shù)據(jù)使能
- for(ab=8;ab>0;ab--) //發(fā)地址
- {
- SCLK=0; //時鐘拉低,,準備接收數(shù)據(jù)
- temp=addr; //把地址送給變量temp
- DIO=(bit)(temp&0x01); //傳送低字節(jié)
- addr>>=1; //地址addr右移1位
- SCLK=1; //時鐘拉高 ,讓1302讀入地址
- }
- for(ab=8;ab>0;ab--) //讀數(shù)據(jù)
- {
- ACC_7=DIO; // ACC-7=接收新的一位數(shù)據(jù)
- SCLK=1; //時鐘拉高,,告訴1302我接收到數(shù)據(jù)了??!
- ACC>>=1; //ACC右移1位,,把剛接到的數(shù)據(jù)移到低位去
- SCLK=0; //時鐘拉低,告訴1302,,請為我準備下一個數(shù)據(jù)
- }
- CE=0; //關閉讀寫數(shù)據(jù)使能
- dat1=ACC; //把ACC的數(shù)據(jù)送給dat1
- dat2=dat1/16; //數(shù)據(jù)轉換 dat2=數(shù)據(jù)的 "十六位"
- dat1=dat1%16; //數(shù)據(jù)轉換 dat1=數(shù)據(jù)的 "個位"
- dat1=dat1+dat2*10; //再一次數(shù)據(jù)轉換(把接收到的BCD碼轉換成十進制碼)
- return(dat1); //反回讀到的數(shù)據(jù)
- }
- //-----------檢查LCD忙狀態(tài) --//
- void lcd_busy()
- {
- P0=0xff;
- LCD_RS=0; //選擇指令寄存器
- LCD_RW=1; //進行讀操作
- LCD_EN=1; //使能
- while((P0&0x80)==0x80);
- LCD_EN=0; //關使能
- }
- //-----------------------------讀LCD顯示的數(shù)字--//
- uchar lcd_sz(uchar sxs)
- {
- uchar xx;
- delay(2);
- LCD_RS=0; //選擇指令
- LCD_RW=0; //選擇寫操作
- LCD_EN=0; //關使能 ,讓P0數(shù)據(jù)線上數(shù)據(jù)
- P0=(sxs|0x80); //DDRAM數(shù)據(jù)指針=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; //記錄數(shù)據(jù)
- LCD_EN=0; //關使能
- return xx;
- }
- //----------------------寫指令數(shù)據(jù)到LCD --//
- void lcd_wcmd(uchar cmd)
- {
- lcd_busy();
- LCD_RS=0; //選擇寫操作
- LCD_RW=0; //進行寫操作
- LCD_EN=0; //關使能 ,讓數(shù)據(jù)線上數(shù)據(jù)
- P0=cmd; //送指令代碼
- delay(2);
- LCD_EN=1; //開使能 ,讓單片機讀指令
- delay(5);
- LCD_EN=0; //關使能
- return;
- }
- //-------------------------寫顯示數(shù)據(jù)到LCD --//
- void lcd_wdat(uchar dat)
- {
- lcd_busy(); //讀忙
- LCD_RS=1; //選擇數(shù)據(jù)寄存器
- LCD_RW=0; //進行讀操作
- LCD_EN=0; //關使能
- P0=dat; //寫入要顯示的字符
- LCD_EN=1; //開使能 ,,讓LCD讀進數(shù)據(jù)
- delay(2);
- LCD_EN=0; //關使能 ,不讓LCD操作
- return;
- }
- //----------------------設定顯示位置 pos是屏幕的地址 --//
-
- void lcd_pos(uchar pos)
- {
- lcd_busy();
- LCD_RS=0; //選擇寫操作
- LCD_RW=0; //進行寫操作
- LCD_EN=0; //關使能 ,讓數(shù)據(jù)線上數(shù)據(jù)
- P0=(pos|0x80); //DDRAM數(shù)據(jù)指針=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計數(shù)器,,畫面禁止?jié)L動
- 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; //負跳變觸發(fā)
- EA=1; //開總開關
- return;
- }
- //------------------------------------------------//
- void interrupt0()interrupt 0 //總斷子函數(shù)
- {
- uchar i=0,j=0,k=0,us=0; //定義字符變量i j k us
- uchar addr[4]={0}; //定義字符型數(shù)組
- EX0=0; //關中斷總開關
- for(i=0;i<255;i++) //9ms內(nèi)有高電平認為是干擾
- {
- 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; //接收一位數(shù)據(jù)
- 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 //總斷子函數(shù)
- {
- 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函數(shù)循環(huán)
- {
- bs=0x1f&D1302(0x85); //讀當前時間時
- bf=0x7f&D1302(0x83); //讀當前時間分
- bm=0x7f&D1302(0x81); //讀當前時間秒
- delay(10);
- while(ws==0x43) //開始計時循環(huán)
- {
- 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)
- {
- ;
- }
- }
- //------------------------------主函數(shù) //
- 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{;}
- }
- }
復制代碼
|