返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[IDE] 瑞萨RL78/G15的功能扩展方法

[复制链接]
 楼主| jinglixixi 发表于 2023-9-19 16:05 | 显示全部楼层 |阅读模式
<
本帖最后由 jinglixixi 于 2023-9-19 16:11 编辑

#申请原创# @21小跑堂

通过Arduino IDE开发环境的构建,就为瑞萨RL78/G15开发板的功能扩展敞开了大门。
1)LED模块控制
为掌握I/O口的使用,可通过扩展接口来控制LED模块,其测试程序及上传结果如图1所示。
1.jpg
图1 测试程序及上传


由于LED模块是由引脚13来控制,在完成连接的情况下,其造型效果如图2和图3所示。
2.jpg
图2 点亮LED模块

3.jpg
图3熄灭LED模块

2)触摸模块检测
除了使用I/O口来输出控制信号,还可使用I/O口来检测引脚所处状态,在连接触摸模块的情况下,通过图4所示的程序可控制LED模块的亮灭。
4.jpg
图4 控制程序

5.jpg
图5 空闲状态


6.jpg
图6 触控状态

3)OLED屏驱动
对于瑞萨RL78/G15开发板来说,为它配置一个显示器件是十分必要的,由于该开发板的引脚资源比较少,这里就为它配置了一个I2C接口的OLED屏,其显示分辨率为128*64像素点。
该OLED屏与开发板的连接关系为:
SCL---P22 (A1)
SDA---P02 (A2)

为便于输出高低电平信号,所定义的语句为:
#defineSCL_high  digitalWrite(15, HIGH)
#defineSCL_low   digitalWrite(15, LOW)
#defineSDA_high  digitalWrite(16, HIGH)
#defineSDA_low   digitalWrite(16, LOW)
以I/O口模拟I2C发送字节数据的函数为:
  1. void Write_IIC_Byte(unsigned char IIC_Byte)
  2. {
  3.     unsigned char i;
  4.     unsigned char m,da;
  5.     da=IIC_Byte;
  6.     SCL_low;
  7.     for(i=0;i<8;i++)
  8.     {
  9.         m=da;
  10.         m=m&0x80;
  11.         if(m==0x80)
  12.         {
  13.             SDA_high;
  14.         }
  15.         else  SDA_low;
  16.         da=da<<1;
  17.         SCL_high;
  18.         SCL_low;
  19.      }
  20. }

该显示屏的清屏函数为:
  1. void OLED_Clear(void)
  2. {
  3.     uint8_t i,n;
  4.     for(i=0;i<8;i++)
  5.     {
  6.         OLED_WR_Byte (0xb0+i,OLED_CMD);
  7.         OLED_WR_Byte (0x00,OLED_CMD);
  8.         OLED_WR_Byte (0x10,OLED_CMD);
  9.         for(n=0;n<128;n++) OLED_WR_Byte(0,OLED_DATA);
  10.     }
  11. }


为便于检测驱动效果,可将清屏的数据改为0XF0,这样若在显示屏上显示相间的水平线,则说明显示驱动有效。
7.jpg
图7 测试效果

在驱动有效的情况下,通过添加字符显示函数可实现字符的显示,该函数的具体内容为:
  1. void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
  2. {
  3.       unsigned char c=0,i=0;
  4.       c=chr-' ';
  5.      if(x>Max_Column-1){x=0;y=y+2;}
  6.      if(Char_Size ==16)
  7.      {
  8.             OLED_Set_Pos(x,y);
  9.             for(i=0;i<8;i++)
  10.             OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  11.             OLED_Set_Pos(x,y+1);
  12.             for(i=0;i<8;i++)
  13.             OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  14.       }
  15. }

所使用的字库结构为:
unsigned charF8X16[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,
  …
}

受芯片程序空间的制约,需对字库进行相应地删减和压缩,否则会无法完成编译。
以字符显示函数为基础,通过数值显示函数的添加,则完成数据显示的需要,其具体的内容为:
  1. void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
  2. {
  3.     uint8_t t,temp;
  4.     uint8_t enshow=0;
  5.     for(t=0;t<len;t++)
  6.     {
  7.         temp=(num/oled_pow(10,len-t-1))%10;
  8.         if(enshow==0&&t<(len-1))
  9.         {
  10.             if(temp==0)
  11.             {
  12.                 OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  13.                 continue;
  14.             }
  15.             else enshow=1;
  16.         }
  17.         OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  18.     }
  19. }

有字符和数值显示函数的支持,相应的初始设置函数和循环处理函数为:
  1. void setup() {
  2.   // initialize digital pin LED_BUILTIN as an output.
  3.   pinMode(4, OUTPUT);
  4.   pinMode(13, OUTPUT);
  5.   pinMode(15, OUTPUT);
  6.   pinMode(16, OUTPUT);
  7.   OLED_Init();
  8.   OLED_Clear();
  9.   OLED_ShowChar(16,0,'C',16);
  10.   OLED_ShowChar(24,0,'D',16);
  11.   OLED_ShowNum(32,0,78,2,16);
  12.   OLED_ShowChar(48,0,'/',16);
  13.   OLED_ShowChar(56,0,'E',16);
  14.   OLED_ShowNum(64,0,15,2,16);
  15.   OLED_ShowNum(16,4,1234567890,10,16);
  16. }

  17. void loop() {
  18.   digitalWrite(4, HIGH);   // turn the LED on (HIGH is the voltage level)
  19.   digitalWrite(13, HIGH);
  20.   delay(1000);           // wait for a second
  21.   digitalWrite(4, LOW);    // turn the LED off by making the voltage LOW
  22.   digitalWrite(13, LOW);
  23.   delay(1000);           // wait for a second
  24. }

经程序的编译和上传,其显示效果如图8所示。
8.jpg
图8 显示效果

4)数据采集

以显示程序为基础,通过添加ADC数据采集功能,就可直接观察采集的数据结果,相应的循环处理函数为:
  1. void loop() {
  2.   digitalWrite(4, HIGH);    // turn the LED on (HIGH is the voltage level)
  3.   digitalWrite(13, HIGH);
  4.   delay(500);            // wait for a second
  5.   digitalWrite(4, LOW);    // turn the LED off by making the voltage LOW
  6.   digitalWrite(13, LOW);
  7.   delay(500);            // wait for a second
  8.   sensorValue = analogRead(A0);
  9.   OLED_ShowNum(40,4,sensorValue,4,16);
  10. }

经程序的编译和上传,其显示效果如图9和图10所示。
9.jpg
图9 悬空检测

10.jpg
图10 检测3.3V电压

5)电子时钟
由于瑞萨RL78/G15在片内并没有配置RTC计时器,因此要实现电子时钟功能,就只好依靠延时程序来解决。

实现电子时钟功能的初始设置函数和循环处理函数为:
  1. void setup() {
  2.   pinMode(4, OUTPUT);
  3.   pinMode(13, OUTPUT);
  4.   pinMode(15, OUTPUT);
  5.   pinMode(16, OUTPUT);
  6.   OLED_Init();
  7.   OLED_Clear();
  8.   OLED_ShowChar(16,0,'A',16);
  9.   OLED_ShowChar(24,0,'B',16);
  10.   OLED_ShowNum(32,0,78,2,16);
  11.   OLED_ShowChar(48,0,'/',16);
  12.   OLED_ShowChar(56,0,'C',16);
  13.   OLED_ShowNum(64,0,15,2,16);
  14.   OLED_ShowChar(32,4,':',16);
  15.   OLED_ShowChar(56,4,':',16);
  16. }

  17. void loop() {
  18.      if(t!=p)
  19.      {
  20.             if(t>59)
  21.             {
  22.                 t=0;
  23.                 m=m+1;
  24.             }
  25.             if(m>59)
  26.             {
  27.                 m=0;
  28.                 h=m+1;
  29.             }
  30.             if(h>24)
  31.             {
  32.                 h=0;
  33.             }
  34.             OLED_ShowNum(16,4,h,2,16);
  35.             OLED_ShowNum(40,4,m,2,16);
  36.             OLED_ShowNum(64,4,t,2,16);
  37.             p=t;
  38.       }
  39.       delay(1000);
  40.       t=t+1;
  41. }


经程序的编译和上传,其显示效果如图11所示。
11.jpg
图11 计时效果


由此可以发现,尽管瑞萨RL78/G15开发板的体型比较小,芯片规模也不是很大,但它还是有一定的功能扩展空间的。尤其在使用Arduino IDE的情况下,开发工作还是比较容易的。


演示视频:



打赏榜单

21小跑堂 打赏了 50.00 元 2023-09-26
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

二姨认为瑞萨的开发挺不舒适的,Arduino IDE可以说专治各种不适应,可以更快速的完成小型应用的开发,作者以瑞萨RL78/G15为例在Arduino IDE完成了常用外设的搭建。  发表于 2023-9-26 10:42
mxkw0514 发表于 2024-1-4 09:27 | 显示全部楼层
请问有些开发板上面写的Arduino接口是什么呢?需要经过哪些过程将瑞萨开发板当Arduino板使用呢?
 楼主| jinglixixi 发表于 2024-1-4 09:55 | 显示全部楼层
Arduino接口只是一种接口标准,有一定的引脚功能排列方式而已,方便有相同接口的开发板或模块连接。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

517

主题

2932

帖子

39

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