📄 main.c
字号:
/*
*************************************************************************************************************
* Kingst-51
* Development board samples
*
* (c) Copyright 2009-2012, Kingst Studio
* All Rights Reserved
*
* http://www.kingst.org
* 文件名:main.c
* 描 述:工程主文件
* 版本号:1.0.0
*************************************************************************************************************
*/
#define _MAIN_C
#include <string.h>
#include "config.h"
#include "main.h"
#include "UartCom.h"
#include "KeyBoard.h"
#include "Lcd1602.h"
#include "LedNumber.h"
/*
********************************************************************************
* ----------------------- Local variables -------------------------------------
********************************************************************************
*/
/* 通信命令与其响应函数的封装结构 */
typedef struct _sComAnswer{
const uint8 *cmdstr; //命令字符串的指针
const uint8 cmdlen; //命令字符串的长度
void (*answer) (uint8 *para, int8 len); //响应函数的指针
} sComAnswer;
/* 蜂鸣器开关状态的枚举类型 */
typedef enum {
BUZZ_OFF, BUZZ_ON
} eBuzzSwitch;
static bit BuzzSwitch = BUZZ_OFF; //蜂鸣器开关状态
static bit flag100ms = 0; //100ms定时间隔标志
static bit staStopwatch = 1; //秒表状态
static uint32 tmrStopwatch = 0; //秒表定时器
/*
***************************************************************************************************
* ---------------------------------- Source codes ------------------------------------------------
***************************************************************************************************
*/
void ComHandle(void);
void Stopwatch(void);
/*
*==============================================================================
* 函数名:main
* 描 述:C语言main函数,即程序执行入口
*==============================================================================
*/
void main (void)
{
/* 配置T0作为系统定时器 */
TMOD &= 0xF0;
TMOD |= 0x01;
ET0 = 1;
TR0 = 1;
UartComInit();
Lcd1602Init();
LedNumberInit();
/* 使能中断,开始主循环 */
EA = 1;
while(1) {
KeyHandle();
ComHandle();
Stopwatch();
}
}
/*
* 描 述:以下皆为串口命令响应函数,参数相同,功能见各自开头的描述
* 输 入:para - 串口命令之后附带的参数指针
* len - 参数长度
* 输 出:无
*/
/* 回传命令,将命令码之后的字符回传给上位机 */
void ComCallback(uint8 *para, int8 len)
{
if (len > 0) {
UartWrite(para, len);
}
else {
UartWrite("none\r\n", sizeof("none\r\n")-1);
}
}
/* 蜂鸣器开关命令,控制蜂鸣器鸣叫的开启和关闭 */
void ComBuzzSwitch(uint8 *para, int8 len)
{
para++; //消除编译器警告
len++; //消除编译器警告
if (BuzzSwitch == BUZZ_OFF) {
BuzzSwitch = BUZZ_ON;
UartWrite("turn on\r\n", sizeof("turn on\r\n")-1);
}
else {
BuzzSwitch = BUZZ_OFF;
UartWrite("turn off\r\n", sizeof("turn off\r\n")-1);
}
}
/* 字符串显示命令,在液晶上显示命令码之后的字符串 */
void ComShowString(uint8 *para, int8 len)
{
if ((*para==' ') && (len>1)) {
/* 显示命令码之后的字符 */
para++;
len--;
*(para+len) = '\0';
Lcd1602ShowStr(para, 0, 0);
/* 不满一行时清楚屏幕后续字符位 */
if (len < 16) {
Lcd1602Clear(len, 0, 16-len);
}
UartWrite("complete\r\n", sizeof("complete\r\n")-1);
}
else {
UartWrite("error\r\n", sizeof("error\r\n")-1);
}
}
/*
* 函数名:ComHandle
* 描 述:串口通信命令解析处理函数
*/
void ComHandle(void)
{
int8 i,len;
uint8 xdata buff[40];
/* 可响应的所有命令列表 */
const sComAnswer code ca[] = {
{"callback", sizeof("callback")-1, ComCallback},
{"buzz switch", sizeof("buzz switch")-1, ComBuzzSwitch},
{"showstr", sizeof("showstr")-1, ComShowString}
};
/* 监控串口接收状态 */
if (UartRxSta == RX_NONE) {
return;
}
UartRxSta = RX_NONE;
/* 接收完一帧命令后处理该命令 */
len = UartRead(buff, sizeof(buff));
for (i=0; i<ArraySize(ca); i++) {
if (memcmp(buff, ca[i].cmdstr, ca[i].cmdlen) == 0) {
ca[i].answer(buff+ca[i].cmdlen, len-ca[i].cmdlen);
return;
}
}
/* 命令不在支持列表中时返回"无效命令"信息 */
if (i >= ArraySize(ca)) {
UartWrite("invalid command\r\n", sizeof("invalid command\r\n")-1);
}
}
/*
* 函数名:Stopwatch
* 描 述:秒表功能函数
*/
void Stopwatch(void)
{
if (flag100ms) {
flag100ms = 0;
/* 每隔100ms,秒表计数器+1 */
if (staStopwatch) {
tmrStopwatch++;
}
/* 秒表计数器当前值显示在数码管上 */
LedNumberShow(tmrStopwatch, 1);
}
}
/*
* 函数名:ResetStopwatch
* 描 述:重置秒表,定时器归零
*/
void ResetStopwatch(void)
{
staStopwatch = 0;
tmrStopwatch = 0;
}
/*
* 函数名:KickStopwatch
* 描 述:启动/停止秒表计数
*/
void KickStopwatch(void)
{
staStopwatch = ~staStopwatch;
}
/*
* 函数名:Timer0_ISR
* 描 述:Timer0定时中断服务函数
*/
void Timer0_ISR() interrupt 1
{
static uint8 t100ms = 0;
/* Timer1定时1ms */
TL0 = (uint8)((65535 - SYS_MCLK/1000) + 18);
TH0 = (uint8)(((65535 - SYS_MCLK/1000) + 18) >> 8);
/* 蜂鸣器控制 */
if (BuzzSwitch == BUZZ_ON) {
BUZZ_CTRL = 0;
}
/* 100ms定时标志处理 */
t100ms++;
if (t100ms >= 100) {
t100ms = 0;
flag100ms = 1;
}
/* 其他需定时处理的函数 */
KeyScan();
LedNumberScan();
UartRxMonitor(1);
BUZZ_CTRL = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -