📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Quanguo dianzi dasai
** http://www.jxust3jia1.com
** 生活从这里起航!
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: xiaoqiang
** Created date: 2007-07-22
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:test1,2007.7.29
**
********************************************************************************************************/
#include "config.h"
#define HC595_CS 1<<29
#define LEDS8 0XFF<<18
#define BEEP 1<<8//pwm0.8
#define KEYSCAN (0X3F<<16)
uint32 KEY_N;
uint8 i,j=0;
/*******************************************************************************************************
**函数名称:DelayNS()
**函数功能:长软件延时
**入口参数:dly 延时参数,值越大,延时越久
**出口参数:无
*******************************************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
/*********************************************************************************************************
** 函数名称: PWM_Int()
** 功能描述: PWM中断服务函数,取反控制蜂鸣器。
********************************************************************************************************/
void __irq PWM_Int(void)
{
PWMIR = 0x01; // 复位PWM中断标志
/* 取反LED9状态 */
if((IO0SET & BEEP) == 0) IO0SET = BEEP;
else IO0CLR = BEEP;
VICVectAddr = 0x00; // VIC结束
}
/********************************************************************************************************
** 函数名称:MSPI_Init()
** 函数功能:初始化SPI接口,设置为主机。
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/
void MSPI_Init(void)
{
//PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // 设置管脚连接SPI
PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;
S0PCCR = 0x52; // 设置SPI时钟分频
S0PCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样
(1 << 4) | // CPOL = 1, SCK 为低有效
(1 << 5) | // MSTR = 1, SPI 处于主模式
(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中断被禁止
}
/********************************************************************************************************
** 函数名称:MSPI_SendData()
** 函数功能:向SPI总线发送数据。
** 入口参数:data 待发送的数据
** 出口参数:返回值为读取的数据
********************************************************************************************************/
uint8 MSPI_SendData(uint8 data)
{
IOCLR = HC595_CS; // 片选74HC595
SPI_SPDR = data;
while( 0 == (SPI_SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕
IOSET = HC595_CS;
return(SPI_SPDR);
}
uint8 const DISP_TAB[11] = {0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0X90,0XFF};
uint8 const LED_TBL[9]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0xFF};
void WaitKey(void)
{ uint32 j;
while(1)
{
while( (IO0PIN&KEYSCAN) ==KEYSCAN);
for(j=0; j<50000; j++);
if((IO0PIN&KEYSCAN) !=KEYSCAN) break;
}
KEY_N=(IO0PIN&KEYSCAN);
while((IO0PIN&KEYSCAN) ==0);
}
int main (void)
{
PINSEL0=0X00005500;
PINSEL1=0X00000000;
PINSEL2=0X00000000;
IO0DIR=HC595_CS|BEEP;
IO1DIR=LEDS8;
IO0SET=BEEP;
MSPI_Init();
/* PWM作为定时器时的初始化 */
PWMTC = 0; // 定时器设置为0
PWMPR = 0; // 时钟不分频
PWMMCR = 0x03; // 设置T0MR0匹配后复位T0TC,并产生中断标志
PWMMR0 = Fpclk / 2; // 0.5秒钟定时
IRQEnable();
IO1CLR=LEDS8;
DelayNS(300);
MSPI_SendData(DISP_TAB[8]);
DelayNS(300);
IO1SET=LEDS8;
MSPI_SendData(DISP_TAB[10]);
while(1)
{ WaitKey();
switch(KEY_N>>16)
{case 0x3e:
{for(j=0;j<10;j++)
{
for(i=0;i<8;i++)
{IO1SET=(~(LED_TBL[i]<<18));
IO1CLR=(LED_TBL[i]<<18);
DelayNS(50);
}
MSPI_SendData(DISP_TAB[j]);
}
PWMTCR = 0x09; // 启动PWM输出
/* 设置PWM中断
VICIntSelect = 0x00000000; // 所有中断连接IRQ
VICVectCntl0 = 0x20 | 8; // 选择通道0
VICVectAddr0 = (int)PWM_Int; // PWM中断服务程序地址
VICIntEnable = (1 << 8); // 使能PWM中断*/
break;}
case 0x3d:{VICIntEnable = (0 << 8); // 使能PWM中断
PWMTCR=0X00;
IO0SET=BEEP;
break;}
case 0x3b:{MSPI_SendData(DISP_TAB[10]);
VICIntEnable = (0 << 8); // 使能PWM中断
PWMTCR=0X00;
IO1SET=LEDS8;
IO0SET=BEEP;
break;
}
default:break;
}
}
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -