|
- #include<reg52.h>
- #include<intrins.h>
- #include<STDIO.H>
- #include<string.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit k1=P1^0;
- /////////////////////////////////////////////////LCD12864串行顯示相關驅動///////////////////////////
- uchar code num[]={"0123456789:.-"};//此數組用于顯示數字轉碼
- uchar time_buf[8] = {0x20,0x23,0x05,0x04,0x09,0x09,0x55,0x04};//用于DS1302放置設置相關數據,此處初始時間2010年6月1號23點59分55秒 星期二
- uchar dis_time_buf[16]={0};//用于放置折分開的DS1302讀回的數據,可用于LCD——12864顯示
- //////////第一步,設置LCD12864串行顯示所需的I/O口線,硬件接線圖////////////////////////////////////
- sbit CS = P3 ^5; //片選 高電平有效 單片LCD使用時可固定高電平
- sbit SID = P3 ^6; //數據
- sbit SCLK = P3 ^4; //時鐘
- sbit PSB = P3 ^7; //串并切換,0串,1并
- ////////////////DS1302引腳定義硬件接線圖//////////////////////////////////////////////////////////
- sbit RST=P2^3;
- sbit IO=P2^2;
- sbit SCK=P2^1;
- //////////////////////////////////////////////////////////////////////////////////////////////////
- //LCD_12864專用延時函數
- void Delaynms(uint di) //延時
- {
- uint da,db;
- for(da=0;da<di;da++)
- for(db=0;db<10;db++);
- }
- //LCD_12864專用單字節必用函數
- void Send_byte(uchar bbyte) //發送一個字節
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- SID=bbyte&0x80; //取出最高位
- SCLK=1;
- SCLK=0;
- bbyte<<=1; //左移
- }
- }
- //LCD_12864寫指令字節必用函數
- void Write_char(bit start, uchar ddata) //寫指令或數據
- {
- uchar start_data,Hdata,Ldata;
- if(start==0)
- start_data=0xf8; //寫指令
- else
- start_data=0xfa; //寫數據
- Hdata=ddata&0xf0; //取高四位
- Ldata=(ddata<<4)&0xf0; //取低四位
- Send_byte(start_data); //發送起始信號
- Delaynms(5); //延時是必須的
- Send_byte(Hdata); //發送高四位
- Delaynms(1); //延時是必須的
- Send_byte(Ldata); //發送低四位
- Delaynms(1); //延時是必須的
- }
- //LCD_12864初始化函數,在顯示之前必需先初始化
- void Lcd_init() //初始化LCD
- {
- PSB=0;//串型模式
- Delaynms(10); //啟動等待,等LCM講入工作狀態
- CS=1;
- Write_char(0,0x30); //8 位介面,基本指令集
- Write_char(0,0x0c); //顯示打開,光標關,反白關
- Write_char(0,0x01); //清屏,將DDRAM的地址計數器歸零
- }
- //LCD_12864清屏函數,在需要清屏時調用
- void Clr_Scr()//清屏函數
- {
- Write_char(0,0x01);
- }
- //LCD_12864設置顯示行、列函數,X為行,Y為列
- void LCD_set_xy( uchar x, uchar y )
- { //設置LCD顯示的起始位置,X為行,Y為列
- uchar address;
- switch(x)
- {
- case 1: address = 0x80 + y; break;
- case 2: address = 0x90 + y; break;
- case 3: address = 0x88 + y; break;
- case 4: address = 0x98 + y; break;
- default:address = 0x80 + y; break;
- }
- Write_char(0, address);
- }
- //LCD_12864調用數組顯示字串函數,包括漢字,X,Y為起始位置,S為數組名
- void LCD_Write_string(uchar X,uchar Y,uchar *s)
- { // 中英文字符串顯示函數
- LCD_set_xy( X, Y );
- while (*s)
- {
- Write_char( 1, *s );
- s++;
- Delaynms(1);
- }
- }
- //LCD_12864顯示數字函數,
- void LCD_Write_number(uchar s)//數字顯示函數
- {
- Write_char(1,num[s]);
- Delaynms(1);
- }
- /////////////////////////////////////////////////LCD12864串行顯示相關驅動///////////////////////////
- ////////////////////////////////////////////////DS1302驅動代碼/////////////////////////////////////
- //DS1302地址定義,必需要有的程序
- #define ds1302_sec_add 0x80 //秒數據地址
- #define ds1302_min_add 0x82 //分數據地址
- #define ds1302_hr_add 0x84 //時數據地址
- #define ds1302_date_add 0x86 //日數據地址
- #define ds1302_month_add 0x88 //月數據地址
- #define ds1302_day_add 0x8a //星期數據地址
- #define ds1302_year_add 0x8c //年數據地址
- #define ds1302_control_add 0x8e //控制數據地址
- #define ds1302_charger_add 0x90
- #define ds1302_clkburst_add 0xbe
- //DS1302初始化函數,使用時第一步用此函數初始化
- void ds1302_init()
- {
- RST=0; //RST腳置低
- SCK=0; //SCK腳置低
- }
- //向DS1302寫入一字節數據,addr為地址,d為要寫入的數據
- void ds1302_write_byte(uchar addr, uchar d)
- {
- uchar i;
- RST=1; //啟動DS1302總線
- //寫入目標地址:addr
- addr = addr & 0xFE; //最低位 置零,寄存器 0位為0時寫,為1時讀
- for (i = 0; i < 8; i ++)
- {
- if (addr & 0x01) //為0
- {
- IO=1; //輸入
- }
- else
- {
- IO=0;
- }
- SCK=1; //產生時鐘
- SCK=0;
- addr = addr >> 1; //右移1位
- }
- //寫入數據:d
- for (i = 0; i < 8; i ++) {
- if (d & 0x01) //為0
- {
- IO=1; //輸入
- }
- else
- {
- IO=0;
- }
- SCK=1; //產生時鐘
- SCK=0;
- d = d >> 1; //右移1位
- }
- RST=0; //停止DS1302總線
- }
- //從DS1302讀出一字節數據,addr為地址
- uchar ds1302_read_byte(uchar addr)
- {
- uchar i,temp;
- RST=1; //啟動DS1302總線
- //寫入目標地址:addr
- addr = addr | 0x01; //最低位 置高,寄存器0位為0時寫,為1時讀
- for (i = 0; i < 8; i ++) {
- if (addr & 0x01)
- {
- IO=1;
- }
- else
- {
- IO=0;
- }
- SCK=1; //產生時鐘
- SCK=0;
- addr = addr >> 1; //右移1位
- }
- //輸出數據:temp
- for (i = 0; i < 8; i ++)
- {
- temp = temp >> 1; //右移1位
- if (IO)
- {
- temp |= 0x80; //temp=temp|0x80
- }
- else {
- temp &= 0x7F; //temp=temp&0x80
- }
- SCK=1; //產生時鐘
- SCK=0;
- }
- RST=0; //停止DS1302總線
- return temp;
- }
- //向DS1302寫入時鐘數據
- void ds1302_write_time()
- {
- ds1302_write_byte(ds1302_control_add,0x00); //關閉寫保護
- ds1302_write_byte(ds1302_sec_add,0x80); //暫停時鐘
- ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
- ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
- ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
- ds1302_write_byte(ds1302_hr_add,time_buf[4]); //時
- ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
- ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
- ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
- ds1302_write_byte(ds1302_control_add,0x80); //打開寫保護
- }
- //從DS1302讀出時鐘數據
- void ds1302_read_time()
- {
- time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
- time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
- time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
- time_buf[4]=ds1302_read_byte(ds1302_hr_add); //時
- time_buf[5]=(ds1302_read_byte(ds1302_min_add))&0x7f;//分
- time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
- time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
- }
- //////設置數據位置////////
- //用于將DS1302讀回的數據,進行折分,折分后放入全局變量數組dis_time_buf[]中,以便顯示調用
- void time_read_address (uchar *TUMP)
- {
- uchar i,a;
- ds1302_read_time();//讀回的數據放在全局變量 dis_time_buf[]數組中
- for(a=0,i=0;i<14;i=i+2,a++)/////做循環,讓數據不斷追加在數組里
- {
- dis_time_buf[i]=(time_buf[a]>>4); //取高四位
- dis_time_buf[i+1]=(time_buf[a]&0x0f); //取低四位
- }
- if(i==14)
- {
- dis_time_buf[i]=(time_buf[7]&0x07); ///星期單字節
- }
- ////////顯示位置////////////
- LCD_set_xy(1,0);
- LCD_Write_number(TUMP[0]);
- LCD_Write_number(TUMP[1]);
- LCD_set_xy(1,1);
- LCD_Write_number(TUMP[2]);
- LCD_Write_number(TUMP[3]);
- LCD_set_xy(1,3);
- LCD_Write_number(TUMP[4]);
- LCD_Write_number(TUMP[5]);
- LCD_set_xy(1,5);
- LCD_Write_number(TUMP[6]);
- LCD_Write_number(TUMP[7]);
- LCD_set_xy(3,0);
- LCD_Write_number(TUMP[8]);
- LCD_Write_number(TUMP[9]);
- LCD_set_xy(3,2);
- LCD_Write_number(TUMP[10]);
- LCD_Write_number(TUMP[11]);
- LCD_set_xy(3,4);
- LCD_Write_number(TUMP[12]);
- LCD_Write_number(TUMP[13]);
- LCD_set_xy(2,2);
- LCD_Write_number(TUMP[14]);
- }
- ////時間顯示位置//////
- void xianshi()
- {
- LCD_Write_string(1,0," 年 月 日");
- LCD_Write_string(2,0,"星期");
- LCD_Write_string(3,0," 時 分 秒");
- }
- ////主程序///////
- void main()
- {
- Lcd_init(); //第一步LCD12864初始化
- Clr_Scr(); //清屏
- Delaynms(200);//延時為了穩定
- ds1302_init(); //DS1302初始化
- Delaynms(1000);//為了穩定必需加延時///
- ds1302_write_time(); //向DS1302寫入初始年月時間值
- xianshi();
- while(1)
- {
- time_read_address(dis_time_buf);
- if(k1==0)
- {time_read_address(dis_time_buf);}
- Delaynms(600);
- }
- }
復制代碼
|
-
-
T0_arm.pdf
2025-5-4 15:20 上傳
點擊文件名下載附件
155.1 KB, 下載次數: 0
|