?? lcd_clock.lst
字號:
C51 COMPILER V7.07 LCD_CLOCK 11/20/2005 11:49:32 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE LCD_CLOCK
OBJECT MODULE PLACED IN lcd_clock.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE lcd_clock.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //日歷時鐘
2 //按AN1,進入設置狀態(tài)
3 //按AN2,停止鬧鐘聲音
4 //按AN3,依次進入鬧鐘功能是否啟用,鬧鐘時,分秒,年,月,日及時間時,分,秒的設置,直到退出設置狀態(tài)
5 //按AN4,調整是否起用鬧鐘和調節(jié)鬧鐘時,分,秒,年,月,日,時間的時,分,秒的數(shù)字
6 //LCD第二排中間顯示小喇叭,表示啟用鬧鐘功能,無則禁止鬧鐘功能(可在調整狀態(tài)進行設置)
7 //正常狀態(tài),LCD上排最前面顯示自定義字符,LCD下排最前面閃動"willar"
8 //設置狀態(tài),LCD上排最前面顯示"P",下排最前面在設置鬧鐘時間時顯示"alarm:",其它狀態(tài)顯示"time"
9 //年代變化2000--2099,星期自動轉換
10 //程序中有自定義字符寫入
11 #include <reg51.h>
12 #include <intrins.h>
13 unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"};
14 unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5}; //星期月參變數(shù)
15 unsigned char data dis_buf1[16]; //lcd上排顯示緩沖區(qū)
16 unsigned char data dis_buf2[16]; //lcd下排顯示緩沖區(qū)
17 unsigned char data year,month,date,week;//年、月、日、星期
18 unsigned char data armhour,armmin,armsec;//鬧鐘時、分、秒
19 unsigned char data hour,min,sec,sec100; //時、分、秒、百分之一秒
20 unsigned char data flag,vkey,skey;//設置狀態(tài)計數(shù)標志、按鍵先前值、按鍵當前值
21 bit alarm; //標識是否啟用鬧鐘,1--啟用,0--關閉
22 sbit rs = P2^0; //LCD數(shù)據(jù)/命令選擇端(H/L)
23 sbit rw = P2^1; //LCD讀/寫選擇端(H/L)
24 sbit ep = P2^2; //LCD使能控制
25 sbit PRE = P3^4; //調整鍵(AN3)
26 sbit SET = P3^5; //調整鍵(AN4)
27 sbit SPK = P3^7;
28 void delayms(unsigned char ms); //延時程序
29 bit lcd_busy(); //測試LCD忙碌狀態(tài)程序
30 void lcd_wcmd(char cmd); //寫入指令到LCD程序
31 void lcd_wdat(char dat); //寫入數(shù)據(jù)到LCD程序
32 void lcd_pos(char pos); //LCD數(shù)據(jù)指針位置程序
33 void lcd_init(); //LCD初始化設定程序
34 void pro_timedate(); //時間日期處理程序
35 void pro_display(); //顯示處理程序
36 void pro_key(); //按鍵處理程序
37 void time_alarm(); //定時報警功能(鬧鐘)
38 unsigned char scan_key(); //按鍵掃描程序
39 unsigned char week_proc(); //星期自動計算與顯示函數(shù)
40 bit leap_year(); //判斷是否為閏年
41 void lcd_sef_chr(); //LCD自定義字符程序
42 void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned ch
-ar dis_s);
43 //更新顯示緩沖區(qū)函數(shù)
44
45
46 // 延時程序
47 void delay(unsigned char ms)
48 { while(ms--)
49 1 { unsigned char i;
50 2 for(i = 0; i< 250; i++)
51 2 {
52 3 _nop_(); //執(zhí)行一條_nop_()指令為一個機器周期
53 3 _nop_();
54 3 _nop_();
C51 COMPILER V7.07 LCD_CLOCK 11/20/2005 11:49:32 PAGE 2
55 3 _nop_();
56 3 }
57 2 }
58 1 }
59
60
61 //測試LCD忙碌狀態(tài)
62 bit lcd_busy()
63 {
64 1 bit result;
65 1 rs = 0;
66 1 rw = 1;
67 1 ep = 1;
68 1 _nop_();
69 1 _nop_();
70 1 _nop_();
71 1 _nop_();
72 1 result =(bit)(P0&0x80); //LCD的D0--D7中,D7=1為忙碌,D7=0為空閑
73 1 ep = 0;
74 1 return result;
75 1 }
76
77 //寫入指令到LCD
78 void lcd_wcmd(char cmd)
79 {
80 1 while(lcd_busy()); //當lcd_busy為1時,再次檢測LCD忙碌狀態(tài),lcd-busy為0時,開始寫指令
81 1 rs = 0;
82 1 rw = 0;
83 1 ep = 0;
84 1 _nop_();
85 1 _nop_();
86 1 P0 = cmd;
87 1 _nop_();
88 1 _nop_();
89 1 _nop_();
90 1 _nop_();
91 1 ep = 1;
92 1 _nop_();
93 1 _nop_();
94 1 _nop_();
95 1 _nop_();
96 1 ep = 0;
97 1 }
98
99 //寫入數(shù)據(jù)到LCD
100 void lcd_wdat(char dat)
101 {
102 1 while(lcd_busy()); //當lcd_busy為1時,再次檢測LCD忙碌狀態(tài),lcd-busy為0時,開始寫數(shù)據(jù)
103 1 rs = 1;
104 1 rw = 0;
105 1 ep = 0;
106 1 P0 = dat;
107 1 _nop_();
108 1 _nop_();
109 1 _nop_();
110 1 _nop_();
111 1 ep = 1;
112 1 _nop_();
113 1 _nop_();
114 1 _nop_();
115 1 _nop_();
116 1 ep = 0;
C51 COMPILER V7.07 LCD_CLOCK 11/20/2005 11:49:32 PAGE 3
117 1 }
118
119 //LCD數(shù)據(jù)指針位置程序
120 void lcd_pos(char pos)
121 {
122 1 lcd_wcmd(pos|0x80); //數(shù)據(jù)指針=80+地址碼(00H~27H,40H~67H)
123 1 }
124
125
126 //設定二個自定義字符,(注意:LCD1602中自定義字符的地址為0x00--0x07,即可定義8個字符)
127 //這里我們設定把一個自定義字符放在0x00位置(000),另一個放在0x01位子(001)
128 void lcd_sef_chr()
129 { //第一個自定義字符
130 1 lcd_wcmd(0x40); //"01 000 000" 第1行地址 (D7D6為地址設定命令形式
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -