?? main.c
字號(hào):
#include"reg52.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar i=0;
uchar SHEZHI[15];
uchar init[7]={0x11,0x21,0x23,0x23,0x04,0x04,0x08};//秒,分,時(shí),日,月,星期,年
void DISP_DATA(void);
//*******************LCD模塊
#define LCD_DATA P0 //LCD的數(shù)據(jù)口
sbit LCD_BUSY=LCD_DATA^7; //LCD忙信號(hào)位
sbit LCD_RW=P3^5; //LCD讀寫控制
sbit LCD_RS=P3^4; //LCD寄存器選擇
sbit LCD_EN=P3^6; //LCD使能信號(hào)
void LCD_check_busy(void) //檢測LCD狀態(tài),看它是不是還在忙呢
{
while(1)
{
LCD_EN=0;
LCD_RS=0; //指令寄存器通信
LCD_RW=1; //read data
LCD_DATA=0xff;
LCD_EN=1;
if(!LCD_BUSY)break;
}
LCD_EN=0;
}
void LCD_cls(void) //LCD清屏
{
LCD_check_busy();
LCD_RS=0;
LCD_RW=0;
LCD_DATA=1;
LCD_EN=1;
LCD_EN=0;
}
void LCD_write_instruction(unsigned char LCD_instruction) //寫指令到LCD
{
LCD_check_busy();
LCD_RS=0;
LCD_RW=0; //寫數(shù)據(jù)
LCD_DATA=LCD_instruction;
LCD_EN=1;
LCD_EN=0;
}
void LCD_write_data(unsigned char LCD_data) //輸出一個(gè)字節(jié)數(shù)據(jù)到LCD
{
LCD_check_busy();
LCD_RS=1;
LCD_RW=0;
LCD_DATA=LCD_data;
LCD_EN=1;
LCD_EN=0;
}
void LCD_set_position(unsigned char x) //LCD光標(biāo)定位到x處
{
LCD_write_instruction(0x80+x);
}
void LCD_printc(unsigned char lcd_data) //輸出一個(gè)字符到LCD
{
LCD_write_data(lcd_data);
}
void LCD_prints(unsigned char *lcd_string) //輸出一個(gè)字符串到LCD
{
unsigned char i=0;
while(lcd_string[i]!=0x00)
{
LCD_write_data(lcd_string[i]);
i++;
}
}
void LCD_initial(void) //初始化LCD
{
LCD_write_instruction(0x3c);
LCD_write_instruction(0x0c);
LCD_write_instruction(0x06);//顯示屏一定要不移動(dòng)。
LCD_cls();
}
//*************************LCD模塊結(jié)束
//鍵盤
uchar temp_OUT=0x0A;
uchar flag_san_key=0;
void delay1(void)
{
uint i;
for(i=300;i>0;i--);
}
void scan_key(void)
{
unsigned char i,temp1;
P1=0XF0;
for(i=0;i<4;i++)
{
P1=~(1<<i);
delay1();
temp1=P1&0xF0;
if(temp1!=0xF0)
{
delay1();
temp1=P1&0xF0;
switch(temp1)
{
case 0xe0:temp_OUT=3-(3-i)*1;SHEZHI[flag_san_key++]=temp_OUT;break; // 0 1 2 3
case 0xd0:temp_OUT=7-(3-i)*1;SHEZHI[flag_san_key++]=temp_OUT;break; // 4 5 6 7
case 0xb0:temp_OUT=11-(3-i)*1;SHEZHI[flag_san_key++]=temp_OUT;break; // 8 9 a b
case 0x70:temp_OUT=15-(3-i)*1;SHEZHI[flag_san_key++]=temp_OUT;break; // c d e f
default:break;//0x3f;
}
tt:temp1=P1&0xF0;
if(temp1!=0xF0)
{
;
goto tt;
}
}
}
}
void DISP_DATA(void)
{
scan_key();
if(temp_OUT!=0X0A)
{
init[6]=(SHEZHI[0]<<4)|SHEZHI[1];
init[5]=(SHEZHI[2]<<4)|SHEZHI[3];
init[4]=(SHEZHI[4]<<4)|SHEZHI[5];
init[3]=(SHEZHI[6]<<4)|SHEZHI[7];
init[2]=(SHEZHI[8]<<4)|SHEZHI[9];
init[1]=(SHEZHI[10]<<4)|SHEZHI[11];
init[0]=(SHEZHI[12]<<4)|SHEZHI[13];
//顯示
LCD_set_position(1);
LCD_printc(0X32);
LCD_set_position(2);
LCD_printc(0X30);
LCD_set_position(3);
LCD_printc(0X30+init[6]/16);
LCD_set_position(4);
LCD_printc(0X30+init[6]%16);
LCD_set_position(5);
LCD_prints(" ");
//月日
LCD_set_position(7);
LCD_printc(0X30+init[4]/16);
LCD_set_position(8);
LCD_printc(0X30+init[4]%16);
LCD_set_position(9);
LCD_prints("-");
LCD_set_position(10);
LCD_printc(0X30+init[3]/16);
LCD_set_position(11);
LCD_printc(0X30+init[3]%16);
LCD_set_position(12);
LCD_prints(" ");
//星期
LCD_set_position(14);
LCD_printc(0X30+init[5]%16);
//時(shí)分秒
LCD_set_position(0X4E);
LCD_printc(0X30+init[0]%16);
LCD_set_position(0X4D);
LCD_printc(0X30+init[0]/16);
LCD_set_position(0X4C);
LCD_prints(":");
LCD_set_position(0x4B);
LCD_printc(0X30+init[1]%16);
LCD_set_position(0x4a);
LCD_printc(0X30+init[1]/16);
LCD_set_position(0X49);
LCD_prints(":");
LCD_set_position(0X48);
LCD_printc(0X30+init[2]%16);
LCD_set_position(0X47);
LCD_printc(0X30+init[2]/16);
}
}
//ds1302控制
sbit reset=P3^7;
sbit sclk=P2^6;
sbit io=P2^7;
void delay()
{uint j;
for(j=500;j>0;j--);
}
//-----------ds1302模塊開始-------------------
//注意點(diǎn):sclk的上升沿輸入數(shù)據(jù),sclk的下跳沿輸出數(shù)據(jù)
//讀寫時(shí)都是從第0位開始
void write_byte(uchar inbyte)
{
uchar i;
for(i=8;i>0;i--)
{
sclk=0; //寫的時(shí)候低電平改變數(shù)據(jù)
if(inbyte&0x01)
io=1;
else
io=0;
sclk=1; //寫的時(shí)候高電平,把數(shù)據(jù)寫入ds1302
_nop_();
inbyte=inbyte>>1;
}
}
uchar read_byte() //sclk的下跳沿讀數(shù)據(jù)
{
uchar i,temp=0;
io=1; //設(shè)置為輸入口
for(i=7;i>0;i--)
{
sclk=0;
if(io==1)
temp=temp|0x80;
else
temp=temp&0x7f;
sclk=1; //產(chǎn)生下跳沿
temp=temp>>1;
}
return (temp);
}
//----------往ds1302的某個(gè)地址寫入數(shù)據(jù)-------------
void write_ds1302(uchar cmd,uchar indata)
{
reset=1;
write_byte(cmd);
write_byte(indata);
reset=0;
sclk=0;
}
//----------讀ds1302某地址的的數(shù)據(jù)-----------------
uchar read_ds1302(uchar addr)
{
uchar backdata;
reset=1;
write_byte(addr);
backdata=read_byte();//先寫地址,然后讀數(shù)據(jù)
reset=0;
sclk=0;
return (backdata);
}
//------------設(shè)置初始時(shí)間-------------------
void set_ds1302(uchar addr,uchar *p,uchar n)//寫入n個(gè)數(shù)據(jù)
{
write_ds1302(0x8e,0x00);//寫控制字,允許寫操作
for(;n>0;n--)
{write_ds1302(addr,*p);
p++;
addr=addr+2;
}
write_ds1302(0x8e,0x80);//寫保護(hù),不允許寫
}
//----------- 讀取當(dāng)前時(shí)間-------------------
void read_nowtime(uchar addr,uchar *p,uchar n)
{
for(;n>0;n--)
{
*p=read_ds1302(addr);
p++;
addr=addr+2;
}
}
void init_ds1302()
{
reset=0;
sclk=0;
write_ds1302(0x80,0x00);//寫控制字,允許寫
write_ds1302(0x90,0x00);//禁止渦流充電
}
//-----------ds1302模塊結(jié)束-------------------
//- ----------公歷轉(zhuǎn)陰歷結(jié)束-------------------
//LCD1602顯示
void LCD1602_DISP(void)
{
uchar format=0;
if(SHEZHI[14]==0x0A)
{
flag_san_key=0;
set_ds1302(0x80,init,7);//設(shè)置初始時(shí)間,日期,年月
SHEZHI[14]=0x00;
for(format=0;format<14;format++)
{
SHEZHI[format]=0;
}
}
if(temp_OUT==0X0A)
{
read_nowtime(0x81,init,7); //讀出當(dāng)前時(shí)間,讀出7個(gè)字節(jié)
//年
LCD_set_position(1);
LCD_printc(0X32);
LCD_set_position(2);
LCD_printc(0X30);
LCD_set_position(3);
LCD_printc(0X30+init[6]/16);
LCD_set_position(4);
LCD_printc(0X30+init[6]%16);
LCD_set_position(5);
LCD_prints(" ");
//月日
LCD_set_position(7);
LCD_printc(0X30+init[4]/16);
LCD_set_position(8);
LCD_printc(0X30+init[4]%16);
LCD_set_position(9);
LCD_prints("-");
LCD_set_position(10);
LCD_printc(0X30+init[3]/16);
LCD_set_position(11);
LCD_printc(0X30+init[3]%16);
LCD_set_position(12);
LCD_prints(" ");
//星期
LCD_set_position(14);
LCD_printc(0X30+init[5]%16);
//時(shí)分秒
LCD_set_position(0X4E);
LCD_printc(0X30+init[0]%16);
LCD_set_position(0X4D);
LCD_printc(0X30+init[0]/16);
LCD_set_position(0X4C);
LCD_prints(":");
LCD_set_position(0x4B);
LCD_printc(0X30+init[1]%16);
LCD_set_position(0x4a);
LCD_printc(0X30+init[1]/16);
LCD_set_position(0X49);
LCD_prints(":");
LCD_set_position(0X48);
LCD_printc(0X30+init[2]%16);
LCD_set_position(0X47);
LCD_printc(0X30+init[2]/16);
}
}
void main()
{
LCD_initial();
init_ds1302(); //初始化ds1302
set_ds1302(0x80,init,7);//設(shè)置初始時(shí)間,日期,年月
while(1)
{
DISP_DATA();
LCD1602_DISP();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -