?? lcdwnl.c
字號:
/********************************************************************************
* 標題: xl系列單片機實驗儀演示程序 *
* 文件: XLLCDWNL.c *
* 日期: 2006-1-5 *
* 版本: 3.0 (試驗通過版)可用xl600-xl1000單片機綜合試驗儀試驗 *
* 郵箱: sxj1974@163.com *
* 網站: http://www.51c51.com www.8951.com *
********************************************************************************
*日歷時鐘 *
*按K1,進入設置狀態 *
*按k2,停止鬧鐘聲音 *
*按k3,依次進入鬧鐘功能是否啟用,鬧鐘時,分秒,年,月,日及時間時,分,秒的設置, *
*直到退出設置狀態 *
*按k4,調整是否起用鬧鐘和調節鬧鐘時,分,秒,年,月,日,時間的時,分,秒的數字 *
*LCD第二排中間顯示小喇叭,表示啟用鬧鐘功能,無則禁止鬧鐘功能 *
*(可在調整狀態進行設置) *
*正常狀態,LCD上排最前面顯示自定義字符,LCD下排最前面閃動"XUELIN" *
*設置狀態,LCD上排最前面顯示"P",下排最前面在設置鬧鐘時間時顯示"alarm:", *
*其它狀態顯示"time" *
*年代變化2000--2099,星期自動轉換 *
*程序中有自定義字符寫入 *
********************************************************************************
* 【版權】 Copyright(C)深圳市學林電子有限公司 www.51c51.com *
* 【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! *
* 【技術支持】請訪問http://www.51c51.com/bbs/index.asp 官方論壇 *
********************************************************************************/
#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 = P2^0; //LCD數據/命令選擇端(H/L)
sbit rw = P2^1; //LCD讀/寫選擇端(H/L)
sbit ep = P2^2; //LCD使能控制
sbit PRE = P1^6; //調整鍵(k3)
sbit SET = P1^7; //調整鍵(k4)
sbit SPK = P3^7;
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 + -