久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8610|回復: 11
打印 上一主題 下一主題
收起左側

stc 8a 8f單片機硬件iic驅動0.96oled 源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:499469 發表于 2020-4-10 23:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
stc  8a或8f硬件iic驅動0.96oled
圖片就不上了  通過stc8f2k16s2實驗(晶振22.1184) 驅動正常
scl接P32,sda接P33(P_SW2 = 0xb0;)
寄存器P_SW2 可更改io口
程序有問題歡迎留言

單片機源程序如下:
  1. #include "STC8A.h"
  2. #include "oled.h"
  3. #include "oledfont.h"         
  4. #include "intrins.h"

  5. void iicInit()
  6. {
  7.           P_SW2 = 0xb0;   // SCL(3.2) SDA(3.3)
  8.     I2CCFG = 0xe0;  //開啟iic 主機模式 最高速度
  9.           I2CMSST = 0x00; //關中斷 待機模式
  10. }
  11. void delay_ms(unsigned int ms) //晶振22.1184
  12. {                        
  13.         while(ms)
  14.         {
  15.         unsigned char i=29, j=183;
  16.         do
  17.         {while (--j);}
  18.         while (--i);
  19.                 ms--;
  20.         }
  21.         return;
  22. }

  23. void Wait()  //等待
  24. {
  25.     while (!(I2CMSST & 0x40));
  26.     I2CMSST &= ~0x40;
  27. }
  28. void IIC_Start()
  29. {
  30.     I2CMSCR = 0x01;     //發送START命令
  31.     Wait();
  32. }

  33. void IIC_Stop()
  34. {
  35.     I2CMSCR = 0x06;     //發送STOP命令
  36.     Wait();
  37. }

  38. void IIC_Wait_Ack()
  39. {
  40.     I2CMSST = 0x00;                             //設置ACK信號
  41.     I2CMSCR = 0x05;                             //發送ACK命令
  42.     Wait();
  43. }

  44. void Write_IIC_Byte(unsigned char dat)
  45. {
  46.     I2CTXD = dat;         //寫數據到數據緩沖區
  47.     I2CMSCR = 0x02;       //發送SEND命令
  48.     Wait();
  49. }

  50. void Write_IIC_Command(unsigned char IIC_Command)
  51. {
  52.    IIC_Start();
  53.    Write_IIC_Byte(0x78);            //Slave address,SA0=0
  54.         IIC_Wait_Ack();        
  55.    Write_IIC_Byte(0x00);                        //write command
  56.         IIC_Wait_Ack();        
  57.    Write_IIC_Byte(IIC_Command);
  58.         IIC_Wait_Ack();        
  59.    IIC_Stop();
  60. }

  61. void Write_IIC_Data(unsigned char IIC_Data)
  62. {
  63.    IIC_Start();
  64.    Write_IIC_Byte(0x78);                        //D/C#=0; R/W#=0
  65.         IIC_Wait_Ack();        
  66.    Write_IIC_Byte(0x40);                        //write data
  67.         IIC_Wait_Ack();        
  68.    Write_IIC_Byte(IIC_Data);
  69.         IIC_Wait_Ack();        
  70.    IIC_Stop();
  71. }
  72. void OLED_WR_Byte(unsigned dat,unsigned cmd)
  73. {
  74.         if(cmd)
  75.                         {

  76.    Write_IIC_Data(dat);
  77.    
  78.                 }
  79.         else {
  80.    Write_IIC_Command(dat);
  81.                
  82.         }


  83. }

  84. /********************************************
  85. // fill_Picture
  86. ********************************************/
  87. //void fill_picture(unsigned char fill_Data)
  88. //{
  89. //        unsigned char m,n;
  90. //        for(m=0;m<8;m++)
  91. //        {
  92. //                OLED_WR_Byte(0xb0+m,0);                //page0-page1
  93. //                OLED_WR_Byte(0x00,0);                //low column start address
  94. //                OLED_WR_Byte(0x10,0);                //high column start address
  95. //                for(n=0;n<128;n++)
  96. //                        {
  97. //                                OLED_WR_Byte(fill_Data,1);
  98. //                        }
  99. //        }
  100. //}


  101. ///***********************Delay****************************************/
  102. //void Delay_50ms(unsigned int Del_50ms)
  103. //{
  104. //        unsigned int m;
  105. //        for(;Del_50ms>0;Del_50ms--)
  106. //                for(m=6245;m>0;m--);
  107. //}

  108. //void Delay_1ms(unsigned int Del_1ms)
  109. //{
  110. //        unsigned char j;
  111. //        while(Del_1ms--)
  112. //        {        
  113. //                for(j=0;j<123;j++);
  114. //        }
  115. //}

  116. //坐標設置

  117.         void OLED_Set_Pos(unsigned char x, unsigned char y)
  118. {         OLED_WR_Byte(0xb0+y,OLED_CMD);
  119.         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  120.         OLED_WR_Byte((x&0x0f),OLED_CMD);
  121. }            
  122. ////開啟OLED顯示   
  123. //void OLED_Display_On(void)
  124. //{
  125. //        OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  126. //        OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  127. //        OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  128. //}
  129. ////關閉OLED顯示     
  130. //void OLED_Display_Off(void)
  131. //{
  132. //        OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  133. //        OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  134. //        OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
  135. //}                                            
  136. //清屏函數,清完屏,整個屏幕是黑色的!和沒點亮一樣!!!         
  137. void OLED_Clear(void)  
  138. {  
  139.         u8 i,n;                    
  140.         for(i=0;i<8;i++)  
  141.         {  
  142.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //設置頁地址(0~7)
  143.                 OLED_WR_Byte (0x00,OLED_CMD);      //設置顯示位置—列低地址
  144.                 OLED_WR_Byte (0x10,OLED_CMD);      //設置顯示位置—列高地址   
  145.                 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  146.         } //更新顯示
  147. }
  148. //void OLED_On(void)  
  149. //{  
  150. //        u8 i,n;                    
  151. //        for(i=0;i<8;i++)  
  152. //        {  
  153. //                OLED_WR_Byte (0xb0+i,OLED_CMD);    //設置頁地址(0~7)
  154. //                OLED_WR_Byte (0x00,OLED_CMD);      //設置顯示位置—列低地址
  155. //                OLED_WR_Byte (0x10,OLED_CMD);      //設置顯示位置—列高地址   
  156. //                for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
  157. //        } //更新顯示
  158. //}
  159. //在指定位置顯示一個字符,包括部分字符
  160. //x:0~127
  161. //y:0~63
  162. //mode:0,反白顯示;1,正常顯示                                 
  163. //size:選擇字體 16/12
  164. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
  165. {              
  166.         unsigned char c=0,i=0;        
  167.                 c=chr-' ';//得到偏移后的值                        
  168.                 if(x>Max_Column-1){x=0;y=y+2;}
  169.                 if(Char_Size ==16)
  170.                         {
  171.                         OLED_Set_Pos(x,y);        
  172.                         for(i=0;i<8;i++)
  173.                         OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  174.                         OLED_Set_Pos(x,y+1);
  175.                         for(i=0;i<8;i++)
  176.                         OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  177.                         }
  178.                         else {        
  179.                                 OLED_Set_Pos(x,y);
  180.                                 for(i=0;i<6;i++)
  181.                                 OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  182.                                 
  183.                         }
  184. }

  185. //顯示單個數字
  186. void OLED_Showm(u8 x,u8 y,u32 num,u8 size2)
  187. {  
  188.         u8 i,f,g;
  189.         if(num>>15)//負溫度
  190.         {
  191.                 num=num&0x7fff;//高位清零
  192.           i=num/100;
  193.           f=num%100/10;
  194.           g=num%10;
  195.           OLED_ShowChar(x,y,'-',size2);
  196.                 OLED_ShowChar(x+size2/2,y,f+'0',size2);
  197.           OLED_ShowChar(x+size2,y,'.',size2);
  198.           OLED_ShowChar(x+size2+4,y,g+'0',size2);
  199. }
  200. else
  201. {
  202.    i=num/100;
  203.         f=num%100/10;
  204.         g=num%10;
  205.           OLED_ShowChar(x,y,i+'0',size2);
  206.                 OLED_ShowChar(x+size2/2,y,f+'0',size2);
  207.         OLED_ShowChar(x+size2,y,'.',size2);
  208.          OLED_ShowChar(x+size2+4,y,g+'0',size2);


  209. }}
  210. //m^n函數
  211. //u32 oled_pow(u8 m,u8 n)
  212. //{
  213. //        u32 result=1;         
  214. //        while(n--)result*=m;   
  215. //        return result;
  216. //}                                 
  217. //顯示2個數字
  218. //x,y :起點坐標         
  219. //len :數字的位數
  220. //size:字體大小
  221. //mode:模式        0,填充模式;1,疊加模式
  222. //num:數值(0~4294967295);                           
  223. //void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
  224. //{                 
  225. //        u8 t,temp;
  226. //        u8 enshow=0;                                                   
  227. //        for(t=0;t<len;t++)
  228. //        {
  229. //                temp=(num/oled_pow(10,len-t-1))%10;
  230. //                if(enshow==0&&t<(len-1))
  231. //                {
  232. //                        if(temp==0)
  233. //                        {
  234. //                                OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  235. //                                continue;
  236. //                        }else enshow=1;
  237. //                          
  238. //                }
  239. //                 OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  240. //        }
  241. //}
  242. //顯示一個字符號串
  243. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
  244. {
  245.         unsigned char j=0;
  246.         while (chr[j]!='\0')
  247.         {                OLED_ShowChar(x,y,chr[j],Char_Size);
  248.                         x+=8;
  249.                 if(x>120){x=0;y+=2;}
  250.                         j++;
  251.         }
  252. }
  253. //顯示漢字
  254. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  255. {                                 
  256.         u8 t,adder=0;
  257.         OLED_Set_Pos(x,y);        
  258.     for(t=0;t<16;t++)
  259.                 {
  260.                                 OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
  261.                                 adder+=1;
  262.      }        
  263.                 OLED_Set_Pos(x,y+1);        
  264.     for(t=0;t<16;t++)
  265.                         {        
  266.                                 OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
  267.                                 adder+=1;
  268.       }                                       
  269. }
  270. /***********功能描述:顯示顯示BMP圖片128×64起始點坐標(x,y),x的范圍0~127,y為頁的范圍0~7*****************/
  271. //void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  272. //{         
  273. // unsigned int j=0;
  274. // unsigned char x,y;
  275. //  
  276. //  if(y1%8==0) y=y1/8;      
  277. //  else y=y1/8+1;
  278. //        for(y=y0;y<y1;y++)
  279. //        {
  280. //                OLED_Set_Pos(x0,y);
  281. //    for(x=x0;x<x1;x++)
  282. //            {      
  283. //                    OLED_WR_Byte(BMP[j++],OLED_DATA);                    
  284. //            }
  285. //        }
  286. //}

  287. //初始化SSD1306                                            
  288. void OLED_Init(void)
  289. ……………………

  290. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

程序如果不好用,請看2樓和4樓的修改方案:
0.96OLED硬件iic.zip (113.51 KB, 下載次數: 235)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏14 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:748788 發表于 2021-8-21 16:28 | 只看該作者
測試了樓主的程序,開始屏幕不亮,對比stc的有關范例,加了一句:P_SW2 = 0x80; 就能正常顯示了。還是要感謝樓主的奉獻

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:963221 發表于 2021-9-1 17:34 | 只看該作者
為什么我就不對呢?請指教一下
回復

使用道具 舉報

地板
ID:504289 發表于 2021-9-20 16:36 | 只看該作者
需要對GPIO進行初始化上拉配置 才能使用
/******************** IO口配置 ********************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                                //結構定義

        GPIO_InitStructure.Pin  = GPIO_Pin_All;                        //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
        GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
        P3=0xFF;
}

0.96OLED硬件iic完美例子!!.zip

257.55 KB, 下載次數: 107, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:66287 發表于 2022-1-14 09:02 | 只看該作者

下載了樓上的附件,用壓縮包里的EXE文件燒錄,工作正常。
但自己編譯一下,生成的EXE文件燒錄就不能工作。
回復

使用道具 舉報

6#
ID:66287 發表于 2022-1-14 09:09 | 只看該作者
我用的芯片是STC8G1K08A,用壓縮包里的EXE文件燒錄工作正常。
回復

使用道具 舉報

7#
ID:912806 發表于 2022-1-14 11:07 | 只看該作者
https://github.com/IOsetting/FwL ... er/demo/i2c/ssd1306

STC8H 的 SSD1306 驅動演示, STC8G沒測, 應該也支持
回復

使用道具 舉報

8#
ID:66287 發表于 2022-1-20 11:09 | 只看該作者
折騰了幾天,找到了問題所在。
樓上的定義了一個GPIO_config();
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                                //結構定義
        GPIO_InitStructure.Pin  = GPIO_Pin_All;                        //指定要初始化的IO, GPIO_Pin_0 ~   GPIO_Pin_7, 或操作
        GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
        P3=0xFF;
}
但不能正常運行,所以一直不能運行。
本人在主程序中加入一句端口初始化語句,完美解決。
main()
{
   P3M1 = 0;   
   P3M0 = 0;   //P3設置為準雙向口
   IIC_Init(); //硬件iic初始化       
   OLED_Init();//初始化OLED
   ……
   ……
}
回復

使用道具 舉報

9#
ID:228723 發表于 2022-6-24 10:41 | 只看該作者
我的還是不顯示
回復

使用道具 舉報

10#
ID:921294 發表于 2022-9-27 20:13 | 只看該作者
int main(void)
{        u8 t;
        //GPIO_config();
         P3M1 = 0;   
         P3M0 = 0;   //P3設置為準雙向口
         iicInit();  //硬件iic初始化
搞了好久,把//GPIO_config();注釋掉,增加 P3M1 = 0;P3M0 = 0;   //P3設置為準雙向口,就可以顯示了,我用的芯片是STC8G1K08A SOP8
回復

使用道具 舉報

11#
ID:400910 發表于 2022-10-31 11:47 | 只看該作者
樓主這個地方的最高速度不應該是MSSPEED[5:0]=0時才是最高速度嗎?你這個I2CCFG = 0xe0;的 [MSSPEED]=32,怎么都不是最高速度啊?不太懂,希望大佬能解釋下
回復

使用道具 舉報

12#
ID:1088283 發表于 2023-7-12 21:31 | 只看該作者
bhjyqjs 發表于 2022-1-14 09:09
我用的芯片是STC8G1K08A,用壓縮包里的EXE文件燒錄工作正常。

使用config.h做頭文件,修改起來應該會比較方便
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜a v电影 | 福利视频一区二区 | 亚洲一区二区三区免费观看 | 国产福利在线 | 亚洲视频一区二区三区 | 91国内产香蕉 | 免费黄色片视频 | 美女一区 | 成人av观看 | 欧美色999 | 国产视频一区在线 | 亚洲一区二区三区在线视频 | 麻豆changesxxx国产 | 91伦理片 | 91pao对白在线播放 | 亚洲一区二区精品视频在线观看 | 超碰8| 国产精品国产精品国产专区不蜜 | 91亚洲国产成人久久精品网站 | 国产一区二区在线免费观看 | 日韩欧美久久 | 免费在线观看成年人视频 | 国产成人在线观看免费 | 夜夜骑天天干 | 玖玖色在线视频 | 国产精品一二三区在线观看 | 请别相信他免费喜剧电影在线观看 | 99精品免费久久久久久久久日本 | 99精品欧美一区二区蜜桃免费 | 福利精品在线观看 | 亚洲啊v在线 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 亚洲精品久久久蜜桃 | 午夜精品一区二区三区在线视 | 日韩第一页 | 国产91色在线 | 亚洲 | 亚洲免费精品 | 国产一区在线免费 | av在线免费观看网址 | 激情五月婷婷在线 | 免费xxxx大片国产在线 |