为了增强远距离的显示效果,这里选用一款P3.75的红色点阵板,其显示分辨率为16*64像素点,其外观如图1所示。

图1 点阵屏外观
该点阵板随使用的接口方式为HUB08,其各引脚的排列如图2所示。

图2 HUB08接口
为与RA4M2-SENSOR开发板相连接,所使用的接口为CN4和CN8,见图3所示。

图3 使用接口
点阵板与开发板的引脚连接关系为:
A ---- P014
B ---- P015
C ---- P000
D ----P001
R1 ---- P101
CLK----P102
OE ---- P500
LAT---- P100
为对所用引脚进行配置,需用到 RASC,并生成KEIL项目。

图4 引脚配置
所用引脚输出高低电平的语句定义为:
#define LR1_high R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_01, BSP_IO_LEVEL_HIGH)
#define LR1_low R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_01, BSP_IO_LEVEL_LOW)
#define CLK_high R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_02, BSP_IO_LEVEL_HIGH)
#define CLK_low R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_02, BSP_IO_LEVEL_LOW)
#define LSTB_high R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_00, BSP_IO_LEVEL_HIGH)
#define LSTB_low R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_00, BSP_IO_LEVEL_LOW)
#define LEN_high R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_05_PIN_00, BSP_IO_LEVEL_HIGH)
#define LEN_low R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_05_PIN_00, BSP_IO_LEVEL_LOW)
#define LA_high R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_14, BSP_IO_LEVEL_HIGH)
#define LA_low R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_14, BSP_IO_LEVEL_LOW)
#define LB_high R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_15, BSP_IO_LEVEL_HIGH)
#define LB_low R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_15, BSP_IO_LEVEL_LOW)
#define LC_high R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_00, BSP_IO_LEVEL_HIGH)
#define LC_low R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_00, BSP_IO_LEVEL_LOW)
#define LD_high R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_01, BSP_IO_LEVEL_HIGH)
#define LD_low R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_01, BSP_IO_LEVEL_LOW)
点阵板发送数据的函数为:
void OutByte(uint16_t dat)
{
uint8_t i=0 ;
for(i=0;i<16;i++)
{
CLK_low;
if(dat&0x0001)
{
LR1_high;
}
else
{
LR1_low;
}
dat=dat>>1;
CLK_high;
}
}
发送多列数据的函数为:
void DisCol(uint16_t lenght)
{
uint16_t dat;
uint8_t m=0;
while(lenght--)
{
dat=(S[sj[m+1]*16+ScanRow]<<8)+S[sj[m]*16+ScanRow];
OutByte(dat);
m=m+2;
}
}
输出行地址的函数为:
void SeleRow(uint8_t Nd)
{
uint8_t N;
N=Nd;
N=N%16;
if(N&0x01) LA_high;
else LA_low;
if (N&0x02) LB_high;
else LB_low;
if (N&0x04) LC_high;
else LC_low;
if (N&0x08) LD_high;
else LD_low;
}
实现显示输出的函数为:
void Display(void)
{
DisCol(4);
LEN_high;
LSTB_high;
LSTB_low;
SeleRow(ScanRow);
LEN_low;
ScanRow++;
if(ScanRow>15) ScanRow=0;
}
模拟RTC计时效果的显示函数为:
void ShowTime(void)
{
sj[0]= 1;
sj[1]= 2;j[2]= 10;
sj[3]= 3;
sj[4]= 0;sj[5]= 10;
sj[6]= 0;
sj[7]= 8;
Display();
}
实现驱动测试的主程序为:
int main(void)
{
dzb_Init();
ScanRow=0;
while (1)
{
ShowTime();
}
}
经程序的编译与下载,其执行效果如图5所示。

图5 硬件连接及显示效果
在添加RTC计时功能后,其主程序为:
void hal_entry(void)
{
uint8_t rtc_second= 0;
uint8_t rtc_minute =0;
uint8_t rtc_hour =0;
rtc_time_t get_time;
rtc_flag=1;
err = R_RTC_Open(&rtc_ctrl, &rtc_cfg);
assert(FSP_SUCCESS == err);
R_RTC_CalendarTimeSet(&rtc_ctrl, &set_time);
R_RTC_PeriodicIrqRateSet(&rtc_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND);
R_RTC_CalendarAlarmSet(&rtc_ctrl, &set_alarm_time);
ScanRow=0;
while(1)
{
R_RTC_CalendarTimeGet(&rtc_ctrl, &get_time);
rtc_flag=0;
rtc_second=get_time.tm_sec;
rtc_minute=get_time.tm_min;
rtc_hour=get_time.tm_hour;
sj[0]= rtc_hour/10;
sj[1]= rtc_hour%10;
sj[2]= 10;
sj[3]= rtc_minute/10;
sj[4]= rtc_minute%10;
sj[5]= 10;
sj[6]= rtc_second/10;
sj[7]= rtc_second%10;
Display();
}
}
经程序的编译与下载,其计时效果如视频所示。
演示视频: