[通用8051核FLASH系列] 【芯圣电子HC89S105A测评报告】+另一种OLED

[复制链接]
2725|3
 楼主| 比神乐 发表于 2023-5-22 12:05 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-19 16:43 编辑

今天搞了一下另一种OLED。
SCL接P0.1,SDA接P0.0
主程序代码:
  1. #define ALLOCATE_EXTERN
  2. #include "HC89S105AC8.h"
  3. #include "oled.h"

  4. #define DEVICEADD 0x78 //24C02器件地址
  5. #define SCL P0_1             //I2C时钟控制位
  6. #define SDA P0_0             //I2C数据传送位

  7. unsigned char temp1,temp2,temp3;   //用于存放读写数据

  8. void Delay_ms(unsigned int fui_i);                                                                                //延时函数
  9. void IIC_Send_Byte(unsigned char fuc_Add, unsigned char fuc_Dat); //IIC发送一个字节的数据
  10. unsigned char IIC_Read_Byte(unsigned char fuc_Add);                                        //IIC读取一个字节的数据
  11. char CharData[] = {   "bbs.21ic.com" };
  12. char CharData1[] = {   "HC89S105A8" };
  13. /***************************************************************************************
  14.   * @实现效果        对24C02进行读写操作
  15. ***************************************************************************************/
  16. void main()
  17. {
  18. /************************************系统初始化****************************************/
  19.         CLKCON = 0x02;                           //选择内部高频RC为系统时钟,内部高频RC  Fosc=32MHz
  20.         CLKDIV = 0x02;                           //Fosc 2分频得到Fcpu,Fcpu=16MHz
  21.         
  22. /**********************************IIC配置初始化***************************************/        
  23.         P0M0 = P0M0 & 0xF0 | 0x0A;  //P00带上拉开漏输出
  24.         P0M0 = P0M0 & 0x0F | 0x80;  //P01推挽输出
  25.         SCL_MAP = 0x01;                           //SCL映射P01口
  26.         SDA_MAP = 0x00;                           //SDA映射P00口
  27.         IICCON = 0x40;                           //启动IIC模块
  28.         OLED_Init();
  29.         OLED_Clear();
  30.    
  31.     OLED_ShowString(10,0,(u8 *)CharData,16);
  32.     OLED_ShowCHinese(10,2,0);
  33.         OLED_ShowCHinese(26,2,1);
  34.         OLED_ShowCHinese(42,2,2);
  35.         OLED_ShowString(10,4,(u8 *)CharData1,16);
  36.         OLED_ShowCHinese(10,6,8);
  37.         OLED_ShowCHinese(26,6,9);
  38.         OLED_ShowCHinese(42,6,5);
  39.         OLED_ShowCHinese(58,6,6);
  40.         OLED_ShowCHinese(74,6,7);
  41.         while (1)
  42.         {
  43.         
  44.         }
  45. }

  46. /***************************************************************************************
  47.   * @说明          IIC发送一个字节的数据
  48.   *        @参数        fuc_Add:存储的地址
  49.   *                        fuc_Dat:存储的数据
  50.   * @返回值 无
  51.   * @注                无
  52. ***************************************************************************************/
  53. void IIC_Send_Byte(unsigned char fuc_Add, unsigned char fuc_Dat)
  54. {
  55.         IICCON &= ~0x08; //清除中断标志位

  56.         IICCON |= 0x20; //起始位发送起始信号

  57.         while ((!(IICCON & 0x08)) && (IICSTA != 0x08));
  58.         IICCON &= ~0x20;        //起始位停止起始信号
  59.         IICCON &= ~0x08;        //清除中断标志位
  60.         IICDAT = DEVICEADD; //写入器件地址
  61.         while (IICSTA != 0x18);
  62.         IICCON &= ~0x08;  //清除中断标志位
  63.         IICDAT = fuc_Add; //写入地址
  64.         while (IICSTA != 0x28);
  65.         IICCON &= ~0x08;  //清除中断标志位
  66.         IICDAT = fuc_Dat; //写入数据
  67.         while (IICSTA != 0x28);
  68.         IICCON &= ~0x08; //清除中断标志位
  69.         IICCON |= 0x10;         //停止位发送停止信号
  70. }

  71. /***************************************************************************************
  72.   * @说明          IIC读取一个字节的数据
  73.   *        @参数        fuc_Add:存储的地址
  74.   * @返回值 存储地址里面的数据
  75.   * @注                无
  76. ***************************************************************************************/
  77. unsigned char IIC_Read_Byte(unsigned char fuc_Add)
  78. {
  79.         unsigned char fuc_Dat;
  80.         IICCON &= ~0x08; //清除中断标志位
  81.         IICCON |= 0x20;         //起始位发送起始信号
  82.         while ((!(IICCON & 0x08)) && (IICSTA != 0x08));
  83.         IICCON &= ~0x20;        //起始位停止起始信号
  84.         IICCON &= ~0x08;        //清除中断标志位
  85.         IICDAT = DEVICEADD; //写入器件地址
  86.         while (IICSTA != 0x18);
  87.         IICCON &= ~0x08;  //清除中断标志位
  88.         IICDAT = fuc_Add; //写入读地址
  89.         while (IICSTA != 0x28);
  90.         IICCON &= ~0x08; //清除中断标志位

  91.         IICCON |= 0x20; //起始位发送起始信号
  92.         while ((!(IICCON & 0x08)) && (IICSTA != 0x08));
  93.         IICCON &= ~0x20;                   //起始位停止起始信号
  94.         IICCON &= ~0x08;                   //清除中断标志位
  95.         IICDAT = DEVICEADD | 0x01; //写入读指令
  96.         while (IICSTA != 0x40);
  97.         IICCON &= ~0x08; //清除中断标志位
  98.         while (IICSTA != 0x58);
  99.         fuc_Dat = IICDAT; //读入数据
  100.         IICCON &= ~0x08;  //清除中断标志位
  101.         IICCON |= 0x10;          //停止位发送停止信号

  102.         return fuc_Dat;
  103. }

  104. /***************************************************************************************
  105.   * @说明          延时函数
  106.   * @参数          fui_i : 延时时间
  107.   * @返回值 无
  108.   * @注         Fcpu = 16MHz,fui_i = 1时,延时时间约为1ms
  109. ***************************************************************************************/
  110. void Delay_ms(unsigned int fui_i)
  111. {
  112.         unsigned int fui_j;
  113.         for (; fui_i > 0; fui_i--)
  114.                 for (fui_j = 1596; fui_j > 0; fui_j--);
  115. }
OLED.C
  1. #include "oled.h"

  2. #define u8 unsigned char

  3. #define Max_Column 128
  4. //OLED鐨勬樉瀛?
  5. //瀛樻斁鏍煎紡濡備笅.
  6. //[0]0 1 2 3 ... 127        
  7. //[1]0 1 2 3 ... 127        
  8. //[2]0 1 2 3 ... 127        
  9. //[3]0 1 2 3 ... 127        
  10. //[4]0 1 2 3 ... 127        
  11. //[5]0 1 2 3 ... 127        
  12. //[6]0 1 2 3 ... 127        
  13. //[7]0 1 2 3 ... 127                           
  14. extern void IIC_Send_Byte(unsigned char fuc_Add, unsigned char fuc_Dat);

  15. void Delay1(unsigned long time)
  16. {
  17.     /*<UserCodeStart>*//*<SinOne-Tag><64>*/
  18.   for(;time>0;time--);
  19.    
  20.     /*<UserCodeEnd>*//*<SinOne-Tag><64>*/
  21. }
  22. /**
  23.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Write_I2C_Data 鍚慜LED鍐欏叆鏁版嵁
  24.   * @param  I2C_Data锛氭暟鎹?
  25.   * @retval 鏃?
  26.   */

  27. u8 TWI_WriteOneByte(u8 DeviceAddr,u8 DataAddr,u8 u8Data)
  28. {
  29.         IIC_Send_Byte(DataAddr, u8Data);
  30.         return 0;
  31. }        


  32. ////OLED娓呭睆
  33. void OLED_Clear()
  34. {
  35.     /*<UserCodeStart>*//*<SinOne-Tag><65>*/
  36.     unsigned int i,n;
  37.     for(i=0;i<8;i++)
  38.     {
  39.      TWI_WriteOneByte(0x78,0x00,0xb0+i);
  40.      TWI_WriteOneByte(0x78,0x00,0x00);
  41.      TWI_WriteOneByte(0x78,0x00,0x10);
  42.      for(n=0;n<128;n++)
  43.      {
  44.         TWI_WriteOneByte(0x78,0x40,0);
  45.       }
  46.     }
  47.    
  48.     /*<UserCodeEnd>*//*<SinOne-Tag><65>*/
  49. }
  50. ////OLED鍒濆鍖?
  51. void OLED_Init()
  52. {
  53.     /*<UserCodeStart>*//*<SinOne-Tag><66>*/
  54. Delay1(100);
  55. TWI_WriteOneByte(0x78,0x00,0xAE);
  56. TWI_WriteOneByte(0x78,0x00,0x00);
  57. TWI_WriteOneByte(0x78,0x00,0x10);
  58. TWI_WriteOneByte(0x78,0x00,0x40);
  59. TWI_WriteOneByte(0x78,0x00,0xB0);
  60. TWI_WriteOneByte(0x78,0x00,0x81);
  61. TWI_WriteOneByte(0x78,0x00,0xFF);
  62. TWI_WriteOneByte(0x78,0x00,0xA1);
  63. TWI_WriteOneByte(0x78,0x00,0xA6);
  64. TWI_WriteOneByte(0x78,0x00,0xA8);
  65. TWI_WriteOneByte(0x78,0x00,0x3F);
  66. TWI_WriteOneByte(0x78,0x00,0xC8);
  67. TWI_WriteOneByte(0x78,0x00,0xD3);
  68. TWI_WriteOneByte(0x78,0x00,0x00);

  69. TWI_WriteOneByte(0x78,0x00,0xD5);
  70. TWI_WriteOneByte(0x78,0x00,0x80);

  71. TWI_WriteOneByte(0x78,0x00,0xD8);
  72. TWI_WriteOneByte(0x78,0x00,0x05);

  73. TWI_WriteOneByte(0x78,0x00,0xD9);
  74. TWI_WriteOneByte(0x78,0x00,0xF1);

  75. TWI_WriteOneByte(0x78,0x00,0xDA);
  76. TWI_WriteOneByte(0x78,0x00,0x12);

  77. TWI_WriteOneByte(0x78,0x00,0xDB);
  78. TWI_WriteOneByte(0x78,0x00,0x30);

  79. TWI_WriteOneByte(0x78,0x00,0x8D);
  80. TWI_WriteOneByte(0x78,0x00,0x14);

  81. TWI_WriteOneByte(0x78,0x00,0xAF);
  82. Delay1(100);
  83.    
  84.     /*<UserCodeEnd>*//*<SinOne-Tag><66>*/
  85. }
  86. ////娓呴櫎鎸囧畾鍖哄煙瀛楃x0,y0,宸︿笂瑙掑潗鏍噚1,y1,鍙充笅瑙掑潗鏍?
  87. void OLED_PartClear(u8 x0,u8 y0,u8 x1,u8 y1)
  88. {
  89.     /*<UserCodeStart>*//*<SinOne-Tag><67>*/
  90.     u8 i,n;
  91.     for( i=x0;i<x1;i++)
  92.     {
  93.         for( n=y0;n<y1;n++)
  94.         {
  95.           TWI_WriteOneByte(0x78,0x00,0xb0+i);
  96.           TWI_WriteOneByte(0x78,0x00,((n&0xf0)>>4)|0x10);
  97.           TWI_WriteOneByte(0x78,0x00,(n&0x0f));
  98.           TWI_WriteOneByte(0x78,0x40,0);
  99.         }
  100.     }
  101.    
  102.     /*<UserCodeEnd>*//*<SinOne-Tag><67>*/
  103. }
  104. ////m^n鍑芥暟
  105. unsigned long oled_pow(u8 m,u8 n)
  106. {
  107.     /*<UserCodeStart>*//*<SinOne-Tag><68>*/
  108.     u32 result=1;         
  109.         while(n--)
  110.         {
  111.          result*=m;
  112.         }   
  113.         return result;
  114.    
  115.     /*<UserCodeEnd>*//*<SinOne-Tag><68>*/
  116. }
  117. ////鍧愭爣璁剧疆
  118. void OLED_Set_Pos(unsigned char x, unsigned char y)
  119. {
  120.     /*<UserCodeStart>*//*<SinOne-Tag><69>*/
  121.    TWI_WriteOneByte(0x78,0x00,0xb0+y);
  122.    TWI_WriteOneByte(0x78,0x00,((x&0xf0)>>4)|0x10);
  123.    TWI_WriteOneByte(0x78,0x00,(x&0x0f));
  124.    
  125.     /*<UserCodeEnd>*//*<SinOne-Tag><69>*/
  126. }
  127. ////鍦ㄦ寚瀹氫綅缃樉绀轰竴涓瓧绗?鍖呮嫭閮ㄥ垎瀛楃x:0~127y:0~8chr:瀛楃鍦板潃size:閫夋嫨瀛椾綋16/12
  128. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
  129. {
  130.     /*<UserCodeStart>*//*<SinOne-Tag><70>*/
  131.         unsigned char c=0,i=0;        
  132.                 c=chr-' ';//寰楀埌鍋忕Щ鍚庣殑鍊?               
  133.                 if(x>Max_Column-1)
  134.                 {
  135.                   x=0;
  136.                   y=y+2;
  137.                  }
  138.                 if(Char_Size ==16)
  139.                 {
  140.                         OLED_Set_Pos(x,y);        
  141.                         for(i=0;i<8;i++)
  142.                         {
  143.                       TWI_WriteOneByte(0x78,0x40,F8X16[c*16+i]);
  144.                     }
  145.                         OLED_Set_Pos(x,y+1);
  146.                         for(i=0;i<8;i++)
  147.                         {
  148.                           TWI_WriteOneByte(0x78,0x40,F8X16[c*16+i+8]);
  149.                          }
  150.                 }
  151.                 else
  152.                 {        
  153.                         OLED_Set_Pos(x,y);
  154.                         for(i=0;i<6;i++)
  155.                         {
  156.                           TWI_WriteOneByte(0x78,0x40,F6x8[c][i]);
  157.                          }                                
  158.                 }
  159.    
  160.     /*<UserCodeEnd>*//*<SinOne-Tag><70>*/
  161. }
  162. ////鏄剧ず姹夊瓧
  163. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  164. {
  165.     /*<UserCodeStart>*//*<SinOne-Tag><71>*/
  166.     u8 t,adder=0;
  167.     OLED_Set_Pos(x,y);        
  168.     for(t=0;t<16;t++)
  169.     {
  170.       TWI_WriteOneByte(0x78,0x40,Hzk[2*no][t]);
  171.           adder+=1;
  172.     }        
  173.         OLED_Set_Pos(x,y+1);        
  174.     for(t=0;t<16;t++)
  175.         {        
  176.           TWI_WriteOneByte(0x78,0x40,Hzk[2*no+1][t]);
  177.           adder+=1;
  178.     }        
  179.    
  180.     /*<UserCodeEnd>*//*<SinOne-Tag><71>*/
  181. }
  182. /******************************************************************************************************
  183. *鏄剧ず2涓暟瀛梮,y :璧风偣鍧愭爣len :鏁板瓧鐨勪綅鏁皊ize:瀛椾綋澶у皬num:鏁板€?0~429496729
  184. *5)
  185. ******************************************************************************************************/
  186. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
  187. {
  188.     /*<UserCodeStart>*//*<SinOne-Tag><72>*/
  189.     u8 t,temp;
  190.         u8 enshow=0;                                                   
  191.         for(t=0;t<len;t++)
  192.         {
  193.                 temp=(num/oled_pow(10,len-t-1))%10;
  194.                 if(enshow==0&&t<(len-1))
  195.                 {
  196.                         if(temp==0)
  197.                         {
  198.                                 OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  199.                                 continue;
  200.                         }
  201.                         else
  202.                            enshow=1;
  203.                 }
  204.                  OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  205.     }        
  206.    
  207.     /*<UserCodeEnd>*//*<SinOne-Tag><72>*/
  208. }
  209. ////鏄剧ず涓€涓瓧绗︿覆
  210. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
  211. {
  212.     /*<UserCodeStart>*//*<SinOne-Tag><73>*/
  213.     unsigned char j=0;
  214.         while(chr[j]!='\0')
  215.         {               
  216.            OLED_ShowChar(x,y,chr[j],Char_Size);
  217.            x+=8;
  218.            if(x>120)
  219.            {
  220.              x=0;
  221.              y+=2;
  222.            }
  223.            j++;
  224.         }
  225.    
  226.     /*<UserCodeEnd>*//*<SinOne-Tag><73>*/
  227. }
效果图:
12.jpg
classroom 发表于 2023-5-23 09:19 | 显示全部楼层
比神仙都快乐
 楼主| 比神乐 发表于 2023-5-23 09:20 | 显示全部楼层

我一点都不快乐。只不过我以前一个单位的名字叫比神乐
hjl714016 发表于 2023-11-2 15:05 | 显示全部楼层
不错,写得很详细。清屏8页(64)*128,应该是0.96吋
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部