?? led時鐘.lst
字號:
C51 COMPILER V7.06 LED蔩鐘 06/10/2008 10:57:17 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE LED蔩鐘
OBJECT MODULE PLACED IN LED時鐘.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE LED時鐘.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <REG51.H>
2 #include "ds1302.h" //包含DS1302頭文件
3 #include "ds18b20.h"
4 #define leddata P0 //定義LED數據口
5 #define sec 0x80 //1302秒寄存器地址
6 #define min 0x82 //1302分寄存器地址
7 #define hou 0x84 //1302時寄存器地址
8 #define read 0x01 //讀操作,因為讀的時候地址要加1,使最低位為1
9 sbit MODE=P3^4; //按鍵定義,下同
10 sbit SET=P3^5;
11 sbit UP=P3^6;
12 sbit DOWN=P3^7;
13 sbit led0=P2^0; //LED位選,因為布線不是按順序布的,程序定義一下就可以了,下同
14 sbit led1=P2^3;
15 sbit led2=P2^7;
16 sbit led3=P2^4;
17 sbit led4=P2^6;
18 sbit led5=P2^5;
19 //**************函數聲明*****************
20 void delays(unsigned char);
21 void display(void);
22 void Scan_Key(void);
23 void id_case1_key();
24 void Set_id(unsigned char ,unsigned char);
25 //*************變量定義******************
26 unsigned char id=0,timecount,re_disp=0; //定義用到的變量,id為調整模式用,不為0時表示調整模式,調整哪個量
-由id值確定
27 //timecount用于500ms定時記數,時間到取反flag標志位,re_disp記數200次共10s,調整狀態下按鍵無操作
-10s自動返回正常顯示狀態
28 bit hour,minute,second,flag; //定義位變量,hour,minute,second分別為調整時閃爍標志位,flag 500ms取反一次
-,調整位閃爍及冒號閃爍用
29 unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60}; //LED碼表,根據硬件修改
30 unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x11,0x06,0x04}; //初始化1302時用到的初始化數據
31 // 秒 分鐘 小時 日 月 年 星期
32 void t0(void) interrupt 1 using 0 //中斷處理程序,主要用于取反標志位,返回正常顯示狀態
33 {
34 1 TH0=(65535-50000)/256; //50ms定時
35 1 TL0=(65535-50000)%256;
36 1 timecount++;re_disp++;
37 1 if(timecount>9)
38 1 {
39 2 timecount=0;
40 2 flag=~flag;
41 2 }
42 1 if(re_disp>200){re_disp=0;if(id)id=0;}
43 1 }
44 void delays(unsigned char k) //延時函數
45 {
46 1 unsigned char i,j;
47 1 for(i=0;i<k;i++)
48 1 for(j=0;j<50;j++);
49 1 }
50 void display(void) //顯示函數
51 {
52 1 if(flag&hour) //如hour為1表示調整時,flag為1時不顯示
C51 COMPILER V7.06 LED蔩鐘 06/10/2008 10:57:17 PAGE 2
53 1 {
54 2 led0=0;leddata=0xff;delays(10);led0=1;
55 2 led1=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led1=1; //&~((unsigned char)~flag<<6)該句根據
-flag的值決定來顯示小數點,為1時顯示,4個小數點組成兩對冒號,下同
56 2 }
57 1 else //flag為0時顯示,產生閃爍效果,下同
58 1 {
59 2 leddata=tab[Read1302(hou|read)/16];led0=0;delays(10);led0=1;
60 2 leddata=tab[Read1302(hou|read)%16]&~((unsigned char)~flag<<6);led1=0;delays(10);led1=1;
61 2 }
62 1 if(flag&minute)
63 1 {
64 2 led2=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led2=1;
65 2 led3=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led3=1;
66 2 }
67 1 else
68 1 {
69 2 leddata=tab[Read1302(min|read)/16]&~((unsigned char)~flag<<6);led2=0;delays(10);led2=1;
70 2 leddata=tab[Read1302(min|read)%16]&~((unsigned char)~flag<<6);led3=0;delays(10);led3=1;
71 2 }
72 1 if(flag&second)
73 1 {
74 2 led4=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led4=1;
75 2 led5=0;leddata=0xff;delays(10);led5=1;
76 2 }
77 1 else
78 1 {
79 2 leddata=tab[Read1302(sec|read)/16]&~((unsigned char)~flag<<6);led4=0;delays(10);led4=1;
80 2 leddata=tab[Read1302(sec|read)%16];led5=0;delays(10);led5=1;
81 2 }
82 1 }
83 void Scan_Key(void) //鍵盤檢測函數
84 {
85 1 display(); //程序開頭調用顯示函數
86 1 if(!SET)
87 1 {
88 2 while(!SET)display(); //等待按鍵釋放,如一直按下一直調用顯示函數,防止顯示中斷
89 2 re_disp=0; //清除記數,重新開始10s定時
90 2 id++;if(id>3)id=0; //id加1,后面根據id值對應調整項目
91 2 }
92 1 if(id==0){hour=0;minute=0;second=0;} //根據id值跳到相應處理函數
93 1 if(id==1){hour=1;id_case1_key();} //id為1,選擇調整小時位,閃爍標志位置1,然后跳到鍵盤處理函數,下同
94 1 if(id==2){hour=0;minute=1;id_case1_key();}
95 1 if(id==3){minute=0;second=1;id_case1_key();}
96 1 }
97 void id_case1_key(void) //鍵盤處理函數,只有按下set鍵時才會進入,
98 {
99 1 display();
100 1 if (!DOWN) //減少
101 1 {
102 2 while(!DOWN)display(); //等待按鍵釋放,如一直按下一直調用顯示函數,防止顯示中斷
103 2 re_disp=0; //清除記數,重新開始10s定時
104 2 Set_id(id,0); //跳到加減判斷函數,下同,
105 2 }
106 1 if (!UP) //增加
107 1 {
108 2 while(!UP)display();
109 2 re_disp=0;
110 2 Set_id(id,1);
111 2 }
112 1 }
113
C51 COMPILER V7.06 LED蔩鐘 06/10/2008 10:57:17 PAGE 3
114 //根據選擇調整相應項目并寫入DS1302
115 void Set_id(unsigned char sel,unsigned char sel_1) //執行調整項目的函數
116 {
117 1 signed char max,mini,address,item;
118 1 if(sel==1) {address=hou; max=23;mini=0;} //小時 //根據id值確定要調整的項,并確定調整上下限,下同
119 1 if(sel==2) {address=min; max=59;mini=0;} //分鐘
120 1 if(sel==3) {address=sec; max=0; mini=0;} //秒
121 1 item=Read1302(address|read)/16*10+Read1302(address|read)%16; //從相應的地址讀取當前數據并轉換為十進制
122 1 if (sel_1==0) item--; else item++; //確定是對項目加還是減,并對越限處理
123 1 if(item>max) item=mini;
124 1 if(item<mini) item=max;
125 1 Write1302(0x8e,0x00);//允許寫操作
126 1 Write1302(address,item/10*16+item%10); //將調整結果轉換成壓縮BCD碼重新寫入1302
127 1 Write1302(0x8e,0x80);//寫保護,禁止寫操作
128 1 }
129 void main() //主函數
130 {
131 1 TMOD=0x01; //初始化定時器
132 1 TH0=(65535-50000)/256;
133 1 TL0=(65535-50000)%256;
134 1 EA=1;
135 1 ET0=1;
136 1 TR0=1;
137 1 Write1302(0x90,0xa0);//關閉充電二級管,不能對后備電池進行充電,防止發脹,原來的程序是打開的請關閉
138 1 Write1302(0x8e,0x80);//寫保護,禁止寫操作
139 1 if(!UP&!DOWN)Set1302(inittime); //如果同時按下UP和DOWN鍵則初始化1302,該語句在while(1)前,只執行一次,
-需要復位,防止誤操作
140 1 while(1)
141 1 {
142 2 Scan_Key(); //主程序一直調用鍵盤檢測函數即可
143 2 }
144 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 761 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 1
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -