ARM原理与应用基于OLED显示屏的设计①

设计目的

此次设计是为了完成本学期的期末作业,通过了一个学期的学习,也想检验一下自己学习到的知识,今天我们先来完成一个简单的功能,那就是让屏幕显示学号和姓名,同时点亮两个红灯(本次设计的代码是在老师教学的实验板上实现功能的),希望可以通过在这里分享代码跟大家一起学习,也欢迎各位前辈前来指导。

代码


#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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值