51單片機(jī)+帶字庫液晶12864+DS1302數(shù)字時鐘C源程序
目前還不能修改時間與日期,只是以預(yù)定時間以始。
本文引用地址:http://m.butianyuan.cn/article/201612/325258.htm適用于開發(fā)板:51單片機(jī)(AT89S52)+帶字庫液晶12864(ST7920)+DS1302(實時時鐘)
實現(xiàn)功能:簡單,數(shù)字時鐘+日期(以后會不斷完美)。
C語言源程序如下:
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*DS1302 端口設(shè)置 */
sbit SCK=P3^6; //DS1302時鐘
sbit SDA=P3^4; //DS1302 IO
sbit RST = P3^5; // DS1302復(fù)位
bit ReadRTC_Flag; //讀DS1302全局變量
/* 12864端口定義*/
#define LCD_data P0 //帶字庫液晶12864數(shù)據(jù)口
sbit LCD_RS = P2^4; //寄存器選擇輸入
sbit LCD_RW = P2^5; //液晶讀/寫控制
sbit LCD_EN = P2^6; //液晶使能控制
sbit PSB=P2^1; //并口控制
sbit RES=P2^3;
uchar code dis1[] = {" 電子設(shè)計天地"}; //液晶顯示的漢字
uchar code dis2[] = {"有志者,事竟成!"};
uchar code dis4[] = {0,1,2,3,4,5,6,7,8,9};
unsigned char temp;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void lcd_pos(uchar X,uchar Y); //確定顯示位置
unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分時日月周年09-10-19 16:07:00
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分時日月周年 最低位讀寫位
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void Read_RTC(void);//read RTC
void Set_RTC(void); //set RTC
void InitTIMER0(void);//inital timer0
/*******************************************************************/
/* */
/* 延時函數(shù) */
/* */
/*******************************************************************/
void delay(unsigned int m) //延時程序
{
unsigned int i,j;
for(i=0;i
}
/*******************************************************************/
/* */
/*檢查LCD忙狀態(tài) */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*寫指令數(shù)據(jù)到LCD */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delay(1);
LCD_EN = 1;
delay(1);
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*寫顯示數(shù)據(jù)到LCD */
/*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delay(1);
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* LCD初始化設(shè)定 */
/* */
/*******************************************************************/
void lcd_init()
{
P0=0xFF;
P2=0xFF;
delay(40);
PSB=1; //并口方式。
delay(1);
RES=0;
delay(1);
RES=1;
delay(10);
lcd_wcmd(0x30);
delay(100);
lcd_wcmd(0x30);
delay(37);
lcd_wcmd(0x08);
delay(100);
lcd_wcmd(0x10);
delay(100);
lcd_wcmd(0x0C); //顯示開,關(guān)光標(biāo)
delay(100);
lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
delay(100);
lcd_wcmd(0x06);
delay(100);
}
void main()
{
uchar i;
InitTIMER0();
Set_RTC();
lcd_init();
//初始化LCD
while(1)
{
if(ReadRTC_Flag)
{
ReadRTC_Flag=0;
Read_RTC();
lcd_pos(0,0); //設(shè)置顯示位置為第一行的第1個字符
i = 0;
while(dis1[i] !=