找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3480|回复: 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 单片机教程网

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