- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- //---------------1302引脚定义-----------------------
- sbit RST=P1^0; //RST=1时允许操作1302
- sbit SCLK=P1^1; //1302时钟脚,低电平到高电平跳变时写入
- sbit IO=P1^2; //IO写入或读出数据脚,串行形式。
- //---------------1602引脚定义------------------------
- sbit E=P1^5; //使能端,E=1允许读写操作,E=0禁止。
- sbit RW=P1^4; //RW=1读出数据,RW=0写入数据。
- sbit RS=P1^3; //RS=1读写数据寄存器,RS=0读写指令寄存器。
- sbit ACC7=ACC^7;
- //---------------1302,1602共用延时程序------------------------
- void delay(int m)
- {
- int i,j;
- for(i=0;i<m;i++)
- for(j=0;j<10;j++);
- }
- //------------------写1302程序-----------------------------
- void Wr1302(uchar wr)
- {
- uchar i;
- SCLK=0; //sclk低电平到高电平跳变时写入数据
- for(i=0;i<8;i++)
- {
- IO=wr & 0x01; //写入1302数据,IO端口
- SCLK=1; //sclk低电平到高电平跳变时写入数据
- wr>>=1; //右一位
- delay(20);
- SCLK=0; //关闭
- }
- }
- //-----------------读1302程序------------------------
- uchar Rd1302()
- {
- uchar i;
- IO=1; //允许数据输入输出
- for(i=0;i<8;i++)
- {
- ACC>>=1; //ACC右一位
- ACC7=IO; //ACC第7位必须是高电平
- SCLK=1; //时钟高电平向低电平的跳变写入一个数据
- delay(20);
- SCLK=0;
- };
- return ACC;
- }
- //------------突发写程序----------------------------------
- void TWr1302(uchar x[])
- {
- int i;
- RST=0; //复位,低电平有效
- Wr1302(0xbe);
- for(i=0;i<8;i++)
- Wr1302(x[i]);
- }
- //-----------突发读程序------------------------------------
- void TRead(uchar x[])
- {
- uchar i;
- RST=1; //高电平复位信号无效
- Wr1302(0xbf); //1302突发读寄存器
- for(i=0;i<7;i++)
- x[i]=Rd1302(); //读1302的数据
- RST=0; //高电平复位信号有效
- }
-
- //--------------1302启动程序---------------------------------
- void Cmd_wr(c,d)
- {
- RST=1; //RST=1时允许对1302操作
- Wr1302(c); //读1302,写入指令字
- Wr1302(d); //读1302,写入指令字
- RST=0; //禁止对1302操作
- }
- //---------------写入指令1602 ------------------------
- void WR_cmd(uint cmd)
- {
- RW=0; //向1602lcd写入指令或数据允许位
- P0=cmd; //将数据送到P1口
- RS=0; //向1602写入指令
- E=1; //从高电平到低电平的跳变写入一个数据
- delay(1);
- E=0;
- }
- //===============1602写入数据=====================
- void WR_data(uint dat)
- {
- RS=1; //向1602写入指令
- RW=0; //向1602lcd写入指令或数据允许位
- P0=dat; //将数据送到P1口
- E=1; //1602时钟从高电平向低电平的跳变写入一个数据
- delay(1);
- E=0;
- }
- //==============1602初始化程序===================
- void init1602(void)
- {
- WR_cmd(0x38); //模式设置为8位数据总线,显示2行数据 5x7点阵/字符
- WR_cmd(0x0c); // 打开显示
- WR_cmd(0x06); //显示模式设置为写入新的数据光标右移
- WR_cmd(0x01); //清屏显示
- delay(10);
- }
- //===============1602显示程序===================
- void display(char strlen,uchar *table) //一个变量前加*说明此变量时指针形式
- {
- uchar i;
- for(i=0;i<strlen;i++) //判一行16个数据是否都写入进1602
- {
- WR_data(table[i]); //数据写入1602
- }
- delay(20); //延时20us
- }
- //==============1602与1302主程序=====================
- void main(void)
- { uchar a[8]={0x00,0x57,0x12,0x06,0x07,0x06,0x18,0x00}; //00秒57分12时06日07月06-5周18年
- uchar Y[16]={0x32,0x30,0x00,0x00,0x2d,0x00,0x00,0x2d,
- 0x00,0x00,0x2d,0x57,0x65,0x65,0x6b,0x00}; //定义1602第一行显示的字符
- uchar H[16]={0x00,0x00,0x3a,0x00,0x00,0x3a,0x00,0x00,
- 0x2d,0x2d,0x4f,0x4b,0x2d,0x21,0x00,0x00}; //定义1602第二行显示的字符
-
- uchar b[7]; //读出的数据存储位置
- Cmd_wr(0x8e,0x00); //启动1302,0x8e写保护中写单元地址,只能读不再写。
- // TWr1302(a); //突发写入(可以试验是否能写入,能写入就正常,测试时使用)
- // Cmd_wr(0x8e,0x00); //禁止写入1302
- init1602();
- delay(20);
- while(1) //循环
- {
- TRead(b); //突发读,可以读到b数组中
- Y[2]=(0x30+b[6]/16); //0x30是ASCII阿拉伯数字的首地址
- Y[3]=(0x30+b[6]%16);
- Y[5]=(0x30+b[4]/16);
- Y[6]=(0x30+b[4]%16);
- Y[8]=(0x30+b[3]/16);
- Y[9]=(0x30+b[3]%16);
- if(b[5]==1)
- Y[15]=7+0x30;
- else
- Y[15]=b[5]-1+0x30;
- H[0]=(0x30+b[2]/16);
- H[1]=(0x30+b[2]%16);
- H[3]=(0x30+b[1]/16);
- H[4]=(0x30+b[1]%16);
- H[6]=(0x30+b[0]/16);
- H[7]=(0x30+b[0]%16);
- // E=0;
- // Cmd_wr(0x8e,0x00); //WP写保护位设置为不工作方式
-
- WR_cmd(0x80); //第一行显示地址
- display(16,Y);
- WR_cmd(0x80+0x40); //第二行显示地址
- display(16,H);
- }
- }
复制代码 |