- 积分
- 4
- 回帖
- 0
- 西莫币
-
- 贡献
-
- 威望
-
- 存款
-
- 阅读权限
- 5
- 最后登录
- 1970-1-1
该用户从未签到
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1:
2: /***************************************************************************
3: * 文件名:93c46.c
4: * 功 能:SPI总线以及9346EEPROM的读写
5: * 作 者:TXMCU
6: * 日 期:
7: * 备 注:
8: //软件思路:
9: // KEY0键按下时把0x32和0x36写入到EEPROM中以EE—ADDR为地址的单元内,
10: //完成后,单个数码观显示“0”做为完成标志
11: //KEY1键按下时,读取EEPROM中以EE—ADDR为地址的单元,并送数码管显示
12: //开发板连接方法:将JP10 JP11 JP12 JP13这4个跳线帽分别接到93c46位置
13: // 把JP8的的跳线帽跳到DPY位置上,JP14选择在IO口位置上
14: //注意: atmel93c46 JP9跳转到16位端
15: ****************************************************************************/
16: #include<pic.h>
17: __CONFIG(0x1832);
18: //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
19:
20: #define c_s RC2
21: #define d0 RC4
22: #define ee_addr 0x5
23: #define nop() asm("nop")
24:
25: const char ee_data_write[] = {0x32, 0x36};
26: unsigned char ee_date[4];
27: const unsigned char table[] = {0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};
28:
29: unsigned int temp;
30:
31: void init();
32: void ee_write();
33: void ee_read();
34: void display();
35: void delay();
36: void ee_write_enable();
37: void spi_comm(unsigned char x);
38:
39: void main()
40: {
41: int flag=100;
42: init();
43: // ee_write();
44: // ee_read();
45: while (1)
46: {
47: if (!RB0)
48: {
49: ee_write();//write();//先写后读
50: flag=1; //写完标志
51: }
52: if (!RB1) //读按钮被按下
53: {
54: ee_read();//read();
55: ee_read();
56: flag=0; //写标志清零,
57: }
58: if(flag==1) //如果写完
59: {
60: PORTD = table[0]; //送D口显示0
61: PORTA = 0x01; //点亮第一个位
62: delay(); //延长一段时间,保证亮度
63: }
64: if(flag==0) //如果读数完毕
65: {
66: display(); //显示读出的数据
67: }
68:
69: }
70: }
71:
72: /****************************************************************************
73: * 名 称:init()
74: * 功 能:引脚初始化
75: * 入口参数:
76: * 出口参数:
77: * 说 明:
78: ****************************************************************************/
79: void init()
80: {
81: ADCON1 = 0X07;
82: TRISA = 0X00;
83: RA4=0;
84: TRISB = 0X03;
85: TRISC = 0X10;
86: TRISD = 0X00;
87: PORTD = 0XFF;
88: SSPSTAT = 0X80;
89: SSPCON = 0X32;//Fosc/64
90: INTCON = 0X00;
91: PIR1 = 0X00;
92: c_s = 0;
93: }
94:
95: /****************************************************************************
96: * 名 称:write()
97: * 功 能:将写缓冲区的数据写到93c46中
98: * 入口参数:
99: * 出口参数:
100: * 说 明:
101: ****************************************************************************/
102: void ee_write()
103: {
104: int i, j;
105: ee_write_enable(); //写使能
106: c_s = 1; //选中
107: spi_comm(0x1); //以下两条发送写地址
108: spi_comm(ee_addr | 0x40);
109: for (i = 0;i < 2;i++) //写入两个字节数据
110: {
111: j = ee_data_write[i];
112: spi_comm(j);
113: }
114: c_s = 0;
115: nop();
116: nop();
117: c_s = 1;
118: nop();
119: nop();
120: while (!d0);
121: c_s = 0;
122: nop();
123: nop();
124: PORTD = 0Xff;
125: PORTA = 0Xff;
126: }
127:
128: /****************************************************************************
129: * 名 称: ee_read()
130: * 功 能:把存储器某地址的数据读到缓冲区
131: * 入口参数:
132: * 出口参数:
133: * 说 明:
134: ****************************************************************************/
135: void ee_read()
136: {
137: int i;
138: c_s = 1;
139: nop();
140: nop();
141: spi_comm(0x01); //发送要读的地址
142: spi_comm(ee_addr | 0x80);
143: for (i = 0;i < 2;i++) //读两个字节到缓冲区
144: {
145: spi_comm(0);
146: ee_date[i] = temp;
147: }
148: nop();
149: c_s = 0;
150: nop();
151: }
152:
153: /****************************************************************************
154: * 名 称:ee_write_enable()
155: * 功 能:eeprom写诗能使能
156: * 入口参数:
157: * 出口参数:
158: * 说 明:
159: ****************************************************************************/
160: void ee_write_enable()
161: {
162: c_s = 1; //选中存储器
163: spi_comm(0x01); //发送写命令
164: spi_comm(0x30);
165: c_s = 0;
166: nop();
167: nop();
168: }
169:
170: /****************************************************************************
171: * 名 称:spi_comm()
172: * 功 能:spi总线上发送一个字节的数据
173: * 入口参数:unsigned char x 待发送的数据
174: * 出口参数:
175: * 说 明:
176: ****************************************************************************/
177: void spi_comm(unsigned char x)
178: {
179: SSPBUF = x; //写入数据
180: while (!SSPIF); //等待发送完毕
181: SSPIF = 0; //清楚标志位
182: temp = SSPBUF; //数据发送以后SSPBUF中的数据是接收到的,请看数据手册
183: }
184:
185: /****************************************************************************
186: * 名 称:display()
187: * 功 能:数码管显示
188: * 入口参数:
189: * 出口参数:
190: * 说 明:
191: ****************************************************************************/
192: void display()
193: {
194: int i;
195: i = ee_date[0] & 0xf0; //取出数据
196: i = i >> 4; //取出低位
197: PORTD = table[i]; //送D口显示
198: PORTA = 0x01; //点亮第一个位
199: delay(); //延长一段时间,保证亮度
200: //以下注释原理同上
201:
202: i = ee_date[0] & 0x0f;
203: PORTD = table[i];
204: PORTA = 0x02;
205: delay();
206:
207: i = ee_date[1] & 0xf0;
208: i = i >> 4;
209: PORTD = table[i];
210: PORTA = 0x04;
211: delay();
212: i = ee_date[1] & 0x0f;
213: PORTD = table[i];
214: PORTA = 0x08;
215: delay();
216: }
217:
218: /****************************************************************************
219: * 名 称:delay()
220: * 功 能:延时
221: * 入口参数:
222: * 出口参数:
223: * 说 明:
224: ****************************************************************************/
225: void delay()
226: {
227: int i;
228: for (i = 100;i > 0;i--);
229: } |
评分
-
查看全部评分
|