1.png (844.56 KB, 下載次數(shù): 54)
下載附件
2017-4-24 01:55 上傳
2.png (844.51 KB, 下載次數(shù): 45)
下載附件
2017-4-24 01:55 上傳
3.png (834.56 KB, 下載次數(shù): 50)
下載附件
2017-4-24 01:55 上傳
- #include<reg51.h>
- #include"lcd.h"
- void Lcd1602_Delay1ms(uint c); //誤差 0us
- {
- uchar a,b;
- for (; c>0; c--)
- {
- for (b=199;b>0;b--)
- {
- for(a=1;a>0;a--);
- }
- }
-
- }
- #ifndef LCD1602_4PINS //當(dāng)沒有定義這個(gè)LCD1602_4PINS時(shí)
- /*
- */
- void LcdWriteCom(uchar com) //寫入命令
- {
- LCD1602_E = 0; //使能
- LCD1602_RS = 0; //選擇發(fā)送命令
- LCD1602_RW = 0; //選擇寫入
-
- LCD1602_DATAPINS = com; //放入命令
- Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定
- LCD1602_E = 1; //寫入時(shí)序
- Lcd1602_Delay1ms(5); //保持時(shí)間
- LCD1602_E = 0;
- }
- #else
- void LcdWriteCom(uchar com) //寫入命令
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 0; //選擇寫入命令
- LCD1602_RW = 0; //選擇寫入
- LCD1602_DATAPINS = com; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //寫入時(shí)序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- // Lcd1602_Delay1ms(1);
- LCD1602_DATAPINS = com << 4; //發(fā)送低四位
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //寫入時(shí)序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- }
- #endif
-
- #ifndef LCD1602_4PINS
- void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 1; //選擇輸入數(shù)據(jù)
- LCD1602_RW = 0; //選擇寫入
- LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //寫入時(shí)序
- Lcd1602_Delay1ms(5); //保持時(shí)間
- LCD1602_E = 0;
- }
- #else
- void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 1; //選擇寫入數(shù)據(jù)
- LCD1602_RW = 0; //選擇寫入
- LCD1602_DATAPINS = dat; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //寫入時(shí)序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- LCD1602_DATAPINS = dat << 4; //寫入低四位
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //寫入時(shí)序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- }
- #endif
-
- #ifndef LCD1602_4PINS
- void LcdInit() //LCD初始化子程序
- {
- LcdWriteCom(0x38); //開顯示
- LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)
- LcdWriteCom(0x06); //寫一個(gè)指針加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
- }
- #else
- void LcdInit() //LCD初始化子程序
- {
- LcdWriteCom(0x32); //將8位總線轉(zhuǎn)為4位總線
- LcdWriteCom(0x28); //在四位線下的初始化
- LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)
- LcdWriteCom(0x06); //寫一個(gè)指針加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
- }
- #endif
- #include"ds1302.h"
- uchar code READ_RTC_ADDR[3] = {0x81, 0x83, 0x85};
- uchar code WRITE_RTC_ADDR[3] = {0x80, 0x82, 0x84};
- uchar TIME[3][3] = {{0, 0, 0x12},{0},{0}};
- void Ds1302Write(uchar addr, uchar dat)
- {
- uchar n;
- RST = 0;
- _nop_();
- SCLK = 0;//先將SCLK置低電平。
- _nop_();
- RST = 1; //然后將RST(CE)置高電平。
- _nop_();
- for (n=0; n<8; n++)//開始傳送八位地址命令
- {
- DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送
- addr >>= 1;
- SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
- _nop_();
- SCLK = 0;
- _nop_();
- }
- for (n=0; n<8; n++)//寫入8位數(shù)據(jù)
- {
- DSIO = dat & 0x01;
- dat >>= 1;
- SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
- _nop_();
- SCLK = 0;
- _nop_();
- }
-
- RST = 0;//傳送數(shù)據(jù)結(jié)束
- _nop_();
- }
- uchar Ds1302Read(uchar addr)
- {
- uchar n,dat,dat1;
- RST = 0;
- _nop_();
- SCLK = 0;//先將SCLK置低電平。
- _nop_();
- RST = 1;//然后將RST(CE)置高電平。
- _nop_();
- for(n=0; n<8; n++)//開始傳送八位地址命令
- {
- DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送
- addr >>= 1;
- SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
- _nop_();
- SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
- _nop_();
- }
- _nop_();
- for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
- {
- dat1 = DSIO;//從最低位開始接收
- dat = (dat>>1) | (dat1<<7);
- SCLK = 1;
- _nop_();
- SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
- _nop_();
- }
- RST = 0;
- _nop_(); //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
- SCLK = 1;
- _nop_();
- DSIO = 0;
- _nop_();
- DSIO = 1;
- _nop_();
- return dat;
- }
- void Ds1302Init()
- {
- uchar n;
- Ds1302Write(0x8E,0X00); //禁止寫保護(hù),就是關(guān)閉寫保護(hù)功能
- for (n=0; n<3; n++)//寫入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
- {
- Ds1302Write(WRITE_RTC_ADDR[n],TIME[0][n]);
- }
- Ds1302Write(0x8E,0x80); //打開寫保護(hù)功能
- }
- void Ds1302ReadTime()
- {
- uchar n;
- for (n=0; n<3; n++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
- {
- TIME[0][n] = Ds1302Read(READ_RTC_ADDR[n]);
- }
- }
- sbit key_mode = P2^0;
- sbit key_right = P2^1;
- sbit key_up = P2^2;
- sbit key_exit = P2^3;
- sbit key_light = P2^5;
- sbit key_check = P2^6;
- sbit led1 = P1^0;
- sbit led2 = P1^1;
- sbit PRT = P2^4;
- sbit check1 = P2^5;
- sbit check2 = P2^6;
- sbit check3 = P2^7;
- void Delay1ms(uint c);
- void LcdDisplay(uint i);
- void Timing();
- void Dec2BCD(uint i, uint j);
- unsigned int i = 0;
- unsigned int j = 0;
- unsigned int t = 0;
- unsigned int h = 0;
-
- void main()
- {
- led1 = 0;
- led2 = 0;
- PRT = 0;
- LcdInit();
- Timing();
- }
- void Delay1ms(uint c) //誤差 0us
- {
- uchar a,b;
- for (; c>0; c--)
- {
- for (b=199;b>0;b--)
- {
- for(a=1;a>0;a--);
- }
- }
- }
- void LcdDisplay(uint i)
- {
- LcdWriteCom(0x80);
- if(i == 0)
- {
- LcdWriteData('T');
- }
- if(i == 1)
- {
- LcdWriteData('A');
- }
- if(i == 2)
- {
- LcdWriteData('B');
- }
- LcdWriteData(':');
- LcdWriteData('0'+TIME[i][2]/16); //時(shí)
- LcdWriteData('0'+(TIME[i][2]&0x0f));
- LcdWriteData('-');
- LcdWriteData('0'+TIME[i][1]/16); //分
- LcdWriteData('0'+(TIME[i][1]&0x0f));
- LcdWriteData('-');
- LcdWriteData('0'+TIME[i][0]/16); //秒
- LcdWriteData('0'+(TIME[i][0]&0x0f));
- LcdWriteCom(0x80+0x40);
- LcdWriteData('L');
- LcdWriteData('E');
- LcdWriteData('D');
- LcdWriteData('1');
- LcdWriteData(':');
- if(led1 == 1)
- {
- LcdWriteData('T');
- }
- else
- {
- LcdWriteData('F');
- }
- LcdWriteData(' ');
- LcdWriteData(' ');
- LcdWriteData(' ');
- LcdWriteData('L');
- LcdWriteData('E');
- LcdWriteData('D');
- LcdWriteData('2');
- LcdWriteData(':');
- if(led2 == 1)
- {
- LcdWriteData('T');
- }
- else
- {
- LcdWriteData('F');
- }
- }
- void Timing()
- {
- P2 = 0xff;
- A: while(1)
- {
- if(key_mode == 0)
- {
- Delay1ms(50);
- if(key_mode ==0)
- {
- i++;
- if(i > 2)
- {
- i = 0;
- }
- }
- j=0;
- }
- if(key_right == 0)
- {
- Delay1ms(50);
- if(key_right == 0)
- {
- j++;
- if(j > 2)
- {
- j = 0;
- }
- }
- }
- if(key_up == 0)
- {
- Delay1ms(50);
- if(key_up == 0)
- {
- TIME[i][j]++;
- if(TIME[i][j] == 0x0a)
- {
- TIME[i][j] = 0x10;
- }
- else if(TIME[i][j] == 0x1a)
- {
- TIME[i][j] = 0x20;
- }
- else if(TIME[i][j] == 0x2a)
- {
- TIME[i][j] = 0x30;
- }
- else if(TIME[i][j] == 0x3a)
- {
- TIME[i][j] = 0x40;
- }
- else if(TIME[i][j] == 0x4a)
- {
- TIME[i][j] = 0x50;
- }
- else if(TIME[i][j] == 0x5a)
- {
- TIME[i][j] = 0x00;
- }
- else if(j == 2 && TIME[i][j] == 0x24)
- {
- TIME[i][j] = 0x00;
- }
- }
- }
- LcdDisplay(i);
- if(key_exit == 0)
- {
- Delay1ms(50);
- if(key_exit == 0)
- {
- break;
- }
- }
- }
- Ds1302Init();
- while(1)
- {
- Ds1302ReadTime();
- if(TIME[0][2] >= TIME[1][2])
- {
- if(TIME[0][1] >= TIME[1][1])
- {
- led1 = 1;
- led2 = 1;
- }
- }
- if(TIME[0][2] >= TIME[2][2])
- {
- if(TIME[0][1]>=TIME[2][1])
- {
- led1 = 0;
- led2 = 0;
- }
- }
-
- if(key_light == 0)
- {
-
- if(PRT == 0)
- {
- led1 = 0;
- led2 = 0;
- }
- if(PRT == 1)
- {
- led1 = 1;
- led2 = 1;
- }
- }
- if(key_check == 0)
- {
- if(check1 == 1)
- {
- led1 = 1;
- led2 = 0;
- }
- if(check2 == 1)
- {
- led1 = 0;
- led2 = 1;
- }
- if(check3 == 1)
- {
- led1 == 0;
- led2 == 0;
- }
- }
-
- LcdDisplay(0);
- if(key_exit == 0)
- {
- Delay1ms(50);
- if(key_exit == 0)
- {
- goto A;
- }
- }
- }
- }
復(fù)制代碼 |