设计目的
此次设计是为了完成本学期的期末作业,通过了一个学期的学习,也想检验一下自己学习到的知识,今天我们先来完成一个简单的功能,那就是让屏幕显示学号和姓名,同时点亮两个红灯(本次设计的代码是在老师教学的实验板上实现功能的),希望可以通过在这里分享代码跟大家一起学习,也欢迎各位前辈前来指导。
代码
#include "derivative.h" /* include peripheral declarations */
#define uchar unsigned char
#define ushort unsigned short
#define uint unsigned int
#define BIT(x) (1<<x)
#define OLED_DC_H (GPIOB_PDOR|=BIT(2))
#define OLED_RESET_H (GPIOB_PDOR|=BIT(3))
#define OLED_CLK_H (GPIOB_PDOR|=BIT(1))
#define OLED_MOSI_H (GPIOB_PDOR|=BIT(0))
#define OLED_DC_L (GPIOB_PDOR&=~BIT(2))
#define OLED_RESET_L (GPIOB_PDOR&=~BIT(3))
#define OLED_CLK_L (GPIOB_PDOR&=~BIT(1))
#define OLED_MOSI_L (GPIOB_PDOR&=~BIT(0))
#define DDR_OLED_DC (GPIOB_PDDR|=BIT(2))
#define DDR_OLED_RESET (GPIOB_PDDR|=BIT(3))
#define DDR_OLED_MOSI (GPIOB_PDDR|=BIT(0))
#define DDR_OLED_CLK (GPIOB_PDDR|=BIT(1))
void OLED_Clr();
void OLED_W_Ctl(uchar cw);
void OLED_SPI0_Init(void)
{
ushort i;
PORTB_PCR2=0x100; //RESET
PORTB_PCR3=0x100; //DC
PORTB_PCR1=0x100; //SCL
PORTB_PCR0=0x100; //MOSI
SPI0_C1|=0x5c; //CPIO=1,CPHA=1,LSBFE=0
SPI0_BR=0x10; //再2分频
DDR_OLED_DC; //配置总线的各引脚为输出
DDR_OLED_RESET;
DDR_OLED_MOSI;
DDR_OLED_CLK;
OLED_DC_H;
// OLED_CLK_H;
// OLED_MOSI_H;
//产生硬件RESET信号
OLED_RESET_L;
for(i=0;i<30000;i++)
{
asm("nop");}
OLED_RESET_H;
}
void OLED_Init(void)
{
OLED_SPI0_Init();
OLED_W_Ctl(0xae); //OLED off
OLED_W_Ctl(0xd5); //Set clock
OLED_W_Ctl(0x80);
OLED_W_Ctl(0xa8); //行数
OLED_W_Ctl(0x3f);
OLED_W_Ctl(0xd3); //行off set
OLED_W_Ctl(0x00);
OLED_W_Ctl(0x40); //Start Line
OLED_W_Ctl(0x8D); //电荷泵
OLED_W_Ctl(0x14);
OLED_W_Ctl(0xa1); //设置方向127对应Seg0
OLED_W_Ctl(0xc8); //Com[n-i] -> Com0
OLED_W_Ctl(0xda);
OLED_W_Ctl(0x12);
OLED_W_Ctl(0x81); //对比度
OLED_W_Ctl(0xcf);
OLED_W_Ctl(0xd9);
OLED_W_Ctl(0xf1);
OLED_W_Ctl(0xdb);
OLED_W_Ctl(0x40);
OLED_W_Ctl(0xa4); //显示
OLED_W_Ctl(0xa6); //1对应像素on
OLED_W_Ctl(0xaf); //OLED on
OLED_Clr(); //显示空白屏幕
}
void OLED_W_Ctl(uchar cw)
{
uchar i;
OLED_DC_L;
i = 0x80;
while(i)
{
if(cw & i)
{
OLED_CLK_L;
OLED_MOSI_H;
OLED_CLK_H;
i>>=1;
}
else
{
OLED_CLK_L;
OLED_MOSI_L;
OLED_CLK_H;
i>>=1;
}
}
OLED_DC_H;
}
//OLED_W_Dat写数据
void OLED_W_Dat(uchar dw)
{
uchar i;
OLED_DC_H;
i = 0x80;
while(i)
{
if(dw & i)
{
OLED_CLK_L;
OLED_MOSI_H;
OLED_CLK_H;
i>>=1;
}
else
{
OLED_CLK_L;
OLED_MOSI_L;
OLED_CLK_H;
i>>=1;
}
}
OLED_DC_H;
}
//OLED_W_Dot函数
void OLED_W_Dot(uchar lx,uchar ly,char val)
{
uchar temp;
OLED_W_Ctl(0xB0 + ((lx/8