规范化代码格式

Signed-off-by: lockzhiner_wang-xiaobin <wangxb@fzlzdz.com>
This commit is contained in:
lockzhiner_wang-xiaobin
2022-09-06 07:30:15 +00:00
parent 4ddd0ab072
commit 474dedca12
53 changed files with 3394 additions and 3537 deletions
+21 -15
View File
@@ -15,6 +15,16 @@
#include "los_task.h" // OpenHarmony LiteOS的任务管理头文件
/* 等待时间 */
#define HELLOWORLD_WAIT_MSEC 1000
#define OPENHARMONY_WAIT_MSEC 2000
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 2048
/* 任务的优先级 */
#define HELLWORLD_TASK_PRIO 24
#define OPENHARMONY_TASK_PRIO 25
/***************************************************************
* 函数名称: task_helloworld
* 说 明: 线程函数helloworld
@@ -23,11 +33,10 @@
***************************************************************/
void task_helloworld()
{
while (1)
{
while (1) {
printf("Hello World\n");
/* 睡眠1秒。该函数为OpenHarmony LiteoS内核睡眠函数,单位为:毫秒 */
LOS_Msleep(1000);
LOS_Msleep(HELLOWORLD_WAIT_MSEC);
}
}
@@ -39,11 +48,10 @@ void task_helloworld()
***************************************************************/
void task_openharmony()
{
while (1)
{
while (1) {
printf("Hello OpenHarmony\n");
/* 睡眠1秒。该函数为OpenHarmony内核睡眠函数,单位为:毫秒 */
LOS_Msleep(2000);
/* 睡眠2秒。该函数为OpenHarmony内核睡眠函数,单位为:毫秒 */
LOS_Msleep(OPENHARMONY_WAIT_MSEC);
}
}
@@ -66,23 +74,21 @@ void helloworld_example()
/* 创建HelloWorld任务 */
task1.pfnTaskEntry = (TSK_ENTRY_FUNC)task_helloworld; // 运行函数入口
task1.uwStackSize = 2048; // 堆栈大小
task1.uwStackSize = TASK_STACK_SIZE; // 堆栈大小
task1.pcName = "task_helloworld"; // 函数注册名称
task1.usTaskPrio = 24; // 任务的优先级,从0~63
task1.usTaskPrio = HELLWORLD_TASK_PRIO; // 任务的优先级,从0~63
ret = LOS_TaskCreate(&thread_id1, &task1); // 创建任务
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create task_helloworld ret:0x%x\n", ret);
return;
}
task2.pfnTaskEntry = (TSK_ENTRY_FUNC)task_openharmony; // 运行函数入口
task2.uwStackSize = 2048; // 堆栈大小
task2.uwStackSize = TASK_STACK_SIZE; // 堆栈大小
task2.pcName = "task_openharmony"; // 函数注册名称
task2.usTaskPrio = 25; // 任务的优先级,从0~63
task2.usTaskPrio = OPENHARMONY_TASK_PRIO; // 任务的优先级,从0~63
ret = LOS_TaskCreate(&thread_id2, &task2); // 创建任务
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create task_openharmony ret:0x%x\n", ret);
return;
}
+20 -15
View File
@@ -16,6 +16,16 @@
#include "los_task.h"
#include "ohos_init.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 2048
/* 任务的优先级 */
#define TASK_ONE_PRIO 24
#define TASK_TWO_PRIO 24
/* 等待时间 */
#define TASK_ONE_WAIT_MSEC 1000
#define TASK_TWO_WAIT_MSEC 2000
/***************************************************************
* 函数名称: task_one
* 说 明: 线程函数1
@@ -24,10 +34,9 @@
***************************************************************/
void task_one()
{
while (1)
{
while (1) {
printf("This is %s\n", __func__);
LOS_Msleep(1000);
LOS_Msleep(TASK_ONE_WAIT_MSEC);
}
}
@@ -39,10 +48,9 @@ void task_one()
***************************************************************/
void task_two()
{
while (1)
{
while (1) {
printf("This is %s\n", __func__);
LOS_Msleep(2000);
LOS_Msleep(TASK_TWO_WAIT_MSEC);
}
}
@@ -61,27 +69,24 @@ void task_example()
unsigned int ret = LOS_OK;
task1.pfnTaskEntry = (TSK_ENTRY_FUNC)task_one;
task1.uwStackSize = 2048;
task1.uwStackSize = TASK_STACK_SIZE;
task1.pcName = "Task_One";
task1.usTaskPrio = 24;
task1.usTaskPrio = TASK_ONE_PRIO;
ret = LOS_TaskCreate(&thread_id1, &task1);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create Task_One ret:0x%x\n", ret);
return;
}
task2.pfnTaskEntry = (TSK_ENTRY_FUNC)task_two;
task2.uwStackSize = 2048;
task2.uwStackSize = TASK_STACK_SIZE;
task2.pcName = "Task_Two";
task2.usTaskPrio = 25;
task2.usTaskPrio = TASK_TWO_PRIO;
ret = LOS_TaskCreate(&thread_id2, &task2);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create Task_Two ret:0x%x\n", ret);
return;
}
}
APP_FEATURE_INIT(task_example);
+31 -32
View File
@@ -16,7 +16,17 @@
#include "los_sem.h"
#include "ohos_init.h"
#define MAX_COUNT 4
/* 信号量资源总数 */
#define SEM_MAX_COUNT 4
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 2048
/* 任务的优先级 */
#define TASK_PRIO 24
/* 等待时间 */
#define SEM_POST_WAIT_MSEC 1000
#define SEM_PEND_WAIT_MSEC 100
static unsigned int m_sem;
@@ -30,23 +40,19 @@ void control_thread()
{
unsigned int count = 0;
while (1)
{
while (1) {
/*释放两次信号量,sem_one_thread和sem_two_thread同步执行;
释放一次信号量,sem_one_thread和sem_two_thread交替执行*/
if (count++%3)
{
if ((count++) % 3) {
LOS_SemPost(m_sem);
printf("control_thread Release once Semaphore\n");
}
else
{
} else {
LOS_SemPost(m_sem);
LOS_SemPost(m_sem);
printf("control_thread Release twice Semaphore\n");
}
LOS_Msleep(1000);
LOS_Msleep(SEM_POST_WAIT_MSEC);
}
}
@@ -58,13 +64,12 @@ void control_thread()
***************************************************************/
void sem_one_thread()
{
while (1)
{
while (1) {
/*申请信号量*/
LOS_SemPend(m_sem, LOS_WAIT_FOREVER);
printf("sem_one_thread get Semaphore\n");
LOS_Msleep(100);
LOS_Msleep(SEM_PEND_WAIT_MSEC);
}
}
@@ -76,13 +81,12 @@ void sem_one_thread()
***************************************************************/
void sem_two_thread()
{
while (1)
{
while (1) {
/*申请信号量*/
LOS_SemPend(m_sem, LOS_WAIT_FOREVER);
printf("sem_two_thread get Semaphore\n");
LOS_Msleep(100);
LOS_Msleep(SEM_PEND_WAIT_MSEC);
}
}
@@ -102,46 +106,41 @@ void semaphore_example()
TSK_INIT_PARAM_S task3 = {0};
unsigned int ret = LOS_OK;
ret = LOS_SemCreate(MAX_COUNT, &m_sem);
if (ret != LOS_OK)
{
ret = LOS_SemCreate(SEM_MAX_COUNT, &m_sem);
if (ret != LOS_OK) {
printf("Falied to create Semaphore\n");
return;
}
task1.pfnTaskEntry = (TSK_ENTRY_FUNC)control_thread;
task1.uwStackSize = 2048;
task1.uwStackSize = TASK_STACK_SIZE;
task1.pcName = "control_thread";
task1.usTaskPrio = 24;
task1.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_crtl, &task1);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create control_thread ret:0x%x\n", ret);
return;
}
task2.pfnTaskEntry = (TSK_ENTRY_FUNC)sem_one_thread;
task2.uwStackSize = 2048;
task2.uwStackSize = TASK_STACK_SIZE;
task2.pcName = "sem_one_thread";
task2.usTaskPrio = 24;
task2.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id1, &task2);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create sem_one_thread ret:0x%x\n", ret);
return;
}
task3.pfnTaskEntry = (TSK_ENTRY_FUNC)sem_two_thread;
task3.uwStackSize = 2048;
task3.uwStackSize = TASK_STACK_SIZE;
task3.pcName = "sem_two_thread";
task3.usTaskPrio = 24;
task3.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id2, &task3);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create sem_two_thread ret:0x%x\n", ret);
return;
}
}
APP_FEATURE_INIT(semaphore_example);
+12 -17
View File
@@ -16,6 +16,10 @@
#include "los_swtmr.h"
#include "ohos_init.h"
/* 定时器定时滴答数 */
#define TIMER1_TICK 1000
#define TIMER2_TICK 2000
/***************************************************************
* 函数名称: timer1_timeout
* 说 明: 定时器1超时函数
@@ -49,38 +53,29 @@ void timer_example()
unsigned int timer_id1, timer_id2;
unsigned int ret;
ret = LOS_SwtmrCreate(1000, LOS_SWTMR_MODE_PERIOD, timer1_timeout, &timer_id1, NULL);
if (ret == LOS_OK)
{
ret = LOS_SwtmrCreate(TIMER1_TICK, LOS_SWTMR_MODE_PERIOD, timer1_timeout, &timer_id1, NULL);
if (ret == LOS_OK) {
ret = LOS_SwtmrStart(timer_id1);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("start timer1 fail ret:0x%x\n", ret);
return;
}
}
else
{
} else {
printf("create timer1 fail ret:0x%x\n", ret);
return;
}
ret = LOS_SwtmrCreate(2000, LOS_SWTMR_MODE_PERIOD, timer2_timeout, &timer_id2, NULL);
if (ret == LOS_OK)
{
ret = LOS_SwtmrCreate(TIMER2_TICK, LOS_SWTMR_MODE_PERIOD, timer2_timeout, &timer_id2, NULL);
if (ret == LOS_OK) {
ret = LOS_SwtmrStart(timer_id2);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("start timer2 fail ret:0x%x\n", ret);
return;
}
}
else
{
} else {
printf("create timer2 fail ret:0x%x\n"), ret;
return;
}
}
APP_FEATURE_INIT(timer_example);
+24 -20
View File
@@ -16,6 +16,16 @@
#include "los_task.h"
#include "ohos_init.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 2048
/* 任务的优先级 */
#define WRITE_TASK_PRIO 24
#define READ_TASK_PRIO 25
/* 等待时间 */
#define WRITE_WAIT_MSEC 3000
#define READ_WAIT_MSEC 1000
static unsigned int m_mutex_id;
static unsigned int m_data = 0;
@@ -27,14 +37,13 @@ static unsigned int m_data = 0;
***************************************************************/
void write_thread()
{
while (1)
{
while (1) {
LOS_MuxPend(m_mutex_id, LOS_WAIT_FOREVER);
m_data++;
printf("write_thread write data:%u\n", m_data);
LOS_Msleep(3000);
LOS_Msleep(WRITE_WAIT_MSEC);
LOS_MuxPost(m_mutex_id);
}
}
@@ -48,15 +57,14 @@ void write_thread()
void read_thread()
{
/*delay 1s*/
LOS_Msleep(1000);
LOS_Msleep(READ_WAIT_MSEC);
while (1)
{
while (1) {
LOS_MuxPend(m_mutex_id, LOS_WAIT_FOREVER);
printf("read_thread read data:%u\n", m_data);
LOS_Msleep(1000);
LOS_MuxPost(m_mutex_id);
LOS_Msleep(READ_WAIT_MSEC);
LOS_MuxPost(READ_WAIT_MSEC);
}
}
@@ -75,33 +83,29 @@ void mutex_example()
unsigned int ret = LOS_OK;
ret = LOS_MuxCreate(&m_mutex_id);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create Mutex\n");
}
task1.pfnTaskEntry = (TSK_ENTRY_FUNC)write_thread;
task1.uwStackSize = 2048;
task1.uwStackSize = TASK_STACK_SIZE;
task1.pcName = "write_thread";
task1.usTaskPrio = 24;
task1.usTaskPrio = WRITE_TASK_PRIO;
ret = LOS_TaskCreate(&thread_id1, &task1);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create write_thread ret:0x%x\n", ret);
return;
}
task2.pfnTaskEntry = (TSK_ENTRY_FUNC)read_thread;
task2.uwStackSize = 2048;
task2.uwStackSize = TASK_STACK_SIZE;
task2.pcName = "read_thread";
task2.usTaskPrio = 25;
task2.usTaskPrio = READ_TASK_PRIO;
ret = LOS_TaskCreate(&thread_id2, &task2);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create read_thread ret:0x%x\n", ret);
return;
}
}
APP_FEATURE_INIT(mutex_example);
+26 -28
View File
@@ -16,8 +16,18 @@
#include "los_task.h"
#include "ohos_init.h"
#define MSG_QUEUE_LENGTH 16
#define BUFFER_LEN 50
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 2048
/* 任务的优先级 */
#define MSG_WRITE_TASK_PRIO 24
#define MSG_READ_TASK_PRIO 25
/* 等待时间 */
#define MSG_WRITE_WAIT_MSEC 1000
/* 消息队列长度 */
#define MSG_QUEUE_LENGTH 16
#define BUFFER_LEN 50
static unsigned int m_msg_queue;
@@ -32,21 +42,17 @@ void msg_write_thread(void *arg)
unsigned int data = 0;
unsigned int ret = LOS_OK;
while (1)
{
while (1) {
data++;
ret = LOS_QueueWrite(m_msg_queue, (void *)&data, sizeof(data), LOS_WAIT_FOREVER);
if (LOS_OK != ret)
{
if (LOS_OK != ret) {
printf("%s write Message Queue msg fail ret:0x%x\n", __func__, ret);
}
else
{
} else {
printf("%s write Message Queue msg:%u\n", __func__, data);
}
/*delay 1s*/
LOS_Msleep(1000);
LOS_Msleep(MSG_WRITE_WAIT_MSEC);
}
}
@@ -62,17 +68,13 @@ void msg_read_thread(void *arg)
unsigned int ret = LOS_OK;
unsigned int *pData = NULL;
while (1)
{
while (1) {
/*wait for message*/
ret = LOS_QueueRead(m_msg_queue, (void *)&addr, BUFFER_LEN, LOS_WAIT_FOREVER);
if (ret == LOS_OK)
{
if (ret == LOS_OK) {
pData = addr;
printf("%s read Message Queue msg:%u\n", __func__, *pData);
}
else
{
} else {
printf("%s read Message Queue fail ret:0x%x\n", __func__, ret);
}
}
@@ -93,34 +95,30 @@ void queue_example()
unsigned int ret = LOS_OK;
ret = LOS_QueueCreate("queue", MSG_QUEUE_LENGTH, &m_msg_queue, 0, BUFFER_LEN);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create Message Queue ret:0x%x\n", ret);
return;
}
task1.pfnTaskEntry = (TSK_ENTRY_FUNC)msg_write_thread;
task1.uwStackSize = 2048;
task1.uwStackSize = TASK_STACK_SIZE;
task1.pcName = "msg_write_thread";
task1.usTaskPrio = 24;
task1.usTaskPrio = MSG_WRITE_TASK_PRIO;
ret = LOS_TaskCreate(&thread_id1, &task1);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create msg_write_thread ret:0x%x\n", ret);
return;
}
task2.pfnTaskEntry = (TSK_ENTRY_FUNC)msg_read_thread;
task2.uwStackSize = 2048;
task2.uwStackSize = TASK_STACK_SIZE;
task2.pcName = "msg_read_thread";
task2.usTaskPrio = 25;
task2.usTaskPrio = MSG_READ_TASK_PRIO;
ret = LOS_TaskCreate(&thread_id2, &task2);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create msg_read_thread ret:0x%x\n", ret);
return;
}
}
APP_FEATURE_INIT(queue_example);
+25 -19
View File
@@ -17,7 +17,19 @@
#include "los_task.h"
#include "ohos_init.h"
#define EVENT_WAIT 0x00000001
#define EVENT_WAIT 0x00000001
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 2048
/* 任务的优先级 */
#define TAKS_PRIO 5
/* 主程序进入循环前的等待时间 */
#define MASTER_WAIT_DELAY_MSEC 1000
/* 主程序event等待时间 */
#define MASTER_EVENT_DELAY_MSEC 2000
/* 从程序event等待时间 */
#define SLAVE_EVENT_DELAY_MSEC 1000
static EVENT_CB_S m_event;
@@ -31,10 +43,9 @@ void event_master_thread()
{
unsigned int ret = LOS_OK;
LOS_Msleep(1000);
LOS_Msleep(MASTER_WAIT_DELAY_MSEC);
while (1)
{
while (1) {
printf("%s write event:0x%x\n", __func__, EVENT_WAIT);
ret = LOS_EventWrite(&m_event, EVENT_WAIT);
if (ret != LOS_OK) {
@@ -42,7 +53,7 @@ void event_master_thread()
}
/*delay 1s*/
LOS_Msleep(2000);
LOS_Msleep(EVENT_DELAY_MSEC);
LOS_EventClear(&m_event, ~m_event.uwEventID);
}
}
@@ -57,12 +68,11 @@ void event_slave_thread()
{
unsigned int event;
while (1)
{
while (1) {
/* 阻塞方式读事件,等待事件到达*/
event = LOS_EventRead(&m_event, EVENT_WAIT, LOS_WAITMODE_AND, LOS_WAIT_FOREVER);
printf("%s read event:0x%x\n", __func__, event);
LOS_Msleep(1000);
LOS_Msleep(SLAVE_EVENT_DELAY_MSEC);
}
}
@@ -81,34 +91,30 @@ void event_example()
unsigned int ret = LOS_OK;
ret = LOS_EventInit(&m_event);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create EventFlags\n");
return;
}
task1.pfnTaskEntry = (TSK_ENTRY_FUNC)event_master_thread;
task1.uwStackSize = 2048;
task1.uwStackSize = TASK_STACK_SIZE;
task1.pcName = "event_master_thread";
task1.usTaskPrio = 5;
task1.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id1, &task1);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create event_master_thread ret:0x%x\n", ret);
return;
}
task2.pfnTaskEntry = (TSK_ENTRY_FUNC)event_slave_thread;
task2.uwStackSize = 2048;
task2.uwStackSize = TASK_STACK_SIZE;
task2.pcName = "event_slave_thread";
task2.usTaskPrio = 5;
task2.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id2, &task2);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create event_slave_thread ret:0x%x\n", ret);
return;
}
}
APP_FEATURE_INIT(event_example);
+29 -16
View File
@@ -21,8 +21,16 @@
#include "ohos_init.h"
#include "lz_hardware.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 2048
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 1000
/* 定义ADC的通道号 */
#define ADC_CHANNEL 5
#define ADC_CHANNEL 5
/* 定义ADC初始化的结构体 */
static DevIo m_adcKey = {
.isr = {.gpio = INVALID_GPIO},
@@ -31,6 +39,15 @@ static DevIo m_adcKey = {
.ctrl2 = {.gpio = INVALID_GPIO},
};
/* 寄存器地址 */
#define GRF_SOC_CON29_REG_ADDRESS (0x41050000U + 0x274U)
/* 设置saradc的电压信号为AVDD,即参考外部电压为0V */
#define BITS_SELECT_AVDD(value) ((value) & (~(0x1 << 4)))
#define BITS_ENABLE_AVDD(value) ((value) | ((0x1 << 4) << 16))
/* ADC最大电压量程 */
#define
/* ADC最大档位 */
/***************************************************************
* 函数名称: adc_dev_init
@@ -41,14 +58,13 @@ static DevIo m_adcKey = {
static unsigned int adc_dev_init()
{
unsigned int ret = 0;
uint32_t *pGrfSocCon29 = (uint32_t *)(0x41050000U + 0x274U);
uint32_t *pGrfSocCon29 = (uint32_t *)(GRF_SOC_CON29_REG_ADDRESS);
uint32_t ulValue;
PinctrlSet(GPIO0_PC5, MUX_FUNC1, PULL_NONE, DRIVE_KEEP);
ret = DevIoInit(m_adcKey);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: ADC Key IO Init fail\n", __FILE__, __func__, __LINE__);
return __LINE__;
}
@@ -61,8 +77,8 @@ static unsigned int adc_dev_init()
/* 设置saradc的电压信号,选择AVDD */
ulValue = *pGrfSocCon29;
ulValue &= ~(0x1 << 4);
ulValue |= ((0x1 << 4) << 16);
ulValue = BITS_SELECT_AVDD(ulValue);
ulValue = BITS_ENABLE_AVDD(ulValue);
*pGrfSocCon29 = ulValue;
return 0;
@@ -80,8 +96,7 @@ static float adc_get_voltage()
unsigned int data = 0;
ret = LzSaradcReadValue(ADC_CHANNEL, &data);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: ADC Read Fail\n", __FILE__, __func__, __LINE__);
return 0.0;
}
@@ -101,16 +116,15 @@ void adc_process()
/* 初始化adc设备 */
adc_dev_init();
while (1)
{
while (1) {
printf("***************Adc Example*************\r\n");
/*获取电压值*/
voltage = adc_get_voltage();
printf("vlt:%.3fV\n", voltage);
/* 睡眠1秒 */
usleep(1000000);
LOS_Msleep(WAIT_MSEC);
}
}
@@ -128,12 +142,11 @@ void adc_example()
unsigned int ret = LOS_OK;
task.pfnTaskEntry = (TSK_ENTRY_FUNC)adc_process;
task.uwStackSize = 2048;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "adc process";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create task ret:0x%x\n", ret);
return;
}
+13 -10
View File
@@ -17,6 +17,14 @@
#include "los_task.h"
#include "ohos_init.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 10240
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 1000
#define TEXT "XiaoZhiPai!"
#define WEB "fzlzdz.com"
@@ -31,27 +39,23 @@ void nfc_process(void)
unsigned int ret = 0;
/* 初始化NFC设备 */
printf("%s, %d: \n", __FILE__, __LINE__);
nfc_init();
printf("%s, %d: \n", __FILE__, __LINE__);
ret = nfc_store_text(NDEFFirstPos, (uint8_t *)TEXT);
if (ret != 1) {
printf("NFC Write Text Failed: %d\n", ret);
}
printf("%s, %d: \n", __FILE__, __LINE__);
ret = nfc_store_uri_http(NDEFLastPos, (uint8_t *)WEB);
if (ret != 1) {
printf("NFC Write Url Failed: %d\n", ret);
}
printf("%s, %d: \n", __FILE__, __LINE__);
while (1) {
printf("==============NFC Example==============\r\n");
printf("Please use the mobile phone with NFC function close to the development board!\r\n");
printf("\n\n");
LOS_Msleep(1000);
LOS_Msleep(WAIT_MSEC);
}
}
@@ -69,12 +73,11 @@ void nfc_example()
unsigned int ret = LOS_OK;
task.pfnTaskEntry = (TSK_ENTRY_FUNC)nfc_process;
task.uwStackSize = 10240;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "nfc process";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create task ret:0x%x\n", ret);
return;
}
Executable → Regular
+41 -64
View File
@@ -26,8 +26,7 @@
static unsigned int NFC_I2C_PORT = 2;
/* i2c配置 */
static I2cBusIo m_i2c2m0 =
{
static I2cBusIo m_i2c2m0 = {
.scl = {.gpio = GPIO0_PD6, .func = MUX_FUNC1, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},
.sda = {.gpio = GPIO0_PD5, .func = MUX_FUNC1, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},
.id = FUNC_ID_I2C2,
@@ -49,15 +48,14 @@ inline const uint8_t* get_last_ncf_page(void)
static bool writeTimeout( uint8_t *data, uint8_t dataSend)
{
uint32_t status = 0;
status = LzI2cWrite(NFC_I2C_PORT, NT3H1X_SLAVE_ADDRESS, data, dataSend);
if (status != LZ_HARDWARE_SUCCESS)
{
if (status != LZ_HARDWARE_SUCCESS) {
printf("===== Error: I2C write status1 = 0x%x! =====\r\n", status);
return 0;
}
usleep(300000);
return 1;
}
@@ -65,21 +63,19 @@ static bool readTimeout(uint8_t address, uint8_t *block_data)
{
uint32_t status = 0;
uint8_t buffer[1] = {address};
status = LzI2cWrite(NFC_I2C_PORT, NT3H1X_SLAVE_ADDRESS, &buffer[0], 1);
if (status != LZ_HARDWARE_SUCCESS)
{
if (status != LZ_HARDWARE_SUCCESS) {
printf("===== Error: I2C write status1 = 0x%x! =====\r\n", status);
return 0;
}
status = LzI2cRead(NFC_I2C_PORT, NT3H1X_SLAVE_ADDRESS, block_data, NFC_PAGE_SIZE);
if (status != 0)
{
if (status != 0) {
printf("===== Error: I2C write status = 0x%x! =====\r\n", status);
return 0;
}
return 1;
}
@@ -87,24 +83,22 @@ unsigned int NT3HI2cInit()
{
uint32_t *pGrf = (uint32_t *)0x41050000U;
uint32_t ulValue;
ulValue = pGrf[7];
ulValue &= ~((0x7 << 8) | (0x7 << 4));
ulValue |= ((0x1 << 8) | (0x1 << 4));
pGrf[7] = ulValue | (0xFFFF << 16);
printf("%s, %d: GRF_GPIO0D_IOMUX_H(0x%x) = 0x%x\n", __func__, __LINE__, &pGrf[7], pGrf[7]);
if (I2cIoInit(m_i2c2m0) != LZ_HARDWARE_SUCCESS)
{
if (I2cIoInit(m_i2c2m0) != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: I2cIoInit failed!\n", __FILE__, __func__, __LINE__);
return __LINE__;
}
if (LzI2cInit(NFC_I2C_PORT, m_i2c2_freq) != LZ_HARDWARE_SUCCESS)
{
if (LzI2cInit(NFC_I2C_PORT, m_i2c2_freq) != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: LzI2cInit failed!\n", __FILE__, __func__, __LINE__);
return __LINE__;
}
return 0;
}
@@ -117,24 +111,20 @@ bool NT3HReadHeaderNfc(uint8_t *endRecordsPtr, uint8_t *ndefHeader)
{
*endRecordsPtr = 0;
bool ret = NT3HReadUserData(0);
// read the first page to see where is the end of the Records.
if (ret == true)
{
if (ret == true) {
// if the first byte is equals to NDEF_START_BYTE there are some records
// store theend of that
if ((NDEF_START_BYTE == nfcPageBuffer[0]) && (NTAG_ERASED != nfcPageBuffer[2]))
{
if ((NDEF_START_BYTE == nfcPageBuffer[0]) && (NTAG_ERASED != nfcPageBuffer[2])) {
*endRecordsPtr = nfcPageBuffer[1];
*ndefHeader = nfcPageBuffer[2];
}
return true;
}
else
{
} else {
errNo = NT3HERROR_READ_HEADER;
}
return ret;
}
@@ -144,22 +134,18 @@ bool NT3HWriteHeaderNfc(uint8_t endRecordsPtr, uint8_t ndefHeader)
// read the first page to see where is the end of the Records.
bool ret = NT3HReadUserData(0);
if (ret == true)
{
if (ret == true) {
nfcPageBuffer[1] = endRecordsPtr;
nfcPageBuffer[2] = ndefHeader;
ret = NT3HWriteUserData(0, nfcPageBuffer);
if (ret == false)
{
if (ret == false) {
errNo = NT3HERROR_WRITE_HEADER;
}
}
else
{
} else {
errNo = NT3HERROR_READ_HEADER;
}
return ret;
}
@@ -170,9 +156,8 @@ bool NT3HEraseAllTag(void)
bool ret = true;
uint8_t erase[NFC_PAGE_SIZE + 1] = {USER_START_REG, 0x03, 0x03, 0xD0, 0x00, 0x00, 0xFE};
ret = writeTimeout(erase, sizeof(erase));
if (ret == false)
{
if (ret == false) {
errNo = NT3HERROR_ERASE_USER_MEMORY_PAGE;
}
return ret;
@@ -198,19 +183,17 @@ bool NT3HReadUserData(uint8_t page)
{
uint8_t reg = USER_START_REG + page;
// if the requested page is out of the register exit with error
if (reg > USER_END_REG)
{
if (reg > USER_END_REG) {
errNo = NT3HERROR_INVALID_USER_MEMORY_PAGE;
return false;
}
bool ret = readTimeout(reg, nfcPageBuffer);
if (ret == false)
{
if (ret == false) {
errNo = NT3HERROR_READ_USER_MEMORY_PAGE;
}
return ret;
}
@@ -220,24 +203,22 @@ bool NT3HWriteUserData(uint8_t page, const uint8_t* data)
bool ret = true;
uint8_t dataSend[NFC_PAGE_SIZE + 1]; // data plus register
uint8_t reg = USER_START_REG + page;
// if the requested page is out of the register exit with error
if (reg > USER_END_REG)
{
if (reg > USER_END_REG) {
errNo = NT3HERROR_INVALID_USER_MEMORY_PAGE;
ret = false;
goto end;
}
dataSend[0] = reg; // store the register
memcpy(&dataSend[1], data, NFC_PAGE_SIZE);
ret = writeTimeout(dataSend, sizeof(dataSend));
if (ret == false)
{
if (ret == false) {
errNo = NT3HERROR_WRITE_USER_MEMORY_PAGE;
goto end;
}
end:
return ret;
}
@@ -246,11 +227,9 @@ end:
bool NT3HReadSram(void)
{
bool ret = false;
for (int i = SRAM_START_REG, j = 0; i <= SRAM_END_REG; i++, j++)
{
for (int i = SRAM_START_REG, j = 0; i <= SRAM_END_REG; i++, j++) {
ret = readTimeout(i, nfcPageBuffer);
if (ret == false)
{
if (ret == false) {
return ret;
}
//memcpy(&userData[offset], pageBuffer, sizeof(pageBuffer));
@@ -262,11 +241,9 @@ bool NT3HReadSram(void)
void NT3HGetNxpSerialNumber(char* buffer)
{
uint8_t manuf[16];
if (NT3HReaddManufactoringData(manuf))
{
for (int i = 0; i < 6; i++)
{
if (NT3HReaddManufactoringData(manuf)) {
for (int i = 0; i < 6; i++) {
buffer[i] = manuf[i];
}
}
Executable → Regular
+3 -6
View File
@@ -37,8 +37,7 @@
#define NFC_PAGE_SIZE 16
typedef enum
{
typedef enum {
NT3HERROR_NO_ERROR,
NT3HERROR_READ_HEADER,
NT3HERROR_WRITE_HEADER,
@@ -58,15 +57,13 @@ extern NT3HerrNo errNo;
* This strucure is used in the ADD record functionality
* to store the last nfc page information, in order to continue from that point.
*/
typedef struct
{
typedef struct {
uint8_t page;
uint8_t usedBytes;
} UncompletePageStr;
typedef struct
{
typedef struct {
RecordPosEnu ndefPosition;
uint8_t rtdType;
uint8_t *rtdPayload;
Executable → Regular
+74 -105
View File
@@ -22,45 +22,43 @@
typedef uint8_t (*composeRtdPtr)(const NDEFDataStr *ndef, NDEFRecordStr *ndefRecord, uint8_t *I2CMsg);
static composeRtdPtr composeRtd[] = {composeRtdText, composeRtdUri};
static int16_t firstRecord(UncompletePageStr *page, const NDEFDataStr *data, RecordPosEnu rtdPosition)
{
NDEFRecordStr record;
NDEFHeaderStr header;
uint8_t typeFunct = 0;
switch (data->rtdType)
{
case RTD_TEXT:
typeFunct = 0;
break;
case RTD_URI:
typeFunct = 1;
break;
default:
return -1;
break;
switch (data->rtdType) {
case RTD_TEXT:
typeFunct = TYPE_FUNCT_TEXT;
break;
case RTD_URI:
typeFunct = TYPE_FUNCT_URI;
break;
default:
return TYPE_FUNCT_INVALID;
break;
}
// clear all buffers
memset(&record, 0, sizeof(NDEFRecordStr));
memset(nfcPageBuffer, 0, NFC_PAGE_SIZE);
// this is the first record
header.startByte = NDEF_START_BYTE;
composeNDEFMBME(true, true, &record);
// prepare the NDEF Header and payload
uint8_t recordLength = composeRtd[typeFunct](data, &record, &nfcPageBuffer[sizeof(NDEFHeaderStr)]);
header.payloadLength = data->rtdPayloadlength + recordLength;
// write first record
memcpy(nfcPageBuffer, &header, sizeof(NDEFHeaderStr));
return sizeof(NDEFHeaderStr) + recordLength;
}
@@ -71,63 +69,56 @@ static int16_t addRecord(UncompletePageStr *pageToUse, const NDEFDataStr *data,
uint8_t newRecordPtr, mbMe;
bool ret = true;
uint8_t tmpBuffer[NFC_PAGE_SIZE];
uint8_t typeFunct = 0;
switch (data->rtdType)
{
case RTD_TEXT:
typeFunct = 0;
break;
case RTD_URI:
typeFunct = 1;
break;
default:
return -1;
break;
switch (data->rtdType) {
case RTD_TEXT:
typeFunct = 0;
break;
case RTD_URI:
typeFunct = 1;
break;
default:
return -1;
break;
}
// first Change the Header of the first Record
NT3HReadHeaderNfc(&newRecordPtr, &mbMe);
record.header = mbMe;
composeNDEFMBME(true, false, &record); // this is the first record
mbMe = record.header;
memset(&record, 0, sizeof(NDEFRecordStr));
memset(tmpBuffer, 0, NFC_PAGE_SIZE);
// prepare second record
uint8_t recordLength = composeRtd[typeFunct](data, &record, tmpBuffer);
if (rtdPosition == NDEFMiddlePos)
{
if (rtdPosition == NDEFMiddlePos) {
// this is a record in the middle adjust it on the buffet
composeNDEFMBME(false, false, &record);
}
else if (rtdPosition == NDEFLastPos)
{
} else if (rtdPosition == NDEFLastPos) {
// this is the last record adjust it on the buffet
composeNDEFMBME(false, true, &record);
}
tmpBuffer[0] = record.header;
header.payloadLength += data->rtdPayloadlength + recordLength;
// save the new value of length on the first page
NT3HWriteHeaderNfc((newRecordPtr + header.payloadLength), mbMe);
// use the last valid page and start to add the new record
NT3HReadUserData(pageToUse->page);
if (pageToUse->usedBytes + recordLength < NFC_PAGE_SIZE)
{
if (pageToUse->usedBytes + recordLength < NFC_PAGE_SIZE) {
memcpy(&nfcPageBuffer[pageToUse->usedBytes], tmpBuffer, recordLength);
return recordLength + pageToUse->usedBytes;
}
else
{
} else {
uint8_t byteToCopy = NFC_PAGE_SIZE - pageToUse->usedBytes;
memcpy(&nfcPageBuffer[pageToUse->usedBytes], tmpBuffer, byteToCopy);
NT3HWriteUserData(pageToUse->page, nfcPageBuffer);
@@ -138,94 +129,74 @@ static int16_t addRecord(UncompletePageStr *pageToUse, const NDEFDataStr *data,
memcpy(nfcPageBuffer, &tmpBuffer[byteToCopy], pageToUse->usedBytes);
return pageToUse->usedBytes;
}
}
static bool writeUserPayload(int16_t payloadPtr, const NDEFDataStr *data, UncompletePageStr *addPage)
{
uint8_t addedPayload;
bool ret = false;
uint8_t finish = payloadPtr + data->rtdPayloadlength;
bool endRecord = false;
uint8_t copyByte = 0;
// if the header is less then the NFC_PAGE_SIZE, fill it with the payload
if (NFC_PAGE_SIZE > payloadPtr)
{
if (data->rtdPayloadlength > NFC_PAGE_SIZE - payloadPtr)
{
if (NFC_PAGE_SIZE > payloadPtr) {
if (data->rtdPayloadlength > NFC_PAGE_SIZE - payloadPtr) {
copyByte = NFC_PAGE_SIZE - payloadPtr;
}
else
{
} else {
copyByte = data->rtdPayloadlength;
}
}
// Copy the payload
memcpy(&nfcPageBuffer[payloadPtr], data->rtdPayload, copyByte);
addedPayload = copyByte;
//if it is sufficient one send add the NDEF_END_BYTE
if ((addedPayload >= data->rtdPayloadlength) && ((payloadPtr + copyByte) < NFC_PAGE_SIZE))
{
if ((addedPayload >= data->rtdPayloadlength) && ((payloadPtr + copyByte) < NFC_PAGE_SIZE)) {
nfcPageBuffer[(payloadPtr + copyByte)] = NDEF_END_BYTE;
endRecord = true;
}
ret = NT3HWriteUserData(addPage->page, nfcPageBuffer);
while (!endRecord)
{
while (!endRecord) {
addPage->page++; // move to a new register
memset(nfcPageBuffer, 0, NFC_PAGE_SIZE);
//special case just the NDEF_END_BYTE remain out
if (addedPayload == data->rtdPayloadlength)
{
if (addedPayload == data->rtdPayloadlength) {
nfcPageBuffer[0] = NDEF_END_BYTE;
ret = NT3HWriteUserData(addPage->page, nfcPageBuffer);
endRecord = true;
if (ret == false)
{
if (ret == false) {
errNo = NT3HERROR_WRITE_NDEF_TEXT;
}
goto end;
}
if (addedPayload < data->rtdPayloadlength)
{
if (addedPayload < data->rtdPayloadlength) {
// add the NDEF_END_BYTE if there is enough space
if ((data->rtdPayloadlength - addedPayload) < NFC_PAGE_SIZE)
{
if ((data->rtdPayloadlength - addedPayload) < NFC_PAGE_SIZE) {
memcpy(nfcPageBuffer, &data->rtdPayload[addedPayload], (data->rtdPayloadlength - addedPayload));
nfcPageBuffer[(data->rtdPayloadlength - addedPayload)] = NDEF_END_BYTE;
}
else
{
} else {
memcpy(nfcPageBuffer, &data->rtdPayload[addedPayload], NFC_PAGE_SIZE);
}
addedPayload += NFC_PAGE_SIZE;
ret = NT3HWriteUserData(addPage->page, nfcPageBuffer);
if (ret == false)
{
if (ret == false) {
errNo = NT3HERROR_WRITE_NDEF_TEXT;
goto end;
}
}
else
{
} else {
endRecord = true;
}
}
end:
return ret;
}
@@ -238,26 +209,24 @@ bool NT3HwriteRecord(const NDEFDataStr *data)
uint8_t recordLength = 0, mbMe;
UncompletePageStr addPage;
addPage.page = 0;
// calculate the last used page
if (data->ndefPosition != NDEFFirstPos )
{
if (data->ndefPosition != NDEFFirstPos ) {
NT3HReadHeaderNfc(&recordLength, &mbMe);
addPage.page = (recordLength + sizeof(NDEFHeaderStr) + 1) / NFC_PAGE_SIZE;
//remove the NDEF_END_BYTE byte because it will overwrite by the new Record
addPage.usedBytes = (recordLength + sizeof(NDEFHeaderStr) + 1) % NFC_PAGE_SIZE - 1;
}
// call the appropriate function and consider the pointer
// within the NFC_PAGE_SIZE that need to be used
int16_t payloadPtr = addFunct[data->ndefPosition](&addPage, data, data->ndefPosition);
if (payloadPtr == -1)
{
if (payloadPtr == -1) {
errNo = NT3HERROR_TYPE_NOT_SUPPORTED;
return false;
}
return writeUserPayload(payloadPtr, data, &addPage);
}
+5 -1
View File
@@ -18,7 +18,11 @@
#include "NT3H.h"
/* 定义报文类型 */
#define TYPE_FUNCT_TEXT 0
#define TYPE_FUNCT_URI 1
#define TYPE_FUNCT_INVALID -1
bool NT3HwriteRecord(const NDEFDataStr *data);
#endif /* NDEF_H_ */
Executable → Regular
+15 -18
View File
@@ -20,9 +20,10 @@
#include "rtdUri.h"
#include "ndef.h"
/* 记录是否已经初始化 */
static unsigned char m_nfc_is_init = 0;
#define NFC_NOT_INIT 0
#define NFC_IS_INIT 1
static unsigned char m_nfc_is_init = NFC_NOT_INIT;
//////////////////////////////////////////////////////////////////////
@@ -37,13 +38,12 @@ static unsigned char m_nfc_is_init = 0;
bool nfc_store_uri_http(RecordPosEnu position, uint8_t *http)
{
NDEFDataStr data;
if (m_nfc_is_init == 0)
{
if (m_nfc_is_init == NFC_NOT_INIT) {
printf("%s, %s, %d: NFC is not init!\n", __FILE__, __func__, __LINE__);
return 0;
}
prepareUrihttp(&data, position, http);
return NT3HwriteRecord(&data);
}
@@ -60,13 +60,12 @@ bool nfc_store_uri_http(RecordPosEnu position, uint8_t *http)
bool nfc_store_text(RecordPosEnu position, uint8_t *text)
{
NDEFDataStr data;
if (m_nfc_is_init == 0)
{
if (m_nfc_is_init == NFC_NOT_INIT) {
printf("%s, %s, %d: NFC is not init!\n", __FILE__, __func__, __LINE__);
return 0;
}
prepareText(&data, position, text);
return NT3HwriteRecord(&data);
}
@@ -80,20 +79,18 @@ bool nfc_store_text(RecordPosEnu position, uint8_t *text)
unsigned int nfc_init(void)
{
unsigned int ret = 0;
if (m_nfc_is_init == 1)
{
if (m_nfc_is_init == NFC_IS_INIT) {
printf("%s, %s, %d: Nfc readly init!\n", __FILE__, __func__, __LINE__);
return __LINE__;
}
ret = NT3HI2cInit();
if (ret != 0)
{
if (ret != 0) {
printf("%s, %s, %d: NT3HI2cInit failed!\n", __FILE__, __func__, __LINE__);
return __LINE__;
}
m_nfc_is_init = 1;
return 0;
}
@@ -107,7 +104,7 @@ unsigned int nfc_init(void)
***************************************************************/
unsigned int nfc_deinit(void)
{
m_nfc_is_init = 0;
m_nfc_is_init = NFC_NOT_INIT;
NT3HI2cDeInit();
return 0;
}
+16 -22
View File
@@ -21,10 +21,10 @@ static void rtdHeader(uint8_t type, NDEFRecordStr *ndefRecord, uint8_t *I2CMsg)
ndefRecord->header |= 1;
ndefRecord->header |= BIT_SR;
I2CMsg[0] = ndefRecord->header;
ndefRecord->typeLength = 1;
I2CMsg[1] = ndefRecord->typeLength;
ndefRecord->type.typeCode = type;
I2CMsg[3] = ndefRecord->type.typeCode;
}
@@ -33,21 +33,21 @@ static void rtdHeader(uint8_t type, NDEFRecordStr *ndefRecord, uint8_t *I2CMsg)
uint8_t composeRtdText(const NDEFDataStr *ndef, NDEFRecordStr *ndefRecord, uint8_t *I2CMsg)
{
uint8_t retLen;
rtdHeader(RTD_TEXT, ndefRecord, I2CMsg);
uint8_t payLoadLen = addRtdText(&ndefRecord->type.typePayload.text);
memcpy(&I2CMsg[4], &ndefRecord->type.typePayload.text, payLoadLen);
ndefRecord->payloadLength = ndef->rtdPayloadlength + payLoadLen; // added the typePayload
I2CMsg[2] = ndefRecord->payloadLength;
retLen = 3 + /*sizeof(ndefRecord->header) +
sizeof(ndefRecord->typeLength) +
sizeof(ndefRecord->payloadLength) +*/
3 + //sizeof(RTDTextTypeStr)-sizeof(TextExtraDataStr)
1 /*sizeof(ndefRecord->type.typeCode)*/;
return retLen;
}
@@ -56,13 +56,13 @@ uint8_t composeRtdUri(const NDEFDataStr *ndef, NDEFRecordStr *ndefRecord, uint8_
{
rtdHeader(RTD_URI, ndefRecord, I2CMsg);
uint8_t payLoadLen = addRtdUriRecord(ndef, &ndefRecord->type.typePayload.uri);
memcpy(&I2CMsg[4], &ndefRecord->type.typePayload.uri, payLoadLen);
ndefRecord->payloadLength = ndef->rtdPayloadlength + payLoadLen; // added the typePayload
I2CMsg[2] = ndefRecord->payloadLength;
return 5;
/* retLen = sizeof(ndefRecord->header) +
sizeof(ndefRecord->typeLength) +
@@ -70,26 +70,20 @@ uint8_t composeRtdUri(const NDEFDataStr *ndef, NDEFRecordStr *ndefRecord, uint8_
sizeof(1) + //ndefRecord->type.typePayload.uri.type
sizeof(ndefRecord->type.typeCode);
*/
}
void composeNDEFMBME(bool isFirstRecord, bool isLastRecord, NDEFRecordStr *ndefRecord)
{
if (isFirstRecord)
{
if (isFirstRecord) {
ndefRecord->header |= BIT_MB;
}
else
{
} else {
ndefRecord->header &= ~MASK_MB;
}
if (isLastRecord)
{
if (isLastRecord) {
ndefRecord->header |= BIT_ME;
}
else
{
} else {
ndefRecord->header &= ~MASK_ME;
}
}
+6 -6
View File
@@ -29,7 +29,7 @@
typedef struct {
uint8_t startByte;
uint8_t payloadLength;
}NDEFHeaderStr;
} NDEFHeaderStr;
#define BIT_MB (1<<7)
#define BIT_ME (1<<6)
@@ -45,11 +45,11 @@ typedef struct {
#define MASK_TNF 0x07
typedef struct {
uint8_t header;
uint8_t typeLength;
uint8_t payloadLength;
RTDTypeStr type;
}NDEFRecordStr;
uint8_t header;
uint8_t typeLength;
uint8_t payloadLength;
RTDTypeStr type;
} NDEFRecordStr;
uint8_t composeRtdText(const NDEFDataStr *ndef, NDEFRecordStr *ndefRecord, uint8_t *I2CMsg);
uint8_t composeRtdUri(const NDEFDataStr *ndef, NDEFRecordStr *ndefRecord, uint8_t *I2CMsg);
+1 -1
View File
@@ -22,7 +22,7 @@ uint8_t addRtdText(RtdTextTypeStr *typeStr)
typeStr->status = 0x2;
typeStr->language[0] = 'e';
typeStr->language[1] = 'n';
return 3;
}
+2 -2
View File
@@ -28,13 +28,13 @@
typedef struct {
char *body;
uint8_t bodyLength;
}RtdTextUserPayload;
} RtdTextUserPayload;
typedef struct {
uint8_t status;
uint8_t language[2];
RtdTextUserPayload rtdPayload;
}RtdTextTypeStr;
} RtdTextTypeStr;
uint8_t addRtdText(RtdTextTypeStr *typeStr);
void prepareText(NDEFDataStr *data, RecordPosEnu position, uint8_t *text);
+1 -1
View File
@@ -30,6 +30,6 @@ typedef union {
typedef struct {
uint8_t typeCode;
RTDTypeUnion typePayload;
}RTDTypeStr;
} RTDTypeStr;
#endif /* RTDTYPES_H_ */
+2 -2
View File
@@ -22,7 +22,7 @@ static RTDUriTypeStr uri;
uint8_t addRtdUriRecord(const NDEFDataStr *ndef, RTDUriTypeStr *uriType)
{
uriType->type = ((RTDUriTypeStr*) ndef->specificRtdData)->type;
return 1;
}
@@ -32,7 +32,7 @@ void prepareUrihttp(NDEFDataStr *data, RecordPosEnu position, uint8_t *text)
data->rtdType = RTD_URI;
data->rtdPayload = text;
data->rtdPayloadlength = strlen((const char *)text);
uri.type = httpWWW;
data->specificRtdData = &uri;
}
+3 -6
View File
@@ -18,8 +18,7 @@
#ifndef RTDURI_H_
#define RTDURI_H_
typedef enum
{
typedef enum {
freeForm, //0x00 No prepending is done ... the entire URI is contained in the URI Field
httpWWW, //0x01 http://www.
httpsWWW, //0x02 https://www.
@@ -60,15 +59,13 @@ typedef enum
*/
} UriTypeE;
typedef struct
{
typedef struct {
char *body;
uint8_t bodyLength;
void *extraData; // herre should be stored specific URI msgs
} RtdUriUserPayload;
typedef struct
{
typedef struct {
UriTypeE type;
RtdUriUserPayload userPayload; // here should be stored specific URI msgs
} RTDUriTypeStr;
+27 -31
View File
@@ -17,6 +17,14 @@
#include "ohos_init.h"
#include "eeprom.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 5000
void eeprom_proress(void *arg)
{
#define FOR_CHAR 30
@@ -28,56 +36,47 @@ void eeprom_proress(void *arg)
unsigned int addr_offset = 3;
unsigned char data;
unsigned char buffer[FOR_CHAR];
eeprom_init();
while (1)
{
while (1) {
printf("************ Eeprom Process ************\n");
printf("BlockSize = 0x%x\n", eeprom_get_blocksize());
/* 写EEPROM */
memset(buffer, 0, sizeof(buffer));
for (unsigned int i = 0; i < FOR_CHAR; i++)
{
for (unsigned int i = 0; i < FOR_CHAR; i++) {
buffer[i] = data_offset + i;
printf("Write Byte: %d = %c\n", addr_offset + i, buffer[i]);
}
ret = eeprom_write(addr_offset, buffer, FOR_CHAR);
if (ret != FOR_CHAR)
{
if (ret != FOR_CHAR) {
printf("EepromWrite failed(%d)\n", ret);
}
/* 读EEPROM */
memset(buffer, 0, sizeof(buffer));
ret = eeprom_read(addr_offset, buffer, FOR_CHAR);
if (ret != FOR_CHAR)
{
if (ret != FOR_CHAR) {
printf("Read Bytes: failed!\n");
}
else
{
for (unsigned int i = 0; i < FOR_CHAR; i++)
{
} else {
for (unsigned int i = 0; i < FOR_CHAR; i++) {
printf("Read Byte: %d = %c\n", addr_offset + i, buffer[i]);
}
}
data_offset++;
if (data_offset >= CHAR_END)
{
if (data_offset >= CHAR_END) {
data_offset = CHAR_START;
}
addr_offset += FOR_ADDRESS;
if (addr_offset >= 200)
{
if (addr_offset >= 200) {
addr_offset = 0;
}
printf("\n");
LOS_Msleep(5000);
LOS_Msleep(WAIT_MSEC);
}
}
@@ -88,17 +87,14 @@ void eeprom_example()
unsigned int ret = LOS_OK;
task.pfnTaskEntry = (TSK_ENTRY_FUNC)eeprom_proress;
task.uwStackSize = 2048;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "eeprom process";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create task ret:0x%x\n", ret);
return;
}
}
APP_FEATURE_INIT(eeprom_example);
+5 -5
View File
@@ -42,7 +42,7 @@ unsigned int eeprom_get_blocksize();
/***************************************************************
* 函数名称: eeprom_readbyte
* 说 明: EEPROM读一个字节
* 参 数:
* 参 数:
* @addr: EEPROM存储地址
* @data: 存放EERPOM的数据指针
* 返 回 值: 返回读取字节的长度,反之为错误
@@ -52,7 +52,7 @@ unsigned int eeprom_readbyte(unsigned int addr, unsigned char *data);
/***************************************************************
* 函数名称: eeprom_writebyte
* 说 明: EEPROM写一个字节
* 参 数:
* 参 数:
* @addr: EEPROM存储地址
* @data: 写ERPOM的数据
* 返 回 值: 返回写入数据的长度,反之为错误
@@ -62,7 +62,7 @@ unsigned int eeprom_writebyte(unsigned int addr, unsigned char data);
/***************************************************************
* 函数名称: eeprom_writepage
* 说 明: EEPROM写1个页字节
* 参 数:
* 参 数:
* @addr: EEPROM存储地址,必须是页地址
* @data: 写ERPOM的数据指针
* @data_len: 写EEPROM数据的长度,必须是小于或等于1个页大小
@@ -73,7 +73,7 @@ unsigned int eeprom_writepage(unsigned int addr, unsigned char *data, unsigned i
/***************************************************************
* 函数名称: eeprom_read
* 说 明: EEPROM读多个字节
* 参 数:
* 参 数:
* @addr: EERPOM存储地址
* @data: 存放EERPOM的数据指针
* @data_len: 读取EERPOM数据的长度
@@ -84,7 +84,7 @@ unsigned int eeprom_read(unsigned int addr, unsigned char *data, unsigned int da
/***************************************************************
* 函数名称: eeprom_write
* 说 明: EEPROM写多个字节
* 参 数:
* 参 数:
* @addr: EEPROM存储地址
* @data: 写ERPOM的数据指针
* @data_len: 写EEPROM数据的长度
+28 -25
View File
@@ -30,19 +30,22 @@ static I2cBusIo m_i2cBus = {
static unsigned int m_i2c_freq = 100000;
////////////////////////////////////////////////////////
/* 等待时间 */
#define EEPROG_DELAY_USEC 1
#define K24C02_DELAY_USEC 1000
/***************************************************************
* 函数名称: eeprog_delay_usec
* 说 明: 忙等待usec
* 参 数:
* 参 数:
* @usec:等待时间,单位:usec
* 返 回 值: 无
***************************************************************/
static inline void eeprog_delay_usec(unsigned int usec)
{
for (unsigned int i = 0; i < usec; i++)
HAL_DelayUs(1);
for (unsigned int i = 0; i < usec; i++) {
HAL_DelayUs(EEPROG_DELAY_USEC);
}
}
/***************************************************************
@@ -98,7 +101,7 @@ unsigned int eeprom_get_blocksize()
/***************************************************************
* 函数名称: eeprom_readbyte
* 说 明: EEPROM读一个字节
* 参 数:
* 参 数:
* @addr: EEPROM存储地址
* @data: 存放EERPOM的数据指针
* 返 回 值: 返回读取字节的长度,反之为错误
@@ -127,11 +130,11 @@ unsigned int eeprom_readbyte(unsigned int addr, unsigned char *data)
msgs[1].buf = data;
msgs[1].len = 1;
ret = LzI2cTransfer(EEPROM_I2C_BUS, msgs, 2);
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: LzI2cTransfer failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
return 0;
}
ret = LzI2cTransfer(EEPROM_I2C_BUS, msgs, 2);
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: LzI2cTransfer failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
return 0;
}
return 1;
}
@@ -139,7 +142,7 @@ unsigned int eeprom_readbyte(unsigned int addr, unsigned char *data)
/***************************************************************
* 函数名称: eeprom_writebyte
* 说 明: EEPROM写一个字节
* 参 数:
* 参 数:
* @addr: EEPROM存储地址
* @data: 写EERPOM的数据
* 返 回 值: 返回写入数据的长度,反之为错误
@@ -166,8 +169,8 @@ unsigned int eeprom_writebyte(unsigned int addr, unsigned char data)
ret = LzI2cTransfer(EEPROM_I2C_BUS, msgs, 1);
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: LzI2cTransfer failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
return 0;
printf("%s, %s, %d: LzI2cTransfer failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
return 0;
}
/* K24C02芯片需要时间完成写操作,在此之前不响应其他操作*/
@@ -179,7 +182,7 @@ unsigned int eeprom_writebyte(unsigned int addr, unsigned char data)
/***************************************************************
* 函数名称: eeprom_writepage
* 说 明: EEPROM写1个页字节
* 参 数:
* 参 数:
* @addr: EEPROM存储地址,必须是页地址
* @data: 写EERPOM的数据指针
* @data_len: 写EEPROM数据的长度,必须是小于1个页大小
@@ -190,7 +193,7 @@ unsigned int eeprom_writepage(unsigned int addr, unsigned char *data, unsigned i
unsigned int ret = 0;
LzI2cMsg msgs[1];
unsigned char buffer[EEPROM_PAGE + 1];
/* K24C02的存储地址是0~255 */
if (addr >= EEPROM_ADDRESS_MAX) {
printf("%s, %s, %d: addr(0x%x) >= EEPROM_ADDRESS_MAX(0x%x)\n", __FILE__, __func__, __LINE__, addr, EEPROM_ADDRESS_MAX);
@@ -214,7 +217,7 @@ unsigned int eeprom_writepage(unsigned int addr, unsigned char *data, unsigned i
buffer[0] = addr;
memcpy(&buffer[1], data, data_len);
msgs[0].addr = EEPROM_I2C_ADDRESS;
msgs[0].flags = 0;
msgs[0].buf = &buffer[0];
@@ -222,12 +225,12 @@ unsigned int eeprom_writepage(unsigned int addr, unsigned char *data, unsigned i
ret = LzI2cTransfer(EEPROM_I2C_BUS, msgs, 1);
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: LzI2cTransfer failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
return 0;
printf("%s, %s, %d: LzI2cTransfer failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
return 0;
}
/* K24C02芯片需要时间完成写操作,在此之前不响应其他操作*/
eeprog_delay_usec(1000);
eeprog_delay_usec(K24C02_DELAY_USEC);
return data_len;
}
@@ -235,13 +238,13 @@ unsigned int eeprom_writepage(unsigned int addr, unsigned char *data, unsigned i
/***************************************************************
* 函数名称: eeprom_read
* 说 明: EEPROM读多个字节
* 参 数:
* 参 数:
* @addr: EERPOM存储地址
* @data: 存放EERPOM的数据指针
* @data_len: 读取EERPOM数据的长度
* 返 回 值: 返回读取字节的长度,反之为错误
***************************************************************/
unsigned int eeprom_read(unsigned int addr, unsigned char *data, unsigned int data_len)
unsigned int eeprom_read(unsigned int addr, unsigned char *data, unsigned int data_len)
{
unsigned int ret = 0;
@@ -253,7 +256,7 @@ unsigned int eeprom_read(unsigned int addr, unsigned char *data, unsigned int da
if ((addr + data_len) > EEPROM_ADDRESS_MAX) {
printf("%s, %s, %d: addr + len(0x%x) > EEPROM_ADDRESS_MAX(0x%x)\n", __FILE__, __func__, __LINE__, addr + data_len, EEPROM_ADDRESS_MAX);
return 0;
}
}
ret = eeprom_readbyte(addr, data);
if (ret != 1) {
@@ -275,7 +278,7 @@ unsigned int eeprom_read(unsigned int addr, unsigned char *data, unsigned int da
/***************************************************************
* 函数名称: eeprom_write
* 说 明: EEPROM写多个字节
* 参 数:
* 参 数:
* @addr: EEPROM存储地址
* @data: 写EERPOM的数据指针
* @data_len: 写EEPROM数据的长度
@@ -315,7 +318,7 @@ unsigned int eeprom_write(unsigned int addr, unsigned char *data, unsigned int d
}
offset_current = 0;
/* 处理前面非页地址的数据,如果是页地址则不执行 */
for (unsigned int i = addr; i < (page_start * EEPROM_PAGE); i++) {
ret = eeprom_writebyte(i, data[offset_current]);
@@ -332,7 +335,7 @@ unsigned int eeprom_write(unsigned int addr, unsigned char *data, unsigned int d
if ((page == (page_end - 1)) && (is_data_back)) {
len = (addr + data_len) % EEPROM_PAGE;
}
ret = eeprom_writepage(page * EEPROM_PAGE, &data[offset_current], len);
if (ret != len) {
printf("%s, %s, %d: EepromWritePage failed(%d)\n", __FILE__, __func__, __LINE__, ret);
+27 -40
View File
@@ -20,11 +20,10 @@ static inline uint32_t chinese_utf8_to_ascii(uint8_t *src, uint32_t src_len, uin
{
uint32_t i;
uint32_t offset = 0;
for (i = 0; i < src_len; i += 3)
{
for (i = 0; i < src_len; i += 3) {
dst[offset] = src[i];
dst[offset + 1] = src[i+1];
dst[offset + 1] = src[i + 1];
offset += 2;
}
@@ -33,8 +32,7 @@ static inline uint32_t chinese_utf8_to_ascii(uint8_t *src, uint32_t src_len, uin
}
/* 12*6的ASCII码显示 */
const unsigned char ascii_1206[][12] =
{
const unsigned char ascii_1206[][12] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/
{0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00}, /*"!",1*/
{0x14, 0x14, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*""",2*/
@@ -134,8 +132,7 @@ const unsigned char ascii_1206[][12] =
/* 16*8的ASCII码显示 */
const unsigned char ascii_1608[][16] =
{
const unsigned char ascii_1608[][16] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/
{0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00}, /*"!",1*/
{0x00, 0x48, 0x6C, 0x24, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*""",2*/
@@ -235,8 +232,7 @@ const unsigned char ascii_1608[][16] =
/* 24*12的ASCII码显示 */
const unsigned char ascii_2412[][48] =
{
const unsigned char ascii_2412[][48] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"!",1*/
{0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x60, 0x06, 0x30, 0x03, 0x98, 0x01, 0x88, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*""",2*/
@@ -336,8 +332,7 @@ const unsigned char ascii_2412[][48] =
/* 32*16的ASCII码显示 */
const unsigned char ascii_3216[][64] =
{
const unsigned char ascii_3216[][64] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"!",1*/
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1C, 0xE0, 0x1C, 0xF0, 0x1E, 0x70, 0x0E, 0x38, 0x07, 0x18, 0x03, 0x08, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*""",2*/
@@ -437,85 +432,77 @@ const unsigned char ascii_3216[][64] =
/* 定义中文字符 12*12 */
typedef struct
{
typedef struct {
unsigned char Index[2];
unsigned char Msk[24];
} typFNT_GB12;
const typFNT_GB12 tfont12[] =
{
const typFNT_GB12 tfont12[] = {
"", 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x24, 0x01, 0x24, 0x02, 0x22, 0x02, 0x22, 0x04,
0x21, 0x04, 0x20, 0x00, 0x20, 0x00, 0x38, 0x00, /*"小"*/
"", 0x40, 0x00, 0xF9, 0x03, 0x42, 0x00, 0xFC, 0x07, 0x10, 0x01, 0x28, 0x02, 0xE0, 0x01, 0x14, 0x01,
0xAA, 0x00, 0x41, 0x00, 0xB0, 0x01, 0x0C, 0x06, /*"凌"*/
"", 0x00, 0x03, 0xF2, 0x00, 0x14, 0x02, 0xD0, 0x01, 0x51, 0x01, 0x52, 0x05, 0x50, 0x03, 0x50, 0x01,
0x54, 0x01, 0x52, 0x02, 0xD1, 0x02, 0x48, 0x04, /*"派"*/
};
/* 定义中文字符 16*16 */
typedef struct
{
typedef struct {
unsigned char Index[2];
unsigned char Msk[32];
} typFNT_GB16;
const typFNT_GB16 tfont16[] =
{
const typFNT_GB16 tfont16[] = {
"", 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x88, 0x08, 0x88, 0x10, 0x88, 0x20,
0x84, 0x20, 0x84, 0x40, 0x82, 0x40, 0x81, 0x40, 0x80, 0x00, 0x80, 0x00, 0xA0, 0x00, 0x40, 0x00, /*"小",0*/
"", 0x00, 0x02, 0x02, 0x02, 0xC4, 0x1F, 0x04, 0x02, 0x00, 0x02, 0xE0, 0x7F, 0x88, 0x08, 0x48, 0x11,
0x24, 0x21, 0x87, 0x0F, 0xC4, 0x08, 0x24, 0x05, 0x04, 0x02, 0x04, 0x05, 0xC4, 0x08, 0x30, 0x30, /*"凌",1*/
"", 0x00, 0x10, 0x04, 0x3C, 0xE8, 0x03, 0x28, 0x00, 0x21, 0x38, 0xA2, 0x07, 0xA2, 0x04, 0xA8, 0x44,
0xA8, 0x24, 0xA4, 0x14, 0xA7, 0x08, 0xA4, 0x08, 0xA4, 0x10, 0x94, 0x22, 0x94, 0x41, 0x88, 0x00, /*"派",2*/
};
/* 定义中文字符 24*24 */
typedef struct
{
typedef struct {
unsigned char Index[2];
unsigned char Msk[72];
} typFNT_GB24;
const typFNT_GB24 tfont24[] =
{
const typFNT_GB24 tfont24[] = {
"", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00,
0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x90, 0x00, 0x80, 0x11, 0x01, 0xC0, 0x10,
0x02, 0x40, 0x10, 0x04, 0x60, 0x10, 0x1C, 0x30, 0x10, 0x18, 0x10, 0x10, 0x30, 0x08, 0x10, 0x30,
0x04, 0x10, 0x20, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x19, 0x00, 0x00,
0x1E, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, /*"小",0*/
"", 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x08, 0xFE, 0x0F, 0x98,
0x40, 0x00, 0x50, 0x40, 0x00, 0x40, 0x40, 0x10, 0xC0, 0xFF, 0x3F, 0x20, 0x08, 0x01, 0x20, 0x0C,
0x0E, 0x20, 0x12, 0x38, 0x10, 0x19, 0x30, 0x90, 0xF8, 0x03, 0x1A, 0x0C, 0x02, 0x1C, 0x16, 0x01,
0x08, 0x92, 0x01, 0x88, 0xA1, 0x00, 0x48, 0x40, 0x00, 0x0C, 0xB0, 0x00, 0x08, 0x18, 0x07, 0x00,
0x07, 0x7E, 0xE0, 0x00, 0x10, 0x00, 0x00, 0x00, /*"凌",1*/
"", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x60, 0xFC, 0x00, 0x00,
0x04, 0x00, 0x00, 0x04, 0x18, 0x82, 0x04, 0x0F, 0x84, 0xE4, 0x00, 0x48, 0xA4, 0x00, 0x48, 0x24,
0x31, 0x40, 0x24, 0x19, 0x20, 0x24, 0x07, 0x20, 0x26, 0x01, 0x20, 0x26, 0x01, 0x10, 0x22, 0x02,
0x1C, 0x22, 0x02, 0x10, 0x22, 0x04, 0x18, 0x21, 0x0C, 0x18, 0x21, 0x19, 0x98, 0xE0, 0x78, 0x50,
0x20, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, /*"派",2*/
};
/* 定义中文字符 32*32 */
typedef struct
{
typedef struct {
unsigned char Index[2];
unsigned char Msk[128];
} typFNT_GB32;
const typFNT_GB32 tfont32[] =
{
const typFNT_GB32 tfont32[] = {
"", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00,
0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00,
@@ -525,7 +512,7 @@ const typFNT_GB32 tfont32[] =
0x30, 0x80, 0x01, 0x18, 0x10, 0x80, 0x01, 0x18, 0x08, 0x80, 0x01, 0x10, 0x04, 0x80, 0x01, 0x00,
0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00,
0x00, 0xF0, 0x01, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"小",0*/
"", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1C, 0x00,
0x04, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x0C, 0x03, 0x70, 0xF2, 0xFF, 0x07,
0x60, 0x02, 0x0C, 0x00, 0x20, 0x02, 0x0C, 0x00, 0x00, 0x01, 0x0C, 0x18, 0x00, 0xFF, 0xFF, 0x3F,
@@ -534,7 +521,7 @@ const typFNT_GB32 tfont32[] =
0x3C, 0x60, 0xC1, 0x00, 0x30, 0x30, 0x61, 0x00, 0x30, 0x18, 0x32, 0x00, 0x30, 0x04, 0x36, 0x00,
0x30, 0x02, 0x1C, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x37, 0x00, 0x30, 0x80, 0xE1, 0x00,
0x00, 0x60, 0xC0, 0x1F, 0x00, 0x1C, 0x00, 0x3F, 0xC0, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, /*"凌",1*/
"", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x0F,
0xC0, 0x01, 0xF0, 0x0F, 0x80, 0xE1, 0x0F, 0x00, 0x80, 0x61, 0x00, 0x00, 0x00, 0x61, 0x00, 0x04,
0x00, 0x64, 0x00, 0x0F, 0x00, 0x64, 0xE0, 0x03, 0x0C, 0x62, 0x1E, 0x00, 0x18, 0x62, 0x26, 0x00,
@@ -543,7 +530,7 @@ const typFNT_GB32 tfont32[] =
0x40, 0x30, 0xC6, 0x00, 0x7C, 0x30, 0x86, 0x00, 0x70, 0x10, 0x86, 0x01, 0x60, 0x18, 0x86, 0x01,
0x60, 0x08, 0x06, 0x03, 0x70, 0x08, 0x46, 0x06, 0x70, 0x04, 0x36, 0x0E, 0x70, 0x06, 0x1E, 0x3C,
0x70, 0x02, 0x06, 0x18, 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"派",2*/
};
#endif
+112 -36
View File
@@ -17,9 +17,87 @@
#include "picture.h"
#include "lcd.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 1000
/* 图片数据 */
extern const unsigned char gImage_lingzhi[IMAGE_MAXSIZE_LINGZHI];
/* 字体大小 */
#define SIZEY_12 12
#define SIZEY_16 16
#define SIZEY_24 24
#define SIZEY_32 32
/* LCD的位置 */
#define LCD_FILL_X 0
#define LCD_FILL_Y 0
/* 图片的位置,长度和宽度 */
#define LCD_PICTURE_X 15
#define LCD_PICTURE_Y 0
#define LCD_PICTURE_LENGTH 210
#define LCD_PICTURE_WIDTH 62
/* 字符串1的位置,长度和宽度 */
#define LCD_STRING1_X 0
#define LCD_STRING1_Y 130
#define LCD_STRING1_SIZE 16
#define LCD_STRING1_TEXT "Welcome to XiaoLingPai!"
#define LCD_STRING1_MODE 0
/* 字符串2的位置,长度和宽度 */
#define LCD_STRING2_X 0
#define LCD_STRING2_Y 130
#define LCD_STRING2_SIZE 16
#define LCD_STRING2_TEXT "URL: http://www.fzlzda.com"
#define LCD_STRING2_MODE 0
/* 字符串3的位置,长度和宽度 */
#define LCD_STRING3_X 0
#define LCD_STRING3_Y 160
#define LCD_STRING3_SIZE 16
#define LCD_STRING3_TEXT "LCD_W:"
#define LCD_STRING3_MODE 0
/* 数字1int的位置,长度和宽度 */
#define LCD_INT1_X 128
#define LCD_INT1_Y 160
#define LCD_INT1_SIZE 16
#define LCD_INT1_VALUE 3
/* 字符串4的位置,长度和宽度 */
#define LCD_STRING4_X 80
#define LCD_STRING4_Y 160
#define LCD_STRING4_SIZE 16
#define LCD_STRING4_TEXT "LCD_H:"
#define LCD_STRING4_MODE 0
/* 数字2int的位置,长度和宽度 */
#define LCD_INT2_X 128
#define LCD_INT2_Y 160
#define LCD_INT2_SIZE 16
#define LCD_INT2_VALUE 3
/* 字符串5的位置,长度和宽度 */
#define LCD_STRING5_X 80
#define LCD_STRING5_Y 160
#define LCD_STRING5_SIZE 16
#define LCD_STRING5_TEXT "LCD_H:"
#define LCD_STRING5_MODE 0
/* 字符串6的位置,长度和宽度 */
#define LCD_STRING6_X 0
#define LCD_STRING6_Y 190
#define LCD_STRING6_SIZE 16
#define LCD_STRING6_TEXT "Increaseing Num:"
#define LCD_STRING6_MODE 0
/* 数字float的位置,长度和宽度 */
#define LCD_FLOAT1_X 128
#define LCD_FLOAT1_Y 190
#define LCD_FLOAT1_SIZE 16
#define LCD_FLOAT1_NUM 4
#define LCD_FLOAT1_INCREASE (0.11)
/* 中文数字的位置,长度和宽度 */
#define LCD_CHINESE_X 0
#define LCD_CHINESE_Y 220
#define LCD_CHINESE_MODE 0
/***************************************************************
* 函数名称: lcd_process
* 说 明: lcd例程
@@ -31,45 +109,44 @@ void lcd_process(void *arg)
uint32_t ret = 0;
float t = 0;
uint8_t chinese_string[] = "小凌派";
uint8_t cur_sizey = 12;
uint8_t cur_sizey = SIZEY_12;
ret = lcd_init();
if (ret != 0)
{
if (ret != 0) {
printf("lcd_init failed(%d)\n", ret);
return;
}
lcd_fill(0, 0, LCD_W, LCD_H, LCD_WHITE);
while (1)
{
printf("************Lcd Example***********\n");
lcd_show_picture(15, 0, 210, 62, &gImage_lingzhi[0]);
lcd_show_string(0, 100, "Welcome to XiaoLingPai!", LCD_RED, LCD_WHITE, 16, 0);
lcd_show_string(0, 130, "URL: http://www.fzlzda.com", LCD_RED, LCD_WHITE, 16, 0);
lcd_show_string(0, 160, "LCD_W:", LCD_BLUE, LCD_WHITE, 16, 0);
lcd_show_int_num(48, 160, LCD_W, 3, LCD_BLUE, LCD_WHITE, 16);
lcd_show_string(80, 160, "LCD_H:", LCD_BLUE, LCD_WHITE, 16, 0);
lcd_show_int_num(128, 160, LCD_H, 3, LCD_BLUE, LCD_WHITE, 16);
lcd_show_string(80, 160, "LCD_H:", LCD_BLUE, LCD_WHITE, 16, 0);
lcd_show_string(0, 190, "Increaseing Num:", LCD_BLACK, LCD_WHITE, 16, 0);
lcd_show_float_num1(128, 190, t, 4, LCD_BLACK, LCD_WHITE, 16);
t += 0.11;
lcd_fill(0, 220, LCD_W, LCD_H, LCD_WHITE);
lcd_show_chinese(0, 220, chinese_string, LCD_RED, LCD_WHITE, cur_sizey, 0);
if (cur_sizey == 12)
cur_sizey = 16;
else if(cur_sizey == 16)
cur_sizey = 24;
else if(cur_sizey == 24)
cur_sizey = 32;
else
cur_sizey = 12;
lcd_fill(LCD_FILL_X, LCD_FILL_Y, LCD_W, LCD_H, LCD_WHITE);
while (1) {
printf("************Lcd Example***********\n");
lcd_show_picture(LCD_PICTURE_X, LCD_PICTURE_Y, LCD_PICTURE_LENGTH, LCD_PICTURE_WIDTH, &gImage_lingzhi[0]);
lcd_show_string(LCD_STRING1_X, LCD_STRING1_Y, LCD_STRING1_TEXT, LCD_RED, LCD_WHITE, LCD_STRING1_SIZE, LCD_STRING1_MODE);
lcd_show_string(LCD_STRING2_X, LCD_STRING2_Y, LCD_STRING2_TEXT, LCD_RED, LCD_WHITE, LCD_STRING2_SIZE, LCD_STRING2_MODE);
lcd_show_string(LCD_STRING3_X, LCD_STRING3_Y, LCD_STRING3_TEXT, LCD_BLUE, LCD_WHITE, LCD_STRING3_SIZE, LCD_STRING3_MODE);
lcd_show_int_num(LCD_INT1_X, LCD_INT1_Y, LCD_W, LCD_INT1_VALUE, LCD_BLUE, LCD_WHITE, LCD_INT1_SIZE);
lcd_show_string(LCD_STRING4_X, LCD_STRING4_Y, LCD_STRING4_TEXT, LCD_BLUE, LCD_WHITE, LCD_STRING4_SIZE, LCD_STRING4_MODE);
lcd_show_int_num(LCD_INT2_X, LCD_INT2_Y, LCD_H, LCD_INT2_VALUE, LCD_BLUE, LCD_WHITE, LCD_INT2_SIZE);
lcd_show_string(LCD_STRING5_X, LCD_STRING5_Y, LCD_STRING5_TEXT, LCD_BLUE, LCD_WHITE, LCD_STRING5_SIZE, LCD_STRING5_MODE);
lcd_show_string(LCD_STRING6_X, LCD_STRING6_Y, LCD_STRING6_TEXT, LCD_BLACK, LCD_WHITE, LCD_STRING6_SIZE, LCD_STRING6_MODE);
lcd_show_float_num1(LCD_FLOAT1_X, LCD_FLOAT1_Y, t, LCD_FLOAT1_NUM, LCD_BLACK, LCD_WHITE, LCD_FLOAT1_SIZE);
t += LCD_FLOAT1_INCREASE;
lcd_fill(LCD_CHINESE_X, LCD_CHINESE_Y, LCD_W, LCD_H, LCD_WHITE);
lcd_show_chinese(LCD_CHINESE_X, LCD_CHINESE_Y, chinese_string, LCD_RED, LCD_WHITE, cur_sizey, LCD_CHINESE_MODE);
if (cur_sizey == SIZEY_12) {
cur_sizey = SIZEY_16;
} else if (cur_sizey == SIZEY_16) {
cur_sizey = SIZEY_24;
} else if (cur_sizey == SIZEY_24) {
cur_sizey = SIZEY_32;
} else {
cur_sizey = SIZEY_12;
}
printf("\n");
LOS_Msleep(1000);
LOS_Msleep(WAIT_MSEC);
}
}
@@ -87,12 +164,11 @@ void lcd_example()
unsigned int ret = LOS_OK;
task.pfnTaskEntry = (TSK_ENTRY_FUNC)lcd_process;
task.uwStackSize = 20480;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "lcd process";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create task ret:0x%x\n", ret);
return;
}
Executable → Regular
+222 -334
View File
@@ -56,10 +56,24 @@ static SpiBusIo m_spiBus = {
};
static LzSpiConfig m_spiConf = {.bitsPerWord = SPI_PERWORD_8BITS, .firstBit = SPI_MSB, .mode = SPI_MODE_3,
.csm = SPI_CMS_ONE_CYCLES, .speed = 50000000, .isSlave = false};
.csm = SPI_CMS_ONE_CYCLES, .speed = 50000000, .isSlave = false
};
#endif
/////////////////////////////////////////////////////////////////
/* 寄存器定义 */
#define REG_ADDRESS_COLUMN 0x2a
#define REG_ADDRESS_LINE 0x2B
#define REG_ADDRESS_WRITE 0x2C
/* 寄存器位数 */
#define REG_BITS_MAXSIZE 8
/* 寄存器最高位 */
#define REG_BITS_HIGH (0x80)
/* uint16取值 */
#define UINT16_TO_H(val) (((val) & 0xFF00) >> 8)
#define UINT16_TO_L(val) ((val) & 0x00FF)
static void lcd_write_bus(uint8_t dat)
{
@@ -67,22 +81,18 @@ static void lcd_write_bus(uint8_t dat)
LzSpiWrite(LCD_SPI_BUS, 0, &dat, 1);
#else
uint8_t i;
LCD_CS_Clr();
for (i=0; i<8; i++)
{
for (i = 0; i < REG_BITS_MAXSIZE; i++) {
LCD_CLK_Clr();
if (dat & 0x80)
{
if (dat & REG_BITS_HIGH) {
LCD_MOSI_Set();
}
else
{
} else {
LCD_MOSI_Clr();
}
LCD_CLK_Set();
dat<<=1;
}
dat <<= 1;
}
LCD_CS_Set();
#endif
}
@@ -94,8 +104,8 @@ static void lcd_wr_data8(uint8_t dat)
static void lcd_wr_data(uint16_t dat)
{
lcd_write_bus(dat >> 8);
lcd_write_bus(dat);
lcd_write_bus(UINT16_TO_H(dat));
lcd_write_bus(UINT16_TO_L(dat));
}
static void lcd_wr_reg(uint8_t dat)
@@ -108,26 +118,25 @@ static void lcd_wr_reg(uint8_t dat)
static void lcd_address_set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
/* 列地址设置 */
lcd_wr_reg(0x2a);
lcd_wr_reg(REG_ADDRESS_COLUMN);
lcd_wr_data(x1);
lcd_wr_data(x2);
/* 行地址设置 */
lcd_wr_reg(0x2b);
lcd_wr_reg(REG_ADDRESS_LINE);
lcd_wr_data(y1);
lcd_wr_data(y2);
/* 储存器写 */
lcd_wr_reg(0x2c);
lcd_wr_reg(REG_ADDRESS_WRITE);
}
static uint32_t mypow(uint8_t m, uint8_t n)
{
uint32_t result = 1;
while (n--)
{
while (n--) {
result *= m;
}
return result;
}
@@ -147,55 +156,44 @@ static uint32_t mypow(uint8_t m, uint8_t n)
***************************************************************/
static void lcd_show_chinese_12x12(uint16_t x, uint16_t y, uint8_t *s, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode)
{
uint8_t i, j, m=0;
uint8_t i, j, m = 0;
uint16_t k;
uint16_t HZnum;//汉字数目
uint16_t TypefaceNum;//一个字符所占字节大小
uint16_t x0 = x;
TypefaceNum = (sizey/8+((sizey%8)?1:0)) * sizey;
TypefaceNum = (sizey / 8 + ((sizey % 8) ? 1 : 0)) * sizey;
/* 统计汉字数目 */
HZnum = sizeof(tfont12) / sizeof(typFNT_GB12);
for (k = 0; k < HZnum; k++)
{
if ((tfont12[k].Index[0] == *(s)) && (tfont12[k].Index[1] == *(s+1)))
{
lcd_address_set(x, y, x+sizey-1, y+sizey-1);
for (i = 0; i < TypefaceNum; i++)
{
for (j = 0; j < 8; j++)
{
if (!mode)
{/* 非叠加方式 */
if (tfont12[k].Msk[i] & (0x01<<j))
{
for (k = 0; k < HZnum; k++) {
if ((tfont12[k].Index[0] == *(s)) && (tfont12[k].Index[1] == *(s + 1))) {
lcd_address_set(x, y, x + sizey - 1, y + sizey - 1);
for (i = 0; i < TypefaceNum; i++) {
for (j = 0; j < 8; j++) {
if (!mode) {
/* 非叠加方式 */
if (tfont12[k].Msk[i] & (0x01 << j)) {
lcd_wr_data(fc);
}
else
{
} else {
lcd_wr_data(bc);
}
m++;
if ((m % sizey) == 0)
{
if ((m % sizey) == 0) {
m = 0;
break;
}
}
else
{/* 叠加方式 */
if (tfont12[k].Msk[i] & (0x01<<j))
{
} else {
/* 叠加方式 */
if (tfont12[k].Msk[i] & (0x01 << j)) {
/* 画一个点 */
lcd_draw_point(x,y,fc);
lcd_draw_point(x, y, fc);
}
x++;
if ((x - x0) == sizey)
{
if ((x - x0) == sizey) {
x = x0;
y++;
break;
@@ -207,7 +205,7 @@ static void lcd_show_chinese_12x12(uint16_t x, uint16_t y, uint8_t *s, uint16_t
break; //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
}
}
}
}
/***************************************************************
* 函数名称: lcd_show_chinese_16x16
@@ -229,49 +227,38 @@ static void lcd_show_chinese_16x16(uint16_t x, uint16_t y, uint8_t *s, uint16_t
uint16_t HZnum;//汉字数目
uint16_t TypefaceNum;//一个字符所占字节大小
uint16_t x0 = x;
TypefaceNum = (sizey/8 + ((sizey%8)?1:0)) * sizey;
TypefaceNum = (sizey / 8 + ((sizey % 8) ? 1 : 0)) * sizey;
/* 统计汉字数目 */
HZnum=sizeof(tfont16) / sizeof(typFNT_GB16);
for (k = 0; k < HZnum; k++)
{
if ((tfont16[k].Index[0] == *(s)) && (tfont16[k].Index[1] == *(s+1)))
{
lcd_address_set(x, y, x+sizey-1, y+sizey-1);
for (i = 0; i < TypefaceNum; i++)
{
for (j = 0; j < 8; j++)
{
if (!mode)
{/* 非叠加方式 */
if (tfont16[k].Msk[i] & (0x01 << j))
{
HZnum = sizeof(tfont16) / sizeof(typFNT_GB16);
for (k = 0; k < HZnum; k++) {
if ((tfont16[k].Index[0] == *(s)) && (tfont16[k].Index[1] == *(s + 1))) {
lcd_address_set(x, y, x + sizey - 1, y + sizey - 1);
for (i = 0; i < TypefaceNum; i++) {
for (j = 0; j < 8; j++) {
if (!mode) {
/* 非叠加方式 */
if (tfont16[k].Msk[i] & (0x01 << j)) {
lcd_wr_data(fc);
}
else
{
} else {
lcd_wr_data(bc);
}
m++;
if (m%sizey == 0)
{
if (m % sizey == 0) {
m = 0;
break;
}
}
else
{/* 叠加方式 */
if (tfont16[k].Msk[i] & (0x01<<j))
{
} else {
/* 叠加方式 */
if (tfont16[k].Msk[i] & (0x01 << j)) {
/* 画一个点 */
lcd_draw_point(x,y,fc);
lcd_draw_point(x, y, fc);
}
x++;
if ((x - x0) == sizey)
{
if ((x - x0) == sizey) {
x = x0;
y++;
break;
@@ -283,7 +270,7 @@ static void lcd_show_chinese_16x16(uint16_t x, uint16_t y, uint8_t *s, uint16_t
break; //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
}
}
}
}
/***************************************************************
@@ -301,54 +288,43 @@ static void lcd_show_chinese_16x16(uint16_t x, uint16_t y, uint8_t *s, uint16_t
***************************************************************/
static void lcd_show_chinese_24x24(uint16_t x, uint16_t y, uint8_t *s, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode)
{
uint8_t i,j,m = 0;
uint8_t i, j, m = 0;
uint16_t k;
uint16_t HZnum;//汉字数目
uint16_t TypefaceNum;//一个字符所占字节大小
uint16_t x0 = x;
TypefaceNum = (sizey/8 + ((sizey%8)?1:0)) * sizey;
TypefaceNum = (sizey / 8 + ((sizey % 8) ? 1 : 0)) * sizey;
/* 统计汉字数目 */
HZnum = sizeof(tfont24) / sizeof(typFNT_GB24);
for (k = 0; k < HZnum; k++)
{
if ((tfont24[k].Index[0] == *(s)) && (tfont24[k].Index[1] == *(s+1)))
{
lcd_address_set(x, y, x+sizey-1, y+sizey-1);
for (i = 0; i < TypefaceNum; i++)
{
for (j = 0; j < 8; j++)
{
if (!mode)
{/* 非叠加方式 */
if (tfont24[k].Msk[i] & (0x01<<j))
{
for (k = 0; k < HZnum; k++) {
if ((tfont24[k].Index[0] == *(s)) && (tfont24[k].Index[1] == *(s + 1))) {
lcd_address_set(x, y, x + sizey - 1, y + sizey - 1);
for (i = 0; i < TypefaceNum; i++) {
for (j = 0; j < 8; j++) {
if (!mode) {
/* 非叠加方式 */
if (tfont24[k].Msk[i] & (0x01 << j)) {
lcd_wr_data(fc);
}
else
{
} else {
lcd_wr_data(bc);
}
m++;
if (m%sizey == 0)
{
if (m % sizey == 0) {
m = 0;
break;
}
}
else
{/* 叠加方式 */
if (tfont24[k].Msk[i] & (0x01 << j))
{
} else {
/* 叠加方式 */
if (tfont24[k].Msk[i] & (0x01 << j)) {
/* 画一个点 */
lcd_draw_point(x, y, fc);
}
x++;
if ((x - x0) == sizey)
{
if ((x - x0) == sizey) {
x = x0;
y++;
break;
@@ -360,7 +336,7 @@ static void lcd_show_chinese_24x24(uint16_t x, uint16_t y, uint8_t *s, uint16_t
break; //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
}
}
}
}
/***************************************************************
@@ -378,53 +354,42 @@ static void lcd_show_chinese_24x24(uint16_t x, uint16_t y, uint8_t *s, uint16_t
***************************************************************/
static void lcd_show_chinese_32x32(uint16_t x, uint16_t y, uint8_t *s, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode)
{
uint8_t i,j,m = 0;
uint8_t i, j, m = 0;
uint16_t k;
uint16_t HZnum;//汉字数目
uint16_t TypefaceNum;//一个字符所占字节大小
uint16_t x0 = x;
TypefaceNum = (sizey/8 + ((sizey%8)?1:0)) * sizey;
TypefaceNum = (sizey / 8 + ((sizey % 8) ? 1 : 0)) * sizey;
/* 统计汉字数目 */
HZnum = sizeof(tfont32) / sizeof(typFNT_GB32);
for (k = 0; k < HZnum; k++)
{
if ((tfont32[k].Index[0] == *(s)) && (tfont32[k].Index[1] == *(s+1)))
{
lcd_address_set(x, y, x+sizey-1, y+sizey-1);
for (i = 0; i < TypefaceNum; i++)
{
for (j = 0; j < 8; j++)
{
if (!mode)
{/* 非叠加方式 */
if (tfont32[k].Msk[i] & (0x01 << j))
{
for (k = 0; k < HZnum; k++) {
if ((tfont32[k].Index[0] == *(s)) && (tfont32[k].Index[1] == *(s + 1))) {
lcd_address_set(x, y, x + sizey - 1, y + sizey - 1);
for (i = 0; i < TypefaceNum; i++) {
for (j = 0; j < 8; j++) {
if (!mode) {
/* 非叠加方式 */
if (tfont32[k].Msk[i] & (0x01 << j)) {
lcd_wr_data(fc);
}
else
{
} else {
lcd_wr_data(bc);
}
m++;
if (m%sizey == 0)
{
if (m % sizey == 0) {
m = 0;
break;
}
}
else
{/* 叠加方式 */
if (tfont32[k].Msk[i] & (0x01 << j))
{
} else {
/* 叠加方式 */
if (tfont32[k].Msk[i] & (0x01 << j)) {
lcd_draw_point(x, y, fc);//画一个点
}
x++;
if ((x-x0) == sizey)
{
if ((x - x0) == sizey) {
x = x0;
y++;
break;
@@ -495,20 +460,13 @@ unsigned int lcd_init()
LOS_Msleep(100);
/* 启动LCD配置,设置显示和颜色配置 */
lcd_wr_reg(0X36);
if (USE_HORIZONTAL == 0)
{
if (USE_HORIZONTAL == 0) {
lcd_wr_data8(0x00);
}
else if (USE_HORIZONTAL == 1)
{
} else if (USE_HORIZONTAL == 1) {
lcd_wr_data8(0xC0);
}
else if (USE_HORIZONTAL == 2)
{
} else if (USE_HORIZONTAL == 2) {
lcd_wr_data8(0x70);
}
else
{
} else {
lcd_wr_data8(0xA0);
}
lcd_wr_reg(0X3A);
@@ -598,7 +556,7 @@ unsigned int lcd_deinit()
#endif
LzGpioDeinit(LCD_PIN_RES);
LzGpioDeinit(LCD_PIN_DC);
return 0;
}
@@ -619,12 +577,10 @@ void lcd_fill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, uint16
uint16_t i, j;
/* 设置显示范围 */
lcd_address_set(xsta, ysta, xend-1, yend-1);
lcd_address_set(xsta, ysta, xend - 1, yend - 1);
/* 填充颜色 */
for (i = ysta; i < yend; i++)
{
for (j = xsta; j < xend; j++)
{
for (i = ysta; i < yend; i++) {
for (j = xsta; j < xend; j++) {
lcd_wr_data(color);
}
}
@@ -661,8 +617,8 @@ void lcd_draw_point(uint16_t x, uint16_t y, uint16_t color)
***************************************************************/
void lcd_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color)
{
uint16_t t;
int xerr=0, yerr=0, delta_x, delta_y, distance;
uint16_t t;
int xerr = 0, yerr = 0, delta_x, delta_y, distance;
int incx, incy, uRow, uCol;
/* 计算坐标增量 */
@@ -671,61 +627,45 @@ void lcd_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t
/* 画线起点坐标 */
uRow = x1;
uCol = y1;
if (delta_x > 0)
{
if (delta_x > 0) {
/* 设置单步方向 */
incx = 1;
}
else if (delta_x == 0)
{
} else if (delta_x == 0) {
/* 垂直线 */
incx = 0;
}
else
{
} else {
incx = -1;
delta_x = -delta_x;
}
if (delta_y > 0)
{
if (delta_y > 0) {
incy = 1;
}
else if (delta_y == 0)
{
} else if (delta_y == 0) {
/* 水平线 */
incy = 0;
}
else
{
} else {
incy = -1;
delta_y = -delta_y;
}
if (delta_x > delta_y)
{
if (delta_x > delta_y) {
/* 选取基本增量坐标轴 */
distance = delta_x;
}
else
{
} else {
distance = delta_y;
}
for (t = 0; t < distance+1; t++)
{
for (t = 0; t < distance + 1; t++) {
/* 画点 */
lcd_draw_point(uRow, uCol, color);
xerr += delta_x;
yerr += delta_y;
if (xerr > distance)
{
if (xerr > distance) {
xerr -= distance;
uRow += incx;
}
if (yerr > distance)
{
if (yerr > distance) {
yerr -= distance;
uCol += incy;
}
@@ -744,7 +684,7 @@ void lcd_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t
* @color:指定点的颜色
* 返 回 值: 无
***************************************************************/
void lcd_draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint16_t color)
void lcd_draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color)
{
lcd_draw_line(x1, y1, x2, y1, color);
lcd_draw_line(x1, y1, x1, y2, color);
@@ -766,24 +706,22 @@ void lcd_draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint1
void lcd_draw_circle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color)
{
int a, b;
a = 0;
b = r;
while (a <= b)
{
lcd_draw_point(x0-b, y0-a, color);
lcd_draw_point(x0+b, y0-a, color);
lcd_draw_point(x0-a, y0+b, color);
lcd_draw_point(x0-a, y0-b, color);
lcd_draw_point(x0+b, y0+a, color);
lcd_draw_point(x0+a, y0-b, color);
lcd_draw_point(x0+a, y0+b, color);
lcd_draw_point(x0-b, y0+a, color);
while (a <= b) {
lcd_draw_point(x0 - b, y0 - a, color);
lcd_draw_point(x0 + b, y0 - a, color);
lcd_draw_point(x0 - a, y0 + b, color);
lcd_draw_point(x0 - a, y0 - b, color);
lcd_draw_point(x0 + b, y0 + a, color);
lcd_draw_point(x0 + a, y0 - b, color);
lcd_draw_point(x0 + a, y0 + b, color);
lcd_draw_point(x0 - b, y0 + a, color);
a++;
/* 判断要画的点是否过远 */
if ((a*a+b*b) > (r*r))
{
if ((a * a + b * b) > (r * r)) {
b--;
}
}
@@ -813,58 +751,38 @@ void lcd_show_chinese(uint16_t x, uint16_t y, uint8_t *s, uint16_t fc, uint16_t
/* utf8格式汉字转化为ascii格式 */
chinese_utf8_to_ascii(s, strlen(s), buffer, &buffer_len);
for (uint32_t i = 0; i < buffer_len; i += 2, x += sizey)
{
if (sizey == 12)
{
for (uint32_t i = 0; i < buffer_len; i += 2, x += sizey) {
if (sizey == 12) {
lcd_show_chinese_12x12(x, y, &buffer[i], fc, bc, sizey, mode);
}
else if (sizey == 16)
{
} else if (sizey == 16) {
lcd_show_chinese_16x16(x, y, &buffer[i], fc, bc, sizey, mode);
}
else if (sizey == 24)
{
} else if (sizey == 24) {
lcd_show_chinese_24x24(x, y, &buffer[i], fc, bc, sizey, mode);
}
else if (sizey == 32)
{
} else if (sizey == 32) {
lcd_show_chinese_32x32(x, y, &buffer[i], fc, bc, sizey, mode);
}
else
{
} else {
return;
}
}
#if 0
while (*s != 0)
{
if (sizey == 12)
{
#if 0
while (*s != 0) {
if (sizey == 12) {
lcd_show_chinese_12x12(x, y, s, fc, bc, sizey, mode);
}
else if (sizey == 16)
{
} else if (sizey == 16) {
lcd_show_chinese_16x16(x, y, s, fc, bc, sizey, mode);
}
else if (sizey == 24)
{
} else if (sizey == 24) {
lcd_show_chinese_24x24(x, y, s, fc, bc, sizey, mode);
}
else if (sizey == 32)
{
} else if (sizey == 32) {
lcd_show_chinese_32x32(x, y, s, fc, bc, sizey, mode);
}
else
{
} else {
return;
}
s += 2;
x += sizey;
}
#endif
#endif
}
@@ -884,84 +802,66 @@ void lcd_show_chinese(uint16_t x, uint16_t y, uint8_t *s, uint16_t fc, uint16_t
***************************************************************/
void lcd_show_char(uint16_t x, uint16_t y, uint8_t num, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode)
{
uint8_t temp,sizex,t,m = 0;
uint8_t temp, sizex, t, m = 0;
uint16_t i;
uint16_t TypefaceNum;//一个字符所占字节大小
uint16_t x0 = x;
sizex = sizey/2;
TypefaceNum = (sizex/8 + ((sizex%8)?1:0)) * sizey;
sizex = sizey / 2;
TypefaceNum = (sizex / 8 + ((sizex % 8) ? 1 : 0)) * sizey;
/* 得到偏移后的值 */
num = num-' ';
num = num - ' ';
/* 设置光标位置 */
lcd_address_set(x, y, x+sizex-1, y+sizey-1);
for (i = 0; i < TypefaceNum; i++)
{
if (sizey == 12)
{
lcd_address_set(x, y, x + sizex - 1, y + sizey - 1);
for (i = 0; i < TypefaceNum; i++) {
if (sizey == 12) {
/* 调用6x12字体 */
temp = ascii_1206[num][i];
}
else if (sizey == 16)
{
} else if (sizey == 16) {
/* 调用8x16字体 */
temp = ascii_1608[num][i];
}
else if (sizey == 24)
{
} else if (sizey == 24) {
/* 调用12x24字体 */
temp = ascii_2412[num][i];
}
else if (sizey == 32)
{
} else if (sizey == 32) {
/* 调用16x32字体 */
temp = ascii_3216[num][i];
}
else
{
} else {
return;
}
for (t = 0; t < 8; t++)
{
if (!mode)
{/* 非叠加模式 */
if (temp & (0x01 << t))
{
for (t = 0; t < 8; t++) {
if (!mode) {
/* 非叠加模式 */
if (temp & (0x01 << t)) {
lcd_wr_data(fc);
}
else
{
} else {
lcd_wr_data(bc);
}
m++;
if (m%sizex == 0)
{
if (m % sizex == 0) {
m = 0;
break;
}
}
else
{/* 叠加模式 */
if (temp & (0x01 << t))
{
} else {
/* 叠加模式 */
if (temp & (0x01 << t)) {
/* 画一个点 */
lcd_draw_point(x, y, fc);
}
x++;
if ((x - x0) == sizex)
{
if ((x - x0) == sizex) {
x = x0;
y++;
break;
}
}
}
}
}
}
@@ -979,13 +879,12 @@ void lcd_show_char(uint16_t x, uint16_t y, uint8_t num, uint16_t fc, uint16_t bc
* 返 回 值: 无
***************************************************************/
void lcd_show_string(uint16_t x, uint16_t y, const uint8_t *p, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode)
{
while (*p != '\0')
{
{
while (*p != '\0') {
lcd_show_char(x, y, *p, fc, bc, sizey, mode);
x += (sizey / 2);
p++;
}
}
}
@@ -1003,28 +902,23 @@ void lcd_show_string(uint16_t x, uint16_t y, const uint8_t *p, uint16_t fc, uint
***************************************************************/
void lcd_show_int_num(uint16_t x, uint16_t y, uint16_t num, uint8_t len, uint16_t fc, uint16_t bc, uint8_t sizey)
{
uint8_t t,temp;
uint8_t enshow=0;
uint8_t t, temp;
uint8_t enshow = 0;
uint8_t sizex = sizey / 2;
for (t=0; t<len; t++)
{
temp = (num/mypow(10,len-t-1)) % 10;
if (enshow==0 && t<(len-1))
{
if (temp == 0)
{
lcd_show_char(x+t*sizex, y, ' ', fc, bc, sizey, 0);
for (t = 0; t < len; t++) {
temp = (num / mypow(10, len - t - 1)) % 10;
if (enshow == 0 && t < (len - 1)) {
if (temp == 0) {
lcd_show_char(x + t * sizex, y, ' ', fc, bc, sizey, 0);
continue;
}
else
{
} else {
enshow = 1;
}
}
lcd_show_char(x+t*sizex, y, temp+48, fc, bc, sizey, 0);
lcd_show_char(x + t * sizex, y, temp + 48, fc, bc, sizey, 0);
}
}
}
/***************************************************************
@@ -1039,23 +933,21 @@ void lcd_show_int_num(uint16_t x, uint16_t y, uint16_t num, uint8_t len, uint16_
* @sizey: 字号,可选:16、24、32
* 返 回 值: 无
***************************************************************/
void lcd_show_float_num1(uint16_t x, uint16_t y,float num,uint8_t len,uint16_t fc,uint16_t bc,uint8_t sizey)
void lcd_show_float_num1(uint16_t x, uint16_t y, float num, uint8_t len, uint16_t fc, uint16_t bc, uint8_t sizey)
{
uint8_t t,temp, sizex;
uint8_t t, temp, sizex;
uint16_t num1;
sizex = sizey / 2;
num1 = num * 100;
for (t=0; t<len; t++)
{
temp = (num1/mypow(10,len-t-1)) % 10;
if (t == (len-2))
{
lcd_show_char(x+(len-2)*sizex, y, '.', fc, bc, sizey, 0);
for (t = 0; t < len; t++) {
temp = (num1 / mypow(10, len - t - 1)) % 10;
if (t == (len - 2)) {
lcd_show_char(x + (len - 2)*sizex, y, '.', fc, bc, sizey, 0);
t++;
len += 1;
}
lcd_show_char(x+t*sizex, y, temp+48, fc, bc, sizey, 0);
lcd_show_char(x + t * sizex, y, temp + 48, fc, bc, sizey, 0);
}
}
@@ -1072,19 +964,15 @@ void lcd_show_float_num1(uint16_t x, uint16_t y,float num,uint8_t len,uint16_t f
***************************************************************/
void lcd_show_picture(uint16_t x, uint16_t y, uint16_t length, uint16_t width, const uint8_t *pic)
{
uint16_t i,j;
uint16_t i, j;
uint32_t k = 0;
lcd_address_set(x, y, x+length-1, y+width-1);
for (i=0; i<length; i++)
{
for (j=0; j<width; j++)
{
lcd_wr_data8(pic[k*2]);
lcd_wr_data8(pic[k*2+1]);
lcd_address_set(x, y, x + length - 1, y + width - 1);
for (i = 0; i < length; i++) {
for (j = 0; j < width; j++) {
lcd_wr_data8(pic[k * 2]);
lcd_wr_data8(pic[k * 2 + 1]);
k++;
}
}
}
+1628 -1628
View File
File diff suppressed because it is too large Load Diff
+5 -6
View File
@@ -67,7 +67,7 @@ void oled_clear(void);
/***************************************************************
* 函数名称: oled_show_char
* 说 明: oled显示字符
* 参 数:
* 参 数:
* @x:字符的X轴坐标
* @y:字符的Y轴坐标
* @chr:字符
@@ -80,7 +80,7 @@ void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t chr_size);
/***************************************************************
* 函数名称: oled_show_num
* 说 明: oled显示数字
* 参 数:
* 参 数:
* @x:数字的X轴坐标
* @y:数字的Y轴坐标
* @num:数字
@@ -94,7 +94,7 @@ void oled_show_num(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size
/***************************************************************
* 函数名称: oled_show_string
* 说 明: oled显示字符串
* 参 数:
* 参 数:
* @x:字符串的X轴坐标
* @y:字符串的Y轴坐标
* @p:字符串
@@ -107,7 +107,7 @@ void oled_show_string(uint8_t x, uint8_t y, uint8_t *p, uint8_t chr_size);
/***************************************************************
* 函数名称: oled_draw_bmp
* 说 明: oled显示图片
* 参 数:
* 参 数:
* @x0:图片的起始点X轴坐标,取值为0~127
* @y0:图片的起始点Y轴坐标,取值为0~63
* @x1:图片的结束点X轴坐标,取值为0~127
@@ -118,5 +118,4 @@ void oled_show_string(uint8_t x, uint8_t y, uint8_t *p, uint8_t chr_size);
void oled_draw_bmp(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char bmp[]);
#endif
/** @} */
#endif /* _OLED_H_ */
+193 -236
View File
@@ -1,249 +1,206 @@
#ifndef _OLED_FONT_H_
#define _OLED_FONT_H_
/* */
#define F6X8_COLUMNS 6
//常用ASCII表
//偏移量32
//ASCII字符集
//偏移量32
//大小:12*6
/************************************6*8的点阵************************************/
const unsigned char F6x8[][6] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '
0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '
0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
const unsigned char F6x8[][F6X8_COLUMNS] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '
0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '
0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
};
/****************************************8*16的点阵************************************/
const unsigned char F8X16[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};
char Hzk[][32]={
{0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00},
{0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00},/*"中",0*/
{0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x75,0x55,0x55,0x55,0x5F,0x40,0x40,0x40,0x00},
{0x00,0x40,0x20,0x0F,0x09,0x49,0x89,0x79,0x09,0x09,0x09,0x0F,0x20,0x40,0x00,0x00},/*"景",1*/
{0x00,0xFE,0x02,0x42,0x4A,0xCA,0x4A,0x4A,0xCA,0x4A,0x4A,0x42,0x02,0xFE,0x00,0x00},
{0x00,0xFF,0x40,0x50,0x4C,0x43,0x40,0x40,0x4F,0x50,0x50,0x5C,0x40,0xFF,0x00,0x00},/*"园",2*/
{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00},
{0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00},/*"电",3*/
{0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00},
{0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"子",4*/
{0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},
{0x08,0x06,0x01,0xFF,0x00,0x01,0x04,0x04,0x04,0x04,0x04,0xFF,0x02,0x02,0x02,0x00},/*"科",5*/
{0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00},
{0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"?",0*/
{0x40,0x40,0x48,0x48,0x48,0xC8,0x78,0x4F,0x48,0x48,0x48,0x48,0x48,0x40,0x40,0x00},
{0x00,0x00,0x00,0x00,0x03,0x12,0x12,0x22,0x22,0x52,0x8A,0x06,0x00,0x00,0x00,0x00},/*"专",0*/
{0x00,0x10,0x60,0x80,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xC0,0x30,0x00,0x00},
{0x40,0x40,0x40,0x43,0x40,0x7F,0x40,0x40,0x40,0x7F,0x42,0x41,0x40,0x40,0x40,0x00},/*"业",1*/
{0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00},
{0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"技",2*/
{0x00,0x10,0x10,0x10,0x10,0xD0,0x30,0xFF,0x30,0xD0,0x12,0x1C,0x10,0x10,0x00,0x00},
{0x10,0x08,0x04,0x02,0x01,0x00,0x00,0xFF,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x00},/*"术",3*/
{0x00,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0xFE,0x82,0x82,0x92,0xA2,0x9E,0x00,0x00},
{0x80,0x60,0x1F,0x02,0x42,0x82,0x7F,0x00,0xFF,0x40,0x2F,0x10,0x2C,0x43,0x80,0x00},/*"服",4*/
{0x00,0x00,0x90,0x88,0x4C,0x57,0xA4,0x24,0x54,0x54,0x8C,0x84,0x00,0x00,0x00,0x00},
{0x01,0x01,0x80,0x42,0x22,0x1A,0x07,0x02,0x42,0x82,0x42,0x3E,0x01,0x01,0x01,0x00},/*"务",5*/
{0x00,0x04,0xE4,0x24,0x2C,0xB4,0x25,0x26,0x24,0xB4,0x2C,0x24,0xE4,0x04,0x00,0x00},
{0x00,0x00,0xFF,0x02,0x01,0x1E,0x12,0x12,0x12,0x1E,0x41,0x82,0x7F,0x00,0x00,0x00},/*"商",6*/
const unsigned char F8X16[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0
0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x30, 0x00, 0x00, 0x00, //! 1
0x00, 0x10, 0x0C, 0x06, 0x10, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //" 2
0x40, 0xC0, 0x78, 0x40, 0xC0, 0x78, 0x40, 0x00, 0x04, 0x3F, 0x04, 0x04, 0x3F, 0x04, 0x04, 0x00, //# 3
0x00, 0x70, 0x88, 0xFC, 0x08, 0x30, 0x00, 0x00, 0x00, 0x18, 0x20, 0xFF, 0x21, 0x1E, 0x00, 0x00, //$ 4
0xF0, 0x08, 0xF0, 0x00, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x21, 0x1C, 0x03, 0x1E, 0x21, 0x1E, 0x00, //% 5
0x00, 0xF0, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00, 0x1E, 0x21, 0x23, 0x24, 0x19, 0x27, 0x21, 0x10, //& 6
0x10, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //' 7
0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x00, //( 8
0x00, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, //) 9
0x40, 0x40, 0x80, 0xF0, 0x80, 0x40, 0x40, 0x00, 0x02, 0x02, 0x01, 0x0F, 0x01, 0x02, 0x02, 0x00, //* 10
0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x00, //+ 11
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, //, 12
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, //- 13
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, //. 14
0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x04, 0x00, 0x60, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, /// 15
0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, //0 16
0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //1 17
0x00, 0x70, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x30, 0x28, 0x24, 0x22, 0x21, 0x30, 0x00, //2 18
0x00, 0x30, 0x08, 0x88, 0x88, 0x48, 0x30, 0x00, 0x00, 0x18, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, //3 19
0x00, 0x00, 0xC0, 0x20, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x04, 0x24, 0x24, 0x3F, 0x24, 0x00, //4 20
0x00, 0xF8, 0x08, 0x88, 0x88, 0x08, 0x08, 0x00, 0x00, 0x19, 0x21, 0x20, 0x20, 0x11, 0x0E, 0x00, //5 21
0x00, 0xE0, 0x10, 0x88, 0x88, 0x18, 0x00, 0x00, 0x00, 0x0F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, //6 22
0x00, 0x38, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, //7 23
0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x1C, 0x22, 0x21, 0x21, 0x22, 0x1C, 0x00, //8 24
0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x31, 0x22, 0x22, 0x11, 0x0F, 0x00, //9 25
0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, //: 26
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, //; 27
0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, //< 28
0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, //= 29
0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, //> 30
0x00, 0x70, 0x48, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x36, 0x01, 0x00, 0x00, //? 31
0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00, 0x07, 0x18, 0x27, 0x24, 0x23, 0x14, 0x0B, 0x00, //@ 32
0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x3C, 0x23, 0x02, 0x02, 0x27, 0x38, 0x20, //A 33
0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, //B 34
0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x07, 0x18, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00, //C 35
0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, //D 36
0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x23, 0x20, 0x18, 0x00, //E 37
0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, //F 38
0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x07, 0x18, 0x20, 0x20, 0x22, 0x1E, 0x02, 0x00, //G 39
0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x21, 0x3F, 0x20, //H 40
0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //I 41
0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, //J 42
0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00, 0x20, 0x3F, 0x20, 0x01, 0x26, 0x38, 0x20, 0x00, //K 43
0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x30, 0x00, //L 44
0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00, 0x20, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x20, 0x00, //M 45
0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x20, 0x00, 0x07, 0x18, 0x3F, 0x00, //N 46
0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, //O 47
0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x00, 0x00, //P 48
0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x18, 0x24, 0x24, 0x38, 0x50, 0x4F, 0x00, //Q 49
0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x0C, 0x30, 0x20, //R 50
0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x38, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, //S 51
0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, //T 52
0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, //U 53
0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00, //V 54
0xF8, 0x08, 0x00, 0xF8, 0x00, 0x08, 0xF8, 0x00, 0x03, 0x3C, 0x07, 0x00, 0x07, 0x3C, 0x03, 0x00, //W 55
0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08, 0x20, 0x30, 0x2C, 0x03, 0x03, 0x2C, 0x30, 0x20, //X 56
0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, //Y 57
0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x20, 0x38, 0x26, 0x21, 0x20, 0x20, 0x18, 0x00, //Z 58
0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x00, //[ 59
0x00, 0x0C, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x38, 0xC0, 0x00, //\ 60
0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, //] 61
0x00, 0x00, 0x04, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //^ 62
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //_ 63
0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //` 64
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x19, 0x24, 0x22, 0x22, 0x22, 0x3F, 0x20, //a 65
0x08, 0xF8, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, //b 66
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x20, 0x11, 0x00, //c 67
0x00, 0x00, 0x00, 0x80, 0x80, 0x88, 0xF8, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x10, 0x3F, 0x20, //d 68
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x22, 0x22, 0x22, 0x22, 0x13, 0x00, //e 69
0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x18, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //f 70
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x6B, 0x94, 0x94, 0x94, 0x93, 0x60, 0x00, //g 71
0x08, 0xF8, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, //h 72
0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //i 73
0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, //j 74
0x08, 0xF8, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x24, 0x02, 0x2D, 0x30, 0x20, 0x00, //k 75
0x00, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //l 76
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x3F, //m 77
0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, //n 78
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, //o 79
0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xA1, 0x20, 0x20, 0x11, 0x0E, 0x00, //p 80
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0xA0, 0xFF, 0x80, //q 81
0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x20, 0x3F, 0x21, 0x20, 0x00, 0x01, 0x00, //r 82
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x33, 0x24, 0x24, 0x24, 0x24, 0x19, 0x00, //s 83
0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x00, 0x00, //t 84
0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, //u 85
0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x01, 0x0E, 0x30, 0x08, 0x06, 0x01, 0x00, //v 86
0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x0F, 0x30, 0x0C, 0x03, 0x0C, 0x30, 0x0F, 0x00, //w 87
0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x31, 0x2E, 0x0E, 0x31, 0x20, 0x00, //x 88
0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x81, 0x8E, 0x70, 0x18, 0x06, 0x01, 0x00, //y 89
0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x21, 0x30, 0x2C, 0x22, 0x21, 0x30, 0x00, //z 90
0x00, 0x00, 0x00, 0x00, 0x80, 0x7C, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x40, //{ 91
0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, //| 92
0x00, 0x02, 0x02, 0x7C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, //} 93
0x00, 0x06, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //~ 94
};
#endif
+45 -16
View File
@@ -16,26 +16,56 @@
#include "ohos_init.h"
#include "lz_hardware.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 1000
/* 字符串最大长度 */
#define STRING_MAXSIZE 32
/* OLED显示字符串1的位置、长度和宽度 */
#define OLED_STRING1_X 6
#define OLED_STRING1_Y 0
#define OLED_STRING1_TEXT "0.96' OLED TEST"
#define OLED_STRING1_SIZE 16
/* OLED显示字符串2的位置、长度和宽度 */
#define OLED_STRING2_X 0
#define OLED_STRING2_Y 3
#define OLED_STRING2_TEXT "ASCII:"
#define OLED_STRING2_SIZE 16
/* OLED显示字符串3的位置、长度和宽度 */
#define OLED_STRING3_X 64
#define OLED_STRING3_Y 3
#define OLED_STRING3_TEXT "CODE:"
#define OLED_STRING3_SIZE 16
/* OLED显示字符串4的位置、长度和宽度 */
#define OLED_STRING4_X 40
#define OLED_STRING4_Y 6
#define OLED_STRING4_SIZE 16
void oled_process(void *arg)
{
unsigned char buffer[32];
unsigned char buffer[STRING_MAXSIZE];
int i = 0;
oled_init();
oled_clear();
while (1)
{
while (1) {
printf("========= Oled Process =============\n");
oled_show_string(6, 0, "0.96' OLED TEST", 16);
oled_show_string(0, 3, "ASCII:", 16);
oled_show_string(64, 3, "CODE:", 16);
oled_show_string(OLED_STRING1_X, OLED_STRING1_Y, OLED_STRING1_TEXT, OLED_STRING1_SIZE);
oled_show_string(OLED_STRING2_X, OLED_STRING2_Y, OLED_STRING2_TEXT, OLED_STRING2_SIZE);
oled_show_string(OLED_STRING3_X, OLED_STRING3_Y, OLED_STRING3_TEXT, OLED_STRING3_SIZE);
snprintf(buffer, sizeof(buffer), "%d Sec!", i++);
oled_show_string(40, 6, buffer, 16);
oled_show_string(OLED_STRING4_X, OLED_STRING4_Y, buffer, OLED_STRING4_SIZE);
printf("\n\n");
LOS_Msleep(1000);
LOS_Msleep(WAIT_MSEC);
}
}
@@ -53,12 +83,11 @@ void oled_example()
unsigned int ret = LOS_OK;
task.pfnTaskEntry = (TSK_ENTRY_FUNC)oled_process;
task.uwStackSize = 2048;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "oled process";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create task ret:0x%x\n", ret);
return;
}
+63 -99
View File
@@ -44,8 +44,7 @@
#define OLED_RST_Set()
#else
#define OLED_I2C_BUS 1
static I2cBusIo m_i2cBus =
{
static I2cBusIo m_i2cBus = {
.scl = {.gpio = GPIO0_PC2, .func = MUX_FUNC5, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},
.sda = {.gpio = GPIO0_PC1, .func = MUX_FUNC5, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},
.id = FUNC_ID_I2C1,
@@ -72,12 +71,11 @@ static unsigned int m_i2c_freq = 400000;
static uint32_t oled_pow(uint8_t m, uint8_t n)
{
uint32_t result = 1;
while (n--)
{
while (n--) {
result *= m;
}
return result;
}
@@ -128,7 +126,7 @@ static inline void iic_wait_ack()
/***************************************************************
* 函数名称: write_iic_byte
* 说 明: i2c写单个字节
* 参 数:
* 参 数:
* @IIC_Byte:数值
* 返 回 值: 无
***************************************************************/
@@ -138,17 +136,13 @@ static inline void write_iic_byte(unsigned char iic_byte)
unsigned char m, da;
da = iic_byte;
OLED_SCLK_Clr();
for (i = 0; i < 8; i++)
{
for (i = 0; i < 8; i++) {
m = da;
//OLED_SCLK_Clr();
m = m & 0x80;
if (m == 0x80)
{
if (m == 0x80) {
OLED_SDIN_Set();
}
else
{
} else {
OLED_SDIN_Clr();
}
da = da << 1;
@@ -161,7 +155,7 @@ static inline void write_iic_byte(unsigned char iic_byte)
/***************************************************************
* 函数名称: write_iic_command
* 说 明: 通过i2c通信协议,往芯片写入一个命令
* 参 数:
* 参 数:
* @IIC_Command:命令数值
* 返 回 值: 无
***************************************************************/
@@ -183,7 +177,7 @@ static inline void write_iic_command(unsigned char iic_command)
/***************************************************************
* 函数名称: write_iic_data
* 说 明: 通过i2c通信协议,往芯片写入一个数据
* 参 数:
* 参 数:
* @IIC_Data:数据数值
* 返 回 值: 无
***************************************************************/
@@ -204,7 +198,7 @@ static inline void write_iic_data(unsigned char iic_data)
/***************************************************************
* 函数名称: write_iic_command
* 说 明: 通过i2c通信协议,往芯片写入一个命令
* 参 数:
* 参 数:
* @IIC_Command:命令数值
* 返 回 值: 无
***************************************************************/
@@ -217,8 +211,7 @@ static inline void write_iic_command(unsigned char iic_command)
buffer[0] = 0x00;
buffer[1] = iic_command;
ret = LzI2cWrite(OLED_I2C_BUS, OLED_I2C_ADDRESS, buffer, 2);
if (ret != 0)
{
if (ret != 0) {
printf("%s, %s, %d: LzI2cWrite failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
}
}
@@ -227,7 +220,7 @@ static inline void write_iic_command(unsigned char iic_command)
/***************************************************************
* 函数名称: write_iic_data
* 说 明: 通过i2c通信协议,往芯片写入一个数据
* 参 数:
* 参 数:
* @iic_data:数据数值
* 返 回 值: 无
***************************************************************/
@@ -240,8 +233,7 @@ static inline void write_iic_data(unsigned char iic_data)
buffer[0] = 0x40;
buffer[1] = iic_data;
ret = LzI2cWrite(OLED_I2C_BUS, OLED_I2C_ADDRESS, buffer, 2);
if (ret != 0)
{
if (ret != 0) {
printf("%s, %s, %d: LzI2cWrite failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
}
}
@@ -251,23 +243,18 @@ static inline void write_iic_data(unsigned char iic_data)
/***************************************************************
* 函数名称: oled_wr_byte
* 说 明: 往芯片写数据
* 参 数:
* 参 数:
* @data:数据数值
* @cmd:该数据是命令,还是数据
* 返 回 值: 无
***************************************************************/
static inline void oled_wr_byte(unsigned dat, unsigned cmd)
{
if (cmd == OLED_DATA)
{
if (cmd == OLED_DATA) {
write_iic_data(dat);
}
else if (cmd == OLED_CMD)
{
} else if (cmd == OLED_CMD) {
write_iic_command(dat);
}
else
{
} else {
printf("%s, %s, %d: cmd(%d) out of the range!\n", __FILE__, __func__, __LINE__, cmd);
}
}
@@ -276,7 +263,7 @@ static inline void oled_wr_byte(unsigned dat, unsigned cmd)
/***************************************************************
* 函数名称: oled_set_pos
* 说 明: 坐标设置
* 参 数:
* 参 数:
* @xX轴坐标
* @yY轴坐标
* 返 回 值: 无
@@ -306,20 +293,18 @@ unsigned int oled_init()
LzGpioInit(GPIO_I2C_SCL);
LzGpioSetDir(GPIO_I2C_SCL, LZGPIO_DIR_OUT);
#else
if (I2cIoInit(m_i2cBus) != LZ_HARDWARE_SUCCESS)
{
if (I2cIoInit(m_i2cBus) != LZ_HARDWARE_SUCCESS) {
printf("%s, %d: I2cIoInit failed!\n", __FILE__, __LINE__);
return __FILE__;
}
if (LzI2cInit(OLED_I2C_BUS, m_i2c_freq) != LZ_HARDWARE_SUCCESS)
{
if (LzI2cInit(OLED_I2C_BUS, m_i2c_freq) != LZ_HARDWARE_SUCCESS) {
printf("%s, %d: I2cIoInit failed!\n", __FILE__, __LINE__);
return __FILE__;
}
#endif
LOS_Msleep(200);
oled_wr_byte(0xAE, OLED_CMD); //--display off
oled_wr_byte(0x00, OLED_CMD); //---set low column address
oled_wr_byte(0x10, OLED_CMD); //---set high column address
@@ -334,27 +319,27 @@ unsigned int oled_init()
oled_wr_byte(0xC8, OLED_CMD); //Com scan direction
oled_wr_byte(0xD3, OLED_CMD); //-set display offset
oled_wr_byte(0x00, OLED_CMD); //
oled_wr_byte(0xD5, OLED_CMD); //set osc division
oled_wr_byte(0x80, OLED_CMD); //
oled_wr_byte(0xD8, OLED_CMD); //set area color mode off
oled_wr_byte(0x05, OLED_CMD); //
oled_wr_byte(0xD9, OLED_CMD); //Set Pre-Charge Period
oled_wr_byte(0xF1, OLED_CMD); //
oled_wr_byte(0xDA, OLED_CMD); //set com pin configuartion
oled_wr_byte(0x12, OLED_CMD); //
oled_wr_byte(0xDB, OLED_CMD); //set Vcomh
oled_wr_byte(0x30, OLED_CMD); //
oled_wr_byte(0x8D, OLED_CMD); //set charge pump enable
oled_wr_byte(0x14, OLED_CMD); //
oled_wr_byte(0xAF, OLED_CMD); //--turn on oled panel
return 0;
}
@@ -386,14 +371,12 @@ unsigned int oled_deinit()
void oled_clear()
{
uint8_t i, n;
for (i = 0; i < 8; i++)
{
for (i = 0; i < 8; i++) {
oled_wr_byte(0xb0 + i, OLED_CMD); //设置页地址(0~7
oled_wr_byte(0x00, OLED_CMD); //设置显示位置—列低地址
oled_wr_byte(0x10, OLED_CMD); //设置显示位置—列高地址
for (n = 0; n < 128; n++)
{
for (n = 0; n < 128; n++) {
oled_wr_byte(0, OLED_DATA);
}
}
@@ -431,7 +414,7 @@ void oled_display_off(void)
/***************************************************************
* 函数名称: oled_show_char
* 说 明: oled显示字符
* 参 数:
* 参 数:
* @x:字符的X轴坐标
* @y:字符的Y轴坐标
* @chr:字符
@@ -441,36 +424,29 @@ void oled_display_off(void)
void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t chr_size)
{
unsigned char c = 0, i = 0;
c = chr - ' '; //得到偏移后的值
if (x > (OLED_COLUMN_MAX - 1))
{
if (x > (OLED_COLUMN_MAX - 1)) {
x = 0;
y = y + 2;
}
if (chr_size == 16)
{
if (chr_size == 16) {
oled_set_pos(x, y);
for (i = 0; i < 8; i++)
{
for (i = 0; i < 8; i++) {
oled_wr_byte(F8X16[c * 16 + i], OLED_DATA);
}
oled_set_pos(x, y + 1);
for (i = 0; i < 8; i++)
{
for (i = 0; i < 8; i++) {
oled_wr_byte(F8X16[c * 16 + i + 8], OLED_DATA);
}
}
else
{
} else {
oled_set_pos(x, y);
for (i = 0; i < 6; i++)
{
for (i = 0; i < 6; i++) {
oled_wr_byte(F6x8[c][i], OLED_DATA);
}
}
}
@@ -478,7 +454,7 @@ void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t chr_size)
/***************************************************************
* 函数名称: oled_show_num
* 说 明: oled显示数字
* 参 数:
* 参 数:
* @x:数字的X轴坐标
* @y:数字的Y轴坐标
* @num:数字
@@ -490,22 +466,17 @@ void oled_show_num(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size
{
uint8_t t, temp;
uint8_t enshow = 0;
for (t = 0; t < len; t++)
{
for (t = 0; t < len; t++) {
temp = (num / oled_pow(10, len - t - 1)) % 10;
if (enshow == 0 && t < (len - 1))
{
if (temp == 0)
{
if (enshow == 0 && t < (len - 1)) {
if (temp == 0) {
oled_show_char(x + (size2 / 2)*t, y, ' ', size2);
continue;
}
else
{
} else {
enshow = 1;
}
}
oled_show_char(x + (size2 / 2)*t, y, temp + '0', size2);
}
@@ -515,7 +486,7 @@ void oled_show_num(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size
/***************************************************************
* 函数名称: oled_show_string
* 说 明: oled显示字符串
* 参 数:
* 参 数:
* @x:字符串的X轴坐标
* @y:字符串的Y轴坐标
* @p:字符串
@@ -525,13 +496,11 @@ void oled_show_num(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size
void oled_show_string(uint8_t x, uint8_t y, uint8_t *chr, uint8_t chr_size)
{
unsigned char j = 0;
while (chr[j] != '\0')
{
while (chr[j] != '\0') {
oled_show_char(x, y, chr[j], chr_size);
x += 8;
if (x > 120)
{
if (x > 120) {
x = 0;
y += 2;
}
@@ -543,7 +512,7 @@ void oled_show_string(uint8_t x, uint8_t y, uint8_t *chr, uint8_t chr_size)
/***************************************************************
* 函数名称: oled_draw_bmp
* 说 明: oled显示图片
* 参 数:
* 参 数:
* @x0:图片的起始点X轴坐标,取值为0~127
* @y0:图片的起始点Y轴坐标,取值为0~63
* @x1:图片的结束点X轴坐标,取值为0~127
@@ -555,22 +524,17 @@ void oled_draw_bmp(unsigned char x0, unsigned char y0, unsigned char x1, unsigne
{
unsigned int j = 0;
unsigned char x, y;
if (y1 % 8 == 0)
{
if (y1 % 8 == 0) {
y = y1 / 8;
}
else
{
} else {
y = y1 / 8 + 1;
}
for (y = y0; y < y1; y++)
{
for (y = y0; y < y1; y++) {
oled_set_pos(x0, y);
for (x = x0; x < x1; x++)
{
for (x = x0; x < x1; x++) {
oled_wr_byte(bmp[j++], OLED_DATA);
}
}
+23 -14
View File
@@ -16,12 +16,24 @@
#include "ohos_init.h"
#include "lz_hardware.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 2000
/* E53模块中
* UART0_RX_M0 -> GPIO0_B6
* UART0_TX_M0 -> GPIO0_B7
*/
#define UART_ID 0
/* 串口波特率 */
#define UART_BAUD_RATE 115200
void uart_process(void)
{
unsigned int ret;
@@ -29,33 +41,31 @@ void uart_process(void)
unsigned char str[] = "HelloWorld!\n";
LzUartDeinit(UART_ID);
attr.baudRate = 115200;
attr.baudRate = UART_BAUD_RATE;
attr.dataBits = UART_DATA_BIT_8;
attr.pad = FLOW_CTRL_NONE;
attr.parity = UART_PARITY_NONE;
attr.rxBlock = UART_BLOCK_STATE_NONE_BLOCK;
attr.stopBits = UART_STOP_BIT_1;
attr.txBlock = UART_BLOCK_STATE_NONE_BLOCK;
PinctrlSet(GPIO0_PB6, MUX_FUNC2, PULL_KEEP, DRIVE_LEVEL2);
PinctrlSet(GPIO0_PB7, MUX_FUNC2, PULL_KEEP, DRIVE_LEVEL2);
ret = LzUartInit(UART_ID, &attr);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %d: LzUartInit(%d) failed!\n", __FILE__, __LINE__, ret);
return;
}
while (1)
{
while (1) {
printf("%s, %d: uart write!\n", __FILE__, __LINE__);
LzUartWrite(UART_ID, str, strlen(str));
LOS_Msleep(2000);
LOS_Msleep(WAIT_MSEC);
}
return;
}
@@ -72,12 +82,11 @@ void uart_example()
unsigned int ret = LOS_OK;
task.pfnTaskEntry = (TSK_ENTRY_FUNC)uart_process;
task.uwStackSize = 2048;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "uart process";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create task ret:0x%x\n", ret);
return;
}
+56 -53
View File
@@ -27,13 +27,27 @@
#include "lwip/stats.h"
#include "lwip/inet_chksum.h"
#define LOG_TAG "tcp"
int get_wifi_info(WifiLinkedInfo *info);
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
#define OC_SERVER_IP "192.168.2.156"
#define SERVER_PORT 6666
/* 循环等待时间 */
#define GET_WIFI_WAIT_MSEC 1000
#define SERVER_WAIT_MSEC 2000
#define CLIENT_WAIT_MSEC 3000
#define LOG_TAG "tcp"
/* 服务器IP地址和端口 */
#define OC_SERVER_IP "192.168.2.156"
#define SERVER_PORT 6666
/* 服务器监听数量 */
#define SERVER_LISTEN_MAX 64
/* 缓冲区大小 */
#define BUFF_LEN 256
#define BUFF_LEN 256
int get_wifi_info(WifiLinkedInfo *info)
{
@@ -42,14 +56,14 @@ int get_wifi_info(WifiLinkedInfo *info)
memset(info, 0, sizeof(WifiLinkedInfo));
unsigned int retry = 15;
struct in_addr addr;
while (retry) {
if (GetLinkedInfo(info) == WIFI_SUCCESS) {
if (info->connState == WIFI_CONNECTED) {
if (info->ipAddress != 0) {
addr.s_addr = (in_addr_t)info->ipAddress;
LZ_HARDWARE_LOGD(LOG_TAG, "rknetwork IP (%s)", inet_ntoa(addr));
if (WIFI_SUCCESS == GetLocalWifiGw(&gw)) {
addr.s_addr = (in_addr_t)gw;
LZ_HARDWARE_LOGD(LOG_TAG, "network GW (%s)", inet_ntoa(addr));
@@ -74,7 +88,7 @@ int get_wifi_info(WifiLinkedInfo *info)
}
}
}
LOS_Msleep(1000);
LOS_Msleep(GET_WIFI_WAIT_MSEC);
retry--;
}
@@ -90,23 +104,21 @@ void tcp_server_msg_handle(int fd)
int cnt = 0, count;
int client_fd;
struct sockaddr_in client_addr = {0};
printf("waitting for client connect...\n");
/* 监听socket 此处会阻塞 */
client_fd = accept(fd, (struct sockaddr*)&client_addr, &client_addr_len);
// client_fd = lwip_accept(fd, (struct sockaddr*)&client_addr, &client_addr_len);
printf("[tcp server] accept <%s:%d>\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
while (1)
{
while (1) {
memset(buf, 0, BUFF_LEN);
printf("-------------------------------------------------------\n");
printf("[tcp server] waitting client msg\n");
count = recv(client_fd, buf, BUFF_LEN, 0); //read是阻塞函数,没有数据就一直阻塞
// count = lwip_read(client_fd, buf, BUFF_LEN); //read是阻塞函数,没有数据就一直阻塞
if (count == -1)
{
if (count == -1) {
printf("[tcp server] recieve data fail!\n");
LOS_Msleep(3000);
LOS_Msleep(SERVER_WAIT_MSEC);
break;
}
printf("[tcp server] rev client msg:%s\n", buf);
@@ -124,12 +136,10 @@ int wifi_server(void* arg)
{
int server_fd, ret;
while(1)
{
while (1) {
server_fd = socket(AF_INET, SOCK_STREAM, 0); //AF_INET:IPV4;SOCK_STREAM:TCP
// server_fd = lwip_socket(AF_INET, SOCK_STREAM, 0); //AF_INET:IPV4;SOCK_STREAM:TCP
if (server_fd < 0)
{
if (server_fd < 0) {
printf("create socket fail!\n");
return -1;
}
@@ -140,7 +150,7 @@ int wifi_server(void* arg)
if (ret != 0) {
printf("[CommInitTcpServer]setsockopt fail, ret[%d]!\n", ret);
}
struct sockaddr_in serv_addr = {0};
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址,需要进行网络序转换,INADDR_ANY:本地地址
@@ -149,24 +159,22 @@ int wifi_server(void* arg)
/* 绑定服务器地址结构 */
ret = bind(server_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
// ret = lwip_bind(server_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if (ret < 0)
{
if (ret < 0) {
printf("socket bind fail!\n");
lwip_close(server_fd);
return -1;
}
/* 监听socket 此处不阻塞 */
ret = listen(server_fd, 64);
ret = listen(server_fd, SERVER_LISTEN_MAX);
// ret = lwip_listen(server_fd, 64);
if(ret != 0)
{
if (ret != 0) {
printf("socket listen fail!\n");
lwip_close(server_fd);
return -1;
}
printf("[tcp server] listen:%d<%s:%d>\n",server_fd, inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port));
printf("[tcp server] listen:%d<%s:%d>\n", server_fd, inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port));
tcp_server_msg_handle(server_fd); //处理接收到的数据
LOS_Msleep(1000);
LOS_Msleep(SERVER_WAIT_MSEC);
}
}
@@ -177,16 +185,14 @@ void tcp_client_msg_handle(int fd, struct sockaddr* dst)
socklen_t len = sizeof(*dst);
int cnt = 0, count = 0;
while (connect(fd, dst, len) < 0)
{
while (connect(fd, dst, len) < 0) {
printf("connect server failed...%d\n", ++count);
lwip_close(fd);
LOS_Msleep(5000);
LOS_Msleep(CLIENT_WAIT_MSEC);
fd = socket(AF_INET, SOCK_STREAM, 0); //AF_INET:IPV4;SOCK_STREAM:TCP
}
while (1)
{
while (1) {
char buf[BUFF_LEN];
sprintf(buf, "TCP TEST cilent send:%d", ++cnt);
count = send(fd, buf, strlen(buf), 0); //发送数据给server
@@ -197,10 +203,9 @@ void tcp_client_msg_handle(int fd, struct sockaddr* dst)
memset(buf, 0, BUFF_LEN);
count = recv(fd, buf, BUFF_LEN, 0); //接收来自server的信息
// count = lwip_read(fd, buf, BUFF_LEN); //接收来自server的信息
if(count == -1)
{
if (count == -1) {
printf("[tcp client] recieve data fail!\n");
LOS_Msleep(3000);
LOS_Msleep(CLIENT_WAIT_MSEC);
break;
}
printf("[tcp client] rev:%s\n", buf);
@@ -212,12 +217,10 @@ int wifi_client(void* arg)
{
int client_fd, ret;
struct sockaddr_in serv_addr;
while(1)
{
while (1) {
client_fd = socket(AF_INET, SOCK_STREAM, 0);//AF_INET:IPV4;SOCK_STREAM:TCP
if (client_fd < 0)
{
if (client_fd < 0) {
printf("create socket fail!\n");
return -1;
}
@@ -228,17 +231,17 @@ int wifi_client(void* arg)
if (ret != 0) {
printf("[CommInitTcpServer]setsockopt fail, ret[%d]!\n", ret);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(OC_SERVER_IP);
serv_addr.sin_port = htons(SERVER_PORT);
printf("[tcp client] connect:%d<%s:%d>\n",client_fd, inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port));
printf("[tcp client] connect:%d<%s:%d>\n", client_fd, inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port));
tcp_client_msg_handle(client_fd, (struct sockaddr*)&serv_addr);
LOS_Msleep(1000);
LOS_Msleep(CLIENT_WAIT_MSEC);
}
return 0;
@@ -249,12 +252,14 @@ void wifi_process(void *args)
{
unsigned int threadID_client, threadID_server;
unsigned int ret = LOS_OK;
WifiLinkedInfo info;
/* 开启WiFi连接任务 */
ExternalTaskConfigNetwork();
while(get_wifi_info(&info) != 0) ;
while (get_wifi_info(&info) != 0) {
/* 什么都不做,等待 */
}
CreateThread(&threadID_client, wifi_client, NULL, "client@ process");
CreateThread(&threadID_server, wifi_server, NULL, "server@ process");
@@ -269,16 +274,14 @@ void wifi_tcp_example(void)
printf("%s start ....\n", __FUNCTION__);
task.pfnTaskEntry = (TSK_ENTRY_FUNC)wifi_process;
task.uwStackSize = 10240;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "wifi_process";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create wifi_process ret:0x%x\n", ret);
return;
}
}
APP_FEATURE_INIT(wifi_tcp_example);
+62 -50
View File
@@ -23,13 +23,28 @@
#include "lwip/stats.h"
#include "lwip/inet_chksum.h"
#define LOG_TAG "udp"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
#define OC_SERVER_IP "192.168.2.49"
#define SERVER_PORT 6666
#define CLIENT_LOCAL_PORT 8888
/* 循环等待时间 */
#define GET_WIFI_WAIT_MSEC 1000
#define SERVER_WAIT_MSEC 2000
#define CLIENT_WAIT_MSEC 100
#define BUFF_LEN 256
/* 打印信息 */
#define LOG_TAG "udp"
/* UDP服务端IP地址和端口号 */
#define OC_SERVER_IP "192.168.2.49"
#define SERVER_PORT 6666
/* UDP客户端端口号 */
#define CLIENT_LOCAL_PORT 8888
/* 字节缓冲区大小 */
#define BUFF_LEN 256
WifiLinkedInfo wifiinfo;
@@ -72,7 +87,7 @@ int udp_get_wifi_info(WifiLinkedInfo *info)
}
}
}
LOS_Msleep(1000);
LOS_Msleep(GET_WIFI_WAIT_MSEC);
retry--;
}
@@ -87,17 +102,16 @@ void udp_server_msg_handle(int fd)
socklen_t len;
int cnt = 0, count;
struct sockaddr_in client_addr = {0};
while (1)
{
while (1) {
memset(buf, 0, BUFF_LEN);
len = sizeof(client_addr);
printf("[udp server]------------------------------------------------\n");
printf("[udp server] waitting client message!!!\n");
count = recvfrom(fd, buf, BUFF_LEN, 0, (struct sockaddr*)&client_addr, &len); //recvfrom是阻塞函数,没有数据就一直阻塞
if (count == -1)
{
if (count == -1) {
printf("[udp server] recieve data fail!\n");
LOS_Msleep(3000);
LOS_Msleep(SERVER_WAIT_MSEC);
break;
}
printf("[udp server] remote addr:%s port:%u\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
@@ -115,11 +129,9 @@ int wifi_udp_server(void* arg)
int server_fd, ret;
struct in_addr addr;
while(1)
{
while (1) {
server_fd = socket(AF_INET, SOCK_DGRAM, 0); //AF_INET:IPV4;SOCK_DGRAM:UDP
if (server_fd < 0)
{
if (server_fd < 0) {
printf("create socket fail!\n");
return -1;
}
@@ -130,16 +142,15 @@ int wifi_udp_server(void* arg)
if (ret != 0) {
printf("[CommInitUdpServer]setsockopt fail, ret[%d]!\n", ret);
}
struct sockaddr_in serv_addr = {0};
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址,需要进行网络序转换,INADDR_ANY:本地地址
// serv_addr.sin_addr.s_addr = wifiinfo.ipAddress;
// serv_addr.sin_addr.s_addr = wifiinfo.ipAddress;
serv_addr.sin_port = htons(SERVER_PORT); //端口号,需要网络序转换
/* 绑定服务器地址结构 */
ret = bind(server_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if (ret < 0)
{
if (ret < 0) {
printf("socket bind fail!\n");
lwip_close(server_fd);
return -1;
@@ -148,7 +159,7 @@ int wifi_udp_server(void* arg)
printf("[udp server] local addr:%s,port:%u\n", inet_ntoa(addr), ntohs(serv_addr.sin_port));
udp_server_msg_handle(server_fd); //处理接收到的数据
LOS_Msleep(1000);
LOS_Msleep(SERVER_WAIT_MSEC);
}
}
@@ -159,25 +170,22 @@ void udp_client_msg_handle(int fd, struct sockaddr* dst)
socklen_t len = sizeof(*dst);
struct sockaddr_in client_addr;
int cnt = 0,count = 0;
int cnt = 0, count = 0;
printf("[udp client] remote addr:%s port:%u\n", inet_ntoa(((struct sockaddr_in*)dst)->sin_addr), ntohs(((struct sockaddr_in*)dst)->sin_port));
connect(fd, dst, len);
getsockname(fd, (struct sockaddr*)&client_addr,&len);
connect(fd, dst, len);
getsockname(fd, (struct sockaddr*)&client_addr, &len);
printf("[udp client] local addr:%s port:%u\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
while (1)
{
while (1) {
char buf[BUFF_LEN];
printf("[udp client]------------------------------------------------\n");
printf("[udp client] waitting server message!!!\n");
// count = recv(fd, buf, BUFF_LEN, 0); //接收来自server的信息
count = recvfrom(fd, buf, BUFF_LEN, 0, (struct sockaddr*)&client_addr, &len); //recvfrom是阻塞函数,没有数据就一直阻塞
if(count == -1)
{
if (count == -1) {
printf("[udp client] No server message!!!\n");
}
else
{
} else {
printf("[udp client] remote addr:%s port:%u\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
printf("[udp client] rev:%s\n", buf);
}
@@ -188,7 +196,7 @@ void udp_client_msg_handle(int fd, struct sockaddr* dst)
printf("[udp client] send:%s\n", buf);
printf("[udp client] client sendto msg to server %dbyte,waitting server respond msg!!!\n", count);
LOS_Msleep(100);
LOS_Msleep(CLIENT_WAIT_MSEC);
}
lwip_close(fd);
}
@@ -198,12 +206,10 @@ int wifi_udp_client(void* arg)
{
int client_fd, ret;
struct sockaddr_in serv_addr, local_addr;
while(1)
{
while (1) {
client_fd = socket(AF_INET, SOCK_DGRAM, 0);//AF_INET:IPV4;SOCK_DGRAM:UDP
if (client_fd < 0)
{
if (client_fd < 0) {
printf("create socket fail!\n");
return -1;
}
@@ -213,23 +219,30 @@ int wifi_udp_client(void* arg)
ret = setsockopt(client_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int));
if (ret != 0) {
printf("[CommInitUdpServer]setsockopt fail, ret[%d]!\n", ret);
close(client_fd);
continue;
}
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = wifiinfo.ipAddress;
local_addr.sin_port = htons(CLIENT_LOCAL_PORT);
//绑定本地ip端口号
ret = bind(client_fd, (struct sockaddr*)&local_addr, sizeof(local_addr));
if (ret == -1) {
printf("client bind failed(%d)\n", ret);
close(client_fd);
continue;
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址,需要进行网络序转换,INADDR_ANY:本地地址
// serv_addr.sin_addr.s_addr = inet_addr(OC_SERVER_IP); //指定ip接收
serv_addr.sin_port = htons(SERVER_PORT);
serv_addr.sin_port = htons(SERVER_PORT);
udp_client_msg_handle(client_fd, (struct sockaddr*)&serv_addr);
LOS_Msleep(1000);
LOS_Msleep(CLIENT_WAIT_MSEC);
}
return 0;
@@ -240,18 +253,20 @@ void wifi_udp_process(void *args)
{
unsigned int threadID_client, threadID_server;
unsigned int ret = LOS_OK;
WifiLinkedInfo info;
/* 开启WiFi连接任务 */
ExternalTaskConfigNetwork();
while(udp_get_wifi_info(&info) != 0) ;
while (udp_get_wifi_info(&info) != 0) {
/* 等待,不做任何事情 */
}
wifiinfo = info;
LOS_Msleep(1000);
LOS_Msleep(WAIT_MSEC);
CreateThread(&threadID_client, wifi_udp_client, NULL, "udp client@ process");
CreateThread(&threadID_server, wifi_udp_server, NULL, "udp server@ process");
}
@@ -260,19 +275,16 @@ void wifi_udp_example(void)
unsigned int ret = LOS_OK;
unsigned int thread_id;
TSK_INIT_PARAM_S task = {0};
printf("%s start ....\n", __FUNCTION__);
task.pfnTaskEntry = (TSK_ENTRY_FUNC)wifi_udp_process;
task.uwStackSize = 10240;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "wifi_process";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create wifi_process ret:0x%x\n", ret);
return;
}
}
APP_FEATURE_INIT(wifi_udp_example);
@@ -17,6 +17,21 @@
#include "los_task.h"
#include "e53_intelligent_agriculture.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 2000
/* 亮度报警数值 */
#define LUMINANCE_ALARM 20
/* 湿度报警数值 */
#define HUMIDITY_ALARM 60
/* 温度报警数值 */
#define TEMPERATURE_ALARM 30
/***************************************************************
* 函数名称: e53_ia_thread
* 说 明: 智慧农业线程
@@ -29,36 +44,30 @@ void e53_ia_thread()
e53_ia_init();
while (1)
{
while (1) {
e53_ia_read_data(&data);
printf("\nLuminance is %.2f\n", data.luminance);
printf("\nHumidity is %.2f\n", data.humidity);
printf("\nTemperature is %.2f\n", data.temperature);
if (data.luminance < 20)
{
if (data.luminance < LUMINANCE_ALARM) {
light_set(ON);
printf("light on\n");
}
else
{
} else {
light_set(OFF);
printf("light off\n");
}
if ((data.humidity > 60) || (data.temperature > 30))
{
if ((data.humidity > HUMIDITY_ALARM) || (data.temperature > TEMPERATURE_ALARM)) {
motor_set_status(ON);
printf("motor on\n");
}
else
{
} else {
motor_set_status(OFF);
printf("motor off\n");
}
LOS_Msleep(2000);
LOS_Msleep(WAIT_MSEC);
}
}
@@ -75,12 +84,11 @@ void e53_ia_example()
TSK_INIT_PARAM_S task = {0};
task.pfnTaskEntry = (TSK_ENTRY_FUNC)e53_ia_thread;
task.uwStackSize = 10240;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "e53_ia_thread";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create e53_ia_thread ret:0x%x\n", ret);
return;
}
@@ -18,15 +18,13 @@
#include "lz_hardware.h"
typedef struct
{
typedef struct {
float luminance;/*亮度*/
float humidity;/*湿度*/
float temperature;/*温度*/
} e53_ia_data_t;
typedef enum
{
typedef enum {
OFF = 0,
ON
} SWITCH_STATUS_ENUM;
+26 -34
View File
@@ -38,7 +38,7 @@ void init_sht30()
uint8_t send_data[2] = {0x22, 0x36};
uint32_t send_len = 2;
LzI2cWrite(IA_I2C0, SHT30_ADDR, send_data, send_len);
LzI2cWrite(IA_I2C0, SHT30_ADDR, send_data, send_len);
}
/***************************************************************
@@ -52,7 +52,7 @@ void init_bh1750()
uint8_t send_data[1] = {0x01};
uint32_t send_len = 1;
LzI2cWrite(IA_I2C0, BH1750_ADDR, send_data, send_len);
LzI2cWrite(IA_I2C0, BH1750_ADDR, send_data, send_len);
}
/***************************************************************
@@ -123,20 +123,22 @@ uint8_t sht30_check_crc(uint8_t *data, uint8_t nbrOfBytes, uint8_t checksum)
const int16_t POLYNOMIAL = 0x131;
/*calculates 8-Bit checksum with given polynomial*/
for(byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
{
for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr) {
crc ^= (data[byteCtr]);
for ( bit = 8; bit > 0; --bit)
{
if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
else crc = (crc << 1);
for ( bit = 8; bit > 0; --bit) {
if (crc & 0x80) {
crc = (crc << 1) ^ POLYNOMIAL;
} else {
crc = (crc << 1);
}
}
}
if(crc != checksum)
if (crc != checksum) {
return 1;
else
} else {
return 0;
}
}
/***************************************************************
@@ -156,26 +158,22 @@ void e53_ia_io_init()
/*设置GPIO0_PA2为输出模式*/
ret = LzGpioSetDir(GPIO0_PA2, LZGPIO_DIR_OUT);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("set GPIO0_PA2 Direction fail\n");
}
/*设置GPIO1_PD0为输出模式*/
ret = LzGpioSetDir(GPIO1_PD0, LZGPIO_DIR_OUT);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("set GPIO0_PD0 Direction fail\n");
}
/*初始化I2C*/
if (I2cIoInit(m_ia_i2c0m2) != LZ_HARDWARE_SUCCESS)
{
if (I2cIoInit(m_ia_i2c0m2) != LZ_HARDWARE_SUCCESS) {
printf("init I2C I2C0 io fail\n");
}
/*I2C时钟频率100K*/
if (LzI2cInit(IA_I2C0, 100000) != LZ_HARDWARE_SUCCESS)
{
if (LzI2cInit(IA_I2C0, 100000) != LZ_HARDWARE_SUCCESS) {
printf("init I2C I2C0 fail\n");
}
}
@@ -209,7 +207,7 @@ void e53_ia_read_data(e53_ia_data_t *pData)
LOS_Msleep(180);
LzI2cRead(IA_I2C0, BH1750_ADDR, recv_data, receive_len);
pData->luminance = (float)(((recv_data[0]<<8) + recv_data[1])/1.2);
pData->luminance = (float)(((recv_data[0] << 8) + recv_data[1]) / 1.2);
//printf("BH1750 data:0x%x%x", recv_data[0], recv_data[1]);
/*checksum verification*/
@@ -230,19 +228,17 @@ void e53_ia_read_data(e53_ia_data_t *pData)
data[1] = SHT30_Data_Buffer[1];
data[2] = SHT30_Data_Buffer[2];
rc = sht30_check_crc(data, 2, data[2]);
if(!rc)
{
if (!rc) {
tmp = ((uint16_t)data[0] << 8) | data[1];
pData->temperature = sht30_calc_temperature(tmp);
}
/*check humidity*/
data[0] = SHT30_Data_Buffer[3];
data[1] = SHT30_Data_Buffer[4];
data[2] = SHT30_Data_Buffer[5];
rc = sht30_check_crc(data, 2, data[2]);
if(!rc)
{
if (!rc) {
tmp = ((uint16_t)data[0] << 8) | data[1];
pData->humidity = sht30_calc_RH(tmp);
}
@@ -251,20 +247,18 @@ void e53_ia_read_data(e53_ia_data_t *pData)
/***************************************************************
* 函数名称: light_set
* 说 明: 紫光灯控制
* 参 数:
* 参 数:
* OFF,关
* ON,开
* 返 回 值: 无
***************************************************************/
void light_set(SWITCH_STATUS_ENUM status)
{
if(status == ON)
{
if (status == ON) {
/*设置GPIO0_PA2输出高电平点亮灯*/
LzGpioSetVal(GPIO0_PA2, LZGPIO_LEVEL_HIGH);
}
if(status == OFF)
{
if (status == OFF) {
/*设置GPIO0_PA2输出低电平关闭灯*/
LzGpioSetVal(GPIO0_PA2, LZGPIO_LEVEL_LOW);
}
@@ -273,20 +267,18 @@ void light_set(SWITCH_STATUS_ENUM status)
/***************************************************************
* 函数名称: motor_set_status
* 说 明: 电机控制
* 参 数:
* 参 数:
* OFF,关
* ON,开
* 返 回 值: 无
***************************************************************/
void motor_set_status(SWITCH_STATUS_ENUM status)
{
if(status == ON)
{
if (status == ON) {
/*设置GPIO0_PD0输出高电平打开电机*/
LzGpioSetVal(GPIO1_PD0, LZGPIO_LEVEL_HIGH);
}
if(status == OFF)
{
if (status == OFF) {
/*设置GPIO0_PD0输出低电平关闭电机*/
LzGpioSetVal(GPIO1_PD0, LZGPIO_LEVEL_LOW);
}
+26 -25
View File
@@ -17,6 +17,15 @@
#include "los_task.h"
#include "e53_smart_covers.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 2000
/***************************************************************
* 函数名称: e53_sc_thread
* 说 明: E53智慧井盖线程
@@ -32,41 +41,34 @@ void e53_sc_thread()
led_d1_set(OFF);
led_d2_set(OFF);
while (1)
{
while (1) {
e53_sc_read_data(&data);
printf("x is %d\n", (int)data.accel[0]);
printf("y is %d\n", (int)data.accel[1]);
printf("z is %d\n", (int)data.accel[2]);
printf("x is %d\n", (int)data.accel[EACCEL_X]);
printf("y is %d\n", (int)data.accel[EACCEL_Y]);
printf("z is %d\n", (int)data.accel[EACCEL_Z]);
printf("init x:%d y:%d z:%d\n", x, y, z);
if (x == 0 && y == 0 && z == 0)
{
x = (int)data.accel[0];
y = (int)data.accel[1];
z = (int)data.accel[2];
}
else
{
if ((x + DELTA) < data.accel[0] || (x - DELTA) > data.accel[0] ||
(y + DELTA) < data.accel[1] || (y - DELTA) > data.accel[1] ||
(z + DELTA) < data.accel[2] || (z - DELTA) > data.accel[2])
{
if (x == 0 && y == 0 && z == 0) {
x = (int)data.accel[EACCEL_X];
y = (int)data.accel[EACCEL_Y];
z = (int)data.accel[EACCEL_Z];
} else {
if ((x + DELTA) < data.accel[EACCEL_X] || (x - DELTA) > data.accel[EACCEL_X] ||
(y + DELTA) < data.accel[EACCEL_Y] || (y - DELTA) > data.accel[EACCEL_Y] ||
(z + DELTA) < data.accel[EACCEL_Z] || (z - DELTA) > data.accel[EACCEL_Z]) {
/*倾斜告警*/
led_d1_set(OFF);
led_d2_set(ON);
data.tilt_status = 1;
printf("tilt warning \nLED1 OFF LED2 On\n");
}
else
{
} else {
led_d1_set(ON);
led_d2_set(OFF);
data.tilt_status = 0;
printf("normal \nLED1 ON LED2 OFF\n");
}
}
LOS_Msleep(2000);
LOS_Msleep(WAIT_MSEC);
}
}
@@ -83,12 +85,11 @@ void e53_sc_example()
TSK_INIT_PARAM_S task = {0};
task.pfnTaskEntry = (TSK_ENTRY_FUNC)e53_sc_thread;
task.uwStackSize = 10240;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "e53_sc_thread";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create e53_sc_thread ret:0x%x\n", ret);
return;
}
+12 -5
View File
@@ -18,14 +18,19 @@
#include "lz_hardware.h"
typedef struct
{
short accel[3];
enum enum_accel {
EACCEL_X = 0,
EACCEL_Y,
EACCEL_Z,
EACCEL_MAX
};
typedef struct {
short accel[EACCEL_MAX];
unsigned int tilt_status;
} e53_sc_data_t;
typedef enum
{
typedef enum {
OFF = 0,
ON
} SWITCH_STATUS_ENUM;
@@ -52,6 +57,8 @@ typedef enum
#define MPU6050_RA_PWR_MGMT_1 0x6B
#define MPU6050_RA_WHO_AM_I 0x75
void e53_sc_init();
void e53_sc_read_data(e53_sc_data_t *p_data);
void led_d1_set(SWITCH_STATUS_ENUM status);
+52 -52
View File
@@ -15,9 +15,9 @@
#include "e53_smart_covers.h"
/* 传感器与CPU连接的I2C口 */
#define SC_I2C0 0
static I2cBusIo m_sc_i2c0m2 = {
.scl = {.gpio = GPIO0_PA1, .func = MUX_FUNC3, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},
.sda = {.gpio = GPIO0_PA0, .func = MUX_FUNC3, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},
@@ -42,28 +42,24 @@ void e53_sc_io_init()
/*设置GPIO0_PA5为输出模式*/
ret = LzGpioSetDir(GPIO0_PA5, LZGPIO_DIR_OUT);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("set GPIO0_PA5 Direction fail ret:%d\n", ret);
return;
}
/*设置GPIO1_PD0为输出模式*/
ret = LzGpioSetDir(GPIO1_PD0, LZGPIO_DIR_OUT);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("set GPIO1_PD0 Direction fail ret:%d\n", ret);
return;
}
if (I2cIoInit(m_sc_i2c0m2) != LZ_HARDWARE_SUCCESS)
{
if (I2cIoInit(m_sc_i2c0m2) != LZ_HARDWARE_SUCCESS) {
printf("init I2C I2C0 io fail\n");
return;
}
/*I2c时钟频率400K*/
if (LzI2cInit(SC_I2C0, 400000) != LZ_HARDWARE_SUCCESS)
{
if (LzI2cInit(SC_I2C0, 400000) != LZ_HARDWARE_SUCCESS) {
printf("init I2C I2C0 fail\n");
return;
}
@@ -79,19 +75,18 @@ void e53_sc_io_init()
***************************************************************/
uint8_t MPU6050_Read_Buffer(uint8_t reg, uint8_t *p_buffer, uint16_t length)
{
uint32_t status = 0;
uint8_t buffer[1] = {reg};
status = LzI2cWrite(SC_I2C0, MPU6050_SLAVE_ADDRESS, buffer, 1);
if (status != 0)
{
status = LzI2cWrite(SC_I2C0, MPU6050_SLAVE_ADDRESS, buffer, sizeof(buffer));
if (status != 0) {
printf("Error: I2C write status:0x%x\n", status);
return status;
}
LzI2cRead(SC_I2C0, MPU6050_SLAVE_ADDRESS, p_buffer, length);
return 0;
return 0;
}
/***************************************************************
@@ -105,7 +100,7 @@ void mpu6050_write_reg(uint8_t reg, uint8_t data)
{
uint8_t send_data[2] = {reg, data};
LzI2cWrite(SC_I2C0, MPU6050_SLAVE_ADDRESS, send_data, 2);
LzI2cWrite(SC_I2C0, MPU6050_SLAVE_ADDRESS, send_data, sizeof(send_data));
}
/***************************************************************
@@ -129,11 +124,19 @@ void mpu6050_read_data(uint8_t reg, unsigned char *buf, uint8_t length)
***************************************************************/
void mpu6050_read_acc(short *acc_data)
{
/* 加速度数据位置定义 */
#define REG_ACCEL_X_H 0
#define REG_ACCEL_X_L 1
#define REG_ACCEL_Y_H 2
#define REG_ACCEL_Y_L 3
#define REG_ACCEL_Z_H 4
#define REG_ACCEL_Z_L 5
uint8_t buf[6];
mpu6050_read_data(MPU6050_ACC_OUT, buf, 6);
acc_data[0] = (buf[0] << 8) | buf[1];
acc_data[1] = (buf[2] << 8) | buf[3];
acc_data[2] = (buf[4] << 8) | buf[5];
mpu6050_read_data(MPU6050_ACC_OUT, buf, sizeof(buf));
acc_data[EACCEL_X] = (buf[REG_ACCEL_X_H] << 8) | buf[REG_ACCEL_X_L];
acc_data[EACCEL_Y] = (buf[REG_ACCEL_Y_H] << 8) | buf[REG_ACCEL_Y_L];
acc_data[EACCEL_Z] = (buf[REG_ACCEL_Z_H] << 8) | buf[REG_ACCEL_Z_L];
}
/***************************************************************
@@ -144,8 +147,8 @@ void mpu6050_read_acc(short *acc_data)
***************************************************************/
void action_interrupt()
{
mpu6050_write_reg(MPU6050_RA_MOT_THR,0x03);//运动阈值
mpu6050_write_reg(MPU6050_RA_MOT_DUR,0x14);//检测时间20ms 单位1ms
mpu6050_write_reg(MPU6050_RA_MOT_THR, 0x03);//运动阈值
mpu6050_write_reg(MPU6050_RA_MOT_DUR, 0x14);//检测时间20ms 单位1ms
}
/***************************************************************
@@ -156,17 +159,17 @@ void action_interrupt()
***************************************************************/
void mpu6050_init()
{
#define DELAY_COUNT 1000000
#define RESET_DELAY_MSEC 20 /* 复位等待设备重启完毕 */
int i = 0, j = 0;
/*在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错*/
for(i=0;i<1000;i++)
{
for(j=0;j<1000;j++)
{
}
/*在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错*/
for (i = 0; i < DELAY_COUNT; i++) {
/* 延时等待 */
}
mpu6050_write_reg(MPU6050_RA_PWR_MGMT_1, 0X80); //复位MPU6050
usleep(20000);
LOS_Msleep(RESET_DELAY_MSEC);
mpu6050_write_reg(MPU6050_RA_PWR_MGMT_1, 0X00); //唤醒MPU6050
mpu6050_write_reg(MPU6050_RA_INT_ENABLE, 0X00); //关闭所有中断
mpu6050_write_reg(MPU6050_RA_USER_CTRL, 0X00); //I2C主模式关闭
@@ -184,18 +187,16 @@ void mpu6050_init()
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
***************************************************************/
***************************************************************/
uint8_t mpu6050_read_id()
{
unsigned char buff = 0;
mpu6050_read_data(MPU6050_RA_WHO_AM_I, &buff, 1);
if(buff != 0x68)
{
if (buff != MPU6050_SLAVE_ADDRESS) {
printf("MPU6050 dectected error Re:%u\n", buff);
return 0;
}
else
{
} else {
return 1;
}
}
@@ -208,9 +209,10 @@ uint8_t mpu6050_read_id()
***************************************************************/
void e53_sc_init()
{
#define WAIT_MPU6050_INIT_MSEC 1000
e53_sc_io_init();
mpu6050_init();
usleep(1000000);
LOS_Msleep(WAIT_MPU6050_INIT_MSEC);
}
/***************************************************************
@@ -221,17 +223,21 @@ void e53_sc_init()
***************************************************************/
void e53_sc_read_data(e53_sc_data_t *p_data)
{
#define MPU6050_READ_DELAY_MSEC 50
short accel[3];
short temp;
if (mpu6050_read_id() == 0)
{
while(1);
int i;
/* 等待读取设备地址正常 */
if (mpu6050_read_id() == 0) {
while (1);
}
mpu6050_read_acc(accel);
p_data->accel[0] = accel[0];
p_data->accel[1] = accel[1];
p_data->accel[2] = accel[2];
usleep(50000);
p_data->accel[EACCEL_X] = accel[EACCEL_X];
p_data->accel[EACCEL_Y] = accel[EACCEL_Y];
p_data->accel[EACCEL_Z] = accel[EACCEL_Z];
LOS_Msleep(MPU6050_READ_DELAY_MSEC);
}
/***************************************************************
@@ -243,13 +249,10 @@ void e53_sc_read_data(e53_sc_data_t *p_data)
***************************************************************/
void led_d1_set(SWITCH_STATUS_ENUM status)
{
if(status == ON)
{
if (status == ON) {
/*设置GPIO0_PA5输出低电平点亮灯*/
LzGpioSetVal(GPIO0_PA5, LZGPIO_LEVEL_LOW);
}
else if(status == OFF)
{
} else if (status == OFF) {
/*设置GPIO0_PA5输出高电平关闭灯*/
LzGpioSetVal(GPIO0_PA5, LZGPIO_LEVEL_HIGH);
}
@@ -264,13 +267,10 @@ void led_d1_set(SWITCH_STATUS_ENUM status)
***************************************************************/
void led_d2_set(SWITCH_STATUS_ENUM status)
{
if(status == ON)
{
if (status == ON) {
/*设置GPIO1_PD0输出低电平点亮灯*/
LzGpioSetVal(GPIO1_PD0, LZGPIO_LEVEL_LOW);
}
else if(status == OFF)
{
} else if (status == OFF) {
/*设置GPIO1_PD0输出高电平关闭灯*/
LzGpioSetVal(GPIO1_PD0, LZGPIO_LEVEL_HIGH);
}
@@ -17,6 +17,17 @@
#include "los_task.h"
#include "e53_intelligent_street_lamp.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 2000
/* 光强度报警值 */
#define LUMN_ALARM 20.0
/***************************************************************
* 函数名称: e53_isl_thread
* 说 明: E53智慧路灯线程
@@ -29,24 +40,20 @@ void e53_isl_thread()
e53_isl_init();
while (1)
{
while (1) {
lum = e53_isl_read_data();
printf("luminance value is %.2f\n", lum);
if (lum < 20)
{
if (lum < LUMN_ALARM) {
isl_light_set_status(ON);
printf("light on\n");
}
else
{
} else {
isl_light_set_status(OFF);
printf("light off\n");
}
LOS_Msleep(2000);
LOS_Msleep(WAIT_MSEC);
}
}
@@ -63,12 +70,11 @@ void e53_isl_example()
TSK_INIT_PARAM_S task = {0};
task.pfnTaskEntry = (TSK_ENTRY_FUNC)e53_isl_thread;
task.uwStackSize = 10240;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "e53_isl_thread";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create e53_isl_thread ret:0x%x\n", ret);
return;
}
@@ -17,8 +17,7 @@
#include "lz_hardware.h"
typedef enum
{
typedef enum {
OFF = 0,
ON
} SWITCH_STATUS_ENUM;
+22 -19
View File
@@ -15,8 +15,13 @@
#include "e53_intelligent_street_lamp.h"
#define ISL_I2C0 0
#define BH1750_ADDR 0x23
/* i2c编号 */
#define ISL_I2C0 0
/* i2c通信速度 */
#define I2C_RATE 400000
/* 从设备地址 */
#define BH1750_ADDR 0x23
static I2cBusIo m_isl_i2c0m2 = {
.scl = {.gpio = GPIO0_PA1, .func = MUX_FUNC3, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},
@@ -25,6 +30,7 @@ static I2cBusIo m_isl_i2c0m2 = {
.mode = FUNC_MODE_M2,
};
/***************************************************************
* 函数名称: e53_isl_io_init
* 说 明: E53_ISL初始化
@@ -36,12 +42,10 @@ void e53_isl_io_init(void)
LzGpioInit(GPIO0_PA5);
LzGpioSetDir(GPIO0_PA5, LZGPIO_DIR_OUT);
if (I2cIoInit(m_isl_i2c0m2) != LZ_HARDWARE_SUCCESS)
{
if (I2cIoInit(m_isl_i2c0m2) != LZ_HARDWARE_SUCCESS) {
printf("init I2C I2C0 io failed\n");
}
if (LzI2cInit(ISL_I2C0, 400000) != LZ_HARDWARE_SUCCESS)
{
if (LzI2cInit(ISL_I2C0, I2C_RATE) != LZ_HARDWARE_SUCCESS) {
printf("init I2C I2C0 failed\n");
}
}
@@ -57,7 +61,7 @@ void init_bh1750()
uint8_t send_data[1] = {0x01};
uint32_t send_len = 1;
LzI2cWrite(ISL_I2C0, BH1750_ADDR, send_data, send_len);
LzI2cWrite(ISL_I2C0, BH1750_ADDR, send_data, send_len);
}
/***************************************************************
@@ -94,17 +98,18 @@ void e53_isl_init(void)
***************************************************************/
float e53_isl_read_data()
{
/* 等待从设备准备完毕 */
#define WAIT_SLAVE_DEVICE_START_MSEC 180
/* 读取光强度寄存器数值,计算出实际光强度数值 */
#define CALC_LIGHT(recv_data) ((float)((((recv_data[0]) << 8) + (recv_data[1])) / 1.2))
float lum = 0;
uint8_t recv_data[2] = {0};
start_bh1750();
LOS_Msleep(180);
LOS_Msleep(WAIT_SLAVE_DEVICE_START_MSEC);
uint8_t recv_data[2] = {0};
uint32_t receive_len = 2;
LzI2cRead(ISL_I2C0, BH1750_ADDR, recv_data, receive_len);
lum = (float)(((recv_data[0]<<8) + recv_data[1])/1.2);
//printf("data %x %x\n", recv_data[0], recv_data[1]);
LzI2cRead(ISL_I2C0, BH1750_ADDR, recv_data, sizeof(recv_data));
lum = CALC_LIGHT(recv_data);
return lum;
}
@@ -112,20 +117,18 @@ float e53_isl_read_data()
/***************************************************************
* 函数名称: isl_light_set_status
* 说 明: 紫光灯控制
* 参 数:
* 参 数:
* OFF,关
* ON,开
* 返 回 值: 无
***************************************************************/
void isl_light_set_status(SWITCH_STATUS_ENUM status)
{
if(status == ON)
{
if (status == ON) {
/*设置GPIO0_PA5输出高电平点亮灯*/
LzGpioSetVal(GPIO0_PA5, LZGPIO_LEVEL_HIGH);
}
if(status == OFF)
{
if (status == OFF) {
/*设置GPIO0_PA5输出低电平关闭灯*/
LzGpioSetVal(GPIO0_PA5, LZGPIO_LEVEL_LOW);
}
+50 -26
View File
@@ -17,44 +17,70 @@
#include "los_task.h"
#include "e53_intelligent_vehicle_01.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 2000
/* PWM配置,周期时间,单位为纳秒 */
#define PWM_CYCLE_NS 1000000
/* PWM配置,高电平时间,单位为纳秒 */
#define PWM_DUTY_NS 500000
/* PWM配置,开启PWM */
#define PWM_ON 1
/* PWM配置,关闭PWM */
#define PWM_OFF 0
/* LED配置,打开LED */
#define LED_ON 1
/* LED配置,关闭LED */
#define LED_OFF 0
/* 最大报警距离 */
#define DISTANCE_MAX_ALARM (20.0)
/***************************************************************
* 函数名称: e53_iv01_process
* 说 明: 智慧农业例程
* 参 数: 无
* 返 回 值: 无
***************************************************************/
void e53_iv01_process(void *arg)
{
unsigned int ret = 0;
/* 每个周期为200usec,占空比为100usec */
unsigned int duty_ns = 500000;
unsigned int cycle_ns = 1000000;
unsigned int duty_ns = PWM_DUTY_NS;
unsigned int cycle_ns = PWM_CYCLE_NS;
float distance_cm = 0.0;
e53_iv01_init();
while (1)
{
while (1) {
printf("========== E53 IV Example ==========\n");
ret = e53_iv01_get_distance(&distance_cm);
if (ret == 1)
{
if (ret == 1) {
printf("distance cm: %f\n", distance_cm);
if (distance_cm <= 20.0)
{
e53_iv01_buzzer_set(1, duty_ns, cycle_ns);
e53_iv01_led_warning_set(1);
}
else
{
e53_iv01_buzzer_set(0, duty_ns, cycle_ns);
e53_iv01_led_warning_set(0);
if (distance_cm <= DISTANCE_MAX_ALARM) {
e53_iv01_buzzer_set(PWM_ON, duty_ns, cycle_ns);
e53_iv01_led_warning_set(LED_ON);
} else {
e53_iv01_buzzer_set(PWM_OFF, duty_ns, cycle_ns);
e53_iv01_led_warning_set(LED_OFF);
}
}
LOS_Msleep(2000);
LOS_Msleep(WAIT_MSEC);
}
}
/***************************************************************
* 函数名称: e53_iv01_example
* 说 明: 智慧农业例程
* 说 明: 智慧农业开机启动任务
* 参 数: 无
* 返 回 值: 无
***************************************************************/
@@ -65,12 +91,11 @@ void e53_iv01_example()
TSK_INIT_PARAM_S task = {0};
task.pfnTaskEntry = (TSK_ENTRY_FUNC)e53_iv01_process;
task.uwStackSize = 10240;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "e53_iv01_process";
task.usTaskPrio = 25;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create e53_ia_thread ret:0x%x\n", ret);
return;
}
@@ -78,4 +103,3 @@ void e53_iv01_example()
APP_FEATURE_INIT(e53_iv01_example);
@@ -36,7 +36,7 @@ void e53_iv01_deinit();
/***************************************************************
* 函数名称: e53_iv01_get_distance
* 说 明: 智慧车载发起1次超声波测距
* 参 数:
* 参 数:
* @distance_meter:测距的距离,单位为厘米
* 返 回 值: 返回1为成功,0为失败
***************************************************************/
@@ -46,7 +46,7 @@ unsigned int e53_iv01_get_distance(float *distance_cm);
/***************************************************************
* 函数名称: e53_iv01_led_warning_set
* 说 明: 智慧车载的Led灯控制
* 参 数:
* 参 数:
* @is_onLed灯控制,0为灭,1为亮
* 返 回 值: 无
***************************************************************/
@@ -56,7 +56,7 @@ void e53_iv01_led_warning_set(unsigned char is_on);
/***************************************************************
* 函数名称: e53_iv01_buzzer_set
* 说 明: 智慧车载的PWM控制
* 参 数:
* 参 数:
* @is_onPWM控制,0为关闭,1为开启
* @duty_ns:高电平的占比,以nsec为单位
* @cycle_nsPWM周期,以nsec为单位
+48 -60
View File
@@ -29,22 +29,19 @@
/* 系统时钟定时器主频40MHz,定时器5作为系统时钟源,每秒24MHz,从0一直累加 */
#define ECHO_TIMER_FREQ 40000000UL
/* 定义每次中断对应的采集动作 */
typedef enum
{
typedef enum {
EECHO_FLAG_CAPTURE_RISE = 0, /* 准备采集上升沿,即开始时间 */
EECHO_FLAG_CAPTURE_FALL, /* 准备采集下降沿,即结束时间 */
EECHO_FLAG_CAPTURE_SUCCESS, /* 采集成功 */
EECHO_FLAG_MAX
} echo_flag_e;
/* 定义与中断相关的采集动作和采集时间相关信息 */
typedef struct
{
typedef struct {
echo_flag_e flag; /* 中断采集动作 */
uint32_t time_rise; /* 采集上升沿,即开始时间 */
uint32_t time_fall; /* 采集下降沿,即结束时间 */
} e53_iv01_echo_info_s;
static e53_iv01_echo_info_s m_echo_info =
{
static e53_iv01_echo_info_s m_echo_info = {
.flag = EECHO_FLAG_CAPTURE_RISE,
.time_rise = 0,
.time_fall = 0,
@@ -54,7 +51,8 @@ static UINT32 m_task_sem;
/* 定义轮询任务id */
static UINT32 m_task_id = 0;
/* 定时器5的CURRENT_VALUE_LOW的基地址 */
static uint32_t *m_ptimer5_current_value_low = (uint32_t *)(0x400000A0U + 0x8U);
#define TIMER5_ADDRESS (0x400000A0U + 0x8U)
static uint32_t *m_ptimer5_current_value_low = (uint32_t *)(TIMER5_ADDRESS);
/* Trig引脚电平设置 */
#define E53_IV01_TRIG_Set() LzGpioSetVal(E53_IV01_TRIG_GPIO, LZGPIO_LEVEL_HIGH)
@@ -65,9 +63,8 @@ static uint32_t *m_ptimer5_current_value_low = (uint32_t *)(0x400000A0U + 0x8U);
#define E53_IV01_LED_WARNING_Clr() LzGpioSetVal(E53_IV01_LED_WARNING_GPIO, LZGPIO_LEVEL_LOW)
/* Buzzer定义 */
#define E53_IV01_PWM_IO 7
static PwmBusIo m_buzzer_config =
{
#define E53_IV01_PWM_IO 7
static PwmBusIo m_buzzer_config = {
.pwm = {.gpio = E53_IV01_BUZZER_GPIO, .func = MUX_FUNC2, .type = PULL_DOWN, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},
.id = FUNC_ID_PWM7,
.mode = FUNC_MODE_NONE,
@@ -78,7 +75,7 @@ static PwmBusIo m_buzzer_config =
/***************************************************************
* 函数名称: e53_iv01_delay_usec
* 说 明: 延时函数
* 参 数:
* 参 数:
* @usec,延时时间,以usec为单位
* 返 回 值: 无
***************************************************************/
@@ -90,7 +87,7 @@ static inline void e53_iv01_delay_usec(uint32_t usec)
/***************************************************************
* 函数名称: e53_iv01_calc_cm
* 说 明: 计算超声波测距
* 参 数:
* 参 数:
* @time:节拍数
* @freq:节拍频率,以Hz为单位
* @meter:距离差,以厘米为单位
@@ -98,11 +95,14 @@ static inline void e53_iv01_delay_usec(uint32_t usec)
***************************************************************/
static inline void e53_iv01_calc_cm(uint32_t time, uint32_t freq, float *cmeter)
{
#define SOUND_SPEED 340.0 /* 声音速度 */
#define M_TO_CM 100.0 /* 长度单位米转化为厘米 */
#define BACK_AND_FORTH 2.0 /* 来回2次 */
float f_time = (float)time;
float f_freq = (float)freq;
/* 距离 = 时间差 * 340米/秒 / 2(超时波来回2次) * 100厘米/米 */
*cmeter = f_time / f_freq * 170.0 * 100.0;
*cmeter = f_time / f_freq * SOUND_SPEED * M_TO_CM / BACK_AND_FORTH;
}
@@ -115,25 +115,21 @@ static inline void e53_iv01_calc_cm(uint32_t time, uint32_t freq, float *cmeter)
static VOID e53_iv01_task_echo_func(VOID *arg)
{
uint8_t value = 0;
m_echo_info.flag = EECHO_FLAG_CAPTURE_RISE;
while (1)
{
while (1) {
LzGpioGetVal(E53_IV01_ECHO0_GPIO, &value);
if (value == LZGPIO_LEVEL_HIGH)
{
if (value == LZGPIO_LEVEL_HIGH) {
m_echo_info.time_rise = *m_ptimer5_current_value_low;
m_echo_info.flag = EECHO_FLAG_CAPTURE_FALL;
break;
}
}
while (1)
{
while (1) {
LzGpioGetVal(E53_IV01_ECHO0_GPIO, &value);
if (value == LZGPIO_LEVEL_LOW)
{
if (value == LZGPIO_LEVEL_LOW) {
m_echo_info.time_fall = *m_ptimer5_current_value_low;
m_echo_info.flag = EECHO_FLAG_CAPTURE_SUCCESS;
break;
@@ -155,7 +151,7 @@ static void e53_iv01_task_create_echo()
{
uint32_t ret = 0;
TSK_INIT_PARAM_S task;
/* 锁任务调度 */
LOS_TaskLock();
@@ -166,8 +162,7 @@ static void e53_iv01_task_create_echo()
/* 优先级比当前线程低 */
task.usTaskPrio = 30;
ret = LOS_TaskCreate(&m_task_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("%s, %d: LOS_TaskCreate failed(%d)\n", __func__, __LINE__, ret);
/* 解锁任务调度 */
LOS_TaskUnlock();
@@ -223,7 +218,7 @@ static void e53_iv01_init_gpio()
LzGpioInit(E53_IV01_TRIG_GPIO);
LzGpioSetDir(E53_IV01_TRIG_GPIO, LZGPIO_DIR_OUT);
E53_IV01_TRIG_Clr();
/* LED_WARNING灯引脚设置为GPIO输出模式 */
PinctrlSet(E53_IV01_LED_WARNING_GPIO, MUX_FUNC0, PULL_KEEP, DRIVE_KEEP);
LzGpioInit(E53_IV01_LED_WARNING_GPIO);
@@ -254,7 +249,7 @@ static unsigned int e53_iv01_init_pwm()
PinctrlSet(E53_IV01_BUZZER_GPIO, MUX_FUNC2, PULL_DOWN, DRIVE_KEEP);
PwmIoInit(m_buzzer_config);
LzPwmInit(E53_IV01_PWM_IO);
return 0;
}
@@ -278,10 +273,10 @@ static void e53_iv01_deinit_pwm()
static void e53_iv01_init_interrupt()
{
//LzI2cInit(0, 400000);
/* 创建信号量 */
LOS_SemCreate(0, &m_task_sem);
/* Echo引脚设置为GPIO输入模式 */
PinctrlSet(E53_IV01_ECHO0_GPIO, MUX_FUNC0, PULL_KEEP, DRIVE_KEEP);
LzGpioInit(E53_IV01_ECHO0_GPIO);
@@ -310,17 +305,16 @@ static void e53_iv01_deinit_interrupt()
unsigned int e53_iv01_init()
{
unsigned int ret = 0;
e53_iv01_init_gpio();
ret = e53_iv01_init_pwm();
if (ret != 0)
{
if (ret != 0) {
printf("%s, %s, %d: e53_iv01_init_pwm failed(%d)\n", __FILE__, __func__, __LINE__, ret);
e53_iv01_deinit_gpio();
return __LINE__;
}
e53_iv01_init_interrupt();
return 0;
}
@@ -341,37 +335,37 @@ void e53_iv01_deinit()
/***************************************************************
* 函数名称: e53_iv01_get_distance
* 说 明: E53_IntelligentVehicle01发起1次超声波测距
* 参 数:
* 参 数:
* @distance_meter:测距的距离,单位为厘米
* 返 回 值: 返回1为成功,0为失败
***************************************************************/
unsigned int e53_iv01_get_distance(float *distance_cm)
{
/* 多久时间测量完毕 */
#define MAX_TEST_TIM_MSEC 200
/* 定时器5最大数值 */
#define TIMER5_MAX_VALUE (0xFFFFFFFF)
uint32_t time_diff = 0;
e53_iv01_task_create_echo();
/* 发送10Usec的高电平 */
e53_iv01_send_trig();
/* 等待200msec,整个测距最长为66msec */
LOS_SemPend(m_task_sem, LOS_MS2Tick(200));
LOS_SemPend(m_task_sem, LOS_MS2Tick(MAX_TEST_TIM_MSEC));
e53_iv01_task_delete_echo();
if (m_echo_info.flag == EECHO_FLAG_CAPTURE_SUCCESS)
{/* 如果是采集成功,则计算距离 */
if (m_echo_info.time_rise <= m_echo_info.time_fall)
{
if (m_echo_info.flag == EECHO_FLAG_CAPTURE_SUCCESS) {
/* 如果是采集成功,则计算距离 */
if (m_echo_info.time_rise <= m_echo_info.time_fall) {
time_diff = m_echo_info.time_fall - m_echo_info.time_rise;
}
else
{
time_diff = 0xFFFFFFFF - m_echo_info.time_rise + m_echo_info.time_fall + 1;
} else {
time_diff = TIMER5_MAX_VALUE - m_echo_info.time_rise + m_echo_info.time_fall + 1;
}
e53_iv01_calc_cm(time_diff, ECHO_TIMER_FREQ, distance_cm);
return 1;
}
else
{
} else {
printf("%s, %d: flag(%d) is error!\n", __func__, __LINE__, m_echo_info.flag);
return 0;
}
@@ -380,19 +374,16 @@ unsigned int e53_iv01_get_distance(float *distance_cm)
/***************************************************************
* 函数名称: e53_iv01_led_warning_set
* 说 明: E53_IntelligentVehicle01的Led灯控制
* 参 数:
* 参 数:
* @is_onLed灯控制,0为灭,1为亮
* 返 回 值: 无
***************************************************************/
void e53_iv01_led_warning_set(unsigned char is_on)
{
if (is_on == 0)
{
if (is_on == 0) {
/* LED Warning灯低电平有效 */
E53_IV01_LED_WARNING_Set();
}
else
{
} else {
E53_IV01_LED_WARNING_Clr();
}
}
@@ -400,7 +391,7 @@ void e53_iv01_led_warning_set(unsigned char is_on)
/***************************************************************
* 函数名称: e53_iv01_buzzer_set
* 说 明: 智慧车载的PWM控制
* 参 数:
* 参 数:
* @is_onPWM控制,0为关闭,1为开启
* @duty_ns:高电平的占比,以nsec为单位
* @cycle_nsPWM周期,以nsec为单位
@@ -408,13 +399,10 @@ void e53_iv01_led_warning_set(unsigned char is_on)
***************************************************************/
void e53_iv01_buzzer_set(unsigned char is_on, unsigned int duty_ns, unsigned int cycle_ns)
{
if (is_on == 0)
{
if (is_on == 0) {
/* 关闭蜂鸣器 */
LzPwmStop(E53_IV01_PWM_IO);
}
else
{
} else {
/* 打开蜂鸣器 */
LzPwmStart(E53_IV01_PWM_IO, duty_ns, cycle_ns);
}
+20 -14
View File
@@ -17,6 +17,15 @@
#include "los_task.h"
#include "e53_body_induction.h"
/* 任务的堆栈大小 */
#define TASK_STACK_SIZE 20480
/* 任务的优先级 */
#define TASK_PRIO 24
/* 循环等待时间 */
#define WAIT_MSEC 1000
/***************************************************************
* 函数名称: e53_bi_thread
* 说 明: 人体感应模块线程
@@ -30,26 +39,24 @@ void e53_bi_thread()
e53_bi_init();
while (1)
{
while (1) {
ret = LzGpioGetVal(GPIO0_PA5, &val);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("get gpio value failed ret:%d\n", ret);
}
if (val_last != val)
{
if (val == LZGPIO_LEVEL_HIGH)
{
if (val_last != val) {
if (val == LZGPIO_LEVEL_HIGH) {
buzzer_set_status(ON);
printf("buzzer on\n");
LOS_Msleep(1000);
LOS_Msleep(WAIT_MSEC);
buzzer_set_status(OFF);
printf("buzzer off\n");
}
val_last = val;
}
LOS_Msleep(1000);
LOS_Msleep(WAIT_MSEC);
}
}
@@ -66,12 +73,11 @@ void e53_bi_example()
TSK_INIT_PARAM_S task = {0};
task.pfnTaskEntry = (TSK_ENTRY_FUNC)e53_bi_thread;
task.uwStackSize = 10240;
task.uwStackSize = TASK_STACK_SIZE;
task.pcName = "e53_bi_thread";
task.usTaskPrio = 24;
task.usTaskPrio = TASK_PRIO;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create e53_bi_thread ret:0x%x\n", ret);
return;
}
+1 -2
View File
@@ -18,8 +18,7 @@
#include "lz_hardware.h"
typedef enum
{
typedef enum {
OFF = 0,
ON
} SWITCH_STATUS_ENUM;
+12 -15
View File
@@ -15,7 +15,7 @@
#include "e53_body_induction.h"
#define BI_I2C0 0
#define BI_I2C0 0
#define BI_PWM7 7
static I2cBusIo m_bi_i2c0m2 = {
@@ -43,28 +43,24 @@ void e53_bi_init()
#if 0
/*初始化I2C*/
ret = I2cIoInit(m_bi_i2c0m2);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("init I2C I2C0 io fail ret:%d\n", ret);
return;
}
ret = LzI2cInit(BI_I2C0, 400000);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("init I2C I2C0 fail ret:%d\n", ret);
return;
}
#endif
ret = PwmIoInit(m_buzzer);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("PwmIoInit failed ret:%d\n", ret);
return;
}
ret = LzPwmInit(BI_PWM7);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("LzPwmInit 7 failed ret:%d\n", ret);
return;
}
@@ -86,13 +82,14 @@ void e53_bi_init()
***************************************************************/
void buzzer_set_status(SWITCH_STATUS_ENUM status)
{
if(status == ON)
{
LzPwmStart(BI_PWM7, 500000, 1000000);
}
if(status == OFF)
{
#define PWM_DUTY_NS 500000 /* PWM配置,高电平占用时间,单位为纳秒 */
#define PWM_CYCLE_NS 1000000 /* PWM配置,整个周期占用时间,单位为纳秒 */
if (status == ON) {
LzPwmStart(BI_PWM7, PWM_DUTY_NS, PWM_CYCLE_NS);
} else if (status == OFF) {
LzPwmStop(BI_PWM7);
} else {
printf("status(%d) is error!\n", status);
}
}
+16 -30
View File
@@ -21,52 +21,41 @@ void e53_gs_process(void *arg)
{
unsigned int ret = 0;
unsigned short flag = 0;
e53_gs_init();
while (1)
{
while (1) {
ret = e53_gs_get_gesture_state(&flag);
if (ret != 0)
{
if (ret != 0) {
printf("Get Gesture Statu: 0x%x\n", flag);
if (flag & GES_UP)
{
if (flag & GES_UP) {
printf("\tUp\n");
}
if (flag & GES_DOWM)
{
if (flag & GES_DOWM) {
printf("\tDown\n");
}
if (flag & GES_LEFT)
{
if (flag & GES_LEFT) {
printf("\tLeft\n");
}
if (flag & GES_RIGHT)
{
if (flag & GES_RIGHT) {
printf("\tRight\n");
}
if (flag & GES_FORWARD)
{
if (flag & GES_FORWARD) {
printf("\tForward\n");
}
if (flag & GES_BACKWARD)
{
if (flag & GES_BACKWARD) {
printf("\tBackward\n");
}
if (flag & GES_CLOCKWISE)
{
if (flag & GES_CLOCKWISE) {
printf("\tClockwise\n");
}
if (flag & GES_COUNT_CLOCKWISE)
{
if (flag & GES_COUNT_CLOCKWISE) {
printf("\tCount Clockwise\n");
}
if (flag & GES_WAVE)
{
if (flag & GES_WAVE) {
printf("\tWave\n");
}
e53_gs_led_up_set((flag & GES_UP) ? (1) : (0));
e53_gs_led_down_set((flag & GES_DOWM) ? (1) : (0));
e53_gs_led_left_set((flag & GES_LEFT) ? (1) : (0));
@@ -76,9 +65,7 @@ void e53_gs_process(void *arg)
e53_gs_led_cw_set((flag & GES_CLOCKWISE) ? (1) : (0));
e53_gs_led_ccw_set((flag & GES_COUNT_CLOCKWISE) ? (1) : (0));
e53_gs_led_wave_set((flag & GES_WAVE) ? (1) : (0));
}
else
{
} else {
/* 如果没有数据,则多等待 */
LOS_Msleep(100);
}
@@ -96,8 +83,7 @@ void e53_gs_example()
task.pcName = "e53 getsture sensor process";
task.usTaskPrio = 24;
ret = LOS_TaskCreate(&thread_id, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("Falied to create Task_One ret:0x%x\n", ret);
return;
}
+10 -10
View File
@@ -37,7 +37,7 @@ unsigned int e53_gs_init();
/***************************************************************
* 函数名称: gs_led_up_set
* 说 明: 手势感应模块向上LED设置
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
@@ -46,7 +46,7 @@ void e53_gs_led_up_set(unsigned char is_on);
/***************************************************************
* 函数名称: e53_gs_led_down_set
* 说 明: 手势感应模块向下LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
@@ -55,7 +55,7 @@ void e53_gs_led_down_set(unsigned char is_on);
/***************************************************************
* 函数名称: e53_gs_led_left_set
* 说 明: 手势感应模块向左LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
@@ -64,7 +64,7 @@ void e53_gs_led_left_set(unsigned char is_on);
/***************************************************************
* 函数名称: e53_gs_led_right_set
* 说 明: 手势感应模块向右LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
@@ -73,7 +73,7 @@ void e53_gs_led_right_set(unsigned char is_on);
/***************************************************************
* 函数名称: e53_gs_led_forward_set
* 说 明: 手势感应模块向前LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
@@ -82,7 +82,7 @@ void e53_gs_led_forward_set(unsigned char is_on);
/***************************************************************
* 函数名称: gesture_sensor_led_backward_set
* 说 明: 手势感应模块向后LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
@@ -91,7 +91,7 @@ void e53_gs_led_backward_set(unsigned char is_on);
/***************************************************************
* 函数名称: e53_gs_led_cw_set
* 说 明: 手势感应模块顺时针转圈LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
@@ -100,7 +100,7 @@ void e53_gs_led_cw_set(unsigned char is_on);
/***************************************************************
* 函数名称: e53_gs_led_ccw_set
* 说 明: 手势感应模块逆时针转圈LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
@@ -109,7 +109,7 @@ void e53_gs_led_ccw_set(unsigned char is_on);
/***************************************************************
* 函数名称: e53_gs_led_wave_set
* 说 明: 手势感应模块挥手LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
@@ -118,7 +118,7 @@ void e53_gs_led_wave_set(unsigned char is_on);
/***************************************************************
* 函数名称: e53_gs_get_gesture_state
* 说 明: 获取手势感应模块手势
* 参 数:
* 参 数:
* @flag:获取当前手势
* 返 回 值: 1为成功,0为失败
***************************************************************/
+184 -228
View File
@@ -14,7 +14,7 @@
*/
#include <stdio.h>
#include <stdint.h>
#include "los_sem.h"
#include "lz_hardware.h"
@@ -44,7 +44,7 @@ static unsigned int m_i2c_freq = 400000;
typedef enum {
BANK0 = 0, /* Bank0寄存器 */
BANK1, /* Bank1寄存器 */
}BankId;
} BankId;
/* BANK的寄存器地址和BANK0~1 */
#define PAJ_REG_BANK_SEL 0xEF //BANK选择寄存器
@@ -69,9 +69,9 @@ typedef enum {
/* BANK1 寄存器组 */
#define PAJ_REG_SET_PS_GAIN 0x44 //设置检测增益大小 (0:1x gain 1:2x gain)
#define PAJ_REG_SET_IDLE_S1_STEP_0 0x67 //设置S1的响应因子
#define PAJ_REG_SET_IDLE_S1_STEP_1 0x68
#define PAJ_REG_SET_IDLE_S1_STEP_1 0x68
#define PAJ_REG_SET_IDLE_S2_STEP_0 0x69 //设置S2的响应因子
#define PAJ_REG_SET_IDLE_S2_STEP_1 0x6A
#define PAJ_REG_SET_IDLE_S2_STEP_1 0x6A
#define PAJ_REG_SET_OP_TO_S1_STEP_0 0x6B //设置OP到S1的过度时间
#define PAJ_REG_SET_OP_TO_S1_STEP_1 0x6C
#define PAJ_REG_SET_S1_TO_S2_STEP_0 0x6D //设置S1到S2的过度时间
@@ -79,121 +79,121 @@ typedef enum {
#define PAJ_REG_OPERATION_ENABLE 0x72 //设置PAJ7620U2使能寄存器
static uint8_t m_Paj7620u2_InitRegisterConfig[][2] = {
{0xEF,0x00}, //切换bank0
{0x37,0x07}, //
{0x38,0x17},
{0x39,0x06},
{0x41,0x00},
{0x42,0x00},
{0x46,0x2D},
{0x47,0x0F},
{0x48,0x3C},
{0x49,0x00},
{0x4A,0x1E},
{0x4C,0x20},
{0x51,0x10},
{0x5E,0x10},
{0x60,0x27},
{0x80,0x42},
{0x81,0x44},
{0x82,0x04},
{0x8B,0x01},
{0x90,0x06},
{0x95,0x0A},
{0x96,0x0C},
{0x97,0x05},
{0x9A,0x14},
{0x9C,0x3F},
{0xA5,0x19},
{0xCC,0x19},
{0xCD,0x0B},
{0xCE,0x13},
{0xCF,0x64},
{0xD0,0x21},
{0xEF,0x01},
{0x02,0x0F},
{0x03,0x10},
{0x04,0x02},
{0x25,0x01},
{0x27,0x39},
{0x28,0x7F},
{0x29,0x08},
{0x3E,0xFF},
{0x5E,0x3D},
{0x65,0x96},
{0x67,0x97},
{0x69,0xCD},
{0x6A,0x01},
{0x6D,0x2C},
{0x6E,0x01},
{0x72,0x01},
{0x73,0x35},
{0x74,0x00},
{0x77,0x01},
{0xEF, 0x00}, //切换bank0
{0x37, 0x07}, //
{0x38, 0x17},
{0x39, 0x06},
{0x41, 0x00},
{0x42, 0x00},
{0x46, 0x2D},
{0x47, 0x0F},
{0x48, 0x3C},
{0x49, 0x00},
{0x4A, 0x1E},
{0x4C, 0x20},
{0x51, 0x10},
{0x5E, 0x10},
{0x60, 0x27},
{0x80, 0x42},
{0x81, 0x44},
{0x82, 0x04},
{0x8B, 0x01},
{0x90, 0x06},
{0x95, 0x0A},
{0x96, 0x0C},
{0x97, 0x05},
{0x9A, 0x14},
{0x9C, 0x3F},
{0xA5, 0x19},
{0xCC, 0x19},
{0xCD, 0x0B},
{0xCE, 0x13},
{0xCF, 0x64},
{0xD0, 0x21},
{0xEF, 0x01},
{0x02, 0x0F},
{0x03, 0x10},
{0x04, 0x02},
{0x25, 0x01},
{0x27, 0x39},
{0x28, 0x7F},
{0x29, 0x08},
{0x3E, 0xFF},
{0x5E, 0x3D},
{0x65, 0x96},
{0x67, 0x97},
{0x69, 0xCD},
{0x6A, 0x01},
{0x6D, 0x2C},
{0x6E, 0x01},
{0x72, 0x01},
{0x73, 0x35},
{0x74, 0x00},
{0x77, 0x01},
};
static uint8_t m_Paj7620u2_SetPSModeConfig[][2] = {
{0xEF,0x00},
{0x41,0x00},
{0x42,0x02},
{0x48,0x20},
{0x49,0x00},
{0x51,0x13},
{0x83,0x00},
{0x9F,0xF8},
{0x69,0x96},
{0x6A,0x02},
{0xEF,0x01},
{0x01,0x1E},
{0x02,0x0F},
{0x03,0x10},
{0x04,0x02},
{0x41,0x50},
{0x43,0x34},
{0x65,0xCE},
{0x66,0x0B},
{0x67,0xCE},
{0x68,0x0B},
{0x69,0xE9},
{0x6A,0x05},
{0x6B,0x50},
{0x6C,0xC3},
{0x6D,0x50},
{0x6E,0xC3},
{0x74,0x05},
{0xEF, 0x00},
{0x41, 0x00},
{0x42, 0x02},
{0x48, 0x20},
{0x49, 0x00},
{0x51, 0x13},
{0x83, 0x00},
{0x9F, 0xF8},
{0x69, 0x96},
{0x6A, 0x02},
{0xEF, 0x01},
{0x01, 0x1E},
{0x02, 0x0F},
{0x03, 0x10},
{0x04, 0x02},
{0x41, 0x50},
{0x43, 0x34},
{0x65, 0xCE},
{0x66, 0x0B},
{0x67, 0xCE},
{0x68, 0x0B},
{0x69, 0xE9},
{0x6A, 0x05},
{0x6B, 0x50},
{0x6C, 0xC3},
{0x6D, 0x50},
{0x6E, 0xC3},
{0x74, 0x05},
};
static uint8_t m_Paj7620u2_SetGestureModeConfig[][2] = {
{0xEF,0x00},
{0x41,0x00},
{0x42,0x00},
{0xEF,0x00},
{0x48,0x3C},
{0x49,0x00},
{0x51,0x10},
{0x83,0x20},
{0x9F,0xF9},
{0xEF,0x01},
{0x01,0x1E},
{0x02,0x0F},
{0x03,0x10},
{0x04,0x02},
{0x41,0x40},
{0x43,0x30},
{0x65,0x96},
{0x66,0x00},
{0x67,0x97},
{0x68,0x01},
{0x69,0xCD},
{0x6A,0x01},
{0x6B,0xB0},
{0x6C,0x04},
{0x6D,0x2C},
{0x6E,0x01},
{0x74,0x00},
{0xEF,0x00},
{0x41,0xFF},
{0x42,0x01},
{0xEF, 0x00},
{0x41, 0x00},
{0x42, 0x00},
{0xEF, 0x00},
{0x48, 0x3C},
{0x49, 0x00},
{0x51, 0x10},
{0x83, 0x20},
{0x9F, 0xF9},
{0xEF, 0x01},
{0x01, 0x1E},
{0x02, 0x0F},
{0x03, 0x10},
{0x04, 0x02},
{0x41, 0x40},
{0x43, 0x30},
{0x65, 0x96},
{0x66, 0x00},
{0x67, 0x97},
{0x68, 0x01},
{0x69, 0xCD},
{0x6A, 0x01},
{0x6B, 0xB0},
{0x6C, 0x04},
{0x6D, 0x2C},
{0x6E, 0x01},
{0x74, 0x00},
{0xEF, 0x00},
{0x41, 0xFF},
{0x42, 0x01},
};
/* 定义先进先出队列 */
@@ -202,7 +202,7 @@ typedef struct {
uint16_t buffer[FIFO_MAXSIZE]; /* 相关bit定义参考paj7620u2.h的“手势识别效果” */
uint16_t offset_read;
uint16_t offset_write;
}fifo_s;
} fifo_s;
static fifo_s m_fifo_intflags;
/* 轮询方式访问 */
@@ -223,8 +223,9 @@ static inline void FifoPut(fifo_s *fifo, uint16_t flag)
static inline uint16_t FifoGet(fifo_s *fifo, uint16_t *flag)
{
if (fifo->offset_read == fifo->offset_write)
if (fifo->offset_read == fifo->offset_write) {
return 0;
}
*flag = fifo->buffer[fifo->offset_read];
fifo->offset_read = (fifo->offset_read + 1) % FIFO_MAXSIZE;
@@ -289,7 +290,7 @@ static void e53_gs_led_init()
/***************************************************************
* 函数名称: paj7620u2_delay_usec
* 说 明: 忙等待
* 参 数:
* 参 数:
* @usec: 忙等待的微秒数
* 返 回 值: 无
***************************************************************/
@@ -308,10 +309,9 @@ static inline void paj7620u2_delay_usec(uint32_t usec)
static uint8_t paj7620U2_write_null()
{
unsigned int ret = 0;
ret = LzI2cWrite(E53_I2C_BUS, PAJ7620U2_I2C_SLAVE_ADDRESS, NULL, 0);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: LzI2cWrite failed(%d)\n", __FILE__, __func__, __LINE__, ret);
return 0;
}
@@ -322,7 +322,7 @@ static uint8_t paj7620U2_write_null()
/***************************************************************
* 函数名称: paj7620u2_write_data
* 说 明: 使用i2c往PAJ7620U2写入数据
* 参 数:
* 参 数:
* @addr: 寄存器地址
* @data: 数值
* 返 回 值: 返回1为成功
@@ -336,8 +336,7 @@ static uint8_t paj7620u2_write_data(uint8_t addr, uint8_t data)
buffer[0] = addr;
buffer[1] = data;
ret = LzI2cWrite(E53_I2C_BUS, PAJ7620U2_I2C_SLAVE_ADDRESS, buffer, 2);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: LzI2cWrite failed(%d)\n", __FILE__, __func__, __LINE__, ret);
return 0;
}
@@ -348,7 +347,7 @@ static uint8_t paj7620u2_write_data(uint8_t addr, uint8_t data)
/***************************************************************
* 函数名称: paj7620u2_read_data
* 说 明: 使用i2c读取PAJ7620U2的寄存器数据
* 参 数:
* 参 数:
* @addr: 寄存器地址
* @data: 数值
* 返 回 值: 返回1为成功
@@ -361,15 +360,13 @@ static uint8_t paj7620u2_read_data(uint8_t addr, uint8_t *data)
/* 发送地址给PAJ7620U2 */
buffer[0] = addr;
ret = LzI2cWrite(E53_I2C_BUS, PAJ7620U2_I2C_SLAVE_ADDRESS, buffer, 1);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: LzI2cWrite failed(%d)\n", __FILE__, __func__, __LINE__, ret);
return 0;
}
ret = LzI2cRead(E53_I2C_BUS, PAJ7620U2_I2C_SLAVE_ADDRESS, data, 1);
if (ret != LZ_HARDWARE_SUCCESS)
{
if (ret != LZ_HARDWARE_SUCCESS) {
printf("%s, %s, %d: LzI2cRead failed(%d)\n", __FILE__, __func__, __LINE__, ret);
return 0;
}
@@ -380,23 +377,22 @@ static uint8_t paj7620u2_read_data(uint8_t addr, uint8_t *data)
/***************************************************************
* 函数名称: paj7620u2_select_bank
* 说 明: 选择PAJ7620U2 BANK区域
* 参 数:
* 参 数:
* @bankbank区域[0,1]
* 返 回 值: 无
***************************************************************/
static void paj7620u2_select_bank(BankId bank)
{
switch (bank)
{
case BANK0:
paj7620u2_write_data(PAJ_REG_BANK_SEL, PAJ_REB_BANK_SEL_BANK0);
break;
case BANK1:
paj7620u2_write_data(PAJ_REG_BANK_SEL, PAJ_REB_BANK_SEL_BANK1);
break;
default:
printf("%s, %s, %d: bank(%d) out of the range!\n", __FILE__, __func__, __LINE__, bank);
break;
switch (bank) {
case BANK0:
paj7620u2_write_data(PAJ_REG_BANK_SEL, PAJ_REB_BANK_SEL_BANK0);
break;
case BANK1:
paj7620u2_write_data(PAJ_REG_BANK_SEL, PAJ_REB_BANK_SEL_BANK1);
break;
default:
printf("%s, %s, %d: bank(%d) out of the range!\n", __FILE__, __func__, __LINE__, bank);
break;
}
}
@@ -409,7 +405,7 @@ static void paj7620u2_select_bank(BankId bank)
static uint8_t paj7620u2_get_bank_id()
{
uint8_t bankId = 0;
paj7620u2_read_data(PAJ_REG_BANK_SEL, &bankId);
return bankId;
}
@@ -424,7 +420,7 @@ static uint32_t paj7620u2_wake_up()
{
uint8_t ret = 0;
uint8_t data = 0;
/* 查询PAJ7620U2,用于唤醒它 */
paj7620U2_write_null();
paj7620u2_delay_usec(1000);
@@ -435,13 +431,11 @@ static uint32_t paj7620u2_wake_up()
/* 读取bank0 addr 0x0,返回一定是0x20 */
paj7620u2_select_bank(BANK0);
ret = paj7620u2_read_data(0x00, &data);
if (ret != 1)
{
if (ret != 1) {
printf("%s, %s, %d: paj7620u2_read_data failed(%d)\n", __FILE__, __func__, __LINE__, ret);
return __LINE__;
}
if (data != 0x20)
{
if (data != 0x20) {
printf("%s, %s, %d: paj7620u2_read_data 0x%x != 0x20\n", __FILE__, __func__, __LINE__, data);
return __LINE__;
}
@@ -477,26 +471,24 @@ static VOID paj7620u2_poll_task(VOID *args)
uint8_t int_flag1 = 0;
uint8_t int_flag2 = 0;
uint16_t value = 0;
while (1)
{
while (1) {
/* 读取Paj7620U2的手势中断寄存器 */
paj7620u2_select_bank(BANK0);
paj7620u2_read_data(PAJ_REG_GET_INT_FLAG1, &int_flag1);
paj7620u2_read_data(PAJ_REG_GET_INT_FLAG2, &int_flag2);
value = 0;
if (int_flag1 != 0)
{
if (int_flag1 != 0) {
value |= (uint16_t)(int_flag1);
}
if (int_flag2 != 0)
{
if (int_flag2 != 0) {
value |= (uint16_t)(int_flag2 << 8);
}
if (value != 0)
if (value != 0) {
FifoPut(&m_fifo_intflags, value);
}
LOS_Msleep(100);
}
@@ -510,13 +502,11 @@ static VOID paj7620u2_poll_task(VOID *args)
***************************************************************/
static void paj7620u2_i2c_init()
{
if (I2cIoInit(m_i2cBus) != LZ_HARDWARE_SUCCESS)
{
if (I2cIoInit(m_i2cBus) != LZ_HARDWARE_SUCCESS) {
printf("%s, %d: I2cIoInit failed!\n", __FILE__, __LINE__);
return;
}
if (LzI2cInit(E53_I2C_BUS, m_i2c_freq) != LZ_HARDWARE_SUCCESS)
{
if (LzI2cInit(E53_I2C_BUS, m_i2c_freq) != LZ_HARDWARE_SUCCESS) {
printf("%s, %d: I2cIoInit failed!\n", __FILE__, __LINE__);
return;
}
@@ -536,7 +526,7 @@ static void paj7620u2_poll_task_init()
TSK_INIT_PARAM_S task;
uint8_t int_flag1, int_flag2;
UINT32 ret;
/* 初始化先进先出缓冲区 */
m_fifo_intflags.offset_read = 0;
m_fifo_intflags.offset_write = 0;
@@ -551,8 +541,7 @@ static void paj7620u2_poll_task_init()
task.uwStackSize = 0x400;
task.usTaskPrio = 10;
ret = LOS_TaskCreate(&m_pollTaskId, &task);
if (ret != LOS_OK)
{
if (ret != LOS_OK) {
printf("%s, %d: LOS_TaskCreate failed(%d)\n", __func__, __LINE__, ret);
/* 解锁任务调度 */
LOS_TaskUnlock();
@@ -578,24 +567,21 @@ static void paj7620u2_init_config()
{
uint8_t ret = 0;
uint32_t size;
ret = paj7620u2_wake_up();
if (ret != 0)
{
if (ret != 0) {
printf("%s, %s, %d: paj7620u2_wake_up failed(%d)\n", __FILE__, __func__, __LINE__, ret);
}
/* 初始化PAJ7620U2 */
size = sizeof(m_Paj7620u2_InitRegisterConfig) / (sizeof(uint8_t) * 2);
for (uint32_t i = 0; i < size; i++)
{
for (uint32_t i = 0; i < size; i++) {
paj7620u2_write_data(m_Paj7620u2_InitRegisterConfig[i][0], m_Paj7620u2_InitRegisterConfig[i][1]);
}
/* 设置为手势识别模式 */
size = sizeof(m_Paj7620u2_SetGestureModeConfig) / (sizeof(uint8_t) * 2);
for (uint32_t i = 0; i < size; i++)
{
for (uint32_t i = 0; i < size; i++) {
paj7620u2_write_data(m_Paj7620u2_SetGestureModeConfig[i][0], m_Paj7620u2_SetGestureModeConfig[i][1]);
}
@@ -617,7 +603,7 @@ unsigned int e53_gs_init()
e53_gs_led_init();
/* 上电后,等待PAJ7620U2 700usec */
paj7620u2_delay_usec(700);
/* 初始化i2c */
/* 初始化i2c */
paj7620u2_i2c_init();
/* 初始化寄存器配置和工作模式 */
paj7620u2_init_config();
@@ -628,18 +614,15 @@ unsigned int e53_gs_init()
/***************************************************************
* 函数名称: e53_gs_led_up_set
* 说 明: 手势感应模块向上LED设置
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
void e53_gs_led_up_set(unsigned char is_on)
{
if (is_on == 0)
{
if (is_on == 0) {
LzGpioSetVal(GPIO_LED_UP, LZGPIO_LEVEL_HIGH);
}
else
{
} else {
LzGpioSetVal(GPIO_LED_UP, LZGPIO_LEVEL_LOW);
}
}
@@ -647,18 +630,15 @@ void e53_gs_led_up_set(unsigned char is_on)
/***************************************************************
* 函数名称: e53_gs_led_down_set
* 说 明: 手势感应模块向上LED设置
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
void e53_gs_led_down_set(unsigned char is_on)
{
if (is_on == 0)
{
if (is_on == 0) {
LzGpioSetVal(GPIO_LED_DOWN, LZGPIO_LEVEL_HIGH);
}
else
{
} else {
LzGpioSetVal(GPIO_LED_DOWN, LZGPIO_LEVEL_LOW);
}
}
@@ -666,18 +646,15 @@ void e53_gs_led_down_set(unsigned char is_on)
/***************************************************************
* 函数名称: e53_gs_led_left_set
* 说 明: 手势感应模块向左LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
void e53_gs_led_left_set(unsigned char is_on)
{
if (is_on == 0)
{
if (is_on == 0) {
LzGpioSetVal(GPIO_LED_LEFT, LZGPIO_LEVEL_HIGH);
}
else
{
} else {
LzGpioSetVal(GPIO_LED_LEFT, LZGPIO_LEVEL_LOW);
}
}
@@ -685,18 +662,15 @@ void e53_gs_led_left_set(unsigned char is_on)
/***************************************************************
* 函数名称: e53_gs_led_right_set
* 说 明: 手势感应模块向右LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
void e53_gs_led_right_set(unsigned char is_on)
{
if (is_on == 0)
{
if (is_on == 0) {
LzGpioSetVal(GPIO_LED_RIGHT, LZGPIO_LEVEL_HIGH);
}
else
{
} else {
LzGpioSetVal(GPIO_LED_RIGHT, LZGPIO_LEVEL_LOW);
}
}
@@ -704,18 +678,15 @@ void e53_gs_led_right_set(unsigned char is_on)
/***************************************************************
* 函数名称: e53_gs_led_forward_set
* 说 明: 手势感应模块向前LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
void e53_gs_led_forward_set(unsigned char is_on)
{
if (is_on == 0)
{
if (is_on == 0) {
LzGpioSetVal(GPIO_LED_FORWARD, LZGPIO_LEVEL_HIGH);
}
else
{
} else {
LzGpioSetVal(GPIO_LED_FORWARD, LZGPIO_LEVEL_LOW);
}
}
@@ -723,18 +694,15 @@ void e53_gs_led_forward_set(unsigned char is_on)
/***************************************************************
* 函数名称: e53_gs_led_backward_set
* 说 明: 手势感应模块向后LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
void e53_gs_led_backward_set(unsigned char is_on)
{
if (is_on == 0)
{
if (is_on == 0) {
LzGpioSetVal(GPIO_LED_BACKWARD, LZGPIO_LEVEL_HIGH);
}
else
{
} else {
LzGpioSetVal(GPIO_LED_BACKWARD, LZGPIO_LEVEL_LOW);
}
}
@@ -742,18 +710,15 @@ void e53_gs_led_backward_set(unsigned char is_on)
/***************************************************************
* 函数名称: e53_gs_led_cw_set
* 说 明: 手势感应模块顺时针转圈LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
void e53_gs_led_cw_set(unsigned char is_on)
{
if (is_on == 0)
{
if (is_on == 0) {
LzGpioSetVal(GPIO_LED_CW, LZGPIO_LEVEL_HIGH);
}
else
{
} else {
LzGpioSetVal(GPIO_LED_CW, LZGPIO_LEVEL_LOW);
}
}
@@ -761,18 +726,15 @@ void e53_gs_led_cw_set(unsigned char is_on)
/***************************************************************
* 函数名称: e53_gs_led_ccw_set
* 说 明: 手势感应模块逆时针转圈LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
void e53_gs_led_ccw_set(unsigned char is_on)
{
if (is_on == 0)
{
if (is_on == 0) {
LzGpioSetVal(GPIO_LED_CCW, LZGPIO_LEVEL_HIGH);
}
else
{
} else {
LzGpioSetVal(GPIO_LED_CCW, LZGPIO_LEVEL_LOW);
}
}
@@ -780,18 +742,15 @@ void e53_gs_led_ccw_set(unsigned char is_on)
/***************************************************************
* 函数名称: e53_gs_led_wave_set
* 说 明: 手势感应模块挥手LED亮起
* 参 数:
* 参 数:
* @is_on1为开启,0为关闭
* 返 回 值: 无
***************************************************************/
void e53_gs_led_wave_set(unsigned char is_on)
{
if (is_on == 0)
{
if (is_on == 0) {
LzGpioSetVal(GPIO_LED_WAVE, LZGPIO_LEVEL_HIGH);
}
else
{
} else {
LzGpioSetVal(GPIO_LED_WAVE, LZGPIO_LEVEL_LOW);
}
}
@@ -799,7 +758,7 @@ void e53_gs_led_wave_set(unsigned char is_on)
/***************************************************************
* 函数名称: e53_gs_get_gesture_state
* 说 明: 获取手势感应模块手势
* 参 数:
* 参 数:
* @flag:获取当前手势
* 返 回 值: 1为成功,0为失败
***************************************************************/
@@ -807,12 +766,9 @@ unsigned int e53_gs_get_gesture_state(unsigned short *flag)
{
*flag = 0;
if (FifoGet(&m_fifo_intflags, flag) != 0)
{
if (FifoGet(&m_fifo_intflags, flag) != 0) {
return 1;
}
else
{
} else {
return 0;
}
}