找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2660|回复: 3
收起左侧

atmega128单片机 spi模式,OLED屏幕不亮

[复制链接]
ID:307782 发表于 2019-9-2 22:58 | 显示全部楼层 |阅读模式
50黑币
拜托帮忙看一下我的oled屏幕一直不亮,芯片是atmega128的  oled走的是spi模式,现在真的搞得头晕,实在找不到原因为啥子不亮。以下是oled的代码
  1. #include <iom128.h>
  2. #include <delay.h>
  3. #include <oledfont.h>

  4. //8位LED灯控制端口定义,连接在PE口,灌电流模式
  5. #define LED                    PORTE                                       //PE口接8个LED灯
  6. #define LEDDDR                DDRE                                                        //PE口方向寄存器
  7. #define  LED4_0              PORTE &= ~(1<<PE3)          //D4亮
  8. #define  LED4_1              PORTE |= (1<<PE3)           //D4灭

  9. #define  u8 unsigned char
  10. #define  u32 unsigned int
  11. #define OLED_CMD  0        //写命令
  12. #define OLED_DATA 1        //写数据

  13. #define OLED_RST_Clr() PORTE &= ~(1 << PE6)
  14. #define OLED_RST_Set() PORTE |= (1 << PE6)

  15. #define OLED_DC_Clr()  PORTE &= ~(1 << PE5)
  16. #define OLED_DC_Set()  PORTE |= (1 << PE5)

  17. #define OLED_SCLK_Clr() PORTB &= ~(1 << PB1)
  18. #define OLED_SCLK_Set() PORTB |= (1 << PB1)

  19. #define OLED_SDIN_Clr() PORTB &= ~(1 << PB2)
  20. #define OLED_SDIN_Set() PORTB |= (1 << PB2)

  21. #define SIZE 16
  22. #define XLevelL                0x02
  23. #define XLevelH                0x10
  24. #define Max_Column        128
  25. #define Max_Row                64
  26. #define        Brightness        0xFF
  27. #define X_WIDTH         128
  28. #define Y_WIDTH         64

  29. u8 OLED_GRAM[8][128];  //8页 128列



  30. void OLED_WR_Byte(u8 dat,u8 cmd);
  31. void OLED_Set_Pos(unsigned char x, unsigned char y) ;
  32. void OLED_Set_Pos(unsigned char x, unsigned char y) ;
  33. void OLED_Display_On(void);
  34. void OLED_Display_Off(void);
  35. void OLED_Clear(void);
  36. void OLED_DrawPoint(u8 x,u8 y,u8 t);
  37. void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
  38. void OLED_ShowChar(u8 x,u8 y,u8 chr);
  39. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2);
  40. void OLED_ShowString(u8 x,u8 y, u8 *p);         
  41. void OLED_Set_Pos(unsigned char x, unsigned char y);
  42. void OLED_ShowCHinese(u8 x,u8 y,u8 no);
  43. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
  44. void OLED_Init(void);
  45. void system_init();



  46. void system_init()
  47. {

  48.   LEDDDR=0xff;    //设置PE口为输出

  49.   LED=0xff;        //初始状态为高,关闭8个LED灯

  50. }
  51. //向SSD1306写入一个字节单位
  52. //dat:要写入的数据/命令
  53. //cmd:数据/命令标志  0命令  1数据
  54. void OLED_WR_Byte(u8 dat,u8 cmd)
  55. {
  56.   u8 i;                          
  57.   if(cmd)
  58.     OLED_DC_Set();
  59.   else
  60.     OLED_DC_Clr();                  
  61.   //OLED_CS_Clr();
  62.   for(i=0;i<8;i++)
  63.   {                          
  64.     OLED_SCLK_Clr();
  65.     if(dat&0x80)
  66.     {
  67.       OLED_SDIN_Set();
  68.     }
  69.     else  OLED_SDIN_Clr();
  70.     OLED_SCLK_Set();
  71.     dat<<=1;   
  72.   }                                                   
  73.   //OLED_CS_Set();
  74.   OLED_DC_Set();            
  75. }

  76. void OLED_Set_Pos(unsigned char x, unsigned char y) //坐标位置
  77. {
  78.   OLED_WR_Byte(0xb0+y,OLED_CMD);//页
  79.   OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//高四位
  80.   OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); //低四位
  81. }  


  82. //开启OLED显示   
  83. void OLED_Display_On(void)
  84. {
  85.   OLED_WR_Byte(0X8D,OLED_CMD);  //电荷泵设置
  86.   OLED_WR_Byte(0X14,OLED_CMD);  //打开电荷泵
  87.   OLED_WR_Byte(0XAF,OLED_CMD);  //开启显示
  88. }
  89. //关闭OLED显示   
  90. void OLED_Display_Off(void)
  91. {
  92.   OLED_WR_Byte(0X8D,OLED_CMD);
  93.   OLED_WR_Byte(0X10,OLED_CMD);//关  A2
  94.   OLED_WR_Byte(0XAE,OLED_CMD);
  95. }                                            
  96. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!         
  97. void OLED_Clear(void)  
  98. {  
  99.   u8 i,n;                    
  100.   for(i=0;i<8;i++)  
  101.   {  
  102.     OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
  103.     OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
  104.     OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
  105.     for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  106.   } //更新显示
  107. }


  108. //在指定位置显示一个字符,包括部分字符
  109. //x:0~127
  110. //y:0~63
  111. //mode:0,反白显示;1,正常显示                                 
  112. //size:选择字体 16/12
  113. void OLED_ShowChar(u8 x,u8 y,u8 chr)
  114. {              
  115.   unsigned char c=0,i=0;        
  116.   c=chr-' ';//得到偏移后的值                        
  117.   if(x>Max_Column-1){x=0;y=y+2;}
  118.   if(SIZE ==16)
  119.   {
  120.   OLED_Set_Pos(x,y);        
  121.   for(i=0;i<8;i++)
  122.   OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  123.   OLED_Set_Pos(x,y+1);
  124.   for(i=0;i<8;i++)
  125.   OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  126.   }
  127.   else
  128.   {        
  129.     OLED_Set_Pos(x,y+1);
  130.     for(i=0;i<6;i++)
  131.     OLED_WR_Byte(F6x8[c][i],OLED_DATA);

  132.   }
  133. }
  134. //m^n函数
  135. u32 oled_pow(u8 m,u8 n)
  136. {
  137.   u32 result=1;         
  138.   while(n--)result*=m;   
  139.   return result;
  140. }                                 
  141. //显示2个数字
  142. //x,y :起点坐标         
  143. //len :数字的位数
  144. //size:字体大小
  145. //mode:模式        0,填充模式;1,叠加模式
  146. //num:数值(0~4294967295);                           
  147. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
  148. {                 
  149.   u8 t,temp;
  150.   u8 enshow=0;                                                   
  151.   for(t=0;t<len;t++)
  152.   {
  153.     temp=(num/oled_pow(10,len-t-1))%10;
  154.     if(enshow==0&&t<(len-1))
  155.     {
  156.       if(temp==0)
  157.       {
  158.         OLED_ShowChar(x+(size2/2)*t,y,' ');
  159.         //OLED_ShowChar(x+(size2/2)*t,y,' ',size2);//IIC程序中的
  160.         continue;
  161.       }else enshow=1;

  162.     }
  163.     OLED_ShowChar(x+(size2/2)*t,y,temp+'0');
  164.   }
  165. }
  166. //显示一个字符号串
  167. void OLED_ShowString(u8 x,u8 y,u8 *chr)
  168. {
  169.   unsigned char j=0;
  170.   while (chr[j]!='\0')
  171.   {               
  172.   OLED_ShowChar(x,y,chr[j]);
  173.   x+=8;
  174.   if(x>120){x=0;y+=2;}
  175.   j++;
  176.   }
  177. }
  178. //显示汉字
  179. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  180. {                                 
  181.   u8 t,adder=0;
  182.   OLED_Set_Pos(x,y);        
  183.   for(t=0;t<16;t++)
  184.   {
  185.     OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
  186.     adder+=1;
  187.    }        
  188.    OLED_Set_Pos(x,y+1);        
  189.    for(t=0;t<16;t++)
  190.     {        
  191.       OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
  192.       adder+=1;
  193.     }                                       
  194. }
  195. /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
  196. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  197. {         
  198. unsigned int j=0;
  199. unsigned char x,y;

  200.   if(y1%8==0) y=y1/8;      
  201.   else y=y1/8+1;
  202.   for(y=y0;y<y1;y++)
  203.   {
  204.     OLED_Set_Pos(x0,y);
  205.     for(x=x0;x<x1;x++)
  206.     {      
  207.       OLED_WR_Byte(BMP[j++],OLED_DATA);                    
  208.     }
  209.   }
  210. }


  211. //初始化SSD1306                                            
  212. void OLED_Init(void)
  213. {
  214. //OLED_CS_Set();
  215.   OLED_RST_Set();
  216.   delay_ms(100);
  217.   OLED_RST_Clr();
  218.   delay_ms(100);
  219.   OLED_RST_Set();
  220.   OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
  221.   OLED_WR_Byte(0x00,OLED_CMD);//---set low column address低列地址
  222.   OLED_WR_Byte(0x10,OLED_CMD);//---set high column address高列地址
  223.   OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)起始行地址
  224.   OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register对比度
  225.   OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness对比度/亮度值
  226.   OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  227.   OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  228.   OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display A6:正常/A7:反相
  229.   OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)驱动路数
  230.   OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty驱动路数值
  231.   OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)设置显示偏移
  232.   OLED_WR_Byte(0x00,OLED_CMD);//-not offset设置显示偏移值
  233.   OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency 设置时钟分频因子,震荡频率
  234.   OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
  235.   OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period设置预充电周期
  236.   OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  237.   OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration设置COM硬件引脚配置
  238.   OLED_WR_Byte(0x12,OLED_CMD);
  239.   OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh设置VCOMH倍率
  240.   //OLED_WR_Byte(0x30,OLED_CMD);//Set VCOM Deselect Level
  241.   OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
  242.   OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)设置内存地址模式
  243.   OLED_WR_Byte(0x02,OLED_CMD);//[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
  244.   OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable电荷泵设置///////////手册上没找到
  245.   OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disablebit2,开启/关闭
  246.   OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
  247.   OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 设置显示方式;bit0:1,反相显示;0,正常显示
  248.   OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel开启显示         

  249.   OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
  250.   OLED_Clear();
  251.         //OLED_Set_Pos(0,0);         
  252. }   


  253. int main(void)
  254. {
  255.   u8 t;
  256.   system_init();
  257.   OLED_Init();
  258.   OLED_Clear();
  259. //  OLED_ShowString(30,0,"OLED TEST");
  260. //  OLED_ShowString(8,2,"ZHONGJINGYUAN");  
  261. //  OLED_ShowString(20,4,"2014/05/01");  
  262. //  OLED_ShowString(0,6,"ASCII:");  
  263. //  OLED_ShowString(63,6,"CODE:");  
  264. //  t=' ';



  265.   while(1)
  266.     {        
  267.       LED = 0xFF;
  268.       PORTE &= ~(1<<PE3);
  269.       OLED_Clear();
  270.       OLED_ShowCHinese(0,0,0);//中
  271.       OLED_ShowCHinese(18,0,1);//景
  272.       OLED_ShowCHinese(36,0,2);//园
  273.       OLED_ShowCHinese(54,0,3);//电
  274.       OLED_ShowCHinese(72,0,4);//子
  275.       OLED_ShowCHinese(90,0,5);//科
  276.       OLED_ShowCHinese(108,0,6);//技
  277.      }

  278. }
复制代码




回复

使用道具 举报

ID:307782 发表于 2019-9-4 18:09 | 显示全部楼层
更贴,,,,犯了一个超级超级低级的错误。。。。。。。。。。没有初始化io,真是都不想讲自己了
回复

使用道具 举报

ID:592135 发表于 2019-9-11 17:08 | 显示全部楼层
楼主F8X16[]数组 的内容是什么呀 可以发给我吗?
回复

使用道具 举报

ID:894664 发表于 2021-3-21 16:41 来自手机 | 显示全部楼层
请问一下IO口在哪里初始化
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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