⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c

📁 时钟芯片DS1302驱动程序
💻 C
字号:
#include"stdio.h"
#include"reg52.h"
#include"stdlib.h"
#include"intrins.h"
#include"absacc.h"
unsigned char xdata lcddata _at_ 0x0000;
unsigned char xdata lcdcomm _at_ 0x0001;
unsigned char code asctab[]="0123456789";
unsigned char code set[]={0x58,0x59,0x23,0x00,0x00,0x00,0x00,0x20};
unsigned char code address[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,0x8e};
unsigned char datasheet[7];
sbit RES=P1^0;
sbit CLK=P1^1;
sbit DAT=P1^2;
void st1busycheck()//判断液晶读写状态
{
    unsigned char commbyte;
    commbyte=lcdcomm&0x03;
    while(commbyte!=0x03)
    {
        ;
    }
}

void writedata(unsigned char databyte)//向液晶写数据
{
    st1busycheck();
    lcddata=databyte;
}
void writecommand0(unsigned char comm)//无参数指令入口
{
    st1busycheck();
    lcdcomm=comm;
}
void writecommand1(unsigned char dat2,comm)//单字节参数指令入口
{
    writedata(dat2);
    st1busycheck();
    lcdcomm=comm;
}
void writecommand2(unsigned char dat1,dat2,comm)//双字节参数指令入口
{
    writedata(dat1);
    writedata(dat2);
    st1busycheck();
    lcdcomm=comm;
}
void locatexy(unsigned char x,unsigned char y)//定位坐标
{
    unsigned int dat1,dat2,l;
    l=y*0x20+x;
    dat1=l%256;
    dat2=l/256;
    writecommand2(dat1,dat2,0x24);
}

void putch(unsigned char ascdata)
{
    writedata(ascdata-0x20);
    writecommand0(0xc0);
}
void putbcd(unsigned char x,unsigned char y,unsigned int bcd)
{
    locatexy(x,y);
    putch(asctab[bcd/10]);
    bcd=bcd%10;
    putch(asctab[bcd]);
}
void putstring(unsigned char x,unsigned char y,unsigned char *ptr)
{
    locatexy(x,y);
    while(*ptr!='\0')
    {
        writedata(*ptr-0x20);
        writecommand0(0xc0);
        ptr++;
    }
}
void delay(unsigned char ms)
{
    unsigned char i;
    while(ms--)
    for(i=0;i<73;i++) ;
}
void lcdclear()//清屏
{
    unsigned int lcdclear;
    writecommand2(0x00,0x00,0x24);
    writecommand0(0xb0);
    lcdclear=1024;
    while(lcdclear<8193)
    {
        writedata(0x00);
        lcdclear++;
    }
    writecommand0(0xb2);
}
void lcdstart()
{
    writecommand2(0x00,0x00,0x40);//文本区首地址
    writecommand2(0x20,0x00,0x41);//文本区宽度
    writecommand2(0x00,0x08,0x42);//图形区首地址
    writecommand2(0x20,0x00,0x43);//图形区宽度
    writecommand0(0xa7);//字体形状8*7
    writecommand0(0x80);//文本、图形显示方式“或”关系
    writecommand0(0x9c);//启用光标、文本、图形显示
    writecommand0(0x05);
}
void input_a_byte(unsigned char ubyte)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {        
        CLK=0;
        DAT=ubyte&0x01;       
        CLK=1;
        ubyte>>=1;
    }
}
unsigned char output_a_byte()
{
    unsigned char j,n=0;
    for(j=0;j<8;j++)
    {     
           
        if(DAT)
        n|=0x80;
        CLK=1;
        n>>=1; 
        CLK=0;       
    }
        return(n);
}
void w1302(unsigned char address,udat)
{
    RES=0;
    CLK=0;
    RES=1;
    input_a_byte(address);
    input_a_byte(udat);
    RES=0;
}
unsigned char r1302(unsigned char address)
{
    unsigned char udat,nn;
    RES=0;
    CLK=0;
    RES=1;
    input_a_byte(address);
    udat=output_a_byte();
    RES=0;
    nn=udat/16;
    udat=udat%16;
    udat=udat+nn*10;
    return(udat);
}
void set1302()
{
    unsigned char k,address=0x80;
    w1302(0x8e,0x00);
    for(k=0;k<8;k++)
    {
        w1302(address,set[k]);
        address+=2;
    }
    w1302(0x8e,0x80);
}
void get1302()
{
    unsigned char k,m=0x15;
    for(k=0;k<7;k++)
    {
        datasheet[k]=r1302(address[k]);
    }
        for(k=0;k<7;k++)
        {
            putbcd(m,0x00,datasheet[k]);
            m-=3;
        }
        delay(100);
}
main()
{   
    lcdstart();
    lcdclear();
    set1302();
    
    while(1)
    {
        get1302();
    }
    //putstring(0x00,0x00,"-----------");
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -