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

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

设计目的

今天我们来继续我们前面的学习,前面我们完成了一个简单的功能,让屏幕显示学号和姓名,同时点亮两个红灯;这次我们加上按键控制的功能,利用按键控制屏幕分级显示,当按下按键时,屏幕就会显示相对应的内容,同时实现各项功能。下面我们一起来看代码吧!

代码

/*
 * OLED显示屏加其他功能(期末作业)
 *
 */


#include "derivative.h" /* include peripheral declarations */
#define uint unsigned int
#define uchar unsigned char
#define ushort unsigned short


/******************************************/
//OLED模块的宏定义
/******************************************/
#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))


/******************************************/
//Beep音乐播放模块的宏定义
/******************************************/
#define PWM0_CLK_FREQ 164*1000		//20.97MHz/128

#define L1 M1*2		//低八度
#define L2 M2*2
#define L3 M3*2
#define L4 M4*2
#define L5 M5*2
#define L6 M6*2
#define L7 M7*2

#define M1 (unsigned short)(PWM0_CLK_FREQ/523)
#define M2 (unsigned short)(PWM0_CLK_FREQ/587)
#define M3 (unsigned short)(PWM0_CLK_FREQ/659)
#define M4 (unsigned short)(PWM0_CLK_FREQ/698)
#define M5 (unsigned short)(PWM0_CLK_FREQ/784)
#define M6 (unsigned short)(PWM0_CLK_FREQ/880)
#define M7 (unsigned short)(PWM0_CLK_FREQ/988)

#define H1 M1/2		//高八度
#define H2 M2/2
#define H3 M3/2
#define H4 M4/2
#define H5 M5/2
#define H6 M6/2
#define H7 M7/2

#define NN 0		//休止符


/******************************************/
//声明子函数
/******************************************/
void key_init();
void PORTA_IRQHandler();
void PORTC_IRQHandler();
void point_set();
void delay();
void OLED_SPI0_Init();
void OLED_Init();
void OLED_W_Ctl(uchar cw);
void OLED_W_Dat(uchar dw);
void OLED_W_Dot(uchar lx,uchar ly,char val);
void OLED_W_Ch(uchar lx,uchar ly,char ch);
void OLED_Clr();
void OLED_W_Str(uchar lx,uchar ly,char *sch);
void ID();
void LED();
void SYSTICK_Init();
void SysTick_Handler();
void Time();
void TPM0_init();
void TPM0_Set(ushort period);
void Beep();



/******************************************/
//全局变量
/******************************************/
int Right=0,Left=0,UP=0,Down=0;
int menu=0;
int time=9;
int s=5,m=9,h=5;
int Beep_mod = 1;
unsigned short pNote = 0,nDuration = 0;
extern int time,Beep_mod;


/******************************************/
//主函数
/******************************************/
int main(void)
{
   
	SIM_SCGC5|=((1<<9)|(1<<10)|(1<<11));	//打开模块POTRA PORTB PORTC的时钟
	SIM_SCGC4|=(1<<22);						//打开模块SPI0的时钟
	
	key_init();		//初始化按键
	OLED_Init();	//初始化OLED屏幕 /包含PORT的初始化和方向
	OLED_Clr();	//清屏
	
	for(;;) 
	{
   	   
		point_set();	//指针主函数
						//屏幕显示的菜单(一级显示)
		OLED_W_Str(0,8,"ID");
		OLED_W_Str(2,8,"LED");
		OLED_W_Str(4,8,"Time");
		OLED_W_Str(6,8,"Beep");
		if(Right==1)
		{
   
			OLED_Clr();	//清屏
			OLED_W_Str(6,4,"Right");
			Right=0;
			Left=0;
			if(menu==0)
			{
   
				ID();
			}
			else if(menu==2)
			{
   
				LED();
			}
			else if(menu==4)
			{
   
				Time();
			}
			else if(menu==6)
			{
   
				Beep();
			}
			else
			{
   
				OLED_Clr();	//清屏
				OLED_W_Str(5,4,"Press Error");
				delay();
				delay();
				delay();
				OLED_Clr();	//清屏
			}
		}
	}
	return 0;
}



/******************************************/
//初始化按键
/******************************************/
void key_init(void)
{
   
	GPIOA_PDDR&=~(0x83020);	//设置按键的引脚为输入(低电平)
	GPIOC_PDDR&=~(0x003c0);
	
	asm("CPSIE i");			//打开总中断
	NVIC_ISER|=0x40000000;	//打开PORTA中断
	
	PORTC_PCR6=0x0A0120;	//Right
	PORTC_PCR8=0x0A0120;	//Left
	
	PORTA_PCR5=0x0A0120;	//Right
	PORTA_PCR12=0x0A0120;	//Left
	PORTA_PCR13=0x0A0120;	//Down
	PORTA_PCR19=0x0A0120;	//UP
}


/******************************************/
//外部中断(按键中断)
/******************************************/
void PORTA_IRQHandler(void)
{
   
	if((GPIOA_PDIR & 0x0020)==0)	//Right A按键(右)
	{
   
		Right=1;
		PORTA_PCR5|=0x010000000;	//清除中断标志位
	}
	
	else if((GPIOA_PDIR & 0x1000)==0)	//Left B按键(左)
	{
   
		Left=1;
		PORTA_PCR12|=0x010000000;	//清除中断标志位
	}
	
	else if((GPIOA_PDIR & 0x80000)==0)	//UP B按键
	{
   
		UP=1;
		PORTA_PCR19
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值