2020-09-02


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|=0x010000000; //清除中断标志位
}

else if((GPIOA_PDIR & 0x2000)==0) //Down D按键(下)
{
Down=1;
PORTA_PCR13|=0x010000000; //清除中断标志位
}
}
void PORTC_IRQHandler(void)
{
if((GPIOC_PDIR & 0x0040)==0) //Right 按键(右)
{
Right=1;
PORTC_PCR6|=0x010000000; //清除中断标志位
}

else if((GPIOC_PDIR & 0x0100)==0) //Left 按键(左)
{
Left=1;
PORTC_PCR8|=0x010000000; //清除中断标志位
}
}

/******************************************/
//显示(指针)
/******************************************/
void point_set(void)
{
//指针
if(UP==1){menu-=2;UP=0;}
if(Down==1){menu+=2;Down=0;}
if(menu!=6)
OLED_W_Str(menu+2,0," ");
if(menu!=0)
OLED_W_Str(menu-2,0," ");
if(menu==0)
OLED_W_Str(6,0," ");
if(menu==6)
OLED_W_Str(0,0," ");
if(menu>=7)
menu=0;
else if(menu<0)
menu=6;
OLED_W_Str(menu,0,">");
}

/******************************************/
//时间延时函数
/******************************************/
void delay()
{
uint i,j;
for(i=0;i<3000;i++)
{
for(j=0;j<100;j++);
asm("nop");
}
}

/************OLED板块开始*******************/
/******************************************/
//OLED_SPI0初始化
/******************************************/
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;
}

/******************************************/
//OLED_Init初始化
/******************************************/
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(); //显示空白屏幕
}

/******************************************/
//OLED_W_Ctl写控制
/******************************************/
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) & 0x07)); //向OLED写入行地址
temp=(ly%128); //向OLED写入行地址
OLED_W_Ctl(0x00 + (temp & 0x0f)); //低四位
OLED_W_Ctl(0x10 + ((temp>>4) & 0x0f)); //高四位
temp=lx%8;
OLED_W_Dat(0x01<<temp);
}

/******************************************/
//ASCII码数组
/******************************************/
const uchar ASCII[]={
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //' '
0x00, 0x00, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x00, //'!'
0x00, 0x00, 0x0F, 0x03, 0x00, 0x0F, 0x03, 0x00, //'"'
0x0c, 0x1e, 0x3f, 0x7e, 0x7e, 0x3f, 0x1e ,0x0c, //'#'//已改成心形
0x00, 0x00, 0x66, 0x49, 0xC9, 0x33, 0x00, 0x00, //'$'
0x00, 0x12, 0x15, 0x52, 0xA8, 0x48, 0x00, 0x00, //'%'
0x00, 0x00, 0x60, 0x9C, 0xB2, 0xC2, 0xA2, 0x00, //'&'
0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, //'''
0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, //'('
0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, //')'
0x00, 0x00, 0x02, 0x1A, 0x07, 0x1A, 0x02, 0x00, //'*'
0x00, 0x10, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, //'+'
0x00, 0x00, 0x00, 0xC0, 0x40, 0x00, 0x00, 0x00, //','
0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, //'-'
0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, //'.'
0x00, 0x80, 0x60, 0x18, 0x06, 0x01, 0x00, 0x00, //'/'
0x00, 0x7E, 0x81, 0x81, 0x81, 0x81, 0x7E, 0x00, //'0'
0x00, 0x00, 0x82, 0x82, 0xFF, 0x80, 0x80, 0x00, //'1'
0x00, 0xC2, 0xA1, 0x91, 0x89, 0xC6, 0x00, 0x00, //'2'
0x00, 0x42, 0x81, 0x89, 0x89, 0x76, 0x00, 0x00, //'3'
0x00, 0x10, 0x1C, 0x12, 0x91, 0xFF, 0x90, 0x00, //'4'
0x00, 0x40, 0x8F, 0x89, 0x89, 0x89, 0x71, 0x00, //'5'
0x00, 0x00, 0x7C, 0x8A, 0x89, 0x89, 0x71, 0x00, //'6'
0x00, 0x03, 0x01, 0x01, 0xE1, 0x19, 0x07, 0x00, //'7'
0x00, 0x76, 0x89, 0x89, 0x89, 0x89, 0x76, 0x00, //'8'
0x00, 0x8E, 0x91, 0x91, 0x91, 0x51, 0x3E, 0x00, //'9'
0x00, 0x00, 0x00, 0xCC, 0xCC, 0x00, 0x00, 0x00, //':'
0x00, 0x00, 0x80, 0xCC, 0x4C, 0x00, 0x00, 0x00, //';'
0x00, 0x10, 0x10, 0x28, 0x44, 0x44, 0x82, 0x00, //'<'
0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, //'='
0x00, 0x82, 0x44, 0x44, 0x28, 0x10, 0x10, 0x00, //'>'
0x00, 0x00, 0x02, 0x81, 0xA1, 0x11, 0x0E, 0x00, //'?'
0x00, 0x7e, 0x81, 0x99, 0xa5, 0xbd, 0xa1, 0x7e, //'@'
0x00, 0x80, 0xC0, 0xBD, 0x23, 0xBC, 0xC0, 0x80, //'A'
0x00, 0x81, 0xFF, 0x89, 0x89, 0x89, 0x76, 0x00, //'B'
0x00, 0x3C, 0x42, 0x81, 0x81, 0x81, 0x43, 0x00, //'C'
0x00, 0x81, 0xFF, 0x81, 0x81, 0x42, 0x3C, 0x00, //'D'
0x00, 0x81, 0xFF, 0x89, 0x9D, 0x81, 0xC3, 0x00, //'E'
0x00, 0x81, 0xFF, 0x89, 0x1D, 0x01, 0x03, 0x00, //'F'
0x00, 0x3C, 0x42, 0x81, 0x81, 0x91, 0x73, 0x10, //'G'
0x00, 0x81, 0xFF, 0x89, 0x08, 0x89, 0xFF, 0x81, //'H'
0x00, 0x00, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x00, //'I'
0x00, 0x70, 0x80, 0x81, 0x81, 0x7F, 0x01, 0x00, //'J'
0x00, 0x81, 0xFF, 0x91, 0x18, 0x25, 0xC3, 0x81, //'K'
0x00, 0x81, 0xFF, 0x81, 0x80, 0x80, 0xE0, 0x00, //'L'
0x00, 0x81, 0xFF, 0x87, 0x18, 0x87, 0xFF, 0x81, //'M'
0x81, 0xFF, 0x83, 0x0C, 0x30, 0xC1, 0xFF, 0x01, //'N'
0x00, 0x3C, 0x42, 0x81, 0x81, 0x81, 0x42, 0x3C, //'O'
0x00, 0x81, 0xFF, 0x91, 0x11, 0x11, 0x0E, 0x00, //'P'
0x00, 0x3C, 0x42, 0x81, 0x81, 0x81, 0x42, 0x3C, //'Q'
0x00, 0x81, 0xFF, 0x91, 0x11, 0x31, 0x4E, 0x80, //'R'
0x00, 0xC6, 0x49, 0x89, 0x89, 0x8A, 0x73, 0x00, //'S'
0x00, 0x03, 0x01, 0x81, 0xFF, 0x81, 0x01, 0x03, //'T'
0x00, 0x01, 0x7F, 0x81, 0x80, 0x81, 0x7F, 0x01, //'U'
0x01, 0x07, 0x39, 0xC0, 0xC0, 0x39, 0x07, 0x01, //'V'
0x00, 0x01, 0x7F, 0x81, 0x78, 0x81, 0x7F, 0x01, //'W'
0x00, 0x81, 0xC3, 0xA5, 0x18, 0xA5, 0xC3, 0x81, //'X'
0x00, 0x01, 0x03, 0x8D, 0xF0, 0x8D, 0x03, 0x01, //'Y'
0x00, 0x00, 0xC3, 0xA1, 0x99, 0x85, 0xC3, 0x00, //'Z'
0x00, 0x00, 0x00, 0xFF, 0x01, 0x01, 0x00, 0x00, //'['
0x00, 0x01, 0x06, 0x38, 0xC0, 0x00, 0x00, 0x00, //'\'
0x00, 0x01, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, //']'
0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x00, //'^'
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //'_'
0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, //'`'
0x00, 0x68, 0x94, 0x94, 0x94, 0x54, 0xF8, 0x80, //'a'
0x81, 0xFF, 0x48, 0x84, 0x84, 0x84, 0x78, 0x00, //'b'
0x00, 0x78, 0x84, 0x84, 0x84, 0x88, 0x4C, 0x00, //'c'
0x00, 0x78, 0x84, 0x84, 0x84, 0x49, 0xFF, 0x80, //'d'
0x00, 0x78, 0x94, 0x94, 0x94, 0x94, 0x98, 0x00, //'e'
0x00, 0x84, 0x84, 0xFE, 0x85, 0x85, 0x85, 0x00, //'f'
0x00, 0x1e, 0xa1, 0xa1, 0xa1, 0x92, 0x7f, 0x01, //'g'
0x00, 0x81, 0xFF, 0x88, 0x04, 0x84, 0xF8, 0x80, //'h'
0x00, 0x00, 0x84, 0x84, 0xFD, 0x80, 0x80, 0x00, //'i'
0x00, 0x80, 0x84, 0x84, 0x85, 0x7C, 0x00, 0x00, //'j'
0x00, 0x81, 0xFF, 0x10, 0x34, 0xCC, 0x84, 0x84, //'k'
0x00, 0x00, 0x80, 0x81, 0xFF, 0x80, 0x80, 0x00, //'l'
0x84, 0xFC, 0x88, 0x04, 0xF8, 0x88, 0x04, 0xF8, //'m'
0x00, 0x84, 0xFC, 0x88, 0x04, 0x84, 0xF8, 0x80, //'n'
0x00, 0x78, 0x84, 0x84, 0x84, 0x84, 0x78, 0x00, //'o'
0x00, 0x04, 0xFC, 0x88, 0x84, 0x84, 0x78, 0x00, //'p'
0x00, 0x78, 0x84, 0x84, 0x84, 0x48, 0xFC, 0x04, //'q'
0x00, 0x84, 0xFC, 0x88, 0x84, 0x84, 0x04, 0x00, //'r'
0x00, 0xC8, 0x94, 0x94, 0x94, 0x94, 0x6C, 0x00, //'s'
0x00, 0x04, 0x7E, 0x84, 0x84, 0x84, 0x40, 0x00, //'t'
0x00, 0x04, 0x7C, 0x80, 0x80, 0x44, 0xFC, 0x80, //'u'
0x04, 0x0C, 0x34, 0xC0, 0xC0, 0x34, 0x0C, 0x04, //'v'
0x00, 0x04, 0x7C, 0x84, 0x70, 0x84, 0x7C, 0x04, //'w'
0x00, 0x84, 0xCC, 0x30, 0x30, 0xCC, 0x84, 0x00, //'x'
0x00, 0x01, 0x87, 0x99, 0xe0, 0x19, 0x07, 0x01, //'y'
0x00, 0x00, 0xCC, 0xA4, 0x94, 0x8C, 0xC4, 0x00, //'z'
0x00, 0x00, 0x10, 0xEE, 0x01, 0x00, 0x00, 0x00, //'{'
0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, //'|'
0x00, 0x00, 0x01, 0xEE, 0x10, 0x00, 0x00, 0x00, //'}'
0x00, 0x10, 0x08, 0x08, 0x10, 0x10, 0x08, 0x00, //'~'
0x01, 0x3D, 0x42, 0x81, 0x81, 0x81, 0x43, 0x00,}; //'DEL'

/******************************************/
//OLED_W_Ch显示数据
/******************************************/
void OLED_W_Ch(uchar lx,uchar ly,char ch)
{
uchar i,nChar;
ushort temp;
OLED_W_Ctl(0xB0 + (lx%8));
nChar=(ly%128);
OLED_W_Ctl(0x00 + (nChar & 0x0f)); //低四位
OLED_W_Ctl(0x10 + ((nChar>>4) & 0x0f)); //高四位
temp=(ch-0x20)*8;
for(i=0;i<8;i++)
{
OLED_W_Dat(ASCII[temp+i]);
}
}

/******************************************/
//OLED_Clr清屏
/******************************************/
void OLED_Clr(void)
{
uchar i,j;
for(i=0;i<8;i++)
{
OLED_W_Ctl(0xB0+i);
OLED_W_Ctl(0x00);
OLED_W_Ctl(0x10);
for(j=0;j<128;j++)
{
OLED_W_Dat(0x00);
}
}
}

/******************************************/
//OLED_W_Str数据显示
/******************************************/
void OLED_W_Str(uchar lx,uchar ly,char *sch)
{
char *p2ch = sch;
unsigned char L_y = ly;
while (*p2ch) {
OLED_W_Ch(lx,L_y,*p2ch++);
L_y += 8;
}
}
/*************OLED模块结束******************/

/******************************************/
/***********ID模块开始*********************/
/******************************************/
void ID(void)
{
OLED_Clr(); //清屏
OLED_W_Str(0,8,"07"); //显示07学号
OLED_W_Str(2,8,"LiSi"); //显示姓名
for(;;)
{
if(Left==1)
{
Left=0;
OLED_Clr(); //清屏
break;
}
}
}
/***********ID模块结束*********************/

/******************************************/
/**********LED模块开始*********************/
/******************************************/
void LED_Init(void)
{
PORTB_PCR16=0x0100;
PORTB_PCR19=0x0100;

GPIOB_PDDR|=0x90000;
GPIOB_PDOR&=~(0x90000);
}

void LED(void)
{
OLED_Clr(); //清屏
OLED_W_Str(0,8,"07"); //显示07学号
OLED_W_Str(2,8,"LiSi"); //显示姓名
LED_Init();
for(;;)
{
GPIOB_PDOR|=0x90000; //两个红灯亮
if(Left==1)
{
Left=0;
OLED_Clr(); //清屏
break;
}
}
}
/***********LED模块结束*********************/

/******************************************/
/*****Time时间倒计时模块开始****************/
/******************************************/
void Time_Init(void)
{
SYST_RVR=0x9FFD07;
SYST_CVR=0x00;
SYST_CSR=0x07;
}

void Time_show(uchar x,uchar y)
{
time--;
if(time<0)
{
time=9;
s--;
if(s<0)
{
s=5;
m--;
if(m<0)
{
m=9;
h--;
if(h<0)
{
h=0;
m=0;
s=0;
time=0;
}
}
}
}
OLED_W_Ch(x,y ,h+48);
OLED_W_Ch(x,y+8 ,m+48);
OLED_W_Ch(x,y+16,':');
OLED_W_Ch(x,y+24,s+48);
OLED_W_Ch(x,y+32,time+48);
}

void Time(void)
{
OLED_Clr(); //清屏
Time_Init();
Beep_mod = 0;
for(;;)
{
Time_show(0,0);
if(Left==1)
{
Left=0;
OLED_Clr(); //清屏
break;
}
}
}
/*****Time时间倒计时模块结束****************/

/******************************************/
/*******Beep音乐播放模块开始****************/
/******************************************/
//歌曲《两只老虎》
const unsigned short note[50] //记录音高
={ M1, M2, M3, M1,
M1, M2, M3, M1,
M3, M4, M5,
M3, M4, M5,
M5, M6, M5, M4, M3, M1,
M5, M6, M5, M4, M3, M1,
M1, L5, M1,
M1, L5, M1,
NN, 0xff };
const unsigned short duration[50] //记录音长
={ 0x02,0x02,0x02,0x02,
0x02,0x02,0x02,0x02,
0x02,0x02,0x04,
0x02,0x02,0x04,
0x01,0x01,0x01,0x01,0x02,0x02,
0x01,0x01,0x01,0x01,0x02,0x02,
0x02,0x02,0x04,
0x02,0x02,0x04,
0x50,0x00 };

void TPM0_init(void) //PWM初始化函数
{
SIM_SOPT2|=SIM_SOPT2_TPMSRC(1);
SIM_SOPT2&=~SIM_SOPT2_PLLFLLSEL_MASK;
SIM_SCGC5|=SIM_SCGC5_PORTC_MASK; //打开PORTC时钟
SIM_SCGC6|=SIM_SCGC6_TPM0_MASK; //打开PWM时钟

PORTC_PCR8=0x0300; //配置PTC引脚给TPM0用

TPM0_CNT=0;
TPM0_MOD=0x00;
TPM0_SC=(0x0008|0x0007);
TPM0_C4SC=(0x0020|0x0008); //设置PWM的模式,边缘对齐
TPM0_C4V=0x00;
}

void TPM0_Set(ushort period) //设置PWM频率
{
TPM0_MOD=period;
TPM0_C4V=period/2; //占空比,可调节音量
}

void SYSTICK_Init(void) //定时器初始化函数
{
SYST_RVR=2621250; //1/8秒,20.97MHz/8
SYST_CVR=0x00;
SYST_CSR=0x07;
}

uint i;
void SysTick_Handler(void)
{

if(Beep_mod == 1)
{
time = 0;
if(!nDuration)
{
if(note[pNote]==0xff)pNote=0;
//设置播放新的音乐
TPM0_Set((ushort)(note[pNote]));
nDuration=duration[pNote];
pNote++;
}
nDuration--;
}
else if(Beep_mod == 0)
{
time--;
}
i = SYST_CSR;//读操作清除标志位
}

void Beep(void)
{
OLED_Clr(); //清屏
OLED_W_Str(0,0,"Music...");
TPM0_init();
SYSTICK_Init();
Beep_mod=1;
for(;;)
{
if(Left==1)
{
Left=0;
OLED_Clr(); //清屏
SIM_SCGC6&=0x00; //关闭PWM时钟
break;
}
}
}
/*******Beep音乐播放模块结束****************/

声明:部分代码通过网络学习所掌握

原创:https://www.panoramacn.com
源码网提供WordPress源码,帝国CMS源码discuz源码,微信小程序,小说源码,杰奇源码,thinkphp源码,ecshop模板源码,微擎模板源码,dede源码,织梦源码等。

专业搭建小说网站,小说程序,杰奇系列,微信小说系列,app系列小说

2020-09-02

免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

您必须遵守我们的协议,如果您下载了该资源行为将被视为对《免责声明》全部内容的认可-> 联系客服 投诉资源
www.panoramacn.com资源全部来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:2640602276@qq.com
未经允许不得转载:书荒源码源码网每日更新网站源码模板! » 2020-09-02
关注我们小说电影免费看
关注我们,获取更多的全网素材资源,有趣有料!
120000+人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

您的打赏就是我分享的动力!

支付宝扫一扫打赏

微信扫一扫打赏