[PIC®/AVR®/dsPIC®产品] PIC18单片机读写93C46

[复制链接]
12215|5
 楼主| 比神乐 发表于 2024-12-12 22:28 | 显示全部楼层 |阅读模式
代码:
  1. #include <xc.h>
  2. #include "OLED.h"
  3. //CONFIG1L芯片配置字
  4. #pragma config RETEN = OFF           //超低功耗稳压器禁止
  5. #pragma config INTOSCSEL = HIGH      //休眠期间 LF-INTOSC 于高功耗模式
  6. #pragma config SOSCSEL = DIG         //SOSC配置为( SCLKI)模式;使能 RC0 和 RC1 数字I/O
  7. #pragma config XINST = OFF           //扩展指令集使能位,禁止指令集扩展和变址寻址模式 (传统模式)

  8. // CONFIG1H
  9. #pragma config FOSC = HS1            //4 MHz - 16 MHz 外部晶振设置HS中等功耗振荡器,
  10. #pragma config PLLCFG = ON           //使能PLL x4功能,8M晶振经4倍频变为32MHz系统时钟
  11. #pragma config FCMEN = OFF           //禁止故障保护时钟监视器
  12. #pragma config IESO = OFF            //禁止双速启动

  13. // CONFIG2L
  14. #pragma config PWRTEN = OFF          //禁止上电延时
  15. #pragma config BOREN = SBORDIS       //由硬件使能欠压复位
  16. #pragma config BORV = 3              //设置电压为1.8v欠压复位
  17. #pragma config BORPWR = ZPBORMV      //选择ZPBORMV而不是BORMV

  18. // CONFIG2H
  19. #pragma config WDTEN = OFF           //关看门狗
  20. //#pragma config WDTEN = SWDTDIS     //由硬件使能WDT,禁止SWDTEN位
  21. #pragma config WDTPS = 256           //看门狗后分频1:256,溢出时间1.024s

  22. // CONFIG3H
  23. #pragma config CANMX = PORTB         //CAN通信引脚设置到 RB2 和 RB3
  24. #pragma config MSSPMSK = MSK7        //使能 7 位地址掩码模式
  25. #pragma config MCLRE = ON            //使能MCLR外部复位功能

  26. // CONFIG4L
  27. #pragma config STVREN = ON         // 堆栈满/下溢复位
  28. #pragma config BBSIZ = BB2K        // 配置引导区大小为2K

  29. // CONFIG5L
  30. #pragma config CP0 = OFF           //00800-01FFF代码不加密
  31. #pragma config CP1 = OFF           //02000-03FFF代码不加密
  32. #pragma config CP2 = OFF           //04000-05FFF代码不加密
  33. #pragma config CP3 = OFF           //06000-07FFF代码不加密

  34. // CONFIG5H
  35. #pragma config CPB = OFF        //引导区代码不加密
  36. #pragma config CPD = OFF        //EEPROM数据不不加密

  37. // CONFIG6L
  38. #pragma config WRT0 = OFF       // 00800-01FFF 写保护位不使能
  39. #pragma config WRT1 = OFF       // 02000-03FFF 写保护位不使能
  40. #pragma config WRT2 = OFF       // 04000-05FFF 写保护位不使能
  41. #pragma config WRT3 = OFF       // 06000-07FFF 写保护位不使能

  42. // CONFIG6H
  43. #pragma config WRTC = OFF       //配置寄存器不受写保护
  44. #pragma config WRTB = OFF       //引导区不受写保护
  45. #pragma config WRTD = OFF       //EEPROM数据不受写保护

  46. // CONFIG7L
  47. #pragma config EBTR0 = OFF      //00800-01FFF表读保护位不使能
  48. #pragma config EBTR1 = OFF      //02000-03FFF表读保护位不使能
  49. #pragma config EBTR2 = OFF      //04000-05FFF表读保护位不使能
  50. #pragma config EBTR3 = OFF      //06000-07FFF表读保护位不使能
  51. // CONFIG7H
  52. #pragma config EBTRB = OFF      //引导区不受写保护

  53. #define uint unsigned int
  54. #define u8  unsigned char

  55. #define LED1   LATDbits.LATD4  //定义LED1端口
  56. #define LED2   LATEbits.LATE1  //定义LED2端口

  57. #define uchar unsigned char
  58. #define uint unsigned int
  59. #define READ           0X80                   //只包括前3个控制BIT--下同
  60. #define EWEN           0X00
  61. #define ERASE           0Xc0
  62. #define WRITE           0X40
  63. #define ERAL           0X00
  64. #define WRAL           0X00
  65. #define EWDS           0X00

  66. #define  cs LATCbits.LATC4      
  67. #define ck LATCbits.LATC5
  68. #define di1 LATCbits.LATC6
  69. #define d0 PORTCbits.RC7

  70. #define readcode 0x0c
  71. #define writecode 0x0a
  72. //MS延时函数
  73. void MS_delay(uint MS)
  74. {
  75.     uint x,y;
  76.     for(y=MS;y>0;y--)
  77.     {
  78.             for(x=796;x>0;x--);
  79.     }
  80. }
  81. void delay1ms()
  82. {
  83.    unsigned char i,j;
  84.   for(i=0;i<10;i++)
  85.    for(j=0;j<33;j++)
  86.     ;   
  87. }
  88. /*****************************************************
  89. 函数功能:延时若干毫秒
  90. 入口参数:n
  91. ***************************************************/
  92. void delaynms(unsigned char n)
  93. {
  94.    unsigned char i;
  95. for(i=0;i<n;i++)
  96.     delay1ms();
  97. }
  98. void delay(uchar n)
  99. {
  100. int i;
  101. for(i=0;i<n;i++)
  102. ;
  103. }



  104. uchar readdata(uchar add)
  105. {
  106. uchar read_data,i;
  107. cs=1;
  108. delay(4);

  109. di1=1;        //        1
  110. delay(4);
  111. ck=1;
  112. delay(4);
  113. ck=0;

  114. delay(4);
  115. di1=1;                 //0
  116. delay(4);
  117. ck=1;
  118. delay(4);
  119. ck=0;
  120. delay(4);
  121. for(i=0;i<8;i++)
  122. {
  123.        
  124.         if(add&0x80)
  125.                 di1=1;
  126.         else
  127.                 di1=0;
  128.         delay(4);
  129.         ck=1;
  130.         delay(4);
  131.         add<<=1;
  132.         ck=0;
  133.         delay(4);
  134.                
  135. }
  136. for(i=0;i<8;i++)
  137. {
  138.         read_data<<=1;
  139.         ck=1;
  140.         delay(4);
  141.         ck=0;
  142.         delay(4);
  143.         //d0=1;
  144.         if(d0)
  145.                 read_data|=1;       
  146.         delay(4);
  147.        
  148.        
  149.                
  150. }
  151. cs=0;
  152. return(read_data);
  153. }

  154. void writedata(uchar add,uchar write_data)
  155. {
  156. uchar i;
  157. cs=1;
  158. delay(4);

  159. di1=1;        //        1
  160. delay(4);
  161. ck=1;
  162. delay(4);
  163. ck=0;
  164. delay(4);

  165. di1=0;                 //0
  166. delay(4);
  167. ck=1;
  168. delay(4);
  169. ck=0;
  170. delay(4);
  171. for(i=0;i<8;i++)
  172. {
  173.        
  174.         if(add&0x80)
  175.                 di1=1;
  176.         else
  177.                 di1=0;
  178.         delay(4);
  179.         ck=1;
  180.         delay(4);
  181.         add<<=1;
  182.         ck=0;
  183.         delay(4);
  184.                
  185. }
  186. for(i=0;i<8;i++)
  187. {
  188.        
  189.         if(write_data&0x80)
  190.                 di1=1;
  191.         else
  192.                 di1=0;
  193.         delay(4);
  194.         ck=1;
  195.         delay(4);
  196.         write_data<<=1;
  197.         ck=0;
  198.         delay(4);
  199.                
  200. }
  201. cs=0;
  202. }
  203. void EW_enable(void)
  204. {
  205.         uchar i;
  206.         cs=1;
  207.         delay(4);
  208.        
  209.         di1=1;                         //1
  210.         delay(4);
  211.         ck=1;
  212.         delay(4);
  213.         ck=0;
  214.         delay(4);
  215.        
  216.         di1=0;                        //0
  217.         delay(4);
  218.         ck=1;
  219.         delay(4);
  220.         ck=0;
  221.         delay(4);
  222.        
  223.         di1=0;                        //0
  224.         delay(4);
  225.         ck=1;
  226.         delay(4);
  227.         ck=0;
  228.         delay(4);
  229.        
  230.         di1=1;                        //1
  231.         delay(4);
  232.         ck=1;
  233.         delay(4);
  234.         ck=0;
  235.         delay(4);
  236.        
  237.         di1=1;                        //1
  238.         delay(4);
  239.         ck=1;
  240.         delay(4);
  241.         ck=0;
  242.         delay(4);
  243.         for(i=0;i<5;i++)
  244.         {
  245.                  
  246.                 di1=1;                        //1
  247.                 delay(4);
  248.                 ck=1;
  249.                 delay(4);
  250.                 ck=0;
  251.                 delay(4);
  252.         }
  253.         delay(4);
  254.         cs=0;
  255. }

  256. void main(void)
  257. {
  258.     uint   l;
  259.     uchar address;
  260.     uchar bai,shi,ge,i,j,k;
  261.      ANCON0bits.ANSEL6=0;    //RE1(AN6)配置为数字IO
  262.      ANCON1=0x00;            //将部分带模拟输入功能的引脚设置为数字IO

  263.      //输出使用LAT寄存器,输入使用PORT寄存器
  264.      TRISDbits.TRISD4=0;     //PORD4配置为输出
  265.      TRISEbits.TRISE1=0;     //PORE1配置为输出
  266.      TRISC=0X80;
  267.      LCD_Init();
  268.      LCD_CLS();
  269.         EW_enable();
  270.          writedata(0x80,55);
  271.           for(l=0;l<10000;l++);
  272.           writedata(0x81,66);
  273.           for(l=0;l<10000;l++);
  274.           writedata(0x82,196);
  275.           for(l=0;l<10000;l++);
  276.           i=readdata(1);
  277.          
  278.          
  279.          //i=READ1(address);  /*把地址为address的内容读出并存放在dat中*/
  280.          bai=i/100+48;
  281.                 shi=i%100/10+48;
  282.                 ge=i%10+48;
  283.                 LCD_P8x16Char(0,0,bai);
  284.                 LCD_P8x16Char(8,0,shi);
  285.                 LCD_P8x16Char(16,0,ge);
  286.          address=2;
  287.          
  288.          j=readdata(2);  /*把地址为address的内容读出并存放在dat中*/
  289.          bai=j/100+48;
  290.                 shi=j%100/10+48;
  291.                 ge=j%10+48;
  292.                 LCD_P8x16Char(0,2,bai);
  293.                 LCD_P8x16Char(8,2,shi);
  294.                 LCD_P8x16Char(16,2,ge);
  295.          address=0;
  296.          k=0;
  297.          k=readdata(0);  /*把地址为address的内容读出并存放在dat中*/
  298.                 //nop;
  299.                 //nop;
  300.                 //EW_disable();
  301.                
  302.                 bai=k/100+48;
  303.                 shi=k%100/10+48;
  304.                 ge=k%10+48;
  305.                 LCD_P8x16Char(0,4,bai);
  306.                 LCD_P8x16Char(8,4,shi);
  307.                 LCD_P8x16Char(16,4,ge);
  308.      while(1)
  309.      {
  310.           LED1=0; LED2=1;    //点亮LED1     
  311.           MS_delay(500);
  312.                  
  313.           LED1=1; LED2=0;    //点亮LED2   
  314.           MS_delay(500);
  315.      }
  316. }



效果图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
小明的同学 发表于 2024-12-13 09:45 | 显示全部楼层
全部IO模拟啊,牛,哈哈,通用可移植。
xinpian101 发表于 2024-12-15 20:52 来自手机 | 显示全部楼层
这是一个什么芯片的读写?
lcczg 发表于 2024-12-16 09:18 | 显示全部楼层
这个EEPROM芯片的读写可以直接用单片机硬件外设SPI访问吗?
 楼主| 比神乐 发表于 2024-12-16 14:34 | 显示全部楼层
lcczg 发表于 2024-12-16 09:18
这个EEPROM芯片的读写可以直接用单片机硬件外设SPI访问吗?

可以
598330983 发表于 2025-1-12 18:15 | 显示全部楼层
SPI接口的就是用起来方便。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部