亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
LCD12864和PCF8563 IIC總線(萬年歷)顯示時間的單片機源碼
[打印本頁]
作者:
biaji
時間:
2018-6-3 13:58
標題:
LCD12864和PCF8563 IIC總線(萬年歷)顯示時間的單片機源碼
剛學51單片機IIC以及萬年歷的源碼
下面直接放東西,就是個簡單的萬年歷,請各位大神指教
0.png
(47.63 KB, 下載次數: 72)
下載附件
2018-6-4 02:48 上傳
單片機源程序如下:
/*
LCD12864和PCF8563顯示時間 !!!
徐逸夫
2016-5-16 ~ 5-18
*/
/* 如果要在程序中使用此代碼,請在程序中注明使用了STC的資料及程序 */
#include <STC15.H>
#include <stdio.h>
#include "GPIO.h"
#include "12864.h"
#include "LCD_draw.h"
#include "IIC.h"
#include "Infrared.h"
sbit HC595_SER = P4^0; //pin 14 SER data input
sbit HC595_LCLK = P5^4; //pin 12 RCLk store (latch) clock
sbit HC595_SCLK = P4^3; //pin 11 SRCLK Shift data clock
/************* 紅外接收程序變量聲明 **************/
//sbit P_IR_RX = P3^6; //定義紅外接收輸入IO口
u8 IR_SampleCnt; //采樣計數
u8 IR_BitCnt; //編碼位數
u8 IR_UserH; //用戶碼(地址)高字節
u8 IR_UserL; //用戶碼(地址)低字節
u8 IR_data; //數據原碼
u8 IR_DataShit; //數據移位
bit P_IR_RX_temp; //Last sample
bit B_IR_Sync; //已收到同步標志
bit B_IR_Press; //安鍵動作發生
u8 IR_code; //紅外鍵碼
u16 UserCode; //用戶碼
/*****************************************************/
u8 week0[] = {"一"},week1[] = {"二"},week2[] = {"三"};
u8 week3[] = {"四"},week4[] = {"五"},week5[] = {"六"},week6[] = {"天"}; //星期幾的字符集
u8 code num2char[] = {"0123456789"}; //數字轉化為ASCII字符
u8 Time_num[] = {"00-00-00"}; //時分秒的數字形式
u8 YMD_num[] = {"00-00-00"}; //year,month,day的數字形式
u16 msecond; //毫秒計數
bit B_1ms; //1ms標志位
struct POINT_CLOCK //結構體 RTC變量時分秒
{
u8 hour;
u8 minute;
u8 second;
}RTC_Time,RTC_Time_Now;
struct NUM_CLOCK //結構體 RTC變量year,month,day的擴充
{
u8 year;
u8 month;
u8 week;
u8 day;
}More_Time;
void DisableHC595(void); //關閉595顯示
void ReadRTC(); //讀取PCF8563的時間
void WriteRTC(); //更改PCF8563的時間
void init_ClockCirle(); //初始化表盤和刻度
void Display_Pointer(struct POINT_CLOCK AA); //指針顯示
void Display_ThreePointer(); //指針式時鐘顯示
void Display_Number(struct POINT_CLOCK AA,struct NUM_CLOCK BB); //右側LCD數字顯示
void DisableHC595(void) //關閉595顯示
{
u8 i;
HC595_SER = 1;
for(i=0; i<20; i++)
{
HC595_SCLK = 1;
HC595_SCLK = 0;
}
HC595_LCLK = 1;
HC595_LCLK = 0; //鎖存輸出數據
HC595_LCLK = 1;
HC595_LCLK = 0; //鎖存輸出數據
}
/********************** 讀RTC函數 ************************/
void ReadRTC(void)
{
u8 tmp[7];
ReadNbyte(2, tmp, 7);
RTC_Time_Now.second = ((tmp[0] >> 4) & 0x07) * 10 + (tmp[0] & 0x0f);
RTC_Time_Now.minute = ((tmp[1] >> 4) & 0x07) * 10 + (tmp[1] & 0x0f);
RTC_Time_Now.hour = ((tmp[2] >> 4) & 0x03) * 10 + (tmp[2] & 0x0f);
More_Time.day = ((tmp[3] >> 4) & 0x03) * 10 + (tmp[3] & 0x0f);
More_Time.week = ((tmp[4] >> 4) & 0x00) * 10 + (tmp[4] & 0x07);
More_Time.month = ((tmp[5] >> 4) & 0x01) * 10 + (tmp[5] & 0x0f);
More_Time.year = ((tmp[6] >> 4) & 0x0f) * 10 + (tmp[6] & 0x0f);
}
/********************** 寫RTC函數 ************************/
void WriteRTC()
{
u8 tmp[7];
tmp[0] = ((RTC_Time_Now.second / 10) << 4) + (RTC_Time_Now.second % 10);
tmp[1] = ((RTC_Time_Now.minute / 10) << 4) + (RTC_Time_Now.minute % 10);
tmp[2] = ((RTC_Time_Now.hour / 10) << 4) + (RTC_Time_Now.hour % 10);
tmp[3] = ((More_Time.day / 10) << 4) + (More_Time.day % 10);
tmp[4] = ((More_Time.week / 10) << 4) + (More_Time.week % 10);
tmp[5] = ((More_Time.month / 10) << 4) + (More_Time.month % 10);
tmp[6] = ((More_Time.year / 10) << 4) + (More_Time.year % 10);
WriteNbyte(2, tmp, 7);
}
void init_ClockCirle() //初始化表盤
{
u8 i;
draw_Circle(32,32,31,0);//畫圓 圓心坐標(32,32) 半徑31,空心圓
for(i=0;i<60;i++)
{
if((i%5)==0) //畫刻度
{
draw_Line(RTC_X(32,28,i),RTC_Y(32,28,i),RTC_X(32,30,i),RTC_Y(32,30,i));
}
}
}
/*========================================================================
*name:Display_Pointer(struct POINT_CLOCK AA)
*function:顯示時、分、秒指針
*參 數:結構體: 時分秒
*注: 秒針長24 分針長17 秒針長12
=========================================================================*/
void Display_Pointer(struct POINT_CLOCK AA) //指針顯示 ,作為Display_ThreePointer()的子函數
{
draw_Line(RTC_X(32,24,AA.second),RTC_Y(32,24,AA.second),32,32); //秒針
draw_Line(RTC_X(32,17,AA.minute),RTC_Y(32,17,AA.minute),32,32); //分針
draw_Line(RTC_X(32,12,AA.minute/12+5*(AA.hour%12)),RTC_Y(32,12,AA.minute/12+5*(AA.hour%12)),32,32); //時針
}
/*========================================================================
*name:Display_ThreePointer(struct POINT_CLOCK AA,unsigned char color)
*function:顯示時、分、秒指針
*參 數: 結構體0:存放上一個時分秒 兩者不同時,刷新顯示
結構體1:存放這一個時分秒
=========================================================================*/
void Display_ThreePointer() //左側LCD指針式時鐘顯示
{
if(RTC_Time.second!=RTC_Time_Now.second) //秒刷新
{
dele_Line(RTC_X(32,24,RTC_Time.second),RTC_Y(32,24,RTC_Time.second),32,32);
}
if(RTC_Time.minute!=RTC_Time_Now.minute) //分刷新
{
dele_Line(RTC_X(32,17,RTC_Time.minute),RTC_Y(32,17,RTC_Time.minute),32,32);
}
if((RTC_Time.minute/12+5*(RTC_Time.hour%12))!=(RTC_Time_Now.minute/12+5*(RTC_Time_Now.hour%12))) //時刷新顯示
{
dele_Line(RTC_X(32,12,RTC_Time.minute/12+5*(RTC_Time.hour%12)),RTC_Y(32,12,RTC_Time.minute/12+5*(RTC_Time.hour%12)),32,32);
}
Display_Pointer(RTC_Time_Now); //現在的指針式時鐘顯示
RTC_Time=RTC_Time_Now;
}
void Display_Number(struct POINT_CLOCK AA,struct NUM_CLOCK BB) //右側LCD數字顯示
{
lcdwritecmd(0x30); //普通文本模式
ReadRTC();
Time_num[0]=num2char[AA.hour/10],Time_num[1]=num2char[AA.hour%10];
Time_num[3]=num2char[AA.minute/10],Time_num[4]=num2char[AA.minute%10];
Time_num[6]=num2char[AA.second/10],Time_num[7]=num2char[AA.second%10];
lcdshowstr(4,2,Time_num); //時分秒的數字顯示
YMD_num[0]=num2char[BB.year/10],YMD_num[1]=num2char[BB.year%10];
YMD_num[3]=num2char[BB.month/10],YMD_num[4]=num2char[BB.month%10];
YMD_num[6]=num2char[BB.day/10],YMD_num[7]=num2char[BB.day%10];
lcdshowstr(4,1,YMD_num); //年月日的數字顯示
lcdshowstr(4,3,"星期"); //星期幾的顯示
switch (BB.week)
{
case 0:lcdshowstr(6,3,week0);break; case 1:lcdshowstr(6,3,week1);break; case 2:lcdshowstr(6,3,week2);break;
case 3:lcdshowstr(6,3,week3);break; case 4:lcdshowstr(6,3,week4);break; case 5:lcdshowstr(6,3,week5);break;
case 6:lcdshowstr(6,3,week6);break; default:lcdshowstr(6,3,"幾");break;
}
}
void AutoTime() //時間自動調整,分針時針的加減調整和進位
{
if (IR_code == 7||IR_code == 21||IR_code == 64||IR_code == 68)
{
if(IR_code == 7)
{
if(RTC_Time_Now.minute == 0)
{
RTC_Time_Now.minute = 59;
if(RTC_Time_Now.hour == 0)
{
RTC_Time_Now.hour = 23;
}else RTC_Time_Now.hour--;
}else RTC_Time_Now.minute--;
WriteRTC();IR_code=0;
}
if(IR_code == 21)
{
if(++RTC_Time_Now.minute >= 60)
{
RTC_Time_Now.minute = 0;
if(++RTC_Time_Now.hour >= 24) RTC_Time_Now.hour = 0;
}
WriteRTC();IR_code=0;
}
if(IR_code == 64)
{
if(++RTC_Time_Now.hour >= 24)
{
RTC_Time_Now.hour = 0;
}
WriteRTC();IR_code=0;
}
if(IR_code == 68)
{
if(RTC_Time_Now.hour == 0)
{
RTC_Time_Now.hour = 23;
}else RTC_Time_Now.hour--;
WriteRTC();IR_code=0;
}
}
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TH0 = 0xFC;
TL0 = 0xF6;
ET0 = 1; //Timer0 interrupt enable
TR0 = 1; //定時器0開始計時
}
void Interrupt_Timer0() interrupt 1
{
B_1ms = 1; //1ms掃描顯示一位
IR_RX_NEC(); //掃描紅外遙控
}
void main()
{
bit error;
GPIO();
DisableHC595(); //禁止掉學習板上的HC595顯示,省電
Timer0Init();EA=1;
lcdinit(); //初始化
lcd_cls(); //清屏
init_ClockCirle(); //畫出表盤
ReadRTC();
error = 1; //初始化默認更改時間
if(RTC_Time_Now.second >= 60) error = 1; //錯誤
if(RTC_Time_Now.minute >= 60) error = 1; //錯誤
if(RTC_Time_Now.hour >= 24) error = 1; //錯誤
if(error) //有錯誤, 默認12:00:00
{
RTC_Time_Now.second = 58;RTC_Time_Now.minute = 59;RTC_Time_Now.hour = 22; //更改為2016-5-18
More_Time.day = 18;More_Time.week = 2;More_Time.month = 5 ;More_Time.year = 16; // 22:59:58
WriteRTC(); //寫入時間到PCF8563
}
while(1)
{ //根據接收到的鍵值 對時間進行改變
AutoTime();
if(B_1ms) //1ms到
{
B_1ms = 0;
if(B_IR_Press) //檢測到收到紅外鍵碼
{
B_IR_Press = 0;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
IIC以及萬年歷.zip
(106.44 KB, 下載次數: 129)
2018-6-3 13:57 上傳
點擊文件名下載附件
簡單的萬年歷
下載積分: 黑幣 -5
作者:
zxy2266
時間:
2020-3-1 12:35
PCF8563就是595的程序吧,我一直在找這個
作者:
chinarenxx
時間:
2020-3-28 16:44
剛好有個8583的時鐘芯片,下載來試試看學習下。
作者:
maijinzhi
時間:
2020-3-28 22:18
剛好有個8583的時鐘芯片,學習下。
作者:
2541959167
時間:
2020-12-7 16:06
剛好用到,感謝大佬
作者:
小強快跑
時間:
2022-2-18 03:39
硬件i2c oled pcf 8563
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1