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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc8單片機+8針oled驅動顯示ADC值源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:581455 發表于 2019-8-5 10:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
沒有搜到8針的oled,這個是我自己用的,僅供參考。
  1. #include <intrins.h>
  2. #include <STC8.H>

  3. sbit lcd_sclk=P5^0;  /*接口定義:lcd_sclk就是CLK*/
  4. sbit lcd_sid=P5^1;   /*接口定義:lcd_sid就是MOSI*/
  5. sbit lcd_rs=P5^2;    /*接口定義:lcd_rs就是DC*/
  6. sbit lcd_cs1=P5^3;   /*接口定義:lcd_cs1就是OLED的片選CS1*/
  7. sbit Rom_OUT=P5^4;   /*字庫IC接口定義:Rom_OUT就是FSO*/
  8. sbit Rom_CS=P5^5;    /*字庫IC接口定義Rom_CS就是字庫IC的CS2*/
  9. unsigned char code ASCII[] =    {'0','1','2','3','4','5','6','7','8','9'};



  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. #define ulong unsigned long

  13. uchar code bmp1[];



  14. /*寫指令到LCD模塊*/
  15. void transfer_command_lcd(int data1)   
  16. {
  17.         char i;
  18.         lcd_rs=0;
  19.         lcd_sclk=0;
  20.         for(i=0;i<8;i++)
  21.    {
  22.                
  23.                 if(data1&0x80) lcd_sid=1;
  24.                 else lcd_sid=0;
  25.                 lcd_sclk=1;
  26.                 _nop_();
  27.                 lcd_sclk=0;
  28.                  data1<<=1;
  29.    }
  30. }

  31. /*寫數據到LCD模塊*/
  32. void transfer_data_lcd(int data1)
  33. {
  34.         char i;
  35.         lcd_rs=1;
  36.         lcd_sclk=0;
  37.         for(i=0;i<8;i++)
  38.    {
  39.                
  40.                 if(data1&0x80) lcd_sid=1;
  41.                 else lcd_sid=0;
  42.                 lcd_sclk=1;
  43.                 _nop_();
  44.                 lcd_sclk=0;
  45.                  data1<<=1;
  46.    }
  47. }

  48. /*延時*/
  49. void delay(int n_ms)               
  50. {
  51. int j,k;
  52. for(j=0;j<n_ms;j++)
  53. for(k=0;k<110;k++);
  54. }


  55. /*等待一個按鍵,我的主板是用P2.0與GND之間接一個按鍵*/
  56. //void waitkey()
  57. //{
  58. // repeat:
  59. //          if (P2&0x01) goto repeat;
  60. //        else delay(6);
  61. //        if (P2&0x01) goto repeat;
  62. //        else
  63. //        delay(40);;
  64. //}


  65. /*LCD模塊初始化*/
  66. void initial_lcd()
  67. {
  68.         lcd_cs1=0;
  69.         Rom_CS = 1;
  70. //        lcd_reset=0;        /*低電平復位*/
  71.         delay(20);
  72.         //lcd_reset=1;                    /*復位完畢*/
  73.         delay(20);        
  74.         transfer_command_lcd(0xAE);   //display off
  75.         transfer_command_lcd(0x20);        //Set Memory Addressing Mode        
  76.         transfer_command_lcd(0x10);        //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
  77.         transfer_command_lcd(0xb0);        //Set Page Start Address for Page Addressing Mode,0-7
  78.         transfer_command_lcd(0xc8);        //Set COM Output Scan Direction
  79.         transfer_command_lcd(0x00);//---set low column address
  80.         transfer_command_lcd(0x10);//---set high column address
  81.         transfer_command_lcd(0x40);//--set start line address
  82.         transfer_command_lcd(0x81);//--set contrast control register
  83.         transfer_command_lcd(0x7f);
  84.         transfer_command_lcd(0xa1);//--set segment re-map 0 to 127
  85.         transfer_command_lcd(0xa6);//--set normal display
  86.         transfer_command_lcd(0xa8);//--set multiplex ratio(1 to 64)
  87.         transfer_command_lcd(0x3F);//
  88.         transfer_command_lcd(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  89.         transfer_command_lcd(0xd3);//-set display offset
  90.         transfer_command_lcd(0x00);//-not offset
  91.         transfer_command_lcd(0xd5);//--set display clock divide ratio/oscillator frequency
  92.         transfer_command_lcd(0xf0);//--set divide ratio
  93.         transfer_command_lcd(0xd9);//--set pre-charge period
  94.         transfer_command_lcd(0x22); //
  95.         transfer_command_lcd(0xda);//--set com pins hardware configuration
  96.         transfer_command_lcd(0x12);
  97.         transfer_command_lcd(0xdb);//--set vcomh
  98.         transfer_command_lcd(0x20);//0x20,0.77xVcc
  99.         transfer_command_lcd(0x8d);//--set DC-DC enable
  100.         transfer_command_lcd(0x14);//
  101.         transfer_command_lcd(0xaf);//--turn on oled panel
  102.         lcd_cs1=1;
  103. }

  104. void lcd_address(uchar page,uchar column)
  105. {

  106.         transfer_command_lcd(0xb0 + column);   /*設置頁地址*/
  107.         transfer_command_lcd(((page & 0xf0) >> 4) | 0x10);        /*設置列地址的高4位*/
  108.         transfer_command_lcd((page & 0x0f) | 0x00);        /*設置列地址的低4位*/        
  109. }

  110. /*全屏清屏*/
  111. void clear_screen()
  112. {
  113.         unsigned char i,j;
  114.         lcd_cs1=0;
  115.         Rom_CS = 1;        
  116.         for(i=0;i<8;i++)
  117.         {
  118.                 transfer_command_lcd(0xb0+i);
  119.                 transfer_command_lcd(0x00);
  120.                 transfer_command_lcd(0x10);
  121.                 for(j=0;j<128;j++)
  122.                 {
  123.                           transfer_data_lcd(0x00);
  124.                 }
  125.         }
  126.          lcd_cs1=1;
  127. }

  128. /*顯示128x64點陣圖像*/
  129. //void display_128x64(uchar *dp)
  130. //{
  131. //        uint i,j;
  132. //        lcd_cs1=0;
  133. //        for(j=0;j<8;j++)
  134. //        {
  135. //                lcd_address(0,j);
  136. //                for (i=0;i<128;i++)
  137. //                {        
  138. //                        transfer_data_lcd(*dp);                                        /*寫數據到LCD,每寫完一個8位的數據后列地址自動加1*/
  139. //                        dp++;
  140. //                }
  141. //        }
  142. //        lcd_cs1=1;
  143. //}


  144. /*顯示16x16點陣圖像、漢字、生僻字或16x16點陣的其他圖標*/
  145. void display_graphic_16x16(uint page,uint column,uchar *dp)
  146. {
  147.         uint i,j;
  148.          lcd_cs1=0;
  149.         Rom_CS = 1;         
  150.         for(j=2;j>0;j--)
  151.         {
  152.                 lcd_address(column,page);
  153.                 for (i=0;i<16;i++)
  154.                 {        
  155.                         transfer_data_lcd(*dp);                                        /*寫數據到LCD,每寫完一個8位的數據后列地址自動加1*/
  156.                         dp++;
  157.                 }
  158.                 page++;
  159.         }
  160.         lcd_cs1=1;
  161. }


  162. /*顯示8x16點陣圖像、ASCII, 或8x16點陣的自造字符、其他圖標*/
  163. void display_graphic_8x16(uint page,uchar column,uchar *dp)
  164. {
  165.         uint i,j;
  166.         lcd_cs1=0;        
  167.         for(j=2;j>0;j--)
  168.         {
  169.                 lcd_address(column,page);
  170.                 for (i=0;i<8;i++)
  171.                 {        
  172.                         transfer_data_lcd(*dp);                                        /*寫數據到LCD,每寫完一個8位的數據后列地址自動加1*/
  173.                         dp++;
  174.                 }
  175.                 page++;
  176.         }
  177.         lcd_cs1=1;
  178. }


  179. /*顯示5*7點陣圖像、ASCII, 或5x7點陣的自造字符、其他圖標*/
  180. //void display_graphic_5x7(uint page,uchar column,uchar *dp)
  181. //{
  182. //        uint col_cnt;
  183. //        uchar page_address;
  184. //        uchar column_address_L,column_address_H;
  185. //        page_address = 0xb0+page-1;
  186. //        
  187. //        lcd_cs1=0;        
  188. //        
  189. //        column_address_L =(column&0x0f)-1;
  190. //        column_address_H =((column>>4)&0x0f)+0x10;
  191. //        
  192. //        transfer_command_lcd(page_address);                 /*Set Page Address*/
  193. //        transfer_command_lcd(column_address_H);        /*Set MSB of column Address*/
  194. //        transfer_command_lcd(column_address_L);        /*Set LSB of column Address*/
  195. //        
  196. //        for (col_cnt=0;col_cnt<6;col_cnt++)
  197. //        {        
  198. //                transfer_data_lcd(*dp);
  199. //                dp++;
  200. //        }
  201. //        lcd_cs1=1;
  202. //}

  203. /****送指令到億陽字庫IC***/
  204. void send_command_to_ROM( uchar datu )
  205. {
  206.         uchar i;
  207.         for(i=0;i<8;i++ )
  208.         {
  209.                 if(datu&0x80)
  210.                         lcd_sid = 1;
  211.                 else
  212.                         lcd_sid = 0;
  213.                         datu = datu<<1;
  214.                         lcd_sclk=0;
  215.                         lcd_sclk=1;
  216.         }
  217. }

  218. /****從億陽字庫IC中取漢字或字符數據(1個字節)***/
  219. static uchar get_data_from_ROM( )
  220. {
  221.         
  222.         uchar i;
  223.         uchar ret_data=0;
  224.         lcd_sclk=1;
  225.         for(i=0;i<8;i++)
  226.         {
  227.                 Rom_OUT=1;
  228.                 lcd_sclk=0;
  229.                 ret_data=ret_data<<1;
  230.                 if( Rom_OUT )
  231.                         ret_data=ret_data+1;
  232.                 else
  233.                         ret_data=ret_data+0;
  234.                 lcd_sclk=1;
  235.         }
  236.         return(ret_data);
  237. }



  238. /*從相關地址(addrHigh:地址高字節,addrMid:地址中字節,addrLow:地址低字節)中連續讀出DataLen個字節的數據到 pBuff的地址*/
  239. /*連續讀取*/
  240. void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen )
  241. {
  242.         uchar i;
  243.         Rom_CS = 0;
  244.         lcd_cs1=1;        
  245.         lcd_sclk=0;
  246.         send_command_to_ROM(0x03);
  247.         send_command_to_ROM(addrHigh);
  248.         send_command_to_ROM(addrMid);
  249.         send_command_to_ROM(addrLow);
  250.         for(i = 0; i < DataLen; i++ )
  251.              *(pBuff+i) =get_data_from_ROM();
  252.         Rom_CS = 1;
  253. }


  254. /*顯示坐標*/

  255. ulong  fontaddr=0;
  256. void display_GB2312_string(uchar y,uchar x,uchar *text)//y為行地址 x為點陣像素漢字為16,ASCII碼符號為8
  257. {
  258.         uchar i= 0;
  259.         uchar addrHigh,addrMid,addrLow ;
  260.         uchar fontbuf[32];                        
  261.         while((text[i]>0x00))
  262.         {
  263.                 if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1))
  264.                 {                                                
  265.                         /*國標簡體(GB2312)漢字在億陽字庫IC中的地址由以下公式來計算:*/
  266.                         /*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/
  267.                         /*由于擔心8位單片機有乘法溢出問題,所以分三部取地址*/
  268.                         fontaddr = (text[i]- 0xb0)*94;
  269.                         fontaddr += (text[i+1]-0xa1)+846;
  270.                         fontaddr = (ulong)(fontaddr*32);
  271.                         
  272.                         addrHigh = (fontaddr&0xff0000)>>16;  /*地址的高8位,共24位*/
  273.                         addrMid = (fontaddr&0xff00)>>8;      /*地址的中8位,共24位*/
  274.                         addrLow = fontaddr&0xff;             /*地址的低8位,共24位*/
  275.                         get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取32個字節的數據,存到"fontbuf[32]"*/
  276.                         display_graphic_16x16(y,x,fontbuf);/*顯示漢字到LCD上,y為頁地址,x為列地址,fontbuf[]為數據*/
  277.                         i+=2;
  278.                         x+=16;
  279.                 }
  280.                 else if(((text[i]>=0xa1) &&(text[i]<=0xa3))&&(text[i+1]>=0xa1))
  281.                 {                                                
  282.                         /*國標簡體(GB2312)15x16點的字符在億陽字庫IC中的地址由以下公式來計算:*/
  283.                         /*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/
  284.                         /*由于擔心8位單片機有乘法溢出問題,所以分三部取地址*/
  285.                         fontaddr = (text[i]- 0xa1)*94;
  286.                         fontaddr += (text[i+1]-0xa1);
  287.                         fontaddr = (ulong)(fontaddr*32);
  288.                         
  289.                         addrHigh = (fontaddr&0xff0000)>>16;  /*地址的高8位,共24位*/
  290.                         addrMid = (fontaddr&0xff00)>>8;      /*地址的中8位,共24位*/
  291.                         addrLow = fontaddr&0xff;             /*地址的低8位,共24位*/
  292.                         get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取32個字節的數據,存到"fontbuf[32]"*/
  293.                         display_graphic_16x16(y,x,fontbuf);/*顯示漢字到LCD上,y為頁地址,x為列地址,fontbuf[]為數據*/
  294.                         i+=2;
  295.                         x+=16;
  296.                 }
  297.                 else if((text[i]>=0x20) &&(text[i]<=0x7e))        
  298.                 {                                                
  299.                         unsigned char fontbuf[16];                        
  300.                         fontaddr = (text[i]- 0x20);
  301.                         fontaddr = (unsigned long)(fontaddr*16);
  302.                         fontaddr = (unsigned long)(fontaddr+0x3cf80);                        
  303.                         addrHigh = (fontaddr&0xff0000)>>16;
  304.                         addrMid = (fontaddr&0xff00)>>8;
  305.                         addrLow = fontaddr&0xff;

  306.                         get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16 );/*取16個字節的數據,存到"fontbuf[32]"*/
  307.                         
  308.                         display_graphic_8x16(y,x,fontbuf);/*顯示8x16的ASCII字到LCD上,y為頁地址,x為列地址,fontbuf[]為數據*/
  309.                         i+=1;
  310.                         x+=8;
  311.                 }
  312.                 else
  313.                         i++;        
  314.         }
  315.         
  316. }

  317. //void display_string_5x7(uchar y,uchar x,uchar *text)
  318. //{
  319. //        unsigned char i= 0;
  320. //        unsigned char addrHigh,addrMid,addrLow ;
  321. //        while((text[i]>0x00))
  322. //        {
  323. //               
  324. //                if((text[i]>=0x20) &&(text[i]<=0x7e))        
  325. //                {                                                
  326. //                        unsigned char fontbuf[8];                        
  327. //                        fontaddr = (text[i]- 0x20);
  328. //                        fontaddr = (unsigned long)(fontaddr*8);
  329. //                        fontaddr = (unsigned long)(fontaddr+0x3bfc0);                        
  330. //                        addrHigh = (fontaddr&0xff0000)>>16;
  331. //                        addrMid = (fontaddr&0xff00)>>8;
  332. //                        addrLow = fontaddr&0xff;

  333. //                        get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,8);/*取8個字節的數據,存到"fontbuf[32]"*/
  334. //                        
  335. //                        display_graphic_5x7(y,x,fontbuf);/*顯示5x7的ASCII字到LCD上,y為頁地址,x為列地址,fontbuf[]為數據*/
  336. //                        i+=1;
  337. //                        x+=6;
  338. //                }
  339. //                else
  340. //                i++;        
  341. //        }
  342. //        
  343. //}


  344. void  xianshiyiwei (uchar y,uchar x,uchar i) //顯示一個字符
  345.         
  346. {   
  347.     uchar j[4];  
  348.    j[0]=ASCII[i];
  349.         display_GB2312_string(y,x,j);        
  350. }


  351. void displaynum (uchar y,uchar x,uint num)//顯示一串字符
  352. {
  353.   if(1000<=num&&num<=9999)
  354.         {
  355.           xianshiyiwei(y,x,num%10000/1000);               
  356.           xianshiyiwei(y,x+8,num%1000/100);
  357.                 xianshiyiwei(y,x+16,num%100/10);
  358.                 xianshiyiwei(y,x+24,num%10);
  359.         }
  360.         if(100<=num&&num<=999)
  361.         {
  362.           xianshiyiwei(y,x,num%1000/100);
  363.           xianshiyiwei(y,x+8,num%100/10);
  364.                 xianshiyiwei(y,x+16,num%10);
  365.         }
  366.         if(10<=num&&num<=99)
  367.         {
  368.           xianshiyiwei(y,x,num%100/10);
  369.                 xianshiyiwei(y,x+8,num%10);
  370.         }
  371.         if(0<=num&&num<=9)
  372.         {
  373.           xianshiyiwei(y,x,num);
  374.         }
  375. }


復制代碼
全部資料51hei下載地址:
ADC_OLED.zip (53.12 KB, 下載次數: 51)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:4240 發表于 2019-10-14 16:37 | 只看該作者
正在玩1.3寸的OLED,還沒有點亮啊;看看你的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久吹潮日韩动画 | 日本三级做a全过程在线观看 | www.日韩在线 | 日韩欧美在线一区 | 欧美一区视频 | 国产精品久久久久久婷婷天堂 | 久久国产精品免费一区二区三区 | 欧美综合一区 | 九九福利| 一区二区免费 | 久久综合一区 | www.伊人.com| caoporn地址 | 亚洲一区视频在线 | 嫩草伊人 | 日韩精品免费视频 | 精品久久久久久亚洲精品 | 精品国产一区二区在线 | 九九热免费在线观看 | 成人av看片 | 欧美黑人激情 | 天天操夜夜拍 | 国产激情在线播放 | 97国产精品视频 | 久久久久国产一区二区三区 | 欧美国产一区二区三区 | 中文字幕在线看第二 | 亚洲 欧美 综合 | 亚洲成人在线免费 | 成人av一区 | 精品无码久久久久国产 | 中文字幕精品一区二区三区精品 | 欧美一区二区在线观看视频 | 天天综合国产 | 欧美久久国产 | 午夜二区| 日本三级电影免费观看 | 日本一区二区在线视频 | 超碰导航| 久久成人高清视频 | 欧美一区二区三区久久精品 |