📄 main.c
字号:
#include "config.h"
#include <stdio.h>
#define BEEP 1 << 24 // P1.24
#define LEDS3 0x07 << 28 // P0[30:28]
#define HC595_CS (1 << 7) // P0.7
#define KEY0 1 << 16 // P0.16连接KEY0
#define KEY1 1 << 17 // P0.17连接KEY1
#define KEY2 1 << 18 // P0.18连接KEY2
#define KEY3 1 << 19 // P0.19连接KEY3
char INFO[] = {"Hello world!\
这是LPC2148板的演示程序,您将看到3个LED逐个点亮,最后全部熄灭;\
数码管轮流显示0~F字样;\
蜂鸣器鸣叫,表示RTC正在运行。\
按KEY0~KEY3中的任意键,可以看到AD转换的结果;\
调整电位器R27,再次观察,可以看到结果会改变;\
按键的同时,LED会点亮。"};
uint8 counter = 0;
void DelayNS (uint32 dly)
{
uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<50000; i++);
}
void MSPI_Init(void)
{
PINSEL0 = (PINSEL0 & (~(0x3F << 8))) | (0x15 << 8) ;
SPCCR = 0x52; // 设置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 中断被禁止
}
uint8 MSPI_SendData(uint8 data)
{
IO0CLR = HC595_CS; // 片选74HC595
SPI_SPDR = data;
while( 0 == (SPI_SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕
IO0SET = HC595_CS;
return(SPI_SPDR);
}
uint8 DISP_TAB[19] = {
// 0 1 2 3 4 5 6 7 8 9
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,
// A b C d E F
0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E,
// L P C
0xC7, 0x8C,0xC6 };
#define UART_BPS 115200 // 串口通讯波特率
void UART0_Init (void)
{
uint16 Fdiv;
PINSEL0 = (PINSEL0 & (~0x0F)) | 0x05; // 设置I/O连接到UART0
U0LCR = 0x83; // DLAB=1,允许设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
void UART0_SendByte (uint8 dat)
{
U0THR = dat;
while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
}
void UART0_SendStr (char *str)
{
while (1)
{
if (*str == '\0') break; // 遇到结束符,退出
UART0_SendByte(*str++); // 发送数据
}
}
void RTCInit (void)
{
PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
CCR = 0x10; // 禁止时间计数器
YEAR = 2005;
MONTH = 01;
DOM = 10;
DOW = 4;
HOUR = 8;
MIN = 30;
SEC = 59;
CIIR = 0x01; // 设置秒值的增量产生1次中断
CCR = 0x11; // 选择独立的外部振荡器,启动RTC
}
void __irq RTC_int (void)
{
counter++;
if(counter>=16) counter=0;
if ((IO1SET & BEEP) == 0) IO1SET = BEEP;
else IO1CLR = BEEP;
MSPI_SendData(DISP_TAB[counter]); // 数码管显示
ILR = 0x03; // 清除中断标志
VICVectAddr = 0x00; // VIC结束
}
int main (void)
{
uint8 i;
uint8 key = 0;
uint32 ADC_Data;
char str_key[20];
char str_ad[64];
PINSEL1 |= 1 << 18; // P0.25连接到AD0.4
IO1DIR |= BEEP;
IO1SET = BEEP;
IO0DIR |= HC595_CS; // 设置74HC595片选控制口为输出
IO0DIR |= LEDS3;
IO0DIR &=~(KEY0|KEY1|KEY2|KEY3);
VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断
VICVectCntl1 = 0x20 | 13; // 分配RTC中断到向量中断0
VICVectAddr1 = (uint32)RTC_int; // 设置中断服务程序地址
ILR = 0x03; // 清除RTC中断标志
VICIntEnable = 1 << 13; // 使能RTC中断
IRQEnable(); // 打开中断
MSPI_Init(); // 初始化SPI接口
UART0_Init(); // 串口初始化
RTCInit(); // RTC初始化
UART0_SendStr(INFO); // 向串口发送字符串
for (i=0; i<3; i++)
{
IO0SET = ~(LEDS3 & (1 << (30-i))); // LED显示
DelayNS(30);
IO0CLR = LEDS3 & (1 << (30-i));
DelayNS(30);
}
AD0CR = (1 << 4) | // SEL=8,选择通道3
((Fpclk / 1000000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
(0 << 16) | // BURST=0,软件控制转换操作
(0 << 17) | // CLKS=0, 使用11clock转换
(1 << 21) | // PDN=1,正常工作模式
(0 << 22) | // TEST1:0=00,正常工作模式
(1 << 24) | // START=1,直接启动ADC转换
(0 << 27); // 直接启动ADC转换时,此位无效
DelayNS(10);
ADC_Data = AD0DR; // 读取ADC结果,并清除DONE标志位
while (1)
{
if ((IO0PIN & KEY0) == 0) // 如果KEY1按下
{
key = 1;
IO0CLR = LEDS3 & (1 << (28+2)); // 点亮LED1
}
else if ((IO0PIN & KEY1) == 0) // 如果KEY2按下
{
key = 2;
IO0CLR = LEDS3 & (1 << (28+1)); // 点亮LED3
}
else if ((IO0PIN & KEY2) == 0) // 如果KEY3按下
{
key = 3;
IO0CLR = LEDS3 & (1 << (28+0)); // 点亮LED4
}
else if ((IO0PIN & KEY3) == 0) // 如果KEY4按下
{
key = 4;
IO0CLR = LEDS3 & (0x07 << (28+0)); // 点亮LED4
}
else
{
IO0SET = LEDS3 & (0x07 << (28));// 熄灭所有LED
sprintf(str_key, "KEY%1d 键被按下,", key);
if (key != 0)
{
UART0_SendStr(str_key);
key = 0;
UART0_SendStr(str_ad); // 向串口发送AD转换结果
}
AD0CR |= 1 << 24; // 进行第一次转换
while ((ADDR & 0x80000000) == 0); // 等待转换结束
AD0CR |= 1 << 24; // 再次启动转换
while ((AD0DR & 0x80000000) == 0); // 等待转换结束
ADC_Data = AD0DR; // 读取ADC结果
ADC_Data = (ADC_Data >> 6) & 0x3ff;
ADC_Data = ADC_Data * 3300;
ADC_Data = ADC_Data / 1024;
sprintf(str_ad, "AD0.4的转换结果为%4d mV。 ", ADC_Data);
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -