| 
积分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: }
 | 
评分
查看全部评分
 |