#include<reg52.h> #include"DS1302.H" #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit EN=P1^2; sbit RS=P1^0; sbit RW=P1^1; unsigned char code duan[11]="0123456789-"; char a[]={0x35,0x45,0x16,0x06,0x04,0x04,0x23,0x80}; char b[8]; char min=59,hour=23,sec=55,n=0; void delayms(uint t) { uchar j; while(t--) { for(j=0;j<123;j++); } } void wcmd(uchar cmd) { RS=0; RW=0; P0=cmd; delayms(5); EN=1; delayms(5); EN=0; delayms(5); } void wdat(uchar dat) { RS=1; RW=0; P0=dat; delayms(5); EN=1; delayms(5); EN=0; delayms(5); } void init_1602() { EN=0; wcmd(0x06); delayms(5); wcmd(0x01); delayms(5); wcmd(0x0c); delayms(5); wcmd(0x38); delayms(5); } void main() { char i,xs[8]; char xq[7][4]={{"MON"},{"TUE"},{"WES"},{"THU"},{"FRI"}}; char a[8]={0x35,0x45,0x16,0x06,0x04,0x04,0x23,0x80}; init_1602(); init_1302(); send_1_byte(0x80,0x55); send_1_byte(0x82,0x30); set (a); while(1) { read_all(b); xs[0]=b[0]%16; xs[1]=b[0]/16; xs[2]=10; xs[3]=b[1]%16; xs[4]=b[1]/16; xs[5]=10; xs[6]=b[2]%16; xs[7]=b[2]/16; wcmd(0x83); for(i=7;i>=0;i--) { wdat(duan[xs[i]]); } xs[0]=b[3]%16; xs[1]=b[3]/16; xs[2]=10; xs[3]=b[4]%16; xs[4]=b[4]/16; xs[5]=10; xs[6]=b[6]%16; xs[7]=b[6]/16; wcmd(0xc3); for(i=7;i>=0;i--) { wdat(duan[xs[i]]); } wcmd(0x8c); for(i=0;i<3;i++) { wdat(xq[b[5]-1][i]); } } }解释每行代码的意思
时间: 2023-12-13 16:04:12 浏览: 174
1. `#include<reg52.h>`:头文件,包含了51单片机的寄存器定义等。
2. `#include"DS1302.H"`:自定义的头文件,包含了DS1302时钟芯片的初始化、读写等函数。
3. `#define uchar unsigned char`:宏定义,将`unsigned char`类型定义为`uchar`。
4. `#define uint unsigned int`:宏定义,将`unsigned int`类型定义为`uint`。
5. `sbit dula=P2^6;`:声明P2.6引脚为动态数码管段选信号。
6. `sbit wela=P2^7;`:声明P2.7引脚为动态数码管位选信号。
7. `sbit EN=P1^2;`:声明P1.2引脚为LCD显示屏的使能信号。
8. `sbit RS=P1^0;`:声明P1.0引脚为LCD显示屏的数据/命令选择信号。
9. `sbit RW=P1^1;`:声明P1.1引脚为LCD显示屏的读/写选择信号。
10. `unsigned char code duan[11]="0123456789-";`:定义一个常量数组,用于存储动态数码管的显示字符。
11. `char a[]={0x35,0x45,0x16,0x06,0x04,0x04,0x23,0x80};`:定义一个字符数组,用于存储LCD显示屏的初始化命令。
12. `char b[8];`:定义一个字符数组,用于存储从DS1302时钟芯片中读取的时间数据。
13. `char min=59,hour=23,sec=55,n=0;`:定义四个字符型变量,用于存储当前时间的时、分、秒和星期几。
14. `void delayms(uint t)`:自定义函数,用于延时一定的时间。
15. `wcmd(uchar cmd)`:自定义函数,用于向LCD显示屏发送命令。
16. `wdat(uchar dat)`:自定义函数,用于向LCD显示屏发送数据。
17. `init_1602()`:自定义函数,用于初始化LCD显示屏。
18. `init_1302()`:自定义函数,用于初始化DS1302时钟芯片。
19. `send_1_byte(0x80,0x55)`:自定义函数,用于向DS1302时钟芯片写入数据。
20. `set(a)`:自定义函数,用于设置DS1302时钟芯片的时间。
21. `read_all(b)`:自定义函数,用于从DS1302时钟芯片中读取时间数据。
22. `void main()`:主函数。
23. `char i,xs[8];`:定义一个字符型变量i和一个长度为8的字符数组xs,用于存储动态数码管的显示数据。
24. `char xq[7][4]={{"MON"},{"TUE"},{"WES"},{"THU"},{"FRI"}};`:定义一个二维字符数组,用于存储星期几的字符串。
25. `init_1602();`:调用自定义函数,初始化LCD显示屏。
26. `init_1302();`:调用自定义函数,初始化DS1302时钟芯片。
27. `send_1_byte(0x80,0x55);`:调用自定义函数,向DS1302时钟芯片写入数据。
28. `send_1_byte(0x82,0x30);`:调用自定义函数,向DS1302时钟芯片写入数据。
29. `set (a);`:调用自定义函数,设置DS1302时钟芯片的时间。
30. `while(1)`:死循环,程序会一直运行下去。
31. `read_all(b);`:调用自定义函数,从DS1302时钟芯片中读取时间数据,并存储到字符数组b中。
32. `xs[0]=b[0]%16; xs[1]=b[0]/16; xs[2]=10; xs[3]=b[1]%16; xs[4]=b[1]/16; xs[5]=10; xs[6]=b[2]%16; xs[7]=b[2]/16;`:将从DS1302时钟芯片中读取的时间数据转换成动态数码管的显示数据,存储到字符数组xs中。
33. `wcmd(0x83);`:向LCD显示屏发送命令,设置光标位置为第一行第四列。
34. `for(i=7;i>=0;i--) { wdat(duan[xs[i]]); }`:向LCD显示屏发送数据,显示动态数码管的时间。
35. `xs[0]=b[3]%16; xs[1]=b[3]/16; xs[2]=10; xs[3]=b[4]%16; xs[4]=b[4]/16; xs[5]=10; xs[6]=b[6]%16; xs[7]=b[6]/16;`:将从DS1302时钟芯片中读取的时间数据转换成动态数码管的显示数据,存储到字符数组xs中。
36. `wcmd(0xc3);`:向LCD显示屏发送命令,设置光标位置为第二行第四列。
37. `for(i=7;i>=0;i--) { wdat(duan[xs[i]]); }`:向LCD显示屏发送数据,显示动态数码管的时间。
38. `wcmd(0x8c);`:向LCD显示屏发送命令,设置光标位置为第二行第十三列。
39. `for(i=0;i<3;i++) { wdat(xq[b[5]-1][i]); }`:向LCD显示屏发送数据,显示当前的星期几。
阅读全文