- #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 //当没有定义这个LCD1602_4PINS时
- /*
- */
- void LcdWriteCom(uchar com) //写入命令
- {
- LCD1602_E = 0; //使能
- LCD1602_RS = 0; //选择发送命令
- LCD1602_RW = 0; //选择写入
-
- LCD1602_DATAPINS = com; //放入命令
- Lcd1602_Delay1ms(1); //等待数据稳定
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5); //保持时间
- 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; //写入时序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- // Lcd1602_Delay1ms(1);
- LCD1602_DATAPINS = com << 4; //发送低四位
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- }
- #endif
-
- #ifndef LCD1602_4PINS
- void LcdWriteData(uchar dat) //写入数据
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 1; //选择输入数据
- LCD1602_RW = 0; //选择写入
- LCD1602_DATAPINS = dat; //写入数据
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5); //保持时间
- LCD1602_E = 0;
- }
- #else
- void LcdWriteData(uchar dat) //写入数据
- {
- LCD1602_E = 0; //使能清零
- LCD1602_RS = 1; //选择写入数据
- LCD1602_RW = 0; //选择写入
- LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- LCD1602_DATAPINS = dat << 4; //写入低四位
- Lcd1602_Delay1ms(1);
- LCD1602_E = 1; //写入时序
- Lcd1602_Delay1ms(5);
- LCD1602_E = 0;
- }
- #endif
-
- #ifndef LCD1602_4PINS
- void LcdInit() //LCD初始化子程序
- {
- LcdWriteCom(0x38); //开显示
- LcdWriteCom(0x0c); //开显示不显示光标
- LcdWriteCom(0x06); //写一个指针加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //设置数据指针起点
- }
- #else
- void LcdInit() //LCD初始化子程序
- {
- LcdWriteCom(0x32); //将8位总线转为4位总线
- LcdWriteCom(0x28); //在四位线下的初始化
- LcdWriteCom(0x0c); //开显示不显示光标
- LcdWriteCom(0x06); //写一个指针加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //设置数据指针起点
- }
- #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;//数据从低位开始传送
- addr >>= 1;
- SCLK = 1;//数据在上升沿时,DS1302读取数据
- _nop_();
- SCLK = 0;
- _nop_();
- }
- for (n=0; n<8; n++)//写入8位数据
- {
- DSIO = dat & 0x01;
- dat >>= 1;
- SCLK = 1;//数据在上升沿时,DS1302读取数据
- _nop_();
- SCLK = 0;
- _nop_();
- }
-
- RST = 0;//传送数据结束
- _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;//数据从低位开始传送
- addr >>= 1;
- SCLK = 1;//数据在上升沿时,DS1302读取数据
- _nop_();
- SCLK = 0;//DS1302下降沿时,放置数据
- _nop_();
- }
- _nop_();
- for(n=0; n<8; n++)//读取8位数据
- {
- dat1 = DSIO;//从最低位开始接收
- dat = (dat>>1) | (dat1<<7);
- SCLK = 1;
- _nop_();
- SCLK = 0;//DS1302下降沿时,放置数据
- _nop_();
- }
- RST = 0;
- _nop_(); //以下为DS1302复位的稳定时间,必须的。
- SCLK = 1;
- _nop_();
- DSIO = 0;
- _nop_();
- DSIO = 1;
- _nop_();
- return dat;
- }
- void Ds1302Init()
- {
- uchar n;
- Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能
- for (n=0; n<3; n++)//写入7个字节的时钟信号:分秒时日月周年
- {
- Ds1302Write(WRITE_RTC_ADDR[n],TIME[0][n]);
- }
- Ds1302Write(0x8E,0x80); //打开写保护功能
- }
- void Ds1302ReadTime()
- {
- uchar n;
- for (n=0; n<3; n++)//读取7个字节的时钟信号:分秒时日月周年
- {
- 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); //时
- 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;
- }
- }
- }
- }
复制代码 |