EEPROM 24c02 + 數(shù)碼管 + 中斷 [統(tǒng)計開機次數(shù)]
>_<:24c02的SCL連P2.0;SDA連P2.1;WP接GND;P0接8位數(shù)碼管的8針;P2.2連段碼;P2.3連位碼;
>_<:delay.c
1 #include "delay.h"
2 /*------------------------------------------------
3 uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
4 unsigned char 是定義無符號字符變量,其值的范圍是
5 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
6 長度如下 T=tx2+5 uS
7 ------------------------------------------------*/
8 void DelayUs2x(unsigned char t)
9 {
10 while(--t);
11 }
12 /*------------------------------------------------
13 mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
14 unsigned char 是定義無符號字符變量,其值的范圍是
15 0~255 這里使用晶振12M,精確延時請使用匯編
16 ------------------------------------------------*/
17 void DelayMs(unsigned char t)
18 {
19 while(t--)
20 {
21 //大致延時1mS
22 DelayUs2x(245);
23 DelayUs2x(245);
24 }
25 }
>_<:delay.h
1 #ifndef __DELAY_H__
2 #define __DELAY_H__
3 /*------------------------------------------------
4 uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
5 unsigned char 是定義無符號字符變量,其值的范圍是
6 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
7 長度如下 T=tx2+5 uS
8 ------------------------------------------------*/
9 void DelayUs2x(unsigned char t);
10 /*------------------------------------------------
11 mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
12 unsigned char 是定義無符號字符變量,其值的范圍是
13 0~255 這里使用晶振12M,精確延時請使用匯編
14 ------------------------------------------------*/
15 void DelayMs(unsigned char t);
16
17 #endif
>_<:display.c
1 #include"display.h"
2 #include"delay.h"
3
4 #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換
5 //sbit LATCH1=P2^0;//定義鎖存使能端口 段鎖存
6 //sbit LATCH2=P2^3;// 位鎖存
7
8 unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數(shù)碼管點亮,即位碼
10 unsigned char TempData[8]; //存儲顯示值的全局變量
11 /*------------------------------------------------
12 顯示函數(shù),用于動態(tài)掃描數(shù)碼管
13 輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數(shù)碼管開始顯示
14 如輸入0表示從第一個顯示。
15 Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2
16 ------------------------------------------------*/
17 void Display(unsigned char FirstBit,unsigned char Num)
18 {
19 static unsigned char i=0;
20
21 DataPort=0; //清空數(shù)據(jù),防止有交替重影
22 LATCH1=1; //段鎖存
23 LATCH1=0;
24
25 DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
26 LATCH2=1; //位鎖存
27 LATCH2=0;
28
29 DataPort=TempData[i]; //取顯示數(shù)據(jù),段碼
30 LATCH1=1; //段鎖存
31 LATCH1=0;
32
33 i++;
34 if(i==Num)
35 i=0;
36 }
37 /*------------------------------------------------
38 定時器初始化子程序
39 ------------------------------------------------*/
40 void Init_Timer0(void)
41 {
42 TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
43 //TH0=0x00; //給定初值
44 //TL0=0x00;
45 EA=1; //總中斷打開
46 ET0=1; //定時器中斷打開
47 TR0=1; //定時器開關(guān)打開
48 }
49 /*------------------------------------------------
50 定時器中斷子程序
51 ------------------------------------------------*/
52 void Timer0_isr(void) interrupt 1
53 {
54 TH0=(65536-2000)/256; //重新賦值 2ms
55 TL0=(65536-2000)%256;
56 Display(0,8);
57 }
>_<:display.h
1 #include
2
3 #ifndef __DISPLAY_H__
4 #define __DISPLAY_H__
5
6 #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換
7 sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存
8 sbit LATCH2=P2^3;// 位鎖存
9
10 extern unsigned char TempData[8]; //存儲顯示值的全局變量
11 extern unsigned char code dofly_DuanMa[10];
12 /*------------------------------------------------
13 顯示函數(shù),用于動態(tài)掃描數(shù)碼管
14 輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數(shù)碼管開始顯示
15 如輸入0表示從第一個顯示。
16 Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2
17 ------------------------------------------------*/
18 void Display(unsigned char FirstBit,unsigned char Num);
19 /*------------------------------------------------
20 定時器初始化子程序
21 ------------------------------------------------*/
22 void Init_Timer0(void);
23
24 #endif
>_<:i2c.c
1 /*-----------------------------------------------
2 名稱:IIC協(xié)議
3 內(nèi)容:函數(shù)是采用軟件延時的方法產(chǎn)生SCL脈沖,固對高晶振頻率要作 一定的修改....(本例是1us機器
4 周期,即晶振頻率要小于12MHZ)
5 ------------------------------------------------*/
6 #include "i2c.h"
7 #include "delay.h"
8 #define _Nop() _nop_() //定義空指令
9 bit ack; //應答標志位
10 sbit SDA=P2^1;
11 sbit SCL=P2^0;
12 /*------------------------------------------------
13 啟動總線
14 ------------------------------------------------*/
15 void Start_I2c()
16 {
17 SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號
18 _Nop();
19 SCL=1;
20 _Nop(); //起始條件建立時間大于4.7us,延時
21 _Nop();
22 _Nop();
23 _Nop();
24 _Nop();
25 SDA=0; //發(fā)送起始信號
26 _Nop(); //起始條件鎖定時間大于4μ
27 _Nop();
28 _Nop();
29 _Nop();
30 _Nop();
31 SCL=0; //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
32 _Nop();
33 _Nop();
34 }
35 /*------------------------------------------------
36 結(jié)束總線
37 ------------------------------------------------*/
38 void Stop_I2c()
39 {
40 SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號
41 _Nop(); //發(fā)送結(jié)束條件的時鐘信號
42 SCL=1; //結(jié)束條件建立時間大于4μ
43 _Nop();
44 _Nop();
45 _Nop();
46 _Nop();
47 _Nop();
48 SDA=1; //發(fā)送I2C總線結(jié)束信號
49 _Nop();
50 _Nop();
51 _Nop();
52 _Nop();
53 }
54 /*----------------------------------------------------------------
55 字節(jié)數(shù)據(jù)傳送函數(shù)
56 函數(shù)原型: void SendByte(unsigned char c);
57 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應答,并對
58 此狀態(tài)位進行操作.(不應答或非應答都使ack=0 假)
59 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應答或損壞。
60 ------------------------------------------------------------------*/
61 void SendByte(unsigned char c)
62 {
63 unsigned char BitCnt;
64
65 for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長度為8位
66 {
67 if((c< 68 else SDA=0; 69 _Nop(); 70 SCL=1; //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位 71 _Nop(); 72 _Nop(); //保證時鐘高電平周期大于4μ 73 _Nop(); 74 _Nop(); 75 _Nop();