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