?? shiyan4.lst
字號:
C51 COMPILER V8.01 SHIYAN4 10/26/2008 19:39:37 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE SHIYAN4
OBJECT MODULE PLACED IN shiyan4.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE shiyan4.c BROWSE DEBUG OBJECTEXTEND TABS(6)
line level source
1 //**程序設計**作者hyg214**網名**展凌**
2 //程序功能:利用I2C總線寫或讀E2PROM
3 //向E2PROM寫n個數據,再按頭尾地址讀出
4 //當然你也可以設置n=1;那就只寫讀一個數據
5 //************************************
6 //********************************************
7 #include<reg52.h>
8 #include<intrins.h>//空操作需要的頭文件
9 #define uchar unsigned char
10 sbit sda=P2^0;//聲明控制信號
11 sbit scl=P2^1;
12
13 uchar idata tab[]={
14 //數碼顯示從0-9數字,讀ROM時
15 0x3f,0x06,0x5b,0x4f,0x66,
16 0x6d,0x7d,0x07,0x7f,0x6f};
17
18 uchar idata sdate[50];//接收數據的數組變量
19 uchar tn=0;//從那個地址開始讀
20 uchar m=10;//讀出時要讀幾個數據
21 //你可以只讀一個(m=1),但這個程序讓它循環顯示
22 uchar n=10;//寫入數據的個數
23 uchar idata mdate[10]={53,28,37,45,69,74,56,82,30,99};//要寫入的數據
24 //*********************************************
25
26 //----------------------------------
27 void delay()//延時函數
28 {//約等于5us用于控制信號SDA,SCL的延時
29 1 uchar i;i++;
30 1 }
31 //----------------------------------
32 void delay_ms(uchar z)//延時函數
33 {//約等于z*0.5ms
34 1 //用于寫、讀間時;數碼動態顯示間時
35 1 uchar i,j;
36 1 for(i=z;i>0;i--)
37 1 for(j=222;j>0;j--);
38 1 }
39 //----------------------------------
40 void intc()//初始化函數
41 {
42 1 sda=1;//控制信號拉高
43 1 scl=1;
44 1 P0=0x00;//數碼管不顯示
45 1 }
46 //----------------------------------
47 void start()//起始信號函數
48 {//向ROM發送一個開始的信號
49 1 sda=1;
50 1 scl=1;
51 1 delay();
52 1 sda=0;
53 1 delay();
54 1 scl=0;
55 1 }
C51 COMPILER V8.01 SHIYAN4 10/26/2008 19:39:37 PAGE 2
56 //----------------------------------
57 void stop()//停止信號函數
58 {//向ROM發送一個停止的信號
59 1 sda=0;
60 1 scl=1;
61 1 delay();
62 1 sda=1;
63 1 delay();
64 1 scl=0;
65 1 }
66 //----------------------------------
67 void respons()//產生應答信號函數
68 {//接收一數據后應答
69 1 sda=0;
70 1 scl=1;
71 1 delay();
72 1 scl=0;
73 1 sda=1;
74 1 }
75 //----------------------------------
76 void no_respons()//產生非應答信號函數
77 {//接收一數據沒應答,則強制
78 1 sda=0;
79 1 scl=1;
80 1 delay();
81 1 scl=0;
82 1 sda=1;
83 1 }
84 //----------------------------------
85 void write_date(uchar date)//向E2PEOM寫數據函數
86 {//向E2PROM寫一字節數據
87 1 uchar i,temp;
88 1 temp=date;
89 1 for(i=0;i<8;i++)//總共寫入8次位=1字節=1個數據
90 1 {
91 2 temp=temp<<1;//要存的數據左移1位,最高位給CY了
92 2 scl=0; //數據可以改變
93 2 delay();
94 2 sda=CY; //寫入一位
95 2 delay();
96 2 scl=1; //數據穩定,不能寫了
97 2 delay();
98 2 }
99 1 scl=0;
100 1 delay();
101 1 sda=1;//穩定數據
102 1 delay();
103 1 }
104 //----------------------------------
105 uchar read_date()//從E2PROM讀出數據函數
106 {//根據
107 1 uchar i,k;
108 1 scl=0;//數據改變
109 1 delay();
110 1 sda=1;//可讀信號
111 1 for(i=0;i<8;i++)//讀出8次位=1字節=1個數據
112 1 {
113 2 scl=1;//數據穩定,可從sda讀出一位
114 2 delay();
115 2 k=(k<<1)|sda;//寫入時是從高位寫,讀出時也一行
116 2 scl=0;//數據改變(準備下一位)
117 2 delay();
C51 COMPILER V8.01 SHIYAN4 10/26/2008 19:39:37 PAGE 3
118 2 }
119 1 delay();
120 1 return k;//返回讀出的一個數據
121 1 }
122 //----------------------------------
123 void write_sword(uchar sta,uchar n,uchar *date)//寫入串數據函數
124 {//根據起始地址、數據個數及數據寫入E2PEOM中
125 1 uchar i;//計數變量
126 1 start();//起始
127 1 write_date(0xa0);//E2PROM地址(ATC02為oxa0)
128 1 respons();//應答
129 1 write_date(sta);//寫入數據要存放的地址
130 1 respons();//應答
131 1 for(i=0;i<n;i++)
132 1 {
133 2 write_date(date[i]);//寫入數據
134 2 respons();//應答
135 2 }
136 1 stop();//停止
137 1 }
138 //-----------------------------------
139 uchar read_sword(uchar sta,uchar n)//讀出串數據函數
140 {//根據起始地址和讀出個數,從E2PROM讀出一串數據
141 1 uchar i;//計數個數
142 1 start();//起始
143 1 write_date(0xa0);//AO表示主機向從機寫數據
144 1 respons();//應答
145 1 write_date(sta);//數據地址
146 1 respons();//應答
147 1
148 1 start();//起始
149 1 write_date(0xa1);//A1表示從機從主機讀取數據
150 1 for(i=0;i<n;i++)
151 1 {
152 2 respons();//應答
153 2 *(sdate+i)=read_date();//讀出數據存入數組
154 2 }
155 1 no_respons();//非應答
156 1 stop();//停止
157 1 return 1;//返回讀出的數組數據
158 1 }
159 //----------------------------------
160 void display(uchar *dat)//數碼管顯示函數
161 {//從E2PROM讀出的數據在數碼管顯示出來
162 1 uchar i,j,k,tem1,tem0,temp;
163 1 //計數變量,2個延時用,十位和個位,傳值變量
164 1 for(i=0;i<m;i++)
165 1 {
166 2 temp=*(dat+tn++);
167 2 if(tn==n){tn=0;}//這里讓它循環顯示
168 2 tem1=temp/10;//十位
169 2 tem0=temp%10;//個位
170 2 for(j=8;j>0;j--)
171 2 for(k=8;k>0;k--)//大約1s一個數據
172 2 {
173 3 P2=0x10;//選通二個數碼管
174 3 P0=tab[tem1];//顯示十位
175 3 delay_ms(20);//延時10ms,動態顯示時暫停時間
176 3 //太快,不夠亮,太慢,不穩定(閃爍),一般10ms
177 3 P2=0x20;
178 3 P0=tab[tem0];
179 3 delay_ms(20);
C51 COMPILER V8.01 SHIYAN4 10/26/2008 19:39:37 PAGE 4
180 3 }
181 2 }
182 1 }
183 //----------------------------------
184 void main()//主函數
185 {//功能:初始化,寫數據,讀數據,顯示數據
186 1 uchar i=0,temp;//i表示開始讀的地址
187 1 intc();//初始化
188 1 write_sword(i,n,mdate);//根據起始地址和個數,串數據寫入E2PROM
189 1 delay_ms(100);//延時,寫入和讀出要有個時間的
190 1 temp=read_sword(i,n);//根據地址讀出一串數據
191 1 while(temp)
192 1 {
193 2 display(sdate);//讀出的數據用數碼管顯示出來
194 2 }
195 1 }
196 //-----------------------------------
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 408 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 10
IDATA SIZE = 70 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -