【瑞萨RA2系列开发板体验】SPI12864显示屏的驱动
一、如我上一篇文章进行新建工程。
https://sq.ramcu.cn/forum.php?mod=viewthread&tid=131
二、本次使用我的SPI屏
cs ---P301 RST ---P302 A0 ---P201 SDIN---P401 SCLK---P400
模拟SPI软件函数如下
- /*写指令到LCD模块*/
- void w_com_st12864(int data1)
- {
- char i;
- cs=0;
- rs=0;
- for(i=0;i<8;i++)
- {
- sclk=0;
- IF(data1&0x80) sid=1;
- else sid=0;
- sclk=1;
- data1<<=1;
- }
- cs=1;
- }
- /*写数据到LCD模块*/
- void w_data_st12864(int data1)
- {
- char i;
- cs=0;
- rs=1;
- for(i=0;i<8;i++)
- {
- sclk=0;
- if(data1&0x80) sid=1;
- else sid=0;
- sclk=1;
- data1<<=1;
- }
- cs=1;
- }
复制代码
屏幕初始化函数
- /*LCD模块初始化*/
- void lcd_init_st12864()
- {
- cs=0;
- reset=0; /*低电平复位*/
- delay_st12864(500);
- reset=1; /*复位完毕*/
- delay_st12864(200);
- w_com_st12864(0xe2); //软复位 //1110 0010
- delay_st12864(50);
- w_com_st12864(0x2c); //*升压步聚1 //0010 1100
- delay_st12864(50);
- w_com_st12864(0x2e); //*升压步聚2 //0010 1110
- delay_st12864(50);
- w_com_st12864(0x2f); //*升压步聚3 //0010 1111
- delay_st12864(50);
- w_com_st12864(0x25); //*粗调对比度,可设置范围0x20~0x27 一开始显示字体,后马上白屏,调大后好了
- w_com_st12864(0x81); //*微调对比度
- w_com_st12864(0x28); //*0x28,微调对比度的值,可设置范围0x00~0x3f
- w_com_st12864(0xa2); //*1/9偏压比(bias)
- w_com_st12864(0xc0); //*行扫描顺序:从上到下0上下8下上
- w_com_st12864(0xa1); //*列扫描顺序:从左到右0左右1右左
- w_com_st12864(0x40); //*起始行:第一行开始//40第一行
- w_com_st12864(0xaf); /*开显示*/
- }
复制代码
显示中文字符函数,可以闪烁
- //显示16x16点阵图像、汉字。111111111111111111111111111111111111111
- //括号里的参数分别是(页,列,闪烁与否,反显与否,数据指针)
- void display_blink_16x16_st12864(uchar page,uchar column,uchar blink,uchar reverse,uchar *dp)
- {
- uchar i,j,k,*data_temp;
- if(blink==0)//判断闪烁
- {
- data_temp=dp;//赋值
- for(j=0;j<2;j++)
- {
- lcd_address_st12864(page+j,column);//设置起始行
- for (i=0;i<16;i++)//输出16个字节循环
- {
- if(reverse==1)//判断是否反显
- {
- w_data_st12864(~*data_temp); //数据取反后写入数据
- }
- else
- {
- w_data_st12864(*data_temp); //写入数据
- }
- data_temp++; //字节自动+1
- }
- }
- }
- else
- {
- for(k=0;k<10;k++)//闪烁
- {
- data_temp=dp; //赋值
- for(j=0;j<2;j++) //0上半字 1下半字
- {
- lcd_address_st12864(page+j,column); //设置起始行
- for (i=0;i<16;i++) //输出16个字节循环
- {
- w_data_st12864(~*data_temp); //数据取反后写入数据
- data_temp++; //字节自动+1
- }
- }
- delay_st12864(2000);
- data_temp=dp; //赋值
- for(j=0;j<2;j++) //0上半字 1下半字
- {
- lcd_address_st12864(page+j,column); //设置起始行
- for (i=0;i<16;i++) //输出16个字节循环
- {
- w_data_st12864(*data_temp); //数据取反后写入数据
- data_temp++; //字节自动+1
- }
- }
- delay_st12864(2000);
- }
- }
- }
复制代码
|