?? lcd_clock.c
字號(hào):
//==============================================
//ME300系列單片機(jī)開發(fā)系統(tǒng)演示程序-日歷時(shí)鐘
//==============================================
//
//作者:chenming
//出處:偉納電子論壇 www.willar.com
//日歷時(shí)鐘
//按K1,進(jìn)入設(shè)置狀態(tài)
//按k2,停止鬧鐘聲音
//按k3,依次進(jìn)入鬧鐘功能是否啟用,鬧鐘時(shí),分秒,年,月,日及時(shí)間時(shí),分,秒的設(shè)置,直到退出設(shè)置狀態(tài)
//按k4,調(diào)整是否起用鬧鐘和調(diào)節(jié)鬧鐘時(shí),分,秒,年,月,日,時(shí)間的時(shí),分,秒的數(shù)字
//LCD第二排中間顯示小喇叭,表示啟用鬧鐘功能,無則禁止鬧鐘功能(可在調(diào)整狀態(tài)進(jìn)行設(shè)置)
//正常狀態(tài),LCD上排最前面顯示自定義字符,LCD下排最前面閃動(dòng)"willar"
//設(shè)置狀態(tài),LCD上排最前面顯示"P",下排最前面在設(shè)置鬧鐘時(shí)間時(shí)顯示"alarm:",其它狀態(tài)顯示"time"
//年代變化2000--2099,星期自動(dòng)轉(zhuǎn)換
//程序中有自定義字符寫入
#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}; //星期月參變數(shù)
unsigned char data dis_buf1[16]; //lcd上排顯示緩沖區(qū)
unsigned char data dis_buf2[16]; //lcd下排顯示緩沖區(qū)
unsigned char data year,month,date,week;//年、月、日、星期
unsigned char data armhour,armmin,armsec;//鬧鐘時(shí)、分、秒
unsigned char data hour,min,sec,sec100; //時(shí)、分、秒、百分之一秒
unsigned char data flag,vkey,skey;//設(shè)置狀態(tài)計(jì)數(shù)標(biāo)志、按鍵先前值、按鍵當(dāng)前值
bit alarm; //標(biāo)識(shí)是否啟用鬧鐘,1--啟用,0--關(guān)閉
sbit rs = P2^0; //LCD數(shù)據(jù)/命令選擇端(H/L)
sbit rw = P2^1; //LCD讀/寫選擇端(H/L)
sbit ep = P2^2; //LCD使能控制
sbit PRE = P1^6; //調(diào)整鍵(k3)
sbit SET = P1^7; //調(diào)整鍵(k4)
sbit SPK = P3^7;
void delayms(unsigned char ms); //延時(shí)程序
bit lcd_busy(); //測(cè)試LCD忙碌狀態(tài)程序
void lcd_wcmd(char cmd); //寫入指令到LCD程序
void lcd_wdat(char dat); //寫入數(shù)據(jù)到LCD程序
void lcd_pos(char pos); //LCD數(shù)據(jù)指針位置程序
void lcd_init(); //LCD初始化設(shè)定程序
void pro_timedate(); //時(shí)間日期處理程序
void pro_display(); //顯示處理程序
void pro_key(); //按鍵處理程序
void time_alarm(); //定時(shí)報(bào)警功能(鬧鐘)
unsigned char scan_key(); //按鍵掃描程序
unsigned char week_proc(); //星期自動(dòng)計(jì)算與顯示函數(shù)
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);
//更新顯示緩沖區(qū)函數(shù)
// 延時(shí)程序
void delay(unsigned char ms)
{ while(ms--)
{ unsigned char i;
for(i = 0; i< 250; i++)
{
_nop_(); //執(zhí)行一條_nop_()指令為一個(gè)機(jī)器周期
_nop_();
_nop_();
_nop_();
}
}
}
//測(cè)試LCD忙碌狀態(tài)
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()); //當(dāng)lcd_busy為1時(shí),再次檢測(cè)LCD忙碌狀態(tài),lcd-busy為0時(shí),開始寫指令
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
//寫入數(shù)據(jù)到LCD
void lcd_wdat(char dat)
{
while(lcd_busy()); //當(dāng)lcd_busy為1時(shí),再次檢測(cè)LCD忙碌狀態(tài),lcd-busy為0時(shí),開始寫數(shù)據(jù)
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
//LCD數(shù)據(jù)指針位置程序
void lcd_pos(char pos)
{
lcd_wcmd(pos|0x80); //數(shù)據(jù)指針=80+地址碼(00H~27H,40H~67H)
}
//設(shè)定二個(gè)自定義字符,(注意:LCD1602中自定義字符的地址為0x00--0x07,即可定義8個(gè)字符)
//這里我們?cè)O(shè)定把一個(gè)自定義字符放在0x00位置(000),另一個(gè)放在0x01位子(001)
void lcd_sef_chr()
{ //第一個(gè)自定義字符
lcd_wcmd(0x40); //"01 000 000" 第1行地址 (D7D6為地址設(shè)定命令形式
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -