|
單片機源程序如下.單片機是89c51RC,屏幕是帶字庫12864,ds1302
51hei圖片_20220219184810.jpg (245.99 KB, 下載次數: 25)
下載附件
2022-2-19 18:50 上傳
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit PSB = P2 ^ 4;
- sbit SCLK = P2 ^ 5;
- sbit SID = P2 ^ 6;
- sbit clk=P1^0;
- sbit io=P1^1;
- sbit ce=P1^2;
- uchar add_write[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
- uchar add_read[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
- uchar tim0[]={20,1,4,13,9,10,26};//年、星期、月、日、時、分秒
- uchar tim_bcd[7];//保存讀出的時間日期
- uchar tim[14];//保存分解開的十位、個位
- //將8位二進制數逐位寫入
- void LCD_sendbyte(uchar dat);
- //寫入命令
- void LCD_write_com(uchar com);
- //寫入數據
- void LCD_write_dat(uchar dat);
- //LCD初始化
- void LCD_init();
- //LCD屏幕地址定位
- void LCD_Setaddress(uchar x, uchar y);
- //LCD顯示字符數組(文字)
- void LCD_Putstring( uchar x, uchar y, uchar *pData );
- void display_1302();
- void write_1302_8(uchar dat);
- void write_1302_byte(uchar add,uchar dat);
- uchar read_1302_byte(uchar add);
- void ds1302_initial();
- void read_1302time();
- void Delayms(uint n) //延時時間為 1ms * x 晶振是11.0592M
- {
- unsigned int i, j;
- for (i = n; i > 0; i--)
- for (j = 110; j > 0; j--);
- }
- //將8位二進制數逐位寫入
- void LCD_sendbyte(uchar dat) {
- unsigned char i;
- for (i = 0; i < 8; i++) {
- SCLK = 0;
- if (dat & 0x80)
- SID = 1;
- else
- SID = 0;
- SCLK = 1;
- dat = dat << 1; //左移一位
- }
- }
- //寫入命令
- void write_com(uchar com) {
- LCD_sendbyte(0xf8); //送入5個連續的“1“,啟動一個周期,11111,RW(0),RS(0),0
- LCD_sendbyte(0xf0 & com); //取高四位,數據分兩次傳送,每個字節的內容被送入兩個字節,高四位放在第一個字節的高四位
- LCD_sendbyte(0xf0 & (com << 4)); //低四位放在第二個字節的高四位
- Delayms(1); //串行不支持讀操作,不可檢測忙操作,這里用延時替代
- }
- //寫入數據
- void write_data(uchar dat) {
- LCD_sendbyte(0xfa);
- LCD_sendbyte(0xf0 & dat);
- LCD_sendbyte(0xf0 & (dat << 4));
- Delayms(1);
- }
- //LCD初始化
- void initial_12864() {
- write_com(0x30); //選擇基本指令集
- write_com(0x0c); //開顯示,無游標,不反白
- write_com(0x01); //清除顯示屏幕,把DDRAM位址計數器調整為00H
- Delayms(1); //清屏操作時間較長1.6ms 因此加此延時
- write_com(0x02); //清DDRAM位址歸位,此處貌似與清屏重復
- write_com(0x06); //設定光標右移,整體顯示不移動
- }
- //LCD屏幕地址定位
- void LCD_Setaddress(uchar x, uchar y) { //地址從第1行第1列開始不從0開始(y)
- unsigned char addr;
- switch (x) {
- case 1:
- addr = 0x80 + y - 1;
- break;
- case 2:
- addr = 0x90 + y - 1;
- break;
- case 3:
- addr = 0x88 + y - 1;
- break;
- case 4:
- addr = 0x98 + y - 1;
- break;
- default :
- break;
- }
- write_com(addr); //字符顯示開始地址
- }
- //LCD顯示字符數組(文字)
- void LCD_Putstring( uchar x, uchar y, uchar *pData ) {
- LCD_Setaddress(x, y);
- while (*pData) {
- write_data( *pData++ );
- }
- }
- /****************寫一個字節*************/
- /*************寫地址,寫數據(方式)**************/
- void write_1302_8(uchar dat)
- {
- uchar i,temp ;
- for(i=0; i<8; i++)
- {
- clk = 0;//時鐘信號為低時,數據才能改變,同時為出現上升沿做準備
- temp = dat&0x01;//取出最低位
- if(temp )
- io =1;//如果這一位為1,io拉高
- else
- io=0;//如果這一位為0,io拉低
- clk = 1;//出現上升沿,1302讀數據
- dat=dat>>1;//為送出下一位做準備
-
- }
- }
- /*****************寫操作******************/
- /*************寫地址,寫數據(目的)**************/
- void write_1302_byte(uchar add,uchar dat)
- {
- ce =0;//不進行操作時拉低
- clk = 0;//時鐘線開始前為低
- ce =1;//拉高啟動一次寫操作過程
- write_1302_8(add );//送地址字節
- write_1302_8(dat );//送數據字節
- ce =0;//一次寫操作的結束
- }
- /*****************讀操作*************/
- /*************寫地址,讀數據(sclk)**************/
- uchar read_1302_byte(uchar add)
- {
- uchar i,value;
- ce =0;
- clk =0;
- ce =1;//開始一次讀操作
- write_1302_8(add );//送地址字節
- for(i=0; i<8; i++)
- {
- clk =0;//讀數據時下降沿有效
- value =value >>1;//將上一次保存的數據移到次高位
- if(io)//若檢測為1
- value =value|0x80;//將1放到最高位
- clk =1;//接受完一位后將時鐘線拉高,為再次出現下降沿做準備
-
- }
- ce =0;//結束一次讀操作過程
- return value ;//將讀取的1字節數據傳遞出去
- }
- /***************初始化**************/
- /**********時間、日期的初始值設置**********/
- void ds1302_initial()
- {
- uchar i,temp;
- for(i=0; i<7; i++)//給寄存器賦初值之前,將日期、時間轉換為BCD碼
- {
- temp = tim0[i]/10;//取十位
- tim0[i]=temp*16+tim0[i]%10;//bcd 碼
- }
-
- write_1302_byte(0x8e,0x00);//給寄存器設置初始值之前,需要去掉寫保護
-
- for(i=0; i<7; i++)//每次循環給一個寄存器賦初值
- {
- write_1302_byte(add_write[i],tim0[i]);
- }
-
- write_1302_byte(0x8e,0x80);//給寄存器設置初始值后,需要加上寫保護
-
- }
- /***************讀取時間并進行轉換*************/
- void read_1302time()
- {
- uchar i;
- for(i=0; i<7; i++)//每次循環讀一個寄存器內容,保存到tim_bcd[]數組中
- {
- tim_bcd[i]=read_1302_byte(add_read[i]);
- }
-
- for(i=0; i<7; i++)//將讀出的日期、時間分解為十位和個位
- {
- tim[2*i]=tim_bcd[i]/16;
- tim[2*i+1]=tim_bcd[i]%16;
- }
- }
- void Int_232() //2323?ê??ˉ
- {
- TMOD=0x20;
- SCON=0x50;
- TH1=0xFD;
- TL1=0xFD;
- TR1=1;
- TI=0;
- }
- void TX(uchar TX_char)//′??ú·¢?íêy?Y
- {
- SBUF=TX_char;
- while(!TI);
- TI=0;
- }
- void TXT()//′??ú·¢?í??êy?Y
- {
- uchar i;
- for(i=0;i<13;i++)
- {
- TX(tim[i]);
-
- }
- }
- /***************顯示日期和時間**************/
- void display_1302()
- {
- //Int_232();
- LCD_Setaddress(1,1);
- write_data(0x30+tim[0]);//年
- write_data(0x30+tim[1]);
- write_data('-');
- write_data(0x30+tim[4]);//月
- write_data(0x30+tim[5]);
- write_data('-');
- write_data(0x30+tim[6]);//日
- write_data(0x30+tim[7]);
- write_data(' ');
- write_data(0x30+tim[2]);//周
- write_data(0x30+tim[3]);
-
- LCD_Setaddress(2,1);
- write_data(0x30+tim[8]);
- write_data(0x30+tim[9]);
- write_data(':');
- write_data(0x30+tim[10]);
- write_data(0x30+tim[11]);
- write_data(':');
- write_data(0x30+tim[12]);
- write_data(0x30+tim[13]);
- // TXT();
- }
- void main()
- {
- initial_12864();
- ds1302_initial();
- while(1)
- {
- read_1302time();
- display_1302();
- }
- }
復制代碼
|
-
-
ds1302.zip
2022-2-19 14:55 上傳
點擊文件名下載附件
6.28 KB, 下載次數: 6
|