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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4587|回復: 1
收起左側

求教oled水平滾動顯示的程序(用指令寫的)

[復制鏈接]
ID:581455 發表于 2020-2-1 23:42 | 顯示全部樓層 |閱讀模式
51hei截圖20200201231235.png 我暫時不知道怎么處理了。
我的幾個問題:
1、怎么解決寫數據直接顯示而不是滾動。是我寫數據的過程有問題嗎?
2、數據是在0x2e之前還是之后寫。
  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. #define uchar unsigned char
  10. #define uint unsigned int
  11. #define ulong unsigned long

  12. uchar code bmp1[];



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

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

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


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


  64. /*LCD模塊初始化*/
  65. void initial_lcd()
  66. {
  67.         lcd_cs1=0;
  68.         Rom_CS = 1;
  69. //        lcd_reset=0;        /*低電平復位*/
  70.         delay(20);
  71.         //lcd_reset=1;                    /*復位完畢*/
  72.         delay(20);        
  73.         transfer_command_lcd(0xAE);   //顯示關
  74.         transfer_command_lcd(0x20);        //內存地址模式設置       
  75.         transfer_command_lcd(0x10);        //00,水平尋址模式;01,垂直尋址模式;10,頁地址模式 (RESET);11,無效
  76.         transfer_command_lcd(0xb0);        //設置頁開始地址0作為頁地址模式,0-7
  77.         transfer_command_lcd(0xc8);        //設置COM輸出掃描方向
  78.         transfer_command_lcd(0x00);//設置列開始地址0作為頁地址模式
  79.         transfer_command_lcd(0x10);//設置列地址0作為頁的開始地址
  80.         transfer_command_lcd(0x40);//設置顯示開始行0
  81.         transfer_command_lcd(0x81);//設置對比度
  82.         transfer_command_lcd(0x7f);//
  83.         transfer_command_lcd(0xa1);//--設置 segment 重映射 0 to 127
  84.         transfer_command_lcd(0xa6);//正常顯示
  85.         transfer_command_lcd(0xa8);//--set multiplex ratio(1 to 64)設置復用率
  86.         transfer_command_lcd(0x3F);//
  87.         transfer_command_lcd(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  88.         transfer_command_lcd(0xd3);//設置行顯示偏移
  89.         transfer_command_lcd(0x00);//無偏移
  90.         transfer_command_lcd(0xd5);//設置顯示時鐘分頻率、振蕩器頻率
  91.         transfer_command_lcd(0xf0);//11110000高四位為振蕩器頻率、低四位為顯示時鐘分頻率
  92.         transfer_command_lcd(0xd9);//設置重充電周期
  93.         transfer_command_lcd(0x22); //
  94.         transfer_command_lcd(0xda);//設置COM引腳硬件配置
  95.         transfer_command_lcd(0x12);
  96.         transfer_command_lcd(0xdb);//--設置vcomh
  97.         transfer_command_lcd(0x20);//0x20,0.77xVcc
  98.         transfer_command_lcd(0x8d);//--set DC-DC enable
  99.         transfer_command_lcd(0x14);//
  100.         transfer_command_lcd(0xaf);//顯示開
  101.         lcd_cs1=1;
  102. }

  103. /*
  104. 頁開始地址column:0~7;
  105. 列開始地址page:0~127;
  106. */
  107. void lcd_address(uchar page,uchar column)
  108. {

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

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

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



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


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

  182. /*
  183. i:向右0向左1
  184. a:滾屏開始行0-7
  185. b:滾屏時間間隔
  186. c:多少行滾屏1-8(a+c<8)
  187. dat:顯示的內容
  188. off_on:開關1開0關
  189. */
  190. void display_GB2312_string(uchar y,uchar x,uchar *text);

  191. void gundong(uchar *dp)
  192. {
  193.         uint i;
  194.         lcd_cs1=0;
  195.         Rom_CS = 1;
  196. //        display_graphic_16x16(0,32,dat);       
  197.         for (i=0;i<128;i++)
  198.         {       
  199.                 transfer_data_lcd(*dp);                                        /*寫數據到LCD,每寫完一個8位的數據后列地址自動加1*/
  200.                 dp++;
  201.         }
  202.        
  203.         transfer_command_lcd(0x2e);
  204. //        display_graphic_16x16(0,32,dat);
  205.         for (i=0;i<128;i++)
  206.         {       
  207.                 transfer_data_lcd(*dp);                                        /*寫數據到LCD,每寫完一個8位的數據后列地址自動加1*/
  208.                 dp++;
  209.         }
  210.         transfer_command_lcd(0x26);
  211.         transfer_command_lcd(0x00);
  212.         transfer_command_lcd(0x00);
  213.         transfer_command_lcd(0x07);
  214.         transfer_command_lcd(0x07);
  215.         transfer_command_lcd(0x00);
  216.         transfer_command_lcd(0xff);
  217.         transfer_command_lcd(0x2f);
  218.         lcd_cs1=1;
  219. }



  220. /*顯示5*7點陣圖像、ASCII, 或5x7點陣的自造字符、其他圖標*/
  221. //void display_graphic_5x7(uint page,uchar column,uchar *dp)
  222. //{
  223. //        uint col_cnt;
  224. //        uchar page_address;
  225. //        uchar column_address_L,column_address_H;
  226. //        page_address = 0xb0+page-1;
  227. //       
  228. //        lcd_cs1=0;       
  229. //       
  230. //        column_address_L =(column&0x0f)-1;
  231. //        column_address_H =((column>>4)&0x0f)+0x10;
  232. //       
  233. //        transfer_command_lcd(page_address);                 /*Set Page Address*/
  234. //        transfer_command_lcd(column_address_H);        /*Set MSB of column Address*/
  235. //        transfer_command_lcd(column_address_L);        /*Set LSB of column Address*/
  236. //       
  237. //        for (col_cnt=0;col_cnt<6;col_cnt++)
  238. //        {       
  239. //                transfer_data_lcd(*dp);
  240. //                dp++;
  241. //        }
  242. //        lcd_cs1=1;
  243. //}

  244. /****送指令到億陽字庫IC***/
  245. void send_command_to_ROM( uchar datu )
  246. {
  247.         uchar i;
  248.         for(i=0;i<8;i++ )
  249.         {
  250.                 if(datu&0x80)
  251.                         lcd_sid = 1;
  252.                 else
  253.                         lcd_sid = 0;
  254.                         datu = datu<<1;
  255.                         lcd_sclk=0;
  256.                         lcd_sclk=1;
  257.         }
  258. }

  259. /****從億陽字庫IC中取漢字或字符數據(1個字節)***/
  260. static uchar get_data_from_ROM( )
  261. {
  262.        
  263.         uchar i;
  264.         uchar ret_data=0;
  265.         lcd_sclk=1;
  266.         for(i=0;i<8;i++)
  267.         {
  268.                 Rom_OUT=1;
  269.                 lcd_sclk=0;
  270.                 ret_data=ret_data<<1;
  271.                 if( Rom_OUT )
  272.                         ret_data=ret_data+1;
  273.                 else
  274.                         ret_data=ret_data+0;
  275.                 lcd_sclk=1;
  276.         }
  277.         return(ret_data);
  278. }



  279. /*從相關地址(addrHigh:地址高字節,addrMid:地址中字節,addrLow:地址低字節)中連續讀出DataLen個字節的數據到 pBuff的地址*/
  280. /*連續讀取*/
  281. void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen )
  282. {
  283.         uchar i;
  284.         Rom_CS = 0;
  285.         lcd_cs1=1;       
  286.         lcd_sclk=0;
  287.         send_command_to_ROM(0x03);
  288.         send_command_to_ROM(addrHigh);
  289.         send_command_to_ROM(addrMid);
  290.         send_command_to_ROM(addrLow);
  291.         for(i = 0; i < DataLen; i++ )
  292.              *(pBuff+i) =get_data_from_ROM();
  293.         Rom_CS = 1;
  294. }


  295. /*顯示坐標*/

  296. ulong  fontaddr=0;
  297. void display_GB2312_string(uchar y,uchar x,uchar *text)//y為行地址 x為點陣像素漢字為16,ASCII碼符號為8
  298. {
  299.         uchar i= 0;
  300.         uchar addrHigh,addrMid,addrLow ;
  301.         uchar fontbuf[32];                       
  302.         while((text[i]>0x00))
  303.         {
  304.                 if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1))
  305.                 {                                               
  306.                         /*國標簡體(GB2312)漢字在億陽字庫IC中的地址由以下公式來計算:*/
  307.                         /*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/
  308.                         /*由于擔心8位單片機有乘法溢出問題,所以分三部取地址*/
  309.                         fontaddr = (text[i]- 0xb0)*94;
  310.                         fontaddr += (text[i+1]-0xa1)+846;
  311.                         fontaddr = (ulong)(fontaddr*32);
  312.                        
  313.                         addrHigh = (fontaddr&0xff0000)>>16;  /*地址的高8位,共24位*/
  314.                         addrMid = (fontaddr&0xff00)>>8;      /*地址的中8位,共24位*/
  315.                         addrLow = fontaddr&0xff;             /*地址的低8位,共24位*/
  316.                         get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取32個字節的數據,存到"fontbuf[32]"*/
  317.                         display_graphic_16x16(y,x,fontbuf);/*顯示漢字到LCD上,y為頁地址,x為列地址,fontbuf[]為數據*/
  318.                         i+=2;
  319.                         x+=16;
  320.                 }
  321.                 else if(((text[i]>=0xa1) &&(text[i]<=0xa3))&&(text[i+1]>=0xa1))
  322.                 {                                               
  323.                         /*國標簡體(GB2312)15x16點的字符在億陽字庫IC中的地址由以下公式來計算:*/
  324.                         /*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/
  325.                         /*由于擔心8位單片機有乘法溢出問題,所以分三部取地址*/
  326.                         fontaddr = (text[i]- 0xa1)*94;
  327.                         fontaddr += (text[i+1]-0xa1);
  328.                         fontaddr = (ulong)(fontaddr*32);
  329.                        
  330.                         addrHigh = (fontaddr&0xff0000)>>16;  /*地址的高8位,共24位*/
  331.                         addrMid = (fontaddr&0xff00)>>8;      /*地址的中8位,共24位*/
  332.                         addrLow = fontaddr&0xff;             /*地址的低8位,共24位*/
  333.                         get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取32個字節的數據,存到"fontbuf[32]"*/
  334.                         display_graphic_16x16(y,x,fontbuf);/*顯示漢字到LCD上,y為頁地址,x為列地址,fontbuf[]為數據*/
  335.                         i+=2;
  336.                         x+=16;
  337.                 }
  338.                 else if((text[i]>=0x20) &&(text[i]<=0x7e))       
  339.                 {                                               
  340.                         unsigned char fontbuf[16];                       
  341.                         fontaddr = (text[i]- 0x20);
  342.                         fontaddr = (unsigned long)(fontaddr*16);
  343.                         fontaddr = (unsigned long)(fontaddr+0x3cf80);                       
  344.                         addrHigh = (fontaddr&0xff0000)>>16;
  345.                         addrMid = (fontaddr&0xff00)>>8;
  346.                         addrLow = fontaddr&0xff;

  347.                         get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16 );/*取16個字節的數據,存到"fontbuf[32]"*/
  348.                        
  349.                         display_graphic_8x16(y,x,fontbuf);/*顯示8x16的ASCII字到LCD上,y為頁地址,x為列地址,fontbuf[]為數據*/
  350.                         i+=1;
  351.                         x+=8;
  352.                 }
  353.                 else
  354.                         i++;       
  355.         }
  356.        
  357. }

  358. //void display_string_5x7(uchar y,uchar x,uchar *text)
  359. //{
  360. //        unsigned char i= 0;
  361. //        unsigned char addrHigh,addrMid,addrLow ;
  362. //        while((text[i]>0x00))
  363. //        {
  364. //               
  365. //                if((text[i]>=0x20) &&(text[i]<=0x7e))       
  366. //                {                                               
  367. //                        unsigned char fontbuf[8];                       
  368. //                        fontaddr = (text[i]- 0x20);
  369. //                        fontaddr = (unsigned long)(fontaddr*8);
  370. //                        fontaddr = (unsigned long)(fontaddr+0x3bfc0);                       
  371. //                        addrHigh = (fontaddr&0xff0000)>>16;
  372. //                        addrMid = (fontaddr&0xff00)>>8;
  373. //                        addrLow = fontaddr&0xff;

  374. //                        get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,8);/*取8個字節的數據,存到"fontbuf[32]"*/
  375. //                       
  376. //                        display_graphic_5x7(y,x,fontbuf);/*顯示5x7的ASCII字到LCD上,y為頁地址,x為列地址,fontbuf[]為數據*/
  377. //                        i+=1;
  378. //                        x+=6;
  379. //                }
  380. //                else
  381. //                i++;       
  382. //        }
  383. //       
  384. //}
復制代碼

oled.zip

3.45 KB, 下載次數: 16

oled.h文件

回復

使用道具 舉報

ID:123289 發表于 2020-2-3 18:29 | 顯示全部樓層
腦子里要有方法,先畫個框圖吧。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜免费福利视频 | 北条麻妃国产九九九精品小说 | 成人精品一区亚洲午夜久久久 | 亚洲精品视频在线观看免费 | 中文字幕在线一区 | 国内自拍第一页 | 在线播放亚洲 | 成人做爰www免费看 午夜精品久久久久久久久久久久 | 一区二区三区小视频 | 亚洲人免费视频 | av在线亚洲天堂 | 日日干天天操 | 欧美一区视频 | 免费在线观看av | 91久久综合亚洲鲁鲁五月天 | 色www精品视频在线观看 | 免费国产视频在线观看 | 欧美一区二区在线 | 亚洲国产18 | 成人在线中文字幕 | 日韩精品一区二区三区中文字幕 | 成人免费小视频 | 午夜成人在线视频 | 91视频在线看 | 中文字幕在线一区二区三区 | 国产成人免费一区二区60岁 | 午夜视频一区 | 天天躁日日躁狠狠躁2018小说 | 日本视频在线播放 | 国产成人综合一区二区三区 | 亚洲色欧美另类 | 国产精品亚洲成在人线 | 欧美激情久久久久久 | 午夜小影院 | 久久久999精品 | 日韩一区二区在线视频 | 欧美日韩国产一区二区三区 | 91免费观看 | 欧美精品在线一区 | 中文字幕av色| 亚洲精品黄 |