找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1819|回复: 9
打印 上一主题 下一主题
收起左侧

求教单片机这个错“(209) type conflict”怎么发生的?怎么解决?谢谢

[复制链接]
跳转到指定楼层
楼主
求教这个错“(209) type conflict”怎么发生,怎么解决?谢谢!(PIC16F877A, SPI连接0.96OLD屏)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:277550 发表于 2021-11-3 13:43 | 只看该作者
检查:  数据类型 uchar 定义过了吗
回复

使用道具 举报

板凳
ID:313048 发表于 2021-11-3 13:51 | 只看该作者
你这个ComTable是个数组,你的writeCommand这个写命令后面的括号内不应该是(0XB0|ComTable[i])?
回复

使用道具 举报

地板
ID:967119 发表于 2021-11-3 13:58 | 只看该作者
devcang 发表于 2021-11-3 13:43
检查:  数据类型 uchar 定义过了吗

定义过。
回复

使用道具 举报

5#
ID:967119 发表于 2021-11-3 13:59 | 只看该作者
AUG 发表于 2021-11-3 13:51
你这个ComTable是个数组,你的writeCommand这个写命令后面的括号内不应该是(0XB0|ComTable)?

哦,我看看。 网上51的,准备移植到PIC。
回复

使用道具 举报

6#
ID:967119 发表于 2021-11-3 14:28 | 只看该作者
AUG 发表于 2021-11-3 13:51
你这个ComTable是个数组,你的writeCommand这个写命令后面的括号内不应该是(0XB0|ComTable)?

对,照你的改后不报错了。谢谢!
又有下面这个错,请指教下:

回复

使用道具 举报

7#
ID:967119 发表于 2021-11-3 14:32 | 只看该作者
本帖最后由 cczjw 于 2021-11-3 14:37 编辑
AUG 发表于 2021-11-3 13:51
你这个ComTable是个数组,你的writeCommand这个写命令后面的括号内不应该是(0XB0|ComTable)?

对,照你的改后不报错了。谢谢!又有下面这个错,请指教下:


若去掉ROM就是这个错:



回复

使用道具 举报

8#
ID:453974 发表于 2021-11-3 21:53 | 只看该作者
源程序发进来吧
回复

使用道具 举报

9#
ID:967119 发表于 2021-11-4 16:32 | 只看该作者

源程序发进来吧


1、下面这个错查出原因应该是RAM放不下6个汉字。只留2个汉字就不报错了。但为什么不能用上一句  "uchar rom font[]=" 把字库放 ROM 呢(会报错)?


2、PIC16F877A SPI 的 3线与4线的SPI模式要怎样设置呢?

谢谢!
源程序:已在下一贴直接放了文本,可不下载这个压缩包: mainSPI_oled12864_max7210.rar (4.2 KB, 下载次数: 3)
回复

使用道具 举报

10#
ID:967119 发表于 2021-11-4 17:08 | 只看该作者
  1. /*******************************************************************************
  2. 文件名:mainSPI_oled12864_max7210-3.c
  3. 单片机型号:        PICl6F877A
  4. 晶振频率:        4MHz
  5. 功能:                OLED 与使用MAX7219串行驱动8位共阴极LED数码管同显
  6. ********************************************************************************/

  7. //#include<pic.h>
  8. //#include<pic16f877a.h>
  9. #include<pic16f87x.h>

  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. #define SPISCK_DIR                TRISC3                 //SPI时钟SCK
  13. #define SPISCK                        RC3                        //SPI时钟SCK
  14. #define SPIMISO_DIR         TRISC4                 //SPI数据输入SDI
  15. #define SPIMISO                        RC4                 //SPI数据输入SDI
  16. #define SPIMOSI_DIR                TRISC5                 //SPI数据输出SDO
  17. #define SPIMOSI                        RC5                        //SPI数据输出SDO
  18. #define SPISS_DIR                TRISC1                //SPI片选SS
  19. #define SPISS                         RC1                 //SPI片选SS

  20. //#define OLED_RST_DIR         TRISC2                 //OLED复位
  21. //#define OLED_RST                RC2                 //OLED复位

  22. //#define        OLED_SI SPIMOSI        //RC5-串行数据输入、输出端
  23. //#define        OLED_SCL SPISCK        //RC3-同步时钟输入端        
  24. //#define        OLED_A0 SPIMISO        //RC4-选择命令还是数据
  25. //#define        OLED_CS SPISS        //RC1-片选

  26. #define RES_DIR         TRISC2                 //OLED复位
  27. #define RES                        RC2                 //OLED复位

  28. #define        OLED_SCL         SPISCK                //RC3-同步时钟输入端
  29. #define        OLED_SI         SPIMOSI                //RC5-串行数据输入、输出端
  30. #define        OLED_A0         SPIMISO                //RC4-选择命令还是数据
  31. #define        OLED_CS1         SPISS                //RC1-片选

  32. #define LCD_SS_DIR                 TRISC6        //LCD片选,输出
  33. #define LCD_SS                        RC6         //LCD片选

  34. uchar LCD_code[10]={0x30,0x6d,0x5b,0x30,0x7F,0x5f,0x6d,0x79};        //12518623
  35. //{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x71,0x70b};                        //表示不译方式0~9
  36. //B码方式数字0~9时,uchar tab[10]={0,1,2,3,4,5,6,7,8,9};

  37. void initiate_SPI(void)        //SPI初始化程序
  38. {
  39.         SSPCON=0x00;
  40.         SSPSTAT=0x00;                 //清空配置寄存器
  41.         SPISCK_DIR=0;                 //置SCK为输出
  42.         SPIMISO_DIR=1;                 //*** SDI为自动控制,本行可省略
  43.         SPIMOSI_DIR=0;                 //置SDO为输出
  44.         SPISS_DIR=0;                //OLED_SS为输出
  45.         SPISS=1;                        //OLED挂起

  46.         RES_DIR=0;                        //置RST为输出

  47.         LCD_SS_DIR=0;                //置LCD_SS为输出
  48.         LCD_SS=1;                         //LCD_SS挂起

  49.         CKP=0;                                //时钟闲置为低电平
  50.         CKE=1;                                 //为上升沿发送数据        *//
  51.         SMP=0;                                //在输出中间采样输入        *//
  52.         SSPM3=0; SSPM2=0;        //Fosc/16
  53.         SSPM1=0; SSPM1=1;
  54.         SSPIF=0;
  55.         SSPIE= 0;                        //关中断
  56.         SSPEN=1;                        //SPI使能
  57. }
  58.         
  59. void SPItransfer(uchar data)         //SPI数据传输
  60. {
  61.         WCOL=0;                                //清发送冲突标志位
  62.         SSPIF=0;                        //清标志位
  63.         SSPBUF=data;                //发送数据
  64.         while(!SSPIF);                 //等待发送完毕
  65.         SSPIF=0;                         //*** 清标志位,本行可省略
  66. }


  67. //** 以下LCD专用
  68. void Max7219_write(uchar address,uchar data)        //写入MAX7219,LCD专用!!!
  69. {
  70.         SPISS=1;
  71.         LCD_SS=0;                                 //LCD_SS选中
  72.         SPItransfer(address);         //写人地址
  73.         SPItransfer(data);                //写入数据
  74.         LCD_SS=1;
  75. }

  76. void Max7219_init(void)                //LCD专用!!!
  77. {
  78.         Max7219_write(0x0c,0x01);                //0x0e为关断模式寄存器;0x01表示显示器处于工作状态
  79.         Max7219_write(0x0a,0x0f);                //0x0a为亮度调节寄存器;0x0f使数码管显示亮度为最亮
  80.         Max7219_write(0x09,0x00);
  81.         //0x09为译码模式选择寄存器;0x00为非译码方式;0xf为选择8位BCD-B译码模式
  82.         Max7219_write(0x0b,0x07);                //0x0b为扫描限制寄存器;0x07表示可接8个LED数码管
  83. }

  84. void display(uchar * p) //数码管8位显示,LCD专用!!!
  85. {
  86.         uchar i;
  87.         for(i=0;i<8;i++)
  88.         {
  89.                 Max7219_write(i+1,*(p+i));
  90.         }
  91. }
  92. //** 以上LCD专用


  93. /*************************************************************************************************/
  94. /*--------------------------------------LCD功能定义----------------------------------------------*/
  95. /*************************************************************************************************/
  96. //uchar code ComTable[]={3,2,1,0,7,6,5,4,};
  97. uchar ComTable[]={3,2,1,0,7,6,5,4,};

  98. /*LCM显示开关设定*/
  99. #define DISPLAY_ON()           WriteCommand(0xaf)   // Display on, 显示开
  100. #define DISPLAY_OFF()          WriteCommand(0xae)   // Display off,显示关

  101. /*LCM显示ADC设定*/
  102. #define SET_ADC()              WriteCommand(0xa1)   // Reverse disrect (SEG131-SEG0,正向
  103. #define CLEAR_ADC()            WriteCommand(0xa0)   // Normal disrect (SEG0-SEG131),逆向

  104. /*LCM反显设定*/
  105. #define REVERSE_DISPLAY_ON()   WriteCommand(0xa7)   // Reverse display : 0 illuminated,白字黑背景
  106. #define REVERSE_DISPLAY_OFF()  WriteCommand(0xa6)   // Normal display :  1 illuminated, 黑字白背景

  107. /*LCM显示黑屏设定*/
  108. #define ENTIRE_DISPLAY_ON()    WriteCommand(0xa5)   // Entire dislay   Force whole LCD point
  109. #define ENTIRE_DISPLAY_OFF()   WriteCommand(0xa4)   // Normal display

  110. /*LCM显示偏压设定 */
  111. #define SET_BIAS()             WriteCommand(0xa3)   // bias 1
  112. #define CLEAR_BIAS()           WriteCommand(0xa2)   // bias 0

  113. /*LCM */
  114. #define SET_MODIFY_READ()      WriteCommand(0xe0)   // Stop automatic increment of the column address by the read instruction
  115. #define RESET_MODIFY_READ()    WriteCommand(0xee)   // Cancel Modify_read, column address return to its initial value just before the Set Modify Read instruction is started

  116. /*LCM复位 */
  117. #define RESET()                WriteCommand(0xe2)

  118. /*LCM显示输出模式选择*/
  119. #define SET_SHL()              WriteCommand(0xc8)   // SHL 1,COM63-COM0 逆方向->从右到左显示
  120. #define CLEAR_SHL()            WriteCommand(0xc0)   // SHL 0,COM0-COM63 顺方向->从左到右显示

  121. /*LCMLCM工作频率选择*/
  122. #define SET_OSC()              WriteCommand(0xE4)  //
  123. #define CLEAR_OSC()            WriteCommand(0xE5)  //

  124. /*************************************************************************************************/
  125. /*---------------------------------------8*16字模------------------------------------------------*/
  126. /*************************************************************************************************/
  127. //uchar rom font1[]=
  128. uchar font1[]=
  129. {
  130. /*--  文字:  测  --*/
  131. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  132. 0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
  133. 0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,

  134. /*--  文字:  试  --*/
  135. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  136. 0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
  137. 0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00,};
  138. /*--  文字:  测  --*/
  139. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  140. //0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
  141. //0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,

  142. /*--  文字:  试  --*/
  143. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  144. //0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
  145. //0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00,
  146. /*--  文字:  测  --*/
  147. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  148. //0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
  149. //0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,

  150. /*--  文字:  试  --*/
  151. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  152. //0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
  153. //0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00,
  154. //};
  155. /*************************************************************************************************/
  156. /*--------------------------------------LCM写数据函数--------------------------------------------*/
  157. /*************************************************************************************************/

  158. void Write_Data(uchar dat)
  159. {
  160.     uchar i;
  161.     uchar z;
  162.     OLED_CS1= 0;
  163.         OLED_A0 = 1;
  164.         for(i=0;i<8;i++)
  165.         {
  166.                 OLED_SCL = 0;
  167.                 //OLED_SI = dat && 0x80;//取最高位
  168.                 OLED_SI=(dat&0x80)==0?0:1;
  169.                 z=OLED_SI;
  170.                 dat <<= 1;        //左移
  171.                 OLED_SCL = 1;
  172.         }
  173.         OLED_CS1= 1;     
  174. }

  175. /*************************************************************************************************/
  176. /*------------------------------------LCM写指令函数----------------------------------------------*/
  177. /*************************************************************************************************/
  178. void WriteCommand(uchar cmd)
  179. {
  180.         uchar i;
  181.         OLED_SCL = 1;
  182.         OLED_SCL = 0;
  183.         OLED_CS1= 0;
  184.         OLED_A0 = 0;
  185.         for(i=0;i<8;i++)
  186.         {
  187.                 OLED_SI = cmd && 0x80;//取最高位         
  188.                 OLED_SCL = 1;
  189.                 OLED_SCL = 0;
  190.                 cmd <<= 1;//左移
  191.         }
  192.         OLED_CS1= 1;      
  193. }

  194. /*************************************************************************************************/
  195. /*--------------------------------------LCM页基址设置--------------------------------------------*/
  196. /*************************************************************************************************/
  197. void Set_Page_Address(uchar add)
  198. {
  199.     add=0xb0|add;
  200.     WriteCommand(add);
  201. }
  202. /*************************************************************************************************/
  203. /*--------------------------------------LCM写数据函数--------------------------------------------*/
  204. /*************************************************************************************************/
  205. void Set_Column_Address(uchar add)
  206. {
  207.     WriteCommand((0x10|(add>>4)));
  208.         WriteCommand((0x0f&add));
  209.         return;
  210. }

  211. /*************************************************************************************************/
  212. /*----------------------------------------LCM清屏函数--------------------------------------------*/
  213. /*************************************************************************************************/
  214. void LcmClear( void )
  215. {
  216.         uchar i,j;
  217.         WriteCommand(0x40);                           //Set Display Start Line = com0
  218.         for(i=0;i<8;i++)
  219.         {
  220.                 WriteCommand(0xB0|ComTable[i]);
  221.                 WriteCommand(0x10);                   //Set Column Address = 0
  222.                 WriteCommand(0x01);            //Colum from 1 -> 129 auto add
  223.                 for(j=0;j<132;j++)
  224.                 {
  225.                         Write_Data( 0 );       //写入0
  226.                 }
  227.         }
  228. }
  229. /**************************************************************************************************/
  230. /*----------------------------------------延时函数------------------------------------------------*/
  231. /**************************************************************************************************/
  232. void Delay(uint n)
  233. {
  234.     while(n--);
  235. }
  236. /**************************************************************************************************/
  237. /*----------------------------------------LCM电源控制项设定函数-----------------------------------*/
  238. /**************************************************************************************************/
  239. void Power_Control(uchar vol)
  240. {
  241.     WriteCommand((0x28|vol));
  242. }
  243. /**************************************************************************************************/
  244. /*----------------------------------------LCM偏置电压函数-----------------------------------------*/
  245. /**************************************************************************************************/
  246. void Regulor_Resistor_Select(uchar r)
  247. {
  248.     WriteCommand((0x20|r));
  249. }
  250. /**************************************************************************************************/
  251. /*----------------------------------------LCM电量设置函数-----------------------------------------*/
  252. /**************************************************************************************************/
  253. void Set_Contrast_Control_Register(uchar mod)
  254. {
  255.     WriteCommand(0x81);
  256.         WriteCommand(mod);
  257. }
  258. /**************************************************************************************************/
  259. /*----------------------------------------显示起始行定义函数--------------------------------------*/
  260. /**************************************************************************************************/
  261. void Initial_Dispay_Line(uchar line)
  262. {
  263.     line|=0x40;
  264.     WriteCommand(line);
  265.         return;
  266. }
  267. /**************************************************************************************************/
  268. /*----------------------------------------LCM初始化函数-------------------------------------------*/
  269. /**************************************************************************************************/
  270. void LcmInitial( void )
  271. {
  272.         RESET();
  273.         DISPLAY_OFF();
  274.         LcmClear();
  275.         Delay(1000);
  276.         OLED_CS1=1;
  277.     SET_ADC();                                     /*LCM显示ADC设定,顺方向 */
  278.     CLEAR_SHL();                                       /*LCM公共输出模式选择,顺方向 */
  279.     SET_BIAS();                                        /*LCM显示偏压设定(取中间值) */
  280.     Power_Control(0x07);                        /*LCM电源控制项设定,这里全开 */
  281.     Regulor_Resistor_Select(0x04);              /*调整V0电阻比率,这里折中*/
  282.     Set_Contrast_Control_Register(0x28);          //NT7534绿0x28//ST7565蓝0x0a
  283.         Initial_Dispay_Line(0x00);                 /*开显示*/
  284.         DISPLAY_ON();
  285. }
  286. /**************************************************************************************************/
  287. /*--------------------------------------LCM汉字显示函数-------------------------------------------*/
  288. /**************************************************************************************************/
  289. void Display_Chinese(uchar ft[],uchar x,uchar y)        //字库数组,起始行,起始列
  290. {
  291.         uchar i,j,k,num=0;
  292.         i=x;
  293.         for(i;i<x+2;i++)          //行
  294.         {
  295.                 num=i<<7;
  296.                 num=num>>3;
  297.                 Set_Page_Address(i);
  298.                 Set_Column_Address(y);//列地址
  299.                 for(j=0;j<0x02;j++)   //行字数
  300.                 {
  301.                         for(k=0;k<0x10;k++)
  302.                         {
  303.                                 Write_Data(ft[num+k]);
  304.                         }
  305.                         num+=0x20;
  306.                 }
  307.         }
  308. }


  309. //------------------------------------------------------------------------------
  310. int main(void)
  311. {
  312.         //dat=0x55;
  313.         Write_Data(0x55);
  314.         uchar i=0;
  315.         initiate_SPI(); //SPI初始化
  316.         Max7219_init();        //LCD初始化
  317.         LcmInitial();        //OLED初始化
  318.         while(1)
  319.         {
  320.                 LcmClear();                                                //OLED清屏
  321.                 Delay(100);
  322.                 DISPLAY_ON();
  323.                 REVERSE_DISPLAY_OFF();
  324.                 Display_Chinese(font1,4,0);                //OLED显示
  325.                 display(LCD_code);                                //LCD显示
  326.         }
  327. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表