logo资料库

51单片机控制DS1302在LCD12864上显示.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
#include #define UINT unsigned int #define UCHAR unsigned char sbit en=P3^4; // 使能 sbit rs=P3^5; // sbit rw=P3^6; // sbit rd=P3^7; // sbit duan=P2^6; //关闭数码管的显示 sbit wei=P2^7; LCD 的数据和控制端口 LCD 的读写控制 LCD 的串行和并行选择 sbit sclk=P2^0;//DS1302 的控制和数据端口 sbit io=P2^1; sbit ce=P2^4;//复位端口,我认为和使能口一样。可这样理解 int c; UCHAR UCHAR UCHAR //UCHAR UCHAR line[]="年月日"; line2[]="时分秒"; line3[]="星期"; table[]="一二三四五六日"; digit[]="0123456789"; void show_on( UCHAR ADD); void DS1302_init(); void DS1302_write(UCHAR add,UCHAR dat); //void LCD_chinese( UCHAR P[10]); void LCD_rw(UCHAR wr,bit n); /******************************************************************* 函数名称:void delay(); 函数功能: ms 延时 输入参数: x ,延时时间 输出函数: 无 ********************************************************************/ //ms 延时 void delay( UINT x) { UINT i,j; for(i=x;i>0;i--)
for(j=110;j>0;j--); } /******************************************************************* 函数名称:void LCD_rw(UCHAR com,bit n) 函数功能: LCD 的数据和命令写入 输入参数: wr 要写入的数据和命令 n: n=1 时,写入数据。n=0 时写入命令 输出函数: 无 ********************************************************************/ void LCD_rw(UCHAR wr,bit n) { rw=0; P0=wr; rs=(0|n); en=0; delay(5); en=1; delay(5); en=0; delay(5); } void LCD_chinese( char *P ) { LCD_rw( *P,1); P++; LCD_rw( *P,1); } /******************************************************************* 函数名称: LCD_init() 函数功能: LCD12864 的初始化 输入参数: 无 输出函数: 无 ********************************************************************/ void LCD_init() { rd=1; duan=0;
wei=0; delay(15); LCD_rw(0x38,0); delay(5); LCD_rw(0x30,0); delay(5); LCD_rw(0x0c,0); delay(5); LCD_rw(0x06,0); delay(5); LCD_rw(0x01,0); delay(5); } /******************************************************************* 函数名称:1302write_byte( UCHAR dat) 函数功能: 写入一个字节( 在 sclk 的上升沿写入,最低位先写入 ) 输入参数: dat 要写入的字节 输出函数: 无 ********************************************************************/ void DS1302write_byte( UCHAR dat) { int i; //unsigned char temp; sclk=0; for( i=0;i<8;i++) //dat=temp; io=dat&0x01; //比原文少延时 sclk=1; delay(2); sclk=0; dat>>=1; { } }
/******************************************************************* 函数名称:void 1302_write(UCHAR add,UCHAR dat ) 函数功能: 在指定位置写入数据 (在上升沿将数据写入) 输入参数: add,地址;dat,数据 输出函数: 无 ********************************************************************/ void DS1302_write(UCHAR add,UCHAR dat) { ce=0; sclk=0; ce=1; DS1302write_byte( add );// 要写入 1302 的寄存器的地址 DS1302write_byte( dat);// 要写入 1302 的寄存器的数据 sclk=1; ce=0; //类似于使能端,使用后将其释放 sclk=0; delay(2); } /******************************************************************* 函数名称:UCHAR 1302read_byte( ) 函数功能: 读取一个字节( 在 sclk 的下降沿读出,最低位先读入 ) 输入参数: 无 输出函数: DAT ,读出的数据 ********************************************************************/ UCHAR DS1302read_byte( ) { int i; UCHAR DAT; sclk=0; for(i=0;i<8;i++) { DAT=DAT>>1; if(io==1)
DAT|=0x80; sclk=1; delay(2); sclk=0; } return DAT; } /******************************************************************* 函数名称: UCHAR 1302_read( UCHAR add ) 函数功能: 读出指定位置的数据 输入参数: add,地址; 输出函数: Temp ********************************************************************/ UCHAR DS1302_read( UCHAR add ) { UCHAR Temp; ce=0; sclk=0; ce=1; DS1302write_byte( add ); Temp=(DS1302read_byte( ) ); sclk=1 ; //这里和原文有区别 ce=0; sclk=0; return Temp } ; //这里有改动,去了个 sclk=1;和 ce=0 换了位置 /******************************************************************* 函数名称: void DS1302_init() 函数功能: 初始化 DS1302 输入参数: 无 输出函数: 无
********************************************************************/ void DS1302_init() { DS1302_write( 0x8E,0x00);//这里有改动开了写保护 DS1302_write( 0x80, ((55/10)<<4|(55%10))); //秒 delay(1); DS1302_write( 0x8a,((3/10)<<4|(3%10)));//星期 delay(1); //分 //时 DS1302_write( 0x82 , ((20/10)<<4|(20%10))); delay(1); DS1302_write( 0x84 , ((23/10)<<4|(23%10))); delay(1); DS1302_write( 0x86 , ((16/10)<<4|(16%10)));//日 delay(1); DS1302_write( 0x88, ((3/10)<<4|(3%10))); //月 delay(1); DS1302_write( 0x8c,((12/10)<<4|(12%10)));//年 delay(1); DS1302_write( 0x90,0xa6); delay(1); DS1302_write( 0x8E,0x80); } /******************************************* 对指定地址读取回来的值进行处理 *******************************************/ UCHAR read_value(unsigned char add) // 读取指定地址的值,并转化为 10 进制 { unsigned char BcdValue,DecValue; add ); BcdValue=DS1302_read( DecValue=(((BcdValue&0x70)>>4)*10+(BcdValue&0x0f)); return DecValue;
} UCHAR read_year( ) { //年需要另外处理,值为 00~99 unsigned char BcdValue,DecValue; BcdValue=DS1302_read(0x8d); DecValue=(((BcdValue&0xf0)>>4)*10+(BcdValue&0x0f)); return DecValue; } void display(unsigned char add,unsigned char x) //将转化为十进制的数进行显示 { } unsigned i,j; i=x/10; j=x%10; LCD_rw( add, 0); LCD_rw( digit[i], 1); LCD_rw( digit[j], 1); delay(5); /*void display_week() { //int a; unsigned char BcdValue,DecValue; BcdValue=DS1302_read(0x8b); //DecValue=(((BcdValue&0xf0)>>4)*10+(BcdValue&0x0f)); LCD_rw( 0x8c, 0); // //DecValue=DecValue*2-2; a=(int)(DecValue); // LCD_rw( 0x8c, 0); // LCD_chinese( &table[4)]); // display(0x8c,DecValue); } */ /******************************************************************* 函数名称: void init_devices() 函数功能: 初始化所有需要初始化的器件 输入参数: 无
输出函数: 无 ********************************************************************/ void init_devices( ) { LCD_init(); delay(5); DS1302_init(); delay(5); display( ); delay(5); // } /******************************************************************* 函数名称: void init_display() 函数功能: 对需要静态显示的数字和汉字进行初始化 输入参数: 无 输出函数: 无 ********************************************************************/ void init_display( ) { LCD_rw(0x81,0); LCD_rw('2',1); LCD_rw('0',1); LCD_rw(0x83,0); LCD_chinese( &line[0]); LCD_rw(0x85,0); LCD_chinese( &line[2]); LCD_rw(0x87,0); LCD_chinese( &line[4]); LCD_rw(0x92,0); LCD_chinese( &line2[0]); LCD_rw(0x94,0); LCD_chinese( &line2[2]); LCD_rw(0x96,0); LCD_chinese( &line2[4]); LCD_rw(0x8a,0); LCD_chinese( &line3[0]); LCD_rw(0x8b,0);
分享到:
收藏