亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
單片機12864時鐘制作資料下載 代碼注釋詳細
[打印本頁]
作者:
liuzhen18
時間:
2017-5-28 00:57
標題:
單片機12864時鐘制作資料下載 代碼注釋詳細
12864時鐘資料包(附件中可下載完整版的代碼 而且注釋非常詳細):
0.png
(40.61 KB, 下載次數: 40)
下載附件
2017-5-28 17:26 上傳
單片機源程序如下:
#include "Initial.h"
#include "ds1302.h"
#include "12864.h"
#include "IC.h"
#include "HongWai.h"
#include "Alarm.h"
/**********************************************************
函數名: Initial()
函數功能: 用于單片機開機后的第一次初始化
入口參數:無
出口參數:無
**********************************************************/
void Initial()
{
Initial_12864(); //12864的初始化
Write_12864_DS1302_Constant(); //寫12864的固定部分
g_Alarm_min = Read_Add_24c02(1); //首次從24C02中讀取數據 鬧鐘的時分
g_Alarm_hour = Read_Add_24c02(2);
Initial_IIC(); //24c02的初始化
Initial_HW_Time(); //初始化紅外的定時器
g_Alarm_Flag1 = 0;
g_Alarm_Flag2 = 0;
g_HongWai_Work_Flag = 0;
g_Uart_Work_Flag = 0;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
紅外遙控部分:
/***************************************************************
文件說明:本文件主要處理紅外因定時器與串口有重合
的部分,故定時器0中采用判斷與標志位處理
在調用本模塊時只需修改 Ir_work(void)
并在主函數中調用 IRR_Work()以便讓整個C文件工作
**************************************************************/
#include "HongWai.h"
#include "Control.h"
#include "ds1302.h"
#include "12864.h"
#include "Initial.h"
#include "Uart.h"
#include "Alarm.h"
bit g_HongWai_Work_Flag; //紅外是否工作標志位的標志位
uchar T0_Count; //T0的計數變量主要用于在串口工作時統計5s的時間
/**********************************************
以下是紅外的變量
***********************************************/
uchar irtime;
bit irpro_ok,irok;
uchar IRcord[4];
uchar irdata[33];
/*********************************************
函數名: Initial_HW_Time()
函數功能: 初始化紅外的定時器
入口參數: 無
出口參數: 無
備 注:
*********************************************/
void Initial_HW_Time()
{
/* 因與顯示的頻率有一定的沖突故將備份如下
TMOD = 0x12; //定時器0工作方式2,TH0是重裝值,TL0是初值
TH0 = 0x00; //重載值
TL0 = 0x00; //初始化值
ET0 = 1; //開中斷
TR0 = 1; //開定時器0
IT0 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
EX0 = 1; //使能外部中斷
TH1 = 0x3c; //50ms 12MHZ晶振
TL1 = 0xB0;
ET1 = 1; //使能T1
TR1 = 1;
EA = 1; //開總中斷
***************************************/
TMOD = 0x02; //定時器0工作方式2,TH0是重裝值,TL0是初值
TH0 = 0x00; //重載值
TL0 = 0x00; //初始化值
ET0 = 1; //開中斷
TR0 = 1; //開定時器0
IT0 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
EX0 = 1; //使能外部中斷
EA = 1; //開總中斷
}
/*********************************************
函數名: T0_Time(void) interrupt 1
函數功能: 定時器0中斷處理
入口參數; 無
出口參數: 無
備 注: 因定時器處理與串口重疊
本函數利用標志位g_Uart_Work_Flag
把兩者分開
*********************************************/
void T0_Time (void) interrupt 1 using 1
{
static Count_5S = 0;
if(g_Uart_Work_Flag == 0) //如果沒有串口工作則計紅外的時間
{
irtime++; //用于計數2個下降沿之間的時間
}
else //否則統計5s的時間
{
TH0 = 0x3c; //定時50ms 12M晶振
TL0 = 0xB0;
T0_Count ++;
if(T0_Count >= 20)
{
T0_Count = 0;
g_Run_Time_Uart_Flag = 1;
Count_5S ++;
if(Count_5S >= 5)
{
Count_5S = 0;
g_Send_Uart_Flag = 1;
}
}
}
}
/*******************************************
函數名: EX0_Ser(void) interrupt 0
函數功能: 外部中斷0服務函數
入口參數: 無
出口參數: 無
********************************************/
void EX0_Ser(void) interrupt 0
{
static unsigned char i; //接收紅外信號處理
static bit startflag; //是否開始處理標志位
if(startflag)
{
if(irtime < 65 &&irtime >= 33 )//引導碼 TC9012的頭碼,9ms+4.5ms
{
i = 0;
}
irdata[i] = irtime;//存儲每個電平的持續時間,用于以后判斷是0還是1
irtime = 0;
i++;
if(i == 33)
{
irok = 1;
i = 0;
}
}
else
{
irtime = 0;
startflag = 1;
}
}
/****************************************************
函數名: Ir_work(void)
函數功能: 兼鍵值處理函數
入口參數: 無
出口參數: 無
備 注: 本函數主要用于處理按下遙控后的處理
處理操作標志位,是本文件中很核心的一個函數
*****************************************************/
void Ir_work(void)
{
switch(IRcord[2]) //判斷第三個數碼值
{
case 0x0c: //1 功能位置增加 顯示相應的按鍵值
{
g_HongWai_Work_Flag = !g_HongWai_Work_Flag;//對紅外的標志位進行取反
g_Alarm_Flag1 = 0; //對鬧鐘的兩個標志位清零,讓程序穩定
g_Alarm_Flag2 = 0;
g_Turn_Poem_Flag = 0;
Initial_12864(); //12864的初始化
if(g_HongWai_Work_Flag == 0)
{
Write_12864_DS1302_Constant(); //寫12864的固定部分
}
}
/**********************************************************
case 0x18: DataPort = table[1]; break;//2
case 0x5e: DataPort = table[2]; break;//3
case 0x08: DataPort = table[3]; break;//4
case 0x1c: DataPort = table[4]; break;//5
case 0x5a: DataPort = table[5]; break;//6
case 0x42: DataPort = table[6]; break;//7
case 0x52: DataPort = table[7]; break;//8
case 0x4a: DataPort = table[8]; break;//9
case 0x0d: DataPort = table[9]; break;//200++
case 0x09: DataPort = table[0]; break;//EQ 顯示相應的按鍵值
case 0x45: DataPort = 0x00; break;//CH-
case 0x46: DataPort = 0xff; break;//CH
case 0x47: DataPort = 0x00; break;//CH+
case 0x44: DataPort = 0xff; break;//后退
case 0x40: DataPort = 0x00; break;//前進
case 0x43: DataPort = 0x02; break;//暫停
case 0x07: DataPort = 0x00; break;//-
case 0x15: DataPort = 0xff; break;//+
case 0x16: DataPort = 0xff; break;//0
case 0x19: DataPort = 0xf0; break;//100+
default: break;
**************************************************************/
}
irpro_ok = 0; //處理完成標志
}
/***************************************************
函數名: Ircordpro(void)
函數功能: 紅外碼值處理函數 紅外碼值處理
入口參數: 無
出口參數: 無
備 注 :
****************************************************/
void Ircordpro(void)
{
uchar i, j, k;
uchar cord,value;
k = 1;
for(i = 0;i < 4;i++) //處理4個字節
{
for(j = 1;j <= 8;j++) //處理1個字節8位
{
cord = irdata[k];
if(cord>7)//大于某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
{
value |= 0x80;
}
if(j<8)
{
value >>= 1;
}
k++;
}
IRcord[i] = value;
value = 0;
}
irpro_ok = 1; //處理完畢標志位置1
}
/******************************************************
函數名: IRR_Work(void)
函數功能: 調用整個c文件 以便讓整個文件函數工作
入口參數: 無
出口參數: 無
備 注:
******************************************************/
void IRR_Work()
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
串口:
/***********************************************************
本文件主要用來寫串口通信
注:統計5s時間的函數寫在紅外里面了
若調用本文件的定時器 定期寫在最后 在工程中我把
定時器屏蔽掉
***********************************************************/
#include "Uart.h"
#include "ds1302.h"
#include "HongWai.h"
#include "12864.h"
#include "Alarm.h"
bit g_Recieve_Flag;
bit g_Run_Time_Uart_Flag; //串口調試的時候時間走動的時候標志位
bit g_Send_Uart_Flag; //串口發送給電腦的標志位
uchar Recieve_Time_Data; //接受的時間數據
uchar g_Num_Uart; //統計串口接收的次數
/*********************************************************
函數名: Initial_Uart()
函數功能:初始化串口
入口參數:無
出口參數:無
備 注: 12M晶振 600bps
*********************************************************/
void Initial_Uart() //初始化串口
{
TMOD = 0x21; //串行口通信時要把定時器打開,設置定時器工作方式
TH0 = (65536 - 45872) / 256;//裝初值
TL0 = (65536 - 45872) % 256;
TH1 = 0xcc; //自動重裝波特率為600bps 12M晶振
TL1 = 0x98;
TR1 = 1; //打開定時器1
ET0 = 1; //
SM0 = 0; //設置串行口工作方式1,要與TMOD相對應
SM1 = 1;
EA = 1; //打開總中斷
ES = 1; //打開串行口中斷
REN = 1; //允許串行口接受,當TMOD = 0x21時要在設置好SM0,SM1后再寫
}
/****************************************************************
函數名稱: Ser_Uart()
函數功能: 主要用于串口的中斷服務
入口參數: 無
出口參數: 無
備 注: 進入計算機通信中斷后設定標志位
*****************************************************************/
void Ser_Uart() interrupt 4
{
RI = 0;
Recieve_Time_Data = SBUF; //把接收的數據給時間標志位
if(Recieve_Time_Data == 'r')
{
g_Num_Uart = 0;
}
else
{
Recieve_Time_Data = Recieve_Time_Data - '0';
g_Num_Uart ++;
}
g_Recieve_Flag = 1; //串口服務的標志主要用于接收
}
/***********************************************************
函數名稱: Uart_Process()
函數功能: 串口處理
入口參數: 無
出口參數: 無
備 注: 本函數主要通過處理g_Recieve_Flag g_Send_Uart_Flag
g_Run_Time_Uart_Flag來達到執行相應函數的目的
***********************************************************/
void Uart_Process()
{
if(g_Recieve_Flag == 1) //如果出現標志位置1 則進行接收的處理
{
g_Recieve_Flag = 0;
ES = 0;
TI = 1;
switch(g_Num_Uart) //通過判斷串口發送的次數來進行相應的處理
{
case 1: break;
case 2: break;
case 3: g_year = Recieve_Time_Data * 10; break;
case 4: g_year = Recieve_Time_Data + g_year; break;
case 5: g_month = Recieve_Time_Data * 10; break;
case 6: g_month = Recieve_Time_Data + g_month; break;
case 7: g_date = Recieve_Time_Data * 10; break;
case 8: g_date = Recieve_Time_Data + g_date; break;
case 9: g_hour = Recieve_Time_Data * 10; break;
case 10: g_hour = Recieve_Time_Data + g_hour; break;
case 11: g_min = Recieve_Time_Data * 10; break;
case 12: g_min = Recieve_Time_Data + g_min; break;
case 13: g_sec = Recieve_Time_Data * 10; break;
case 14: //對數據進行最后一次處理并退出串口中斷服務
{
g_sec = Recieve_Time_Data + g_sec;
Write_sfm(6,g_sec); //把調節的數據寫在液晶屏上
Locate_pos(2,2); //顯示位置重新回到調節處
g_Num_Uart = 0;
g_Uart_Work_Flag = 0; //串口工作的標志位清零退出串口工作
g_Set_DS1302_Num = 0;
Write_1302_Date (); //把數據寫進DS1302
Write_12864_DS1302_Constant(); //把顯示DS1302時間的固定部分寫在液晶上
Initial_HW_Time (); //初始化紅外的定時器
break;
}
default: //為了讓程序穩定 對一些標志位繼續處理
{
g_Num_Uart = 0;
g_Uart_Work_Flag = 0; //串口工作的標志位清零退出串口工作
g_Set_DS1302_Num = 0;
Write_1302_Date (); //把數據寫進DS1302
Write_12864_DS1302_Constant(); //把顯示DS1302時間的固定部分寫在液晶上
Initial_HW_Time (); //初始化紅外的定時器
}
}
if(g_Num_Uart >= 15) //增加程序的穩定性
{
g_Num_Uart = 0;
}
while(!TI);
TI = 0;
ES = 1;
}
if(g_Send_Uart_Flag == 1) //進行發送給電腦數據的處理 發送后DS1302便會更改
{
g_Send_Uart_Flag = 0;
ES = 0;
TI = 1;
printf("\n\n\n 現在時間是\n");
printf("\n 20%c%c年%c%c月%c%c日 %c%c時%c%c分%c%c秒\n",
g_year / 10 + '0', g_year % 10 + '0',
g_month / 10 + '0', g_month % 10 + '0',
g_date / 10 + '0', g_date % 10 + '0',
g_hour / 10 + '0', g_hour % 10 + '0',
g_min / 10 + '0', g_min % 10 + '0',
g_sec / 10 + '0', g_sec % 10 + '0');
while(!TI);
TI = 0;
ES = 1;
}
if(g_Run_Time_Uart_Flag == 1) //到達一秒的時間對DS1302的時間進行讀取更新
{
g_Run_Time_Uart_Flag = 0;
Read_All_DS1302_Date(); //讀取DS1302的所有數據
Display_DS1302_Time(); //把讀取的數據顯示在液晶上
}
}
/*******************************************************
函數名: T0_Time (void) interrupt 1 using 1
函數功能: 定時器0的中斷處理
入口參數: 無
出口參數: 無
void T0_Time (void) interrupt 1 using 1
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
/*******************************************************
文件說明:本文件主要用來寫DS1302與鬧鈴相應
的按鍵按下之后對相應的數值進行處理的函數
********************************************************/
#include "Control.h"
#include "Delay.h"
#include "ds1302.h"
#include "12864.h"
#include "IC.h"
#include "Alarm.h"
/**************************************************
函數名: Di()
函數功能: 制造蜂鳴器的聲音
入口參數: 無
出口參數: 無
備 注:
*************************************************/
void Di()
{
uint i;
for(i = 1;i < 50; i ++)
{
beep = 0;
DelayUs2x(i * 10);
beep = 1;
DelayUs2x( ( 50 - i) * 5);
}
for(i = 1;i < 50; i++)
{
beep = 1;
DelayUs2x(i * 10);
beep = 0;
DelayUs2x( ( 50 - i) * 5);
}
}
/*************************************************
函數名: Locate_DS1302()
函數功能: 用于調整DS1302時間時 定位游標
與提示改變的項目
入口參數: 無
出口參數: 無
備 注:
*************************************************/
void Locate_DS1302()
{
Remind_DS1302_Exchange(g_Set_DS1302_Num); //提示DS1302改變的項目
switch(g_Set_DS1302_Num) //定位光標
{
case 1: Locate_pos(2,6); break; //第一次按下光標到秒位置
case 2: Locate_pos(2,4); break; //第二次按下光標到分鐘位置
case 3: Locate_pos(2,2); break; //第三次按下光標到小時位置
case 4: Locate_pos(2,1); break; //第四次按下光標到星期位置
case 5: Locate_pos(1,6); break; //第五次按下光標到日位置
case 6: Locate_pos(1,4); break; //第六次按下光標到月位置
case 7: Locate_pos(1,2); break; //第七次按下光標到年位置
default: //返回界面并對標志位進行處理
{
g_Set_DS1302_Num = 0;
Initial_12864();
Initial_12864(); //初始化12864
Write_12864_DS1302_Constant(); //寫12864固定的部分
Write_1302_Date(); //寫入 存儲數據
g_Alarm_Flag1 = 0;
g_Alarm_Flag2 = 0;
}
}
if(g_Set_DS1302_Num >= 8) //增加程序的穩定性
{
g_Set_DS1302_Num = 0;
}
}
/************************************************
函數名: Increase_DS1302()
函數功能: 用于處理調整DS1302的數值之時
對調整的項目進行數值增加
入口參數:無
出口參數:無
備 注:
************************************************/
void Increase_DS1302()
{
Remind_DS1302_Exchange(g_Set_DS1302_Num); //提示改變的項目
switch(g_Set_DS1302_Num)
{
case 1: //增大調整秒
{
g_sec ++;
if(g_sec >= 60) //到達一分鐘的時間
{
g_sec = 0;
}
Write_sfm(6,g_sec); //把調節的數據寫在液晶屏上
Locate_pos(2,6); //顯示位置重新回到調節處
break;
}
case 2: //增大調整分鐘
{
g_min ++;
if(g_min >= 60) //到達一小時的時間
{
g_min = 0;
}
Write_sfm(4,g_min); //把調節的數據寫在液晶屏上
Locate_pos(2,4); //顯示位置重新回到調節處
break;
}
case 3: //增大調整小時
{
g_hour ++;
if(g_hour >= 24)
{
g_hour = 0;
}
Write_sfm(2,g_hour); //把調節的數據寫在液晶屏上
Locate_pos(2,2); //顯示位置重新回到調節處
break;
}
case 4: //增大調整星期
{
g_week ++;
if(g_week >= 8)
{
g_week = 1;
}
Write_week(g_week); //把調節的數據寫在液晶屏上
Locate_pos(2,1); //顯示位置重新回到調節處
break;
}
case 5: //增大調整日期
{
g_date ++;
if(g_date >= 31)
{
g_date = 1;
g_month ++;
if(g_month >= 13)//到達一年的時間
{
g_month = 1;
g_year++;
if(g_year >= 20)
{
g_year = 9;
}
}
}
Write_nyr(6,g_date); //把調節的數據寫在液晶屏上
Locate_pos(1,6); //顯示位置重新回到調節處
break;
}
case 6: //增大調整月份
{
g_month ++;
if(g_month >= 12)
{
g_month = 1;
g_year ++;
if(g_year >= 20)
{
g_year = 9;
}
}
Write_nyr(4,g_month); //把調節的數據寫在液晶屏上
Locate_pos(1,4); //顯示位置重新回到調節處
break;
}
case 7: //增大調整年
{
g_year ++;
if(g_year >= 20)
{
g_year = 9;
}
Write_nyr(2,g_year); //把調節的數據寫在液晶屏上
Locate_pos(1,2); //顯示位置重新回到調節處
break;
}
}
}
/***********************************************
函數名: Decrease_DS1302()
函數功能: 用于處理調整DS1302的數值之時
對調整的項目進行數值減小
入口參數:無
出口參數:無
備 注:
/***********************************************/
void Decrease_DS1302()
{
switch(g_Set_DS1302_Num)
{
case 1: //減小調整秒
{
g_sec --;
if(g_sec <= 0)
{
g_sec = 59;
}
Write_sfm(6,g_sec); //把調節的數據寫在液晶屏上
Locate_pos(2,6); //顯示位置重新回到調節處
break;
}
case 2: //減小調整分鐘
{
g_min --;
if(g_min <= 0)
{
g_min = 59;
}
Write_sfm(4,g_min); //把調節的數據寫在液晶屏上
Locate_pos(2,4); //顯示位置重新回到調節處
break;
}
case 3: //減小調整小時
{
g_hour --;
if(g_hour <= 0)
{
g_hour = 23;
}
Write_sfm(2,g_hour); //把調節的數據寫在液晶屏上
Locate_pos(2,2); //顯示位置重新回到調節處
break;
}
case 4: //減小調整星期
{
g_week --;
if(g_week <= 0)
{
g_week = 7;
}
Write_week(g_week); //把調節的數據寫在液晶屏上
Locate_pos(2,1); //顯示位置重新回到調節處
break;
}
case 5: //減小調整日期
{
g_date --;
if(g_date <= 0)
{
g_date = 31;
}
Write_nyr(6,g_date); //把調節的數據寫在液晶屏上
Locate_pos(1,6); //顯示位置重新回到調節處
break;
}
case 6: //減小調整月份
{
g_month --;
if(g_month <= 0)
{
g_month = 12;
g_year --;
if(g_year <= 8)
{
g_year = 20;
}
}
Write_nyr(4,g_month); //把調節的數據寫在液晶屏上
Locate_pos(1,4); //顯示位置重新回到調節處
break;
}
case 7: //減小調整年
{
g_year --;
if(g_year <= 8)
{
g_year = 20;
}
Write_nyr(2,g_year); //把調節的數據寫在液晶屏上
Locate_pos(1,2); //顯示位置重新回到調節處
break;
}
}
}
/************************************************
函數名: void Locate_A()
函數功能: 給變項目時對鬧鐘的調整項目進行提示
并定位改變的項目
入口參數:無
出口參數:無
備 注:
************************************************/
void Locate_A()
{
switch(g_Set_Alarm_Num)
{
case 1: Write_Remind_Alarm_Time(1); break; //設置分鐘
case 2: Write_Remind_Alarm_Time(2); break; //定位小時
}
}
/************************************************
函數名: void A_Increase()
函數功能: 在調整鬧鈴的數值時對相應的時分
進行增加
入口參數: 無
出口參數: 無
備 注:
************************************************/
void A_Increase()
{
switch(g_Set_Alarm_Num)
{
case 1: //增加鬧鐘分鐘的時間
{
g_Alarm_min ++;
if(g_Alarm_min >= 60)
{
g_Alarm_min = 0;
}
Write_Remind_Alarm_Time (1); //讀取設置后的鬧鈴時間
Write_Add_24c02 (1,g_Alarm_min); //24C02存數據
break;
}
case 2: //增加鬧鐘小時的時間
{
g_Alarm_hour ++;
if(g_Alarm_hour >= 24)
{
g_Alarm_hour = 0;
}
Write_Remind_Alarm_Time (2); //讀取設置后的鬧鈴時間
Write_Add_24c02 (2,g_Alarm_hour); //24C02存數據
break;
}
}
}
/************************************************
函數名: A_Decrease()
函數功能: 調整鬧鈴時對鬧鈴的小時與分鐘進行
減小
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載(完整源碼打包):
我的超級時鐘.zip
(163.52 KB, 下載次數: 97)
2017-5-28 00:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
dragon19790000
時間:
2017-5-28 22:03
不錯,值得學習!!!
作者:
wjwjwjwj
時間:
2017-6-16 08:13
好東西值得收藏
作者:
875427704
時間:
2019-1-6 10:00
12864是帶字庫的嗎
作者:
原來如鳥
時間:
2019-1-6 15:43
這就是我一直想要找的,好東西啊
作者:
leezll
時間:
2019-10-11 06:15
不錯,值得學習!!!
作者:
leezll
時間:
2019-10-11 06:32
沒有電路圖啊!!!
作者:
94情節
時間:
2019-10-11 14:09
代碼很棒,值得學習,謝謝
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1