?? 全功能時鐘.c
字號:
//按AN3,依次進入鬧鐘功能是否啟用,鬧鐘時,分秒,年,月,日及時間時,分,秒的設置,直到退出設置狀態
//按AN4,調整是否起用鬧鐘和調節鬧鐘時,分,秒,年,月,日,時間的時,分,秒的數字
//LCD第二排中間顯示小喇叭,表示啟用鬧鐘功能,無則禁止鬧鐘功能(可在調整狀態進行設置)
//正常狀態,LCD上排最前面顯示自定義字符,LCD下排最前面閃動"RICHMCU"
//設置狀態,LCD上排最前面顯示"P",下排最前面在設置鬧鐘時間時顯示"alarm:",其它狀態顯示"time"
//年代變化2000--2099,星期自動轉換
//程序中有自定義字符寫入
#include <reg51.h>
#include <intrins.h>
unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"};
unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5}; //星期月參變數
unsigned char data dis_buf1[16]; //lcd上排顯示緩沖區
unsigned char data dis_buf2[16]; //lcd下排顯示緩沖區
unsigned char data year,month,date,week;//年、月、日、星期
unsigned char data armhour,armmin,armsec;//鬧鐘時、分、秒
unsigned char data hour,min,sec,sec100; //時、分、秒、百分之一秒
unsigned char data flag,vkey,skey;//設置狀態計數標志、按鍵先前值、按鍵當前值
bit alarm; //標識是否啟用鬧鐘,1--啟用,0--關閉
sbit rs = P3^0; //LCD數據/命令選擇端(H/L)
sbit rw = P3^1; //LCD讀/寫選擇端(H/L)
sbit ep = P2^2; //LCD使能控制
sbit PRE = P1^1; //調整鍵(AN3)
sbit SET = P1^2; //調整鍵(AN4)
sbit SPK = P2^1;
void delayms(unsigned char ms); //延時程序
bit lcd_busy(); //測試LCD忙碌狀態程序
void lcd_wcmd(char cmd); //寫入指令到LCD程序
void lcd_wdat(char dat); //寫入數據到LCD程序
void lcd_pos(char pos); //LCD數據指針位置程序
void lcd_init(); //LCD初始化設定程序
void pro_timedate(); //時間日期處理程序
void pro_display(); //顯示處理程序
void pro_key(); //按鍵處理程序
void time_alarm(); //定時報警功能(鬧鐘)
unsigned char scan_key(); //按鍵掃描程序
unsigned char week_proc(); //星期自動計算與顯示函數
bit leap_year(); //判斷是否為閏年
void lcd_sef_chr(); //LCD自定義字符程序
void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s);
//更新顯示緩沖區函數
// 延時程序
void delay(unsigned char ms)
{ while(ms--)
{ unsigned char i;
for(i = 0; i< 250; i++)
{
_nop_(); //執行一條_nop_()指令為一個機器周期
_nop_();
_nop_();
_nop_();
}
}
}
//測試LCD忙碌狀態
bit lcd_busy()
{
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result =(bit)(P0&0x80); //LCD的D0--D7中,D7=1為忙碌,D7=0為空閑
ep = 0;
return result;
}
//寫入指令到LCD
void lcd_wcmd(char cmd)
{
while(lcd_busy()); //當lcd_busy為1時,再次檢測LCD忙碌狀態,lcd-busy為0時,開始寫指令
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
//寫入數據到LCD
void lcd_wdat(char dat)
{
while(lcd_busy()); //當lcd_busy為1時,再次檢測LCD忙碌狀態,lcd-busy為0時,開始寫數據
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
//LCD數據指針位置程序
void lcd_pos(char pos)
{
lcd_wcmd(pos|0x80); //數據指針=80+地址碼(00H~27H,40H~67H)
}
//設定二個自定義字符,(注意:LCD1602中自定義字符的地址為0x00--0x07,即可定義8個字符)
//這里我們設定把一個自定義字符放在0x00位置(000),另一個放在0x01位子(001)
void lcd_sef_chr()
{ //第一個自定義字符
lcd_wcmd(0x40); //"01 000 000" 第1行地址 (D7D6為地址設定命令形式
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -