单片机:屏显示 未测试

#include<reg52.h>                              //包含单片机寄存器的头文件
#include<string.h>                             //使用字符串
#include<intrins.h>                            //单片机头文件
#include<lcd1602.h>                            //液晶显示lcd1602的头文件
//#include<24c04.h>                            //24c02(存储记忆)的头文件
#include<ds1302.h>                             //时钟芯片ds1302头文件
#define uchar unsigned char
#define uint unsigned int
uchar  display[]={"             "};
uchar i=0,j=0;
uint x=0;
//-------------INT0中断------------
void INT0_0() interrupt 0
{
        i++;
        if(i==1)
        {
                TR0=1;
        }
}


//------------INT1中断-------------
void INT1_1() interrupt 2
{
        j++;
        if(j==1)
        {
                TR0=0;

                x=256*TH0+TL0;                  //将字节转换成十进制数
        }
}



//-------------初始化--------------

void INIT()
{
        TMOD=0x01;
        TH0=0;
        TL0=0;
        EA=1;
        EX0=1;
        EX1=1;
        IT0=1;
        IT1=1;
        PX0=1;
}


//------------数据转换--------------
void dispose()
{
        display[7]=x/10000+'0';
        display[8]=x%10000/1000+'0';
        display[10]='s';
        display[11]='e';
        display[12]='c';
}


//----------主程序----------------
void main()
{
    Init_LCD();         //初始化LCD
        //display[7]='1';
        //display[8]='1';
        //display[10]='s';
        //display[11]='e';
        //display[12]='c';
    //IIC_24C04_Init();   //初始化24C04
        INIT();
        while(1)
        {
                GetTime();              //获得当前时间
                Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);         //通道号显示
                Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);
                Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);
            //strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);
                Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);
                Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);        
                Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11);
                //Display_String(display,0x40);
                Display_String(LCD_DSY_BUFFER2,0X00);      //液晶显示
                dispose();
                Display_String(display,0x40);
        }
}

                                                   
#ifndef _lcd1602_2010_4_28_
#define _lcd1602_2010_4_28_
/*********************************lcd1602*****************************/
#define uchar unsigned char
#define uint unsigned int
                              //定义1602与单片机的接口
sbit RS=P2^0;                  //指令数据选择
sbit RW=P2^1;                  //接地,执行写操作
sbit EN=P2^2;                  //信号使能

//---------------延时i毫秒函数------------------
void DelayMs(uint x)
{
uchar i;
while(x--) for(i=0;i<120;i++);
}

//---------------读LCD状态------------------
uchar Read_LCD_State()
{
uchar state;
RS=0;
RW=1;
EN=1;
DelayMs(1);
state=P0;
EN=0;
DelayMs(1);
return state;
}


//----------------忙等待(LCD忙检测)--------------------------
void LCD_Busy_Wait()
{
while((Read_LCD_State()&0x80)==0x80); //读取忙标志位BF,BF=1则一直等待 DelayMS(5)
DelayMs(5);
}


//-----------------向LCD写数据----------------
void Write_LCD_Data(uchar dat)
{
LCD_Busy_Wait();      //忙检测确保上一指令完成,也可用适当的延时替换此行
RS=1;
RW=0;
EN=0;
P0=dat;
EN=1;
DelayMs(1);
EN=0;
}
//--------------写LCD命令--------------------
void Write_LCD_Command(uchar cmd)
{
LCD_Busy_Wait();
RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMs(1);EN=0;
}
//----------------LCD初始化-------------------
void Init_LCD()
{
Write_LCD_Command(0x38);     //8位数据接口,2行显示,5*7点阵字符
DelayMs(1);   //延时保证上一指令完成
Write_LCD_Command(0x01);     //清DDRAM和AC值
DelayMs(1);
Write_LCD_Command(0x06);     //数据读写操作画面不动,AC自动加1
DelayMs(1);
Write_LCD_Command(0x0c);     //开显示,关光标和闪烁
DelayMs(1);
}
//-------------设置液晶显示位置---------------------
void Set_LCD_POS(uchar p)
{
Write_LCD_Command(p|0x80);
}
//-------------在LCD上显示字符串-----------------
void Display_String(uchar*s,uchar p)
{uchar i;
Set_LCD_POS(p);
for(i=0;i<16;i++)
{
Write_LCD_Data(s[i]);
DelayMs(1);
}
}
/*********************lcd1602结束*****************************/

#endif
#ifndef _ds1302_2010_4_28_
#define _ds1302_2010_4_28_

/************************ds1302*********************/

#define uchar unsigned char
#define uint unsigned int                     
                                               //定义DS1302与MCU接口
sbit IO=P2^4;                                //IO接口
sbit SCLK=P2^5;                              //时钟线引脚
sbit RST=P2^6;                               //复位线引脚
uchar*WEEK[]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"};
uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00   "};
uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00   "};
uchar DateTime[7];
//--------------向DS1302写入一字符(一字节数据)----------------
void Write_A_Byte_TO_DS1302(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
IO=x&0x01;SCLK=1;SCLK=0;X>>=1;            //x右移1位,高位补0
}
}
//-------------从DS1302读取一字节(一字节数据)-------------
uchar Get_A_Byte_FROM_DS1302()
{
uchar i,b=0x00;
for(i=0;i<8;i++)
{
b|=_crol_((uchar)IO,i);
SCLK=1;SCLK=0;
}
return b/16*10+b%16;
}
//----------------从DS1302指定位置读数据(读取DS1302某地址的数据,先写命令字,后读数据)-------------------
uchar Read_Date(uchar addr)
{
uchar dat;
RST=0;          //复位
SCLK=0;         //时钟脉冲置0
RST=1;          //启动数据传送
Write_A_Byte_IO_DS1302(addr);         //写入地址命令字
dat=Get_A_Byte_FROM_DS1302();         //读出一个字节的数据
SCLK=1;RST=0;
return dat;
}
//---------------读取当前日期时间----------------
void GetTime()
{
uchar i;addr=0x81;
for(i=0;i<7;i++)
{
DateTime[i]=Read_Data(addr);addr+=2;
}
}
//---------------日期与时间转换为数字字符(格式化日期时间函数)-------------------
void Format_DateTime(uchar d,uchar*a)
{
a[0]=d/10+'0';
a[1]=d%10+'0';
}
/**********************ds1302结束****************************/
#endif

 

posted @ 2021-08-21 07:14  myrj  阅读(85)  评论(0编辑  收藏  举报