#include "sys.h"
#include "lcd.h"
#include "delay.h"
/******** 写指令 ********/
void write_com(u8 com)
{
CS=0;
RS=0;
RD=1;
DATAOUT(com);
WR=0;
WR=1;
CS=1;
}
/******** 写数据********/
void write_data(u8 data)
{
CS=0;
RS=1;
RD=1;
DATAOUT(data);
WR=0;
WR=1;
CS=1;
}
/******** 读“数据”程序 ********/
u8 read_data(void)
{
u8 temp;
GPIOB->CRL=0X88888888; //PDB-7 上拉输入
GPIOB->ODR=0XFFFF; //全部输出高
CS=0;
RS=1;
WR=1;
RD=0;
temp=DATAIN;
RD=1;
CS=1;
GPIOB->CRL=0X33333333; //PB0-7 通用推挽输出
GPIOB->ODR=0XFFFF; //全部输出高
return temp;
}
/******** 地址设置 ********/
void address(u8 page,u8 col)
{
col=col+4;
write_com(0xb0|page); //Set Page Start Address
write_com(0x00|(col&0x0f)); //Set Column Start Address LSB
write_com(0x10|((col>>4)&0x0f)); //Set Column Start Address
}
/******** 全屏显示*******/
void fill(u8 dat)
{
u8 i,j;
for(i=0;i<HD/8;i++)
{
address(i,0);
for(j=0;j<WD;j++)
write_data(dat);
}
}
/******** 隔列显示 ********/
void fill_2(u8 dat1,u8 dat2)
{
u8 i,j;
for(i=0;i<HD/8;i++)
{
address(i,0);
for(j=0;j<WD;j++)
{
if(j%2==0)
write_data(dat1);
else
write_data(dat2);
}
}
}
/******** 字符显示程序********/
void chhzes(u8 x,u8 y,u8 m,u8 n,u8 kk,u8 *s)
{
u8 i,j,k,sum=0;
for(k=y;k<WD&&sum<kk;k+=n,sum++)
{
for(i=0;i<m/8;i++)
{
address(x+i,k);
for(j=0;j<n;j++)
write_data(*s++);
}
}
}
/******** 绘点显示程序 ********/
/**** x:0-HD; y:0-WD ****/
void point(u8 x,u8 y,u8 z)
{
u8 temp1,temp2,dat;
temp1=x/8;
temp2=x%8;
temp2=0x01<<temp2;
address(temp1,y); //地址
dat=read_data(); //Dummy Read
dat=read_data();
if(z==1) //置‘1’
dat=temp2|dat;
else //置‘0’
dat=~temp2&dat;
address(temp1,y); //地址
write_data(dat);
}
/******** 画矩形方块显示程序 ********/
void matrix(u8 x1,u8 y1,u8 x2,u8 y2,u8 z)
{ u8 i,j;
for(i=x1;i<=x2;i++)
for(j=y1;j<=y2;j++)
point(i,j,z);
}
/******** 画矩形方框显示程序 ********/
void block(u8 x1,u8 y1,u8 x2,u8 y2,u8 z)
{
matrix(x1,y1,x2,y1,z); //左边框
matrix(x1,y2,x2,y2,z); //右边框
matrix(x1,y1,x1,y2,z); //上边框
matrix(x2,y1,x2,y2,z); //下边框
}
void reset(void)
{
RCC->APB2ENR|=1<<3; //使能外设PORTB时钟
RCC->APB2ENR|=1<<4; //使能外设PORTC时钟
RCC->APB2ENR|=1<<0; //开启辅助时钟
JTAG_Set(JTAG_SWD_DISABLE); //关闭SWD,JTAG
GPIOC->CRL&=0X00000000;//清端口
GPIOC->CRL|=0X33333333;//PC0-PC7 推挽输出
GPIOC->ODR|=0x00FF; //PC0-PC7 输出高
GPIOB->CRL&=0X00000000;//清端口PORTB0~7
GPIOB->CRL|=0X33333333;//PORTB0~7为通用推挽输出,速度50MHz
GPIOB->ODR=0X00FF; //全部输出高 //*/
delay_ms(15);
RST=0;
delay_ms(50);
RST=1;
delay_ms(50);
}
void LCD_Init(void)
{
reset();//复位
write_com(0xae);//关显示
write_com(0xd5);//设定显示频率
write_com(0x10);
write_com(0xa8);//设定占空比
write_com(0x1f);// 1/32DUTY
write_com(0xd3);//设定显示范围 COM
write_com(0x00);
write_com(0x40);//起始行
write_com(0xad);//外部dc-dc
write_com(0x8e);
write_com(0xd8);//外部dc-dc
write_com(0x05);
//write_com(0x20);//内存地址模式:页方式
//write_com(0x02);
write_com(0xa1);//seg方向 132-0
write_com(0xc8);//com方向 63-0
write_com(0xda);//Set COM Pins Hardware Configuration
write_com(0x12);
write_com(0x81);//对比度调节
write_com(0x80);//对比度为中
write_com(0xd9);
write_com(0xd2);
write_com(0xdb);//倍压调节
write_com(0x08);//0.77 x VCC (RESET)
write_com(0xa4);//Entire Display ON
write_com(0xa6);//Normal display
fill(0x00);
write_com(0xaf);//开显示
}