📄 main.c
字号:
// _delay_loop_(1);
}
return 0;
}
void SystemInit(void) {
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
PINSEL1 = 0x00000000; // 设置管脚连接GPIO
IODIR0 = 0x00000000; // 设置P0口为输入
IODIR1 = 0x00000000; // 设置P1口为输入
}
void KeyInit(void) {
IODIR0 &= ~((1 << KEY1) | // 设置KEY1为输入
(1 << KEY3) | // 设置KEY3为输入
(1 << KEY5) | // 设置KEY5为输入
(1 << KEY6)); // 设置KEY6为输入
}
void LedInit(void) {
IODIR1 |= (1 << LED1) | // 设置LED1为输出
(1 << LED2) | // 设置LED2为输出
(1 << LED3) | // 设置LED3为输出
(1 << LED4) | // 设置LED4为输出
(1 << LED5) | // 设置LED5为输出
(1 << LED6) | // 设置LED6为输出
(1 << LED7) | // 设置LED7为输出
(1 << LED8); // 设置LED8为输出
IOSET1 = (1 << LED1) | // 关闭LED1
(1 << LED2) | // 关闭LED2
(1 << LED3) | // 关闭LED3
(1 << LED4) | // 关闭LED4
(1 << LED5) | // 关闭LED5
(1 << LED6) | // 关闭LED6
(1 << LED7) | // 关闭LED7
(1 << LED8); // 关闭LED8
}
void LednumInit(void) {
MSPI_Init();
}
void MSPI_Init(void) {
PINSEL0 |= ((P0_4_SCK0 << P0_4_PINSEL) | (P0_5_MISO0 << P0_5_PINSEL) | (P0_6_MOSI0 << P0_6_PINSEL));
IODIR0 |= (1 << RCLK); // 设置RCLK控制口为输出
IOCLR0 = (1 << RCLK);
S0SPCCR = 0x52; // 设置SPI时钟分频
S0SPCR = (1 << CPHA) | // CPHA = 1, 数据在SCK 的第2个时钟沿采样
(1 << CPOL) | // CPOL = 1, SCK 为低有效
(1 << MSTR) | // MSTR = 1, SPI 处于主模式
(0 << LSBF) | // LSBF = 0, SPI 数据传输MSB (位7)在先
(0 << SPIE); // SPIE = 0, SPI 中断被禁止
}
unsigned char MSPI_SendData(unsigned char data) {
S0SPDR = data; //发送数据(相当于51的SBUF = DATA)
while(!(S0SPSR & (1 << SPIF))); // 等待SPIF置位,即等待数据发送完毕
return(S0SPDR);
}
void LedDisplay(unsigned char data) {
MSPI_SendData(LedTab[data & 0x0f]);
IOSET0 = (1 << RCLK);
IOCLR0 = (1 << RCLK);
}
void BeepInit(void) {
// IODIR0 |= (1 << BEEP);// 设置BEEP控制口为输出
IO0SET = (1 << BEEP);//关闭BEEP
}
void MainTask (void) __task {
SystemInit();
Key_Task = os_tsk_create (KeyTask, 100);//创建KeyTask任务及级别
Led_Task = os_tsk_create (LedTask, 100);//创建LedTask任务及级别
Lednum_Task = os_tsk_create (LednumTask, 100);//创建LednumTask任务及级别
Beep_Task = os_tsk_create (BeepTask, 100);//创建BeepTask任务及级别
Lcd_Task = os_tsk_create (LcdTask, 100);//创建LcdTask任务及级别
Adc_Task = os_tsk_create (AdcTask, 100);//创建AdcTask任务及级别
os_tsk_delete_self ();//MainTask自毁
}
void LcdTask (void) __task {
LcdInit();
for (;;) {
LcdDisplayBuffers();// 将缓冲区的内容操作硬件
}
}
void KeyTask (void) __task {
KeyInit();
for (;;) {
if ((!(IOPIN0 & (1 << KEY1))) && (IOPIN1 & (1 << LED1))) {//有KEY1键压下且LED未亮
os_evt_set (0x0001, Led_Task);//
os_evt_set (0x0001, Adc_Task);//
// SetLcdDisplayPos(0, 0);//汉字定位到上行左端
// LcdDisplayString("汉字显示演示1212");
}
else if ((IOPIN0 & (1 << KEY1)) && (!(IOPIN1 & (1 << LED1)))) {//无KEY1键压下且LED在亮
os_evt_set (0x8001, Led_Task);//
// SetLcdDisplayPos(0, 0);//汉字定位到上行左端
// LcdDisplayString("汉字显示演示 ");
}
if ((!(IOPIN0 & (1 << KEY3))) && (IOPIN1 & (1 << LED3))) {//有KEY3键压下且LED未亮
os_evt_set (0x0003, Led_Task);//
os_evt_set (0x0003, Adc_Task);//
// SetLcdDisplayPos(1, 0);//汉字定位到上行左端
// LcdDisplayString("汉字显示演示3434");
}
else if ((IOPIN0 & (1 << KEY3)) && (!(IOPIN1 & (1 << LED3)))){//无KEY3键压下且LED在亮
os_evt_set (0x8003, Led_Task);//
// SetLcdDisplayPos(1, 0);//汉字定位到上行左端
// LcdDisplayString("汉字显示演示 ");
}
if ((!(IOPIN0 & (1 << KEY5))) && (IOPIN1 & (1 << LED5))) {//有KEY5键压下且LED未亮
os_evt_set (0x0005, Led_Task);//
// SetLcdDisplayPos(2, 0);//汉字定位到上行左端
// LcdDisplayString("汉字显示演示5656");
}
else if ((IOPIN0 & (1 << KEY5)) && (!(IOPIN1 & (1 << LED5)))){//无KEY5键压下且LED在亮
os_evt_set (0x8005, Led_Task);//
// SetLcdDisplayPos(2, 0);//汉字定位到上行左端
// LcdDisplayString("汉字显示演示 ");
}
if ((!(IOPIN0 & (1 << KEY6))) && (IOPIN1 & (1 << LED6))) {//有KEY6键压下且LED未亮
os_evt_set (0x0006, Led_Task);//
// SetLcdDisplayPos(3, 0);//汉字定位到上行左端
// LcdDisplayString("汉字显示演示7878");
}
else if ((IOPIN0 & (1 << KEY6)) && (!(IOPIN1 & (1 << LED6)))){//无KEY6键压下且LED在亮
os_evt_set (0x8006, Led_Task);//
// SetLcdDisplayPos(3, 0);//汉字定位到上行左端
// LcdDisplayString("汉字显示演示 ");
}
os_dly_wait (2);//延时20mS
}
}
void LedTask (void) __task {
OS_RESULT result;
unsigned int i;
LedInit();
for (;;) {
result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
if(result == OS_R_EVT) {
i = os_evt_get();
switch(i) {
case 0x0001: IOCLR1 = (1 << LED1);//点亮LED1
break;
case 0x0002: IOCLR1 = (1 << LED2);//点亮LED2
break;
case 0x0003: IOCLR1 = (1 << LED3);//点亮LED3
break;
case 0x0004: IOCLR1 = (1 << LED4);//点亮LED4
break;
case 0x0005: IOCLR1 = (1 << LED5);//点亮LED5
break;
case 0x0006: IOCLR1 = (1 << LED6);//点亮LED6
break;
case 0x8001: IOSET1 = (1 << LED1);//关掉LED1
break;
case 0x8002: IOSET1 = (1 << LED2);//关掉LED2
break;
case 0x8003: IOSET1 = (1 << LED3);//关掉LED3
break;
case 0x8004: IOSET1 = (1 << LED4);//关掉LED4
break;
case 0x8005: IOSET1 = (1 << LED5);//关掉LED5
break;
case 0x8006: IOSET1 = (1 << LED6);//关掉LED6
break;
}
os_evt_set (i, Beep_Task);//开关BEEP
os_evt_set (i, Lednum_Task);//开关Lednum
}
os_dly_wait (2);//延时20mS
}
}
void LednumTask (void) __task {
OS_RESULT result;
unsigned int i;
LednumInit();
for (;;) {
result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
if(result == OS_R_EVT) {
i = os_evt_get();
switch(i) {
case 0x0001: LedDisplay(1);//显示数码'1'
break;
case 0x0002: LedDisplay(2);//显示数码'2'
break;
case 0x0003: LedDisplay(3);//显示数码'3'
break;
case 0x0004: LedDisplay(4);//显示数码'4'
break;
case 0x0005: LedDisplay(5);//显示数码'5'
break;
case 0x0006: LedDisplay(6);//显示数码'6'
break;
}
}
os_dly_wait (2);//延时20mS
}
}
void BeepTask (void) __task {
OS_RESULT result;
unsigned int i;
BeepInit();
for (;;) {
result = os_evt_wait_or(0xffff, 0xffff);//等待BeepTask任务事件发生
if(result == OS_R_EVT) {
i = os_evt_get();
switch(i) {
case 0x0001:
case 0x0002:
case 0x0003:
case 0x0004:
case 0x0005:
case 0x0006:
IOCLR0 = (1 << BEEP);//打开BEEP
os_dly_wait (50);//延时500mS
IOSET0 = (1 << BEEP);//关闭BEEP
break;
case 0x8001:
case 0x8002:
case 0x8003:
case 0x8004:
case 0x8005:
case 0x8006:
IOSET0 = (1 << BEEP);//关闭BEEP
break;
}
}
os_dly_wait (10);//延时100mS
}
}
void AdcTask (void) __task {
OS_RESULT result;
unsigned int i;
uint32 AdcVal;
unsigned char str[17];
AdcInit();
for (;;) {
result = os_evt_wait_or(0xffff, 0xffff);//等待BeepTask任务事件发生
if(result == OS_R_EVT) {
i = os_evt_get();
switch(i) {
case 0x0001://
AdcVal = GetAdcVal(1);//
sprintf(str, "Adc1=%04X %1d.%03dV", AdcVal, AdcVal / 1000, AdcVal % 1000);
SetLcdDisplayPos(0, 0);//汉字定位到上行左端
LcdDisplayString(str);
break;
case 0x0002:
break;
case 0x0003://显示 "Adc3=05DD 1.501V" 或 "Adc3=05DB 1.499V"
AdcVal = GetAdcVal(3);//
sprintf(str, "Adc3=%04X %1d.%03dV", AdcVal, AdcVal / 1000, AdcVal % 1000);
SetLcdDisplayPos(1, 0);//汉字定位到上行左端
LcdDisplayString(str);
break;
case 0x0004:
case 0x0005://
case 0x0006://
break;
case 0x8001:
case 0x8002:
case 0x8003:
case 0x8004:
case 0x8005:
case 0x8006:
break;
}
}
os_dly_wait (1);//延时10mS
}
}
void main (void) {
if (SystemRamTest != 0x55aa55aa) {
SystemInit();
SystemRamTest = 0x55aa55aa;
}
else {
SystemRamTest = 0x55aa55aa;
}
os_sys_init (MainTask);//启动ARTX,此函数并不返回main()
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -