📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2007-02
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: wxw
** Created date: 2007-02
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: wxw
** Modified date: 2007-02
** Version:
** Descriptions: 键盘输入与LED扫描人机对话程序。
**
********************************************************************************************************/
#include "config.h"
#define W_CLK0 IO0CLR=IO0CLR&(~(1<<8))|(1<<8);//P0.8为W-CLK,W_CLK清零
#define W_CLK1 IO0SET=IO0SET&(~(1<<8))|(1<<8);//W_CLK置一
#define FQ_UD0 IO0CLR=IO0CLR&(~(1<<10))|(1<<10);//P0.10,FQ_UD清零
#define FQ_UD1 IO0SET=IO0SET&(~(1<<10))|(1<<10);//FQ_UD置一
#define DATE0 IO0CLR=IO0CLR&(~(1<<11))|(1<<11);//P0.11,DATE清零
#define DATE1 IO0SET=IO0SET&(~(1<<11))|(1<<11);//DATE置一
#define KEY (1 << 5) // P0.5口(MISO)为按键输入脚
uint8 T0Flag = 0;
uint32 CS[6]={150,1200,1000,2222,3333,4444}; //可以输入的参数数组
uint8 DATA0[8];
uint8 a[5]={0x55,0x55,0x55,0x08,0x10};//40位控制字
uint8 digitable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示段码表
uint8 selectable[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //显示位码表
uint8 x=0,k=0; //变量,k对DATA0&DATA1&selectable;x&y对digitable;
uint8 w=0; //显示刷新时间计数器
uint8 SF=0; //闪烁标志位
uint8 TK=0x09; //按键按下记录位寄存器,有效数据位为0~7
uint8 M=0,R=0; //按键选项计数器
/*******************************************************************************************
** 函数名称:signalproduct()
** 功能描述:方波发生
** 入口参数:f频率,a%100占空比
** 出口参数:无
******************************************/
int signalproduct (uint16 f,uint16 a )
{uint16 d;
uint16 t;
PINSEL0=(PINSEL0&0XFFF3FFFF)|(0X00080000);
d=a/100;
t=a%100;
// if(d==1) PWMMR0=Fpclk/f;
//else
PWMMR0=Fpclk/(f*1000);
PWMMR6=PWMMR0*t/100;
PWMLER=0X41;
PWMTCR=0X09;
return 0;
}
/*******************************************************************************************
** 函数名称:Timer0_InitExt()
** 功能描述:TIMER0 初始化
** 入口参数:无
** 出口参数:无
*******************************************************************************************/
void Timer0_InitExt(void)
{
T0TC = 0; /* 定时器设置为0 */
T0PR = 0; /* 时钟不分频 */
T0MCR = 0x03; /* 设置T0MR0匹配后复位T0TC,并产生中断标志 */
T0MR0 = Fpclk/400; /* 2.5毫秒定时 */
T0TCR = 0x01; /* 启动定时器 */
}
//-----------------delayns----------------------
void delays(void)
{ uint8 i,j;
for(i=120;i>0;i--)
for(j=50;j>0;j--);
}
/*-----------------------------------------------*/
/*******************************************************************************************
** 函数名称:IRQ_Timer0()
** 功能描述:TIMER0 中断服务程序
** 入口参数:无
** 出口参数:无
*******************************************************************************************/
void __irq IRQ_Timer0(void)
{
T0Flag = 1; // T0中断标志置位
T0IR = 0x01; // 清除中断标志
VICVectAddr = 0;
}
/*******************************************************************************************
** 函数名称:IRQ_Init()
** 功能描述:设置定时器0中断IRQ
** 入口参数:无
** 出口参数:无
*******************************************************************************************/
void IRQ_Init(void)
{
VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
VICVectCntl0 = 0x20 | 0x04; // 设置定时器0中断通道分配最高优先级
VICVectAddr0 = (uint32)IRQ_Timer0; // 设置中断服务程序地址
VICIntEnable = 1 << 0x04; // 使能定时器0中断
}
//二进制数转BCD码子程序0
void CONVBIT0(uint16 num,uint8 hor)
{
DATA0[hor+3] = num/1000; //计算千位
DATA0[hor+2] = num%1000/100; //计算百位
DATA0[hor+1] = num%100/10; //计算十位
DATA0[hor] = num%10/1; //计算个位
}
/********************************************************************************************************
** 函数名称:MSPI_Init()
** 函数功能:初始化SPI接口,设置为主机。
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/
void MSPI_Init(void)
{
//PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // 设置管脚连接SPI0
PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;
//PINSEL1 = (PINSEL0 & 0xFFFF0C03) | 0x00000154; // 设置管脚连接SPI1
SPI_SPCCR = 0x52; // 设置SPI时钟分频
SPI_SPCR = (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)
{
SPI_SPDR = data;
while( 0 == (SPI_SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕
return(SPI_SPDR);
}
/***********************************************************************************************
** 函数名称:SendByte()
** 函数功能:发送一个字节
** 入口参数:bbyte 字节数据
** 出口参数:无
***********************************************************************************************/
void SendByte(uint32 bbyte)
{
uint8 q;
for(q=0;q<40;q++)
{
if( (bbyte&0x01)!=0 ) DATE1//SID=bbyte&0x80;取出最高位
else //
DATE0
__asm
{
nop
}
W_CLK1
//SCLK=1;
__asm
{
nop
}
W_CLK0 //SCLK=0;
bbyte>>=1; //左移
}
FQ_UD1 //SCLK=1;
__asm
{
nop
}
FQ_UD0
}
/********************************************************************************************************
** 函数名称:main()
** 函数功能:使用硬件SPI,74HC595驱动控制7段数码管显示。
** 先显示0~F的字模,然后显示LPC2131字样。
********************************************************************************************************/
uint8 rcv_data;
int main (void)
{ uint32 b ;
//PINSEL0 =PINSEL0&(~(3<<4));
PINSEL1=0x00<<18 ; // 设置SPI管脚连接(P0.5设为GPIO)
PINSEL0=PINSEL0&0XFF0CFF0F;
IO0DIR= IO0DIR|
(1<<8)|
(1<<10)|
(1<<11);
MSPI_Init(); // 初始化SPI接口
Timer0_InitExt();
IRQEnable(); // IRQ中断使能
IRQ_Init();
PWMPR=0;
PWMMCR=0X02;
PWMPCR=1<<14;
PWMTCR=0X02;
// 设置及开启定时器0中断
CONVBIT0(CS[0],0);
CONVBIT0(CS[1],4);
while(1)
{ /*for(b=0;b<5;b++)
SendByte(a[b]);
FQ_UD1 //SCLK=1;
__asm
{
nop
}
FQ_UD0*/
b=CS[2]*3495.25333333;
SendByte(b);
if(T0Flag) //中断定时到
{
while(w==80) //显示数据刷新时间到,执行数据变换。
{
if(M==0) //如果M=0表示运行态,显示运行参数。
{
CONVBIT0(CS[2],0);
CONVBIT0(M,4);
}
w=0; //清除显示刷新计数器
if(SF) //闪烁标志取反
SF=0;
else
SF=1;
}
if(M==0) //显示扫描送运行参数
{
x=DATA0[k];
}
else //否则送修改参数
{
if(k==R) //如果当前显示位与键盘修改位相等,则根据闪烁标志送黑码。
{
if(SF==0)
x=10;
else
x=DATA0[k];
}
else
x=DATA0[k]; //否则直接送显示数
}
w++; //显示刷新计数器+1。
T0Flag=0; //显示标志位清除。
rcv_data = MSPI_SendData(digitable[x]); // 发送显示数据
rcv_data = MSPI_SendData(selectable[k]); // 发送显示位码
if((IO0PIN&KEY) != 0)
{
if(TK==k) //如果键盘输入位=1且键盘记录位与当前输入位相等,执行键功能。
{
switch(TK) //执行TK键盘号功能0~3。
{
case 0: //0#功能为模式键M+1。
{
if(M==4)
M=1;
else
M++;
switch(M) //取出1~4#参数送显示,以便人机对话修改参数。
{
case 1:
{
CONVBIT0(CS[2],4);
CONVBIT0(50,0);
}
break;
case 2:
{
CONVBIT0(CS[3],4);
CONVBIT0(M,0);
}
break;
case 3:
{
CONVBIT0(CS[4],4);
CONVBIT0(M,0);
}
break;
case 4:
{
CONVBIT0(CS[5],4);
CONVBIT0(M,0);
}
break;
}
}
break;
case 1: //1#功能为右移键标志位R+1。
{
if(R==7)
R=1;
else
R++;
}
break;
case 2: //2#功能为加键,当前闪烁位+1。
{
if(DATA0[R]==9)
DATA0[R]=0;
else
DATA0[R]++;
}
break;
case 3: //3#功能为回车确认键操作,将修改好的参数送回参数区。
{
while(!M==0)
{
// CS[1]=DATA0[4]*1000+DATA0[5]*100+DATA0[6]*10+DATA0[7];
CS[2]=DATA0[3]*1000+DATA0[2]*100+DATA0[1]*10+DATA0[0];
R=1; //R、M标志归零。
M=0;
}
}
break;
}
TK=0x09; //键记录位清除。
}
}
else if((IO0PIN&KEY)==0) //如果当前键盘位=0,则再读键盘、延时再读=0则记录键盘位TK=K。
{
delays();
if((IO0PIN&KEY)==0)
TK=k;
}
if(k==7) //如果键盘扫描计数器K=7,则清除K,否则K+1。
k=0;
else
k++;
signalproduct(CS[1],CS[0]);
}
}
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -