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

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

[复制链接]
5767|3
手机看帖
扫描二维码
随时随地手机跟帖
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发送字节数据的函数为:
void Write_IIC_Byte(unsigned char IIC_Byte)
{
    unsigned char i;
    unsigned char m,da;
    da=IIC_Byte;
    SCL_low;
    for(i=0;i<8;i++)
    {
        m=da;
        m=m&0x80;
        if(m==0x80)
        {
            SDA_high;
        }
        else  SDA_low;
        da=da<<1;
        SCL_high;
        SCL_low;
     }
}

该显示屏的清屏函数为:
void OLED_Clear(void)
{
    uint8_t i,n;
    for(i=0;i<8;i++)
    {
        OLED_WR_Byte (0xb0+i,OLED_CMD);
        OLED_WR_Byte (0x00,OLED_CMD);
        OLED_WR_Byte (0x10,OLED_CMD);
        for(n=0;n<128;n++) OLED_WR_Byte(0,OLED_DATA);
    }
}


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

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

所使用的字库结构为:
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,
  …
}

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

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

void loop() {
  digitalWrite(4, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(13, HIGH);
  delay(1000);           // wait for a second
  digitalWrite(4, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(13, LOW);
  delay(1000);           // wait for a second
}

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

4)数据采集

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

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

10.jpg
图10 检测3.3V电压

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

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

void loop() {
     if(t!=p)
     {
            if(t>59)
            {
                t=0;
                m=m+1;
            }
            if(m>59)
            {
                m=0;
                h=m+1;
            }
            if(h>24)
            {
                h=0;
            }
            OLED_ShowNum(16,4,h,2,16);
            OLED_ShowNum(40,4,m,2,16);
            OLED_ShowNum(64,4,t,2,16);
            p=t;
      }
      delay(1000);
      t=t+1;
}


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


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


演示视频:



使用特权

评论回复

打赏榜单

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

评论
21小跑堂 2023-9-26 10:42 回复TA
二姨认为瑞萨的开发挺不舒适的,Arduino IDE可以说专治各种不适应,可以更快速的完成小型应用的开发,作者以瑞萨RL78/G15为例在Arduino IDE完成了常用外设的搭建。 

相关帖子

mxkw0514| | 2024-1-4 09:27 | 显示全部楼层
请问有些开发板上面写的Arduino接口是什么呢?需要经过哪些过程将瑞萨开发板当Arduino板使用呢?

使用特权

评论回复
jinglixixi|  楼主 | 2024-1-4 09:55 | 显示全部楼层
Arduino接口只是一种接口标准,有一定的引脚功能排列方式而已,方便有相同接口的开发板或模块连接。

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2666

帖子

34

粉丝