Compare commits

...

49 Commits

Author SHA1 Message Date
Zhangwen d589e44ac6 fix: 修改RFID读取模块的发射功率26dBm为24dBm 1 year ago
Zhangwen e0b657e796 fix :修正文件名称 1 year ago
mr.zhangsan 1aedc5880f feature: 添加按键非阻塞模式读取 1 year ago
mr.zhangsan 9e554b2b4b fix: 修正rfid掩码错误打印输出格式 1 year ago
mr.zhangsan 8bf883675f fix: rfid错误输出格式添加换行符 1 year ago
mr.zhangsan 275a7181a4 feature: 添加RFID业务掩码 YFRS00AA 1 year ago
mr.zhangsan 61861b0ede fix: 添加rfid没小时发送一次轮询指令1 1 year ago
mr.zhangsan 1145363142 fix: 添加rfid没小时发送一次轮询指令 1 year ago
mr.zhangsan dcf1ea5785 feature: 添加心电模式 1 year ago
mr.zhangsan d103abb14e 修正RFID启用bug 1 year ago
mr.zhangsan f8defdb2f4 修正RFID启用bug 1 year ago
mr.zhangsan bfd8dfb799 修正rfid init的延时时间 1 year ago
mr.zhangsan 474217b83e 修改rfid_task 1 year ago
mr.zhangsan 7e8fbbe5b7 rfid使能重新初始化rfid任务 1 year ago
mr.zhangsan 9a03c11bfb 优化L3_new_rfid函数 1 year ago
mr.zhangsan 6c2039ff70 设置低功耗模式关闭rfid 1 year ago
mr.zhangsan 4b7ae3a14b 设置rfid-en强推挽模式 2 years ago
mr.zhangsan 245860179a 修正brt 2 years ago
mr.zhangsan e35b36a1e1 修正led dat计算bug 2 years ago
mr.zhangsan ac4f2e0ab1 修改ledbug 2 years ago
mr.zhangsan 4feb041006 bfysop-v2 2 years ago
mr.zhangsan 863eb1471f 修改485波特率 9600 2 years ago
mr.zhangsan 8c0cc83caf 修改至新的串口模式 2 years ago
mr.zhangsan 70933c20a1 修改串口为新版本 2 years ago
mr.zhangsan 4c70a7bbdf 添加low_power task 2 years ago
mr.zhangsan c8c350267f 修改功能按键不退出低功耗,由上位机负责退出 2 years ago
mr.zhangsan ace64965db 添加低功耗模式灭灯处理 2 years ago
mr.zhangsan 60ed6b0c7c 张文测试 2 years ago
mr.zhangsan 5ad3501586 添加keil工程文件 2 years ago
mr.zhangsan 3a76d21ef9 修改串口為xdata 2 years ago
mr.zhangsan 869a7a527c 調試完畢,但是485協議有問題 2 years ago
mr.zhangsan 23a43668cc 485循环发送时,按键导致程序卡死 2 years ago
mr.zhangsan 3fbbfc48ef 修改串口,去掉警告 2 years ago
mr.zhangsan 1140221ef0 485测试通过 2 years ago
mr.zhangsan 374efdc80e 串口4调试 2 years ago
mr.zhangsan e99f7bface 修正按键bug 2 years ago
mr.zhangsan 649f1f8711 添加串口4协议解析 2 years ago
mr.zhangsan 92c6edf0bd rfid解析完成 2 years ago
mr.zhangsan 2bfd7fbaba nfc添加至uart2 2 years ago
mr.zhangsan 94482474ea mcuid调试完成 2 years ago
mr.zhangsan edc08e9c1d nfc协议解析完毕 2 years ago
mr.zhangsan 69878586ee 修正串口 2 years ago
mr.zhangsan 37a6e348f0 stdio按键驱动完成 2 years ago
mr.zhangsan c15e017ccf 高阻输入读取按键 2 years ago
mr.zhangsan 458b7c07ca 修改延时 2 years ago
mr.zhangsan 015e0e200e 串口0输出正常 2 years ago
mr.zhangsan 228b26cdb7 bsp_config.c修改完毕 2 years ago
mr.zhangsan 90701ff5ac 添加delay延时 2 years ago
mr.zhangsan 81054d859e 调试所有led 2 years ago
  1. BIN
      docs/02-NFC-高频模块SDK(1).zip
  2. BIN
      docs/03 RFID模块.rar
  3. 148
      keilp/cc_as_stc02_ps5ws.uvprojx
  4. 30
      source/.vscode/settings.json
  5. 280
      source/app/app_config.c
  6. 113
      source/app/app_config.h
  7. 132
      source/app/main.c
  8. 26
      source/app/main.h
  9. BIN
      source/app/source.lnk
  10. 418
      source/app/task_adc.c
  11. 119
      source/app/task_adc.h
  12. 72
      source/app/task_bled.c
  13. 17
      source/app/task_bled.h
  14. 83
      source/app/task_btn.c
  15. 32
      source/app/task_btn.h
  16. 113
      source/app/task_btn_nonblock.c
  17. 35
      source/app/task_btn_nonblock.h
  18. 4
      source/app/task_debug.c
  19. 97
      source/app/task_low_power.c
  20. 34
      source/app/task_low_power.h
  21. 26
      source/app/task_modbus.c
  22. 2
      source/app/task_modbus.h
  23. 98
      source/app/task_nfc.c
  24. 42
      source/app/task_nfc.h
  25. 60
      source/app/task_nfc_auth.c
  26. 34
      source/app/task_nfc_auth.h
  27. 63
      source/app/task_register.c
  28. 172
      source/app/task_rfid.c
  29. 45
      source/app/task_rfid.h
  30. 158
      source/app/task_rs485.c
  31. 56
      source/app/task_rs485.h
  32. 58
      source/bsp/bsp_config.c
  33. 88
      source/bsp/bsp_config.h
  34. 214
      source/bsp/bsp_config_delay.c
  35. 9
      source/bsp/bsp_config_delay.h
  36. 150
      source/bsp/bsp_key.c
  37. 11
      source/bsp/bsp_key.h
  38. 138
      source/bsp/bsp_key_nonblock.c
  39. 12
      source/bsp/bsp_key_nonblock.h
  40. 52
      source/bsp/bsp_led.c
  41. 15
      source/bsp/bsp_led.h
  42. 13
      source/bsp/bsp_rfid.c
  43. 9
      source/bsp/bsp_rfid.h
  44. 16
      source/bsp/chipid.c
  45. 7
      source/bsp/chipid.h
  46. 1
      source/clib/clib.c
  47. 589
      source/cpu/STC_stc8a8k.H
  48. 466
      source/cpu/stc_stc15w.H
  49. 746
      source/cpu/stc_stc8G1k.H
  50. 593
      source/cpu/stc_stc8f.h
  51. 35
      source/cpu/stc_stc8h.h
  52. 640
      source/cpu/stc_stc8hxx.h
  53. 2
      source/ctask/task.c
  54. 4
      source/ctask/task.h
  55. 5
      source/ctask/tick.h
  56. 81
      source/ctask/time.c
  57. 0
      source/ctask/time.h
  58. 187
      source/msp/UART0.C
  59. 10
      source/msp/UART0.h
  60. 191
      source/msp/UART2.c
  61. 9
      source/msp/UART2.h
  62. 181
      source/msp/UART3.c
  63. 64
      source/msp/UART3.h
  64. 188
      source/msp/UART4.C
  65. 10
      source/msp/UART4.h
  66. 240
      source/msp/UARTX.c
  67. 97
      source/msp/UARTX.h
  68. 211
      source/msp/uart_x.c
  69. 105
      source/msp/uart_x.h
  70. 2
      source/tpc/0d0a.c
  71. 2
      source/tpc/0d0a.h
  72. 2
      source/tpc/ccmodbus.c
  73. 2
      source/tpc/ccmodbus.h
  74. 379
      source/tpc/debug.c
  75. 15
      source/tpc/debug.h
  76. 62
      source/tpc/modbus.c
  77. 114
      source/tpc/modbus.h
  78. 18
      source/tpc/tpc_x.h

BIN
docs/02-NFC-高频模块SDK(1).zip

Binary file not shown.

BIN
docs/03 RFID模块.rar

Binary file not shown.

148
keilp/cc_as_stc02_ps5ws.uvprojx

@ -10,7 +10,6 @@
<TargetName>STC8F2K16S2</TargetName>
<ToolsetNumber>0x0</ToolsetNumber>
<ToolsetName>MCS-51</ToolsetName>
<uAC6>0</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STC8H8K64U Series</Device>
@ -124,6 +123,47 @@
<HexOffset>0</HexOffset>
<Oh166RecLen>16</Oh166RecLen>
</OPTHX>
<Simulator>
<UseSimulator>1</UseSimulator>
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
<RunToMain>1</RunToMain>
<RestoreBreakpoints>1</RestoreBreakpoints>
<RestoreWatchpoints>1</RestoreWatchpoints>
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
<RestoreFunctions>1</RestoreFunctions>
<RestoreToolbox>1</RestoreToolbox>
<LimitSpeedToRealTime>0</LimitSpeedToRealTime>
<RestoreSysVw>1</RestoreSysVw>
</Simulator>
<Target>
<UseTarget>0</UseTarget>
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
<RunToMain>0</RunToMain>
<RestoreBreakpoints>1</RestoreBreakpoints>
<RestoreWatchpoints>1</RestoreWatchpoints>
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
<RestoreFunctions>0</RestoreFunctions>
<RestoreToolbox>1</RestoreToolbox>
<RestoreTracepoints>1</RestoreTracepoints>
<RestoreSysVw>1</RestoreSysVw>
</Target>
<RunDebugAfterBuild>0</RunDebugAfterBuild>
<TargetSelection>-1</TargetSelection>
<SimDlls>
<CpuDll></CpuDll>
<CpuDllArguments></CpuDllArguments>
<PeripheralDll></PeripheralDll>
<PeripheralDllArguments></PeripheralDllArguments>
<InitializationFile></InitializationFile>
</SimDlls>
<TargetDlls>
<CpuDll></CpuDll>
<CpuDllArguments></CpuDllArguments>
<PeripheralDll></PeripheralDll>
<PeripheralDllArguments></PeripheralDllArguments>
<InitializationFile></InitializationFile>
<Driver></Driver>
</TargetDlls>
</DebugOption>
<Utilities>
<Flash1>
@ -177,14 +217,12 @@
<Mx51P>0</Mx51P>
<hadXRAM2>0</hadXRAM2>
<uocXram2>0</uocXram2>
<hadXRAM3>0</hadXRAM3>
<ModC2>0</ModC2>
<ModH2>0</ModH2>
<Mdu_R515>0</Mdu_R515>
<Mdu_F120>0</Mdu_F120>
<Psoc>0</Psoc>
<hadIROM2>0</hadIROM2>
<hadIROM3>0</hadIROM3>
<ModSmx2>0</ModSmx2>
<cBanks>0</cBanks>
<xBanks>0</xBanks>
@ -254,16 +292,6 @@
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</IROM512>
<XRA513>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</XRA513>
<IROM513>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</IROM513>
</OnChipMemories>
</Target51Misc>
<C51>
@ -273,7 +301,7 @@
<uAregs>0</uAregs>
<UseInterruptVector>1</UseInterruptVector>
<Fuzzy>3</Fuzzy>
<Optimize>2</Optimize>
<Optimize>0</Optimize>
<WarningLevel>2</WarningLevel>
<SizeSpeed>0</SizeSpeed>
<ObjectExtend>1</ObjectExtend>
@ -341,34 +369,49 @@
<FilePath>..\source\app\main.c</FilePath>
</File>
<File>
<FileName>task_adc.c</FileName>
<FileName>task_debug.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_adc.c</FilePath>
<FilePath>..\source\app\task_debug.c</FilePath>
</File>
<File>
<FileName>task_debug.c</FileName>
<FileName>app_config.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_debug.c</FilePath>
<FilePath>..\source\app\app_config.c</FilePath>
</File>
<File>
<FileName>task_register.c</FileName>
<FileName>task_nfc.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_register.c</FilePath>
<FilePath>..\source\app\task_nfc.c</FilePath>
</File>
<File>
<FileName>task_modbus.c</FileName>
<FileName>task_rfid.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_modbus.c</FilePath>
<FilePath>..\source\app\task_rfid.c</FilePath>
</File>
<File>
<FileName>app_config.c</FileName>
<FileName>task_rs485.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\app_config.c</FilePath>
<FilePath>..\source\app\task_rs485.c</FilePath>
</File>
<File>
<FileName>task_bled.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_bled.c</FilePath>
</File>
<File>
<FileName>task_nfc_auth.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_nfc_auth.c</FilePath>
</File>
<File>
<FileName>task_encrypt.c</FileName>
<FileName>task_low_power.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_encrypt.c</FilePath>
<FilePath>..\source\app\task_low_power.c</FilePath>
</File>
<File>
<FileName>task_btn_nonblock.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_btn_nonblock.c</FilePath>
</File>
</Files>
</Group>
@ -385,11 +428,6 @@
<Group>
<GroupName>msp</GroupName>
<Files>
<File>
<FileName>time.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\time.c</FilePath>
</File>
<File>
<FileName>UART0.C</FileName>
<FileType>1</FileType>
@ -401,9 +439,24 @@
<FilePath>..\source\msp\eeprom.c</FilePath>
</File>
<File>
<FileName>uart_x.c</FileName>
<FileName>UART3.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\UART3.c</FilePath>
</File>
<File>
<FileName>UART2.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\UART2.c</FilePath>
</File>
<File>
<FileName>UART4.C</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\uart_x.c</FilePath>
<FilePath>..\source\msp\UART4.C</FilePath>
</File>
<File>
<FileName>UARTX.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\UARTX.c</FilePath>
</File>
</Files>
</Group>
@ -430,6 +483,26 @@
<FileType>1</FileType>
<FilePath>..\source\bsp\rs485.c</FilePath>
</File>
<File>
<FileName>bsp_config_delay.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_config_delay.c</FilePath>
</File>
<File>
<FileName>bsp_rfid.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_rfid.c</FilePath>
</File>
<File>
<FileName>bsp_led.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_led.c</FilePath>
</File>
<File>
<FileName>bsp_key_nonblock.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_key_nonblock.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -445,15 +518,20 @@
<FileType>1</FileType>
<FilePath>..\source\ctask\tick.c</FilePath>
</File>
<File>
<FileName>time.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\ctask\time.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>tpc</GroupName>
<Files>
<File>
<FileName>modbus.c</FileName>
<FileName>debug.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\tpc\modbus.c</FilePath>
<FilePath>..\source\tpc\debug.c</FilePath>
</File>
</Files>
</Group>

30
source/.vscode/settings.json

@ -0,0 +1,30 @@
{
"files.associations": {
"UART0.C": "cpp",
"bsp_config.h": "c",
"stc_macro.h": "c",
"type.h": "c",
"main.h": "c",
"bsp_config_delay.h": "c",
"bsp_key.h": "c",
"stc_macro.H": "cpp",
"uart_x.h": "c",
"UART4.C": "cpp",
"tpc_x.h": "c",
"uart3.h": "c",
"time.h": "c",
"debug.h": "c",
"app_config.h": "c",
"task_nfc.h": "c",
"task_debug.h": "c",
"clib.h": "c",
"uart2.h": "c",
"task_rfid.h": "c",
"task_rs485.h": "c",
"rs485.h": "c",
"bsp_led.h": "c",
"task_nfc_auth.h": "c",
"stc_stc8h.h": "c",
"task.h": "c"
}
}

280
source/app/app_config.c

@ -1,107 +1,233 @@
#include "app_config.h"
#include "../bsp/cs1232.h"
#include "../bsp/chipid.h"
#include "../bsp/bsp_rfid.h"
#include "../msp/eeprom.h"
GlobalParam G;
GlobalRegister R;
int i;
void L3_param_init(void)
{
#if 0
int i;
for(i=0;i<D_ch_max_num;i++)
{
G.weight[i] = 0;
}
G.allweight = 0;
G._total_weight = 0;
G._total_zweight = 0;
//L3_eeprom_read_param();
#endif
}
// void L3_param_init(void)
// {
// #if 0
// G.xx = 0;
// //L3_eeprom_read_param();
// #endif
// }
//读取reg内容,写入iap
void L3_reg_2_iap(void)
// void L3_reg_2_iap(void)
// {
// #if 0
// iapData.slaver_id = R.p.slaver_id;
// iapData.adc_ch_status = R.p.adc_ch_status;
// iapData.weight_max = R.p.weight_max;
// iapData.lmd = R.p.lmd;
// iapData.adc_blur_mid = R.p.adc_blur_mid;
// iapData.adc_blur_avg = R.p.adc_blur_avg;
// iapData.adc_blur_shift[0] = R.p.adc_blur_shift[0];
// iapData.adc_blur_shift[1] = R.p.adc_blur_shift[1];
// iapData.adc_blur_shift[2] = R.p.adc_blur_shift[2];
// iapData.adc_blur_threshold[0] = R.p.adc_blur_threshold[0];
// iapData.adc_blur_threshold[1] = R.p.adc_blur_threshold[1];
// //写入eeprom
// if(L1_eep_write_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, (U8*)&iapData,sizeof(IapData),TRUE) == 0)
// {
// L0_uart0_sendstr("e2p write success");
// }
// #endif
// if(L1_eep_write_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, D_EEP_SECTOR_BLOCK_SIZE, (U8*)&R.p,sizeof(R.p),TRUE) == 0)
// {
// L0_uart0_sendstr("e2p write success");
// return;
// }
// L0_uart0_sendstr("e2p write failed");
// }
// //读取iap内容,写入reg
// void L3_iap_2_reg(void)
// {
// #if 0
// if(L1_eep_read_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, (U8*)&iapData, NULL) == 1)
// {
// L0_uart0_sendstr("e2p read failed");
// }
// L0_uart0_sendstr("e2p read success");
// R.p.slaver_id = iapData.slaver_id;
// R.p.adc_ch_status = iapData.adc_ch_status;
// R.p.weight_max = iapData.weight_max ;
// R.p.lmd = iapData.lmd;
// R.p.adc_blur_mid = iapData.adc_blur_mid;
// R.p.adc_blur_avg = iapData.adc_blur_avg;
// R.p.adc_blur_shift[0] = iapData.adc_blur_shift[0];
// R.p.adc_blur_shift[1] = iapData.adc_blur_shift[1];
// R.p.adc_blur_shift[2] = iapData.adc_blur_shift[2];
// R.p.adc_blur_threshold[0] = iapData.adc_blur_threshold[0];
// R.p.adc_blur_threshold[1] = iapData.adc_blur_threshold[1];
// #endif
// if(L1_eep_read_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, D_EEP_SECTOR_BLOCK_SIZE, (U8*)&R.p, NULL) == 0)
// {
// L0_uart0_sendstr("e2p read success");
// return;
// }
// L0_uart0_sendstr("e2p read failed");
// }
void L3_reg_reset(void)
{
#if 0
iapData.slaver_id = R.p.slaver_id;
iapData.adc_ch_status = R.p.adc_ch_status;
iapData.weight_max = R.p.weight_max;
iapData.lmd = R.p.lmd;
iapData.adc_blur_mid = R.p.adc_blur_mid;
iapData.adc_blur_avg = R.p.adc_blur_avg;
iapData.adc_blur_shift[0] = R.p.adc_blur_shift[0];
iapData.adc_blur_shift[1] = R.p.adc_blur_shift[1];
iapData.adc_blur_shift[2] = R.p.adc_blur_shift[2];
iapData.adc_blur_threshold[0] = R.p.adc_blur_threshold[0];
iapData.adc_blur_threshold[1] = R.p.adc_blur_threshold[1];
//写入eeprom
if(L1_eep_write_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, (U8*)&iapData,sizeof(IapData),TRUE) == 0)
//心电模式
R.xd_mode = 0;
//设置RFID对照表
for(i=0; i<LED_BTN_NUM; i++)
{
L0_uart0_sendstr("e2p write success");
R.rfid_table[i] = 0x0000 + i;
}
#endif
if(L1_eep_write_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, D_EEP_SECTOR_BLOCK_SIZE, (U8*)&R.p,sizeof(R.p),TRUE) == 0)
//sop板默认不需要授权、未授权
R.auth_flag = (0<<4) | 0;
// R.auth_flag = (0<<4) | 0x01;
//从机ID
R.slave_id = 0x03;
//功耗模式:正常模式
R.power_mode = POWER_NORMAL;
//功能按键按下状态
R.func_btn = 0;
//设置led灯状态
L3_led_clear();
//nfc编号
L3_nfc_clear();
//4路RFID编号
L3_rfid_clear();
//for test
// R.slave_id = 0x01;
// R.power_mode = 0;
// R.func_btn = 1;
// R.nfc.nfc_no[0] = 0x01;
// R.nfc.nfc_no[1] = 0x23;
// for(i=0;i<4;i++){
// R.rfids[i].rfid_no[0] = 0xA0;
// R.rfids[i].rfid_no[1] = 0xB0;
// R.rfids[i].rssi = 0x61;
// R.rfids[i].ant = i;
// };
}
void L3_led_clear(void)
{
//设置led灯状态
for(i=0; i<LED_BTN_NUM; i++)
{
L0_uart0_sendstr("e2p write success");
return;
R.led_status[i] = 0;
}
L0_uart0_sendstr("e2p write failed");
R.led_status[0] = 1;
}
void L3_nfc_clear(void)
{
R.nfc.nfc_no[0] = 0;
R.nfc.nfc_no[1] = 0;
}
//读取iap内容,写入reg
void L3_iap_2_reg(void)
void L3_rfid_clear(void)
{
#if 0
if(L1_eep_read_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, (U8*)&iapData, NULL) == 1)
for(i=0; i<4; i++)
{
L0_uart0_sendstr("e2p read failed");
}
L0_uart0_sendstr("e2p read success");
R.p.slaver_id = iapData.slaver_id;
R.p.adc_ch_status = iapData.adc_ch_status;
R.p.weight_max = iapData.weight_max ;
R.p.lmd = iapData.lmd;
R.p.adc_blur_mid = iapData.adc_blur_mid;
R.p.adc_blur_avg = iapData.adc_blur_avg;
R.p.adc_blur_shift[0] = iapData.adc_blur_shift[0];
R.p.adc_blur_shift[1] = iapData.adc_blur_shift[1];
R.p.adc_blur_shift[2] = iapData.adc_blur_shift[2];
R.p.adc_blur_threshold[0] = iapData.adc_blur_threshold[0];
R.p.adc_blur_threshold[1] = iapData.adc_blur_threshold[1];
#endif
if(L1_eep_read_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, D_EEP_SECTOR_BLOCK_SIZE, (U8*)&R.p, NULL) == 0)
R.rfids[i].rfid_no[0] = 0;
R.rfids[i].rfid_no[1] = 0;
R.rfids[i].rssi = 0;
R.rfids[i].ant = 0;
};
}
void L3_reg_init(void)
{
L3_reg_reset();
//L3_iap_2_reg();
}
U8 L3_new_rfid_1(U16 rfidno, U8 rssi, U8 ant)
{
U8 i = 0;
for(i=0; i<4; i++)
{
L0_uart0_sendstr("e2p read success");
return;
if(R.rfids[i].rfid_no[0] == 0 && R.rfids[i].rfid_no[1] == 0)
{
//空位置
R.rfids[i].rfid_no[0] = rfidno >> 8 & 0xFF;
R.rfids[i].rfid_no[1] = rfidno >> 0 & 0xFF;
R.rfids[i].rssi = rssi;
R.rfids[i].ant = ant;
return 1;
}
if(R.rfids[i].rfid_no[0] == (rfidno >> 8 & 0xFF) && R.rfids[i].rfid_no[1] == (rfidno >> 0 & 0xFF))
{
//该rfid已经存在
break;
}
}
L0_uart0_sendstr("e2p read failed");
return 0;
}
void L3_reg_reset(void)
U8 L3_new_rfid(U16 rfidno, U8 rssi, U8 ant)
{
R.p.adc_ch_status = ADC_status_ch2_Ready | ADC_status_ch3_Ready | ADC_status_ch4_Ready; //修改采集通道
R.p.slaver_id = D_UART4_485_SLAVER_ID;
R.p.weight_max = 500; //500kg
R.p.lmd = 2; //2mv/v
R.p.adc_blur_mid = 1;
R.p.adc_blur_avg = 6;
R.p.adc_blur_shift[0] = 0;
R.p.adc_blur_shift[1] = 2;
R.p.adc_blur_shift[2] = 4;
R.p.adc_blur_threshold[0] = 1600; //g
R.p.adc_blur_threshold[1] = 700; //g
U8 i = 0;
for(i=0; i<RFID_BUF_NUM; i++)
{
if(R.rfids[i].rfid_no[0] == 0 && R.rfids[i].rfid_no[1] == 0)
{
//空位置
break;
}
if(R.rfids[i].rfid_no[0] == (rfidno >> 8 & 0xFF) && R.rfids[i].rfid_no[1] == (rfidno >> 0 & 0xFF))
{
//该rfid已经存在
break;
}
}
if(i == RFID_BUF_NUM)
{
i = 0;
}
//放入RFID(空位置、已存在位置[替换为最新的rssi和ant]、0位置[放满了就从头开始放)
R.rfids[i].rfid_no[0] = rfidno >> 8 & 0xFF;
R.rfids[i].rfid_no[1] = rfidno >> 0 & 0xFF;
R.rfids[i].rssi = rssi;
R.rfids[i].ant = ant;
return 0;
}
void L3_reg_init(void)
U8 L3_find_rfid_table(U16 rfidno)
{
//R.reserved1 = R.reserved2 = R.reserved3 = 0x55;
//R.zero = 0;
//R.status_eep_save = 0;
L3_reg_reset();
L3_iap_2_reg();
for(i=0; i<LED_BTN_NUM; i++)
{
if(rfidno == R.rfid_table[i])
{
return i;
}
}
return LED_BTN_NUM;
}
void L3_set_power_mode(U8 mode)
{
// if(R.power_mode == POWER_NORMAL)
// {
// if(mode == POWER_LOW)
// {
// }
// }
R.power_mode = mode;
}

113
source/app/app_config.h

@ -6,49 +6,74 @@
#define APP_VERSION 0x10
#define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 ))
#define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000)
//STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG
//寄存器编号从1开始
//#define D_COUNT_WEIGHT(adc) (U32)(1000.0 * R.p.weight_max * (adc) / (2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd))
//#define D_blur_threshold_2_1(threshold) (U32) ( 1.0 * threshold *(2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd) / (1000.0 * R.p.weight_max ))
#define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 ))
#define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000)
#define ADC_status_chx_Ready_BASE 0x01
#define ADC_status_ch1_Ready 0x01
#define ADC_status_ch2_Ready 0x02
#define ADC_status_ch3_Ready 0x04
#define ADC_status_ch4_Ready 0x08
#define D_ADC_CHANNEL_NUM 4
// #define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 ))
// #define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000)
// //STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG
// //寄存器编号从1开始
// //#define D_COUNT_WEIGHT(adc) (U32)(1000.0 * R.p.weight_max * (adc) / (2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd))
// //#define D_blur_threshold_2_1(threshold) (U32) ( 1.0 * threshold *(2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd) / (1000.0 * R.p.weight_max ))
// #define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 ))
// #define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000)
// #define ADC_status_chx_Ready_BASE 0x01
// #define ADC_status_ch1_Ready 0x01
// #define ADC_status_ch2_Ready 0x02
// #define ADC_status_ch3_Ready 0x04
// #define ADC_status_ch4_Ready 0x08
// #define D_ADC_CHANNEL_NUM 4
#define LED_BTN_NUM 14
#define POWER_NORMAL 0
#define POWER_LOW 1
#define RFID_BUF_NUM 4
typedef struct global_register
{
//RO Register
U16 reserved1;
U32 total_weight; //净重(显示重量)*100
U32 total_zweight; //皮重*100
//RW Register
U16 reserved2;
U16 zero; //清0标志,写入任何值清0(去皮)
U16 status_eep_save; //eep写入寄存器,1则写入eep并清0
//U16 reset; //reset标志,写入任何值,所有参数恢复初始值
struct
{ //需要持久化的参数,不能超过72字节,否则会导致eeprom溢出
U16 slaver_id;
U16 adc_ch_status;
U16 weight_max; //量程
U16 lmd; //2mv/v
U16 adc_blur_mid; //中值滤波
U16 adc_blur_avg; //均值滤波
U16 adc_blur_shift[3]; //移位滤波点数
U16 adc_blur_threshold[2]; //移位滤波阀值
}p;
U16 reserved3;
U32 adval[D_ADC_CHANNEL_NUM]; //4路重量
U32 ch_weight[D_ADC_CHANNEL_NUM]; //4路重量
U32 rough_weight; // 毛重
//RFID对照表
U16 rfid_table[LED_BTN_NUM];
//本机ID
U8 slave_id;
//低功耗模式
U8 power_mode;
//led状态标志,分表代表第n个led灯的状态
U8 led_status[LED_BTN_NUM];
//授权标志
//高4位代表是否需要授权 高4位0代表无须授权,高4位>0代表需要授权
//低4位 > 0代表已授权,低4位==0代表未授权
//0x01 代表按键不需要授权、已授权
//0x00 代表按键不需要授权、未授权
//0x11 代表按键需要授权、已授权
//0x10 代表按键需要授权、未授权
U8 auth_flag;
//功能按键
U8 func_btn;
//NFC缓冲区
struct {
//nfc卡号,只取后2个字节
U8 nfc_no[2];
}nfc;
//RFID缓冲区
struct {
//rfid卡号,只取后2个字节
U8 rfid_no[2];
//rfid信号强度
U8 rssi;
//rfid天线编号1,2,3,4 FF代表按键
U8 ant;
}rfids[4];
//心电模式
U8 xd_mode;
}GlobalRegister;
extern GlobalRegister R;
@ -80,6 +105,12 @@ extern void L3_reg_2_iap(void);
extern void L3_iap_2_reg(void);
extern void L3_reg_reset(void);
extern void L3_reg_init(void);
extern void L3_led_clear(void);
extern void L3_nfc_clear(void);
extern void L3_rfid_clear(void);
extern void L3_set_power_mode(U8 mode);
extern U8 L3_find_rfid_table(U16 rfidno);
extern U8 L3_new_rfid(U16 rfidno, U8 rssi, U8 ant);
#endif

132
source/app/main.c

@ -75,7 +75,7 @@ stc5ac32s
************************************************/
//===============================================
//寄存器头文件
//===============================================
//===============================================
#include "main.h"
@ -83,25 +83,51 @@ void L0_main_init(void)
{
//Lc_delay_ms(200);
L0_board_config();
L0_uart0_buf_init();//串口初始化
EA = 1;
//Lc_delay_ms(100);
//串口初始化
L0_uart0_buf_init();
L0_uart2_buf_init();
L0_uart3_buf_init();
L0_uart4_buf_init();
//系统定时器初始化
L1_tick_init();
L0_timer0_Init();
//全局寄存器初始化
L3_reg_init();
L3_param_init();
L2_485_init();
L0_ADS1213_INIT();
// L3_param_init();
// L0_ADS1213_INIT();
//打开系统总中断
EA = 1;
L0_uart0_sendArray("v1.3",4);
}
void L0_task_init()
{
//外设初始化
bsp_led_init();
// bsp_key_init();
bsp_key_nonblock_init();
bsp_rfid_init();
//任务初始化
L3_task_nfc_init();
L3_task_rfid_init();
L3_task_rs485_init();
L3_task_bled_init();
L3_task_btn_init();
L3_task_auth_init();
L3_task_low_power_init();
L3_task_adc_init(0);
L3_task_adc_init(1);
L3_task_adc_init(2);
L3_task_adc_init(3);
// L3_task_adc_init(0);
// L3_task_adc_init(1);
// L3_task_adc_init(2);
// L3_task_adc_init(3);
//L3_task_debug_init();
L3_task_show_init();
L3_task_reglisten_init();
L0_uart0_sendArray("v2.7",4);
//L3_task_show_init();
//L3_task_reglisten_init();
}
//===============================================
@ -109,35 +135,93 @@ void L0_main_init(void)
//===============================================
void main(void)
{
U8 key = 0;
U8 count = 0;
#if 0
L0_board_config();
while(1)
{
LED0 = LED0_ON;
delayInMs(500);
LED0 = LED0_OFF;
delayInMs(500);
}
#endif
//初始化
L0_main_init();
//验证加密信息
//L3_encrypt_handler();
//主循环
//任务及外设初始化
L0_task_init();
//上电延时方便输出
delayInMs(1000);
//输出版本号
L0_uart0_sendArray("v2.8",4);
L0_uart0_0d0a();
//获取mcuid
L0_id_get_chipid();
L0_uart0_sendArrayHex(mcuid, MSP_ID_LEN);
L0_uart0_0d0a();
while(1)
{
if(1 == s_nos_tick.t1s_heatbeart)
{
s_nos_tick.t1s_heatbeart = 0;
LED0 ^= 1;
L0_uart0_uc('.');
// L0_uart0_uchex(g_uart3_recv_num);
// L0_uart0_uchex(count);
// L0_uart0_sendArray("v2.7",4);
//L0_uartN_sendstr(0,"v2.8111");
}
//设置bled任务
L3_task_bled_handler(&_s_task_bled);
// //扫描键盘任务
L3_task_btn_handler(&_s_task_btn);
// //10s认证过期
L3_task_auth_handler(&_s_task_auth);
//低功耗模式
L3_task_low_power_handler(&_s_task_low_power);
//NFC协议处理
L3_task_nfc_handler(&_s_task_nfc);
// // //RFID协议处理
L3_task_rfid_handler(&_s_task_rfid);
// // //RS485协议处理
L3_task_rs485_handler(&_s_task_rs485);
//串口调试
// if(ts_uart3_recv_buf.ok == 1){
// // count++;
// ts_uart3_recv_buf.ok = 0;
// L0_uart0_uchex(ts_uart3_recv_buf.reg);
// }
//L1_ADS1213_main();
//单路采集滤波
L3_task_adc_handler(0);
L3_task_adc_handler(1);
L3_task_adc_handler(2);
L3_task_adc_handler(3);
//L3_task_adc_handler(0);
//L3_task_adc_handler(1);
//L3_task_adc_handler(2);
//L3_task_adc_handler(3);
//显示
L3_task_adc_filter_show(&ts_adc_blur_show);
//L3_task_adc_filter_show(&ts_adc_blur_show);
//寄存器值监控
L3_task_reglisten_handle(&s_task_reglisten);
//L3_task_reglisten_handle(&s_task_reglisten);
//输出,响应485协议
L3_task_modbus_handler(&s_uart0_rec);
//L3_task_modbus_handler(&s_uart0_rec);
//调试输出
//L3_task_debug(&_s_task_debug);

26
source/app/main.h

@ -37,21 +37,33 @@
#ifndef _MAIN_H
#define _MAIN_H
#include "../msp/uart0.h"
#include "../msp/eeprom.h"
#include "../bsp/bsp_config.h"
#include "../bsp/bsp_config_delay.h"
#include "../bsp/bsp_led.h"
// #include "../bsp/bsp_key.h"
#include "../bsp/bsp_key_nonblock.h"
#include "../bsp/bsp_rfid.h"
#include "../bsp/chipid.h"
#include "../bsp/cs1232.h"
#include "../bsp/rs485.h"
#include "../msp/uart0.h"
#include "../msp/uart2.h"
#include "../msp/uart3.h"
#include "../msp/uart4.h"
#include "../msp/eeprom.h"
#include "../app/app_config.h"
#include "../app/task_modbus.h"
#include "../app/task_adc.h"
#include "../app/task_debug.h"
#include "../app/task_register.h"
#include "../app/task_encrypt.h"
#include "../app/task_nfc.h"
#include "../app/task_rfid.h"
#include "../app/task_rs485.h"
#include "../app/task_bled.h"
// #include "../app/task_btn.h"
#include "../app/task_btn_nonblock.h"
#include "../app/task_nfc_auth.h"
#include "../app/task_low_power.h"
//////////////////////////////////////////////////////////////////

BIN
source/app/source.lnk

Binary file not shown.

418
source/app/task_adc.c

@ -1,418 +0,0 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_adc.h"
#include "../bsp/bsp_config.h"
#include "../bsp/cs1232.h"
#include "../msp/uart0.h"
//=============================================
//S_TASK_ADC_CHANNEL_BLUR ts_adc_channel_blurs[D_ADC_CHANNEL_NUM];
//S_TASK_ADC_CHANNEL_SHOW ts_adc_channel_show;
S_TASK_ADC_CHANNEL_SAMPLE ts_adc_channel_samples[D_ADC_CHANNEL_NUM];
//S_TASK_ADC_BLUR_MID ts_adc_blur_mid[D_ADC_CHANNEL_NUM];
S_TASK_ADC_BLUR_AVG ts_adc_blur_avg[D_ADC_CHANNEL_NUM];
S_TASK_ADC_BLUR_SHIFT ts_adc_blur_shift[D_ADC_CHANNEL_NUM];
S_TASK_ADC_BLUR_OUT ts_adc_blur_out[D_ADC_CHANNEL_NUM];
S_TASK_ADC_BLUR_SHOW ts_adc_blur_show;
static U8 count_n(u8 n,u8 d)
{
if(n < d)
{
return MAX_OUT_NUM + n - d ;
}
else
{
return n-d;
}
}
U32 Abs(S32 a)
{
if(a < 0)
{
a = -a;
}
return a;
}
//ch是0123,代表4通道
void L3_task_adc_init(U8 ch)
{
//通道采集任务初始化
L1_task_init(&ts_adc_channel_samples[ch].task);
L3_task_s_go(ts_adc_channel_samples[ch],D_task_init);
ts_adc_channel_samples[ch].status = (R.p.adc_ch_status >> ch) & 0x1;
ts_adc_channel_samples[ch].pool = 0;
ts_adc_channel_samples[ch].adcval = 0;
ts_adc_channel_samples[ch].n = 0;
ts_adc_channel_samples[ch].ch = D_ADCCH_1 + ch;
#if 0
//通道中值滤波任务初始化
L1_task_init(&ts_adc_blur_mid[ch].task);
L3_task_s_go(ts_adc_blur_mid[ch],D_task_init);
ts_adc_blur_mid[ch].n = 0;
ts_adc_blur_mid[ch].max = R.p.adc_blur_mid;
ts_adc_blur_mid[ch].ch = D_ADCCH_1 + ch;
#endif
//通道均值滤波任务初始化
L1_task_init(&ts_adc_blur_avg[ch].task);
L3_task_s_go(ts_adc_blur_avg[ch],D_task_init);
ts_adc_blur_avg[ch].max = R.p.adc_blur_avg;
ts_adc_blur_avg[ch].avgval = 0;
ts_adc_blur_avg[ch].n = 0;
ts_adc_blur_avg[ch].ch = D_ADCCH_1 + ch;
//通道移位滤波任务初始化
L1_task_init(&ts_adc_blur_shift[ch].task);
L3_task_s_go(ts_adc_blur_shift[ch],D_task_init);
ts_adc_blur_shift[ch].n = 0;
ts_adc_blur_shift[ch].h = 0;
ts_adc_blur_shift[ch].shiftreg[0] = R.p.adc_blur_shift[0];
ts_adc_blur_shift[ch].shiftreg[1] = R.p.adc_blur_shift[1];
ts_adc_blur_shift[ch].shiftreg[2] = R.p.adc_blur_shift[2];
ts_adc_blur_shift[ch].sum[0] = 0;
ts_adc_blur_shift[ch].sum[1] = 0;
ts_adc_blur_shift[ch].sum[2] = 0;
ts_adc_blur_shift[ch].shiftval[0] = 0;
ts_adc_blur_shift[ch].shiftval[1] = 0;
ts_adc_blur_shift[ch].shiftval[2] = 0;
ts_adc_blur_shift[ch].ch = D_ADCCH_1 + ch;
//输出判定任务初始化
L1_task_init(&ts_adc_blur_out[ch].task);
L3_task_s_go(ts_adc_blur_out[ch],D_task_init);
ts_adc_blur_out[ch].h= 0;
ts_adc_blur_out[ch].threshold[0] = D_COUNT_ADC(R.p.adc_blur_threshold[0]); //2KG
ts_adc_blur_out[ch].threshold[1] = D_COUNT_ADC(R.p.adc_blur_threshold[1]); //0.5KG
ts_adc_blur_out[ch].newnum = 0;
ts_adc_blur_out[ch].oldnum = 0;
ts_adc_blur_out[ch].newout = 0;
ts_adc_blur_out[ch].n = 0;
ts_adc_blur_out[ch].ch = D_ADCCH_1 + ch;
#if 0
//通道切换任务初始化
//L1_task_init(&ts_adc_channel_switch.task);
L3_task_s_go(ts_adc_channel_switch,D_task_init);
#endif
}
void L3_task_show_init(void)
{
//显示任务初始化
L1_task_init(&ts_adc_blur_show.task);
L3_task_s_go(ts_adc_blur_show,D_task_init);
ts_adc_blur_show.rough_weight = 0;
}
//ADC Channel 采样任务
#define D_task_ADC_CHx_SAMPLE_WAIT_LOW 0x53
#define D_task_ADC_CHx_SAMPLE_READ 0x54
#define D_task_ADC_CHx_SAMPLE_OUT 0x55
void L3_task_adc_channel_sample(S_TASK_ADC_CHANNEL_SAMPLE *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_SAMPLE_WAIT_LOW);
TTSS_Task_step(D_task_ADC_CHx_SAMPLE_WAIT_LOW)
if(s->status == ADC_CHANNEL_STATUS_READY) //需要判断status是否ready,ready则读取,否则使用pool值
{
if(0 == L0_2dc_DOUT_AT(s->ch))
{
L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
}
}
else
{
s->adcval = s->pool;
L2_task_go_Tdelay(D_task_ADC_CHx_SAMPLE_OUT,D_Tdelay_Msec(15)); //延时15ms,模拟一次采样过程
}
TTSS_Task_step(D_task_ADC_CHx_SAMPLE_READ)
if(s->status == ADC_CHANNEL_STATUS_READY) //需要重新判断status是否ready,因为channel_switch任务随时可能修改status状态
{
s->adcval = Abs(L0_ADS1231_readCH(s->ch));
L2_task_go(D_task_ADC_CHx_SAMPLE_OUT);
}
else
{
L2_task_go(D_task_ADC_CHx_SAMPLE_WAIT_LOW);
}
TTSS_Task_step(D_task_ADC_CHx_SAMPLE_OUT)
//不判断ready,不管是采集到的真实数据还是pool数据,都继续执行
s->pool = s->adcval;
s->out[s->n] = s->adcval;
//R.adval[s->ch] = s->out[s->n];
//L0_uart0_ulhex(R.adval[s->ch]);L0_uart0_0d0a();
s->n++;
#if 0
L0_uart0_ulhex(s->out[count_n(s->n,1)]);
L0_uart0_uc(' ');
//L0_uart0_ulhex(ts_adc_blur_mid[s->ch].out[count_n(ts_adc_blur_mid[s->ch].n,1)]);
//L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n,1)]);
L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_blur_shift[s->ch].shiftval[0]);
L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_blur_shift[s->ch].shiftval[1]);
L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_blur_shift[s->ch].shiftval[2]);
L0_uart0_uc(' ');
L0_uart0_ulhex(R.adval[s->ch]);
L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_blur_out[s->ch].oldnum);
L0_uart0_0d0a();
#endif
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_SAMPLE_WAIT_LOW);
TTSS_Task_end();
}
#if 0
//中值滤波任务
#define D_task_ADC_CHx_FILTER_MID_GET 0x50
#define D_task_ADC_CHx_FILTER_MID_COUNT 0x51
#define D_task_ADC_CHx_FILTER_MID_OUT 0x52
void L3_task_adc_filter_mid(S_TASK_ADC_BLUR_MID *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_FILTER_MID_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_GET)
if(ts_adc_channel_samples[s->ch].n >= s->max)
{
U8 i = 0;
for(i=0;i<s->max;i++)
{
s->in[i] = ts_adc_channel_samples[s->ch].out[i];
}
ts_adc_channel_samples[s->ch].n = 0;
L2_task_go(D_task_ADC_CHx_FILTER_MID_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_COUNT)
s->midval = Lc_vS32_media(s->in, s->max);
L2_task_go(D_task_ADC_CHx_FILTER_MID_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_OUT)
s->out[s->n] = s->midval;
//R.adval[s->ch] = s->out[s->n];
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_FILTER_MID_GET);
TTSS_Task_end();
}
#endif
//均值滤波任务
#define D_task_ADC_CHx_FILTER_AVG_GET 0x50
#define D_task_ADC_CHx_FILTER_AVG_COUNT 0x51
#define D_task_ADC_CHx_FILTER_AVG_OUT 0x52
void L3_task_adc_filter_avg(S_TASK_ADC_BLUR_AVG *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_FILTER_AVG_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_GET)
if(ts_adc_channel_samples[s->ch].n >= s->max)
{
U8 i = 0;
ts_adc_channel_samples[s->ch].n = 0;
for(i=0;i<s->max;i++)
{
s->in[i] = ts_adc_channel_samples[s->ch].out[i];
}
L2_task_go(D_task_ADC_CHx_FILTER_AVG_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_COUNT)
s->avgval = Lc_vU32_avg(s->in,s->max);
L2_task_go(D_task_ADC_CHx_FILTER_AVG_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_OUT)
s->out[s->n] = s->avgval;
//R.adval[s->ch] = s->out[s->n];
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_FILTER_AVG_GET);
TTSS_Task_end();
}
//移位滤波任务
#define D_task_ADC_CHx_FILTER_SHIFT_GET 0x50
#define D_task_ADC_CHx_FILTER_SHIFT_COUNT 0x51
#define D_task_ADC_CHx_FILTER_SHIFT_OUT 0x52
void L3_task_adc_filter_shift(S_TASK_ADC_BLUR_SHIFT *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_GET)
if(s->h != ts_adc_blur_avg[s->ch].n)
{
s->in = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n,1)];
s->h = ts_adc_blur_avg[s->ch].n;
L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_COUNT)
s->sum[0] -= s->shiftval[0];
s->sum[0] += s->in;
s->shiftval[0] = s->sum[0] >> s->shiftreg[0];
s->sum[1] -= s->shiftval[1];
s->sum[1] += s->in;
s->shiftval[1] = s->sum[1] >> s->shiftreg[1];
s->sum[2] -= s->shiftval[2];
s->sum[2] += s->in;
s->shiftval[2] = s->sum[2] >> s->shiftreg[2];
L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_OUT)
s->out[0][s->n] = s->shiftval[0];
s->out[1][s->n] = s->shiftval[1];
s->out[2][s->n] = s->shiftval[2];
//R.adval[s->ch] = s->out[0][s->n] = s->shiftval[0];
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_GET);
TTSS_Task_end();
}
//输出判定任务
#define D_task_ADC_CHx_FILTER_OUT_GET 0x50
#define D_task_ADC_CHx_FILTER_OUT_COUNT 0x51
#define D_task_ADC_CHx_FILTER_OUT_CHANGE 0x52
#define D_task_ADC_CHx_FILTER_OUT_OUT 0x53
void L3_task_adc_filter_out(S_TASK_ADC_BLUR_OUT *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_FILTER_OUT_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_GET)
if(s->h != ts_adc_blur_shift[s->ch].n)
{
s->h = ts_adc_blur_shift[s->ch].n;
s->in[0] = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n, 1)];
s->in[1] = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n, 2)];
//获取输出曲线val
s->newout = ts_adc_blur_shift[s->ch].out[s->oldnum][count_n(ts_adc_blur_shift[s->ch].n, 1)];
L2_task_go(D_task_ADC_CHx_FILTER_OUT_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_COUNT) //根据阀值选择输出的曲线
//判断选择新曲线
if(Lc_abs(s->in[0] , s->in[1]) >= s->threshold[0])//2KG
{
s->newnum = 0;
}
else if(Lc_abs(s->in[0] , s->in[1]) >= s->threshold[1]) //0.5KG
{
s->newnum = 1;
}
else
{
s->newnum = 2;
}
//L2_task_go(D_task_ADC_CHx_FILTER_OUT_OUT);
L2_task_go(D_task_ADC_CHx_FILTER_OUT_CHANGE);
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_CHANGE)
if(s->newnum != s->oldnum)//切换移位滤波时调整其他滤波的SUM
{
s->oldnum = s->newnum; //不能只调整新值,所有曲线都要一起调整
//ts_adc_blur_shift[s->ch].sum[1] = (ts_adc_blur_avg[s->ch].out[ts_adc_blur_avg[s->ch].n] * R.adc_blur_avg);
ts_adc_blur_shift[s->ch].sum[0] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[0];
ts_adc_blur_shift[s->ch].shiftval[0] = s->newout;
ts_adc_blur_shift[s->ch].sum[1] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[1];
ts_adc_blur_shift[s->ch].shiftval[1] = s->newout;
ts_adc_blur_shift[s->ch].sum[2] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[2];
ts_adc_blur_shift[s->ch].shiftval[2] = s->newout;
}
L2_task_go(D_task_ADC_CHx_FILTER_OUT_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_OUT)
R.adval[s->ch] = s->newout;
//R.adval[s->ch] = ts_adc_channel_samples[s->ch].adcval;
L2_task_go(D_task_ADC_CHx_FILTER_OUT_GET);
TTSS_Task_end();
}
//显示任务
#define D_task_ADC_CHx_SHOW 0x50
void L3_task_adc_filter_show(S_TASK_ADC_BLUR_SHOW *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_SHOW);
TTSS_Task_step(D_task_ADC_CHx_SHOW)
R.ch_weight[0] = D_COUNT_WEIGHT(R.adval[0]);
R.ch_weight[1] = D_COUNT_WEIGHT(R.adval[1]);
R.ch_weight[2] = D_COUNT_WEIGHT(R.adval[2]);
R.ch_weight[3] = D_COUNT_WEIGHT(R.adval[3]);
s->rough_weight = R.ch_weight[0] + R.ch_weight[1] + R.ch_weight[2] + R.ch_weight[3]; //毛重
if( ABS(R.rough_weight,s->rough_weight) >= 50) //变化超过0.05KG
{
R.rough_weight = s->rough_weight;
R.total_weight = (R.rough_weight > R.total_zweight) ? (R.rough_weight - R.total_zweight) : (0);//净重
}
L2_task_go_Tdelay(D_task_ADC_CHx_SHOW,D_Tdelay_Msec(15)); //延时15ms
TTSS_Task_end();
}
void L3_task_adc_handler(u8 ch)
{
L3_task_adc_channel_sample(&ts_adc_channel_samples[ch]);
//L3_task_adc_filter_mid(&ts_adc_blur_mid[ch]);
L3_task_adc_filter_avg(&ts_adc_blur_avg[ch]);
L3_task_adc_filter_shift(&ts_adc_blur_shift[ch]);
L3_task_adc_filter_out(&ts_adc_blur_out[ch]);
}

119
source/app/task_adc.h

@ -1,119 +0,0 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_ADC_H
#define _APP_TASK_ADC_H
#include "../app/app_config.h"
#include "../ctask/task.h"
#include "../clib/clib.h"
#define ADC_CHANNEL_STATUS_UNREADY 0 //UnReady状态,不能读取
#define ADC_CHANNEL_STATUS_READY 1 //ready状态,可以读取
//AD_CHANNEL_SAMPLE 采样
#define MAX_OUT_NUM 6
typedef struct _s_task_adc_channel_sample
{
TS_task task;
vU8 status;
vU8 ch;
vU32 adcval;
vU32 pool;
vU8 n;
vU32 out[MAX_OUT_NUM];
}S_TASK_ADC_CHANNEL_SAMPLE;
//AD_BLUR_MID 中值滤波
typedef struct _s_task_adc_blur_mid
{
TS_task task;
vU8 ch;
vU8 max;
vU32 in[MAX_OUT_NUM];
vU32 midval;
vU8 n;
vU32 out[MAX_OUT_NUM];
}S_TASK_ADC_BLUR_MID;
//AD_BLUR_AVG 均值滤波
typedef struct _s_task_adc_blur_avg
{
TS_task task;
vU8 ch;
vU8 max;
vU32 in[MAX_OUT_NUM];
vU32 avgval;
vU8 n;
vU32 out[MAX_OUT_NUM];
}S_TASK_ADC_BLUR_AVG;
//AD_BLUR_SHIFT 移位滤波
typedef struct _s_task_adc_blur_shift
{
TS_task task;
vU8 ch;
vU8 n;
vU8 h;
vU8 shiftreg[3];
//vU8 max;
vU32 in;
vU32 sum[3];
vU32 shiftval[3];
vU32 out[3][MAX_OUT_NUM];
}S_TASK_ADC_BLUR_SHIFT;
//AD_BLUR_DECIDE 输出判定
typedef struct _s_task_adc_blur_out
{
TS_task task;
vU8 ch;
vU32 in[2];
U32 threshold[2];
vU8 h;
vU8 oldnum;
vU8 newnum;
vU32 newout;
vU8 n;
}S_TASK_ADC_BLUR_OUT;
//AD_BLUR_SHOW 显示
typedef struct _s_task_adc_blur_show
{
TS_task task;
vU32 rough_weight;
}S_TASK_ADC_BLUR_SHOW;
extern S_TASK_ADC_CHANNEL_SAMPLE ts_adc_channel_samples[D_ADC_CHANNEL_NUM];
//extern S_TASK_ADC_BLUR_MID ts_adc_blur_mid[D_ADC_CHANNEL_NUM];
extern S_TASK_ADC_BLUR_AVG ts_adc_blur_avg[D_ADC_CHANNEL_NUM];
extern S_TASK_ADC_BLUR_SHIFT ts_adc_blur_shift[D_ADC_CHANNEL_NUM];
extern S_TASK_ADC_BLUR_OUT ts_adc_blur_out[D_ADC_CHANNEL_NUM];
extern S_TASK_ADC_BLUR_SHOW ts_adc_blur_show;
extern void L3_task_adc_init(U8 ch);
extern void L3_task_show_init(void);
extern void L3_task_adc_handler(U8 ch);
extern void L3_task_adc_init_handler(void);
extern void L3_task_adc_channel_switch_handler(void);
extern void L3_task_adc_filter_show(S_TASK_ADC_BLUR_SHOW *s);
#endif // #ifndef _APP_TASK_ADC_H

72
source/app/task_bled.c

@ -0,0 +1,72 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_bled.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../bsp/bsp_led.h"
S_TASK_BLED _s_task_bled;
static int i;
void L3_task_bled_init(void)
{
L1_task_init(&_s_task_bled.task);
L3_task_s_go(_s_task_bled,D_task_init);
}
#define D_task_BLED_SET 0x50
extern U16 L0_led_array_2_dat();
void L3_task_bled_handler(S_TASK_BLED *s)
{
TTSS_Task_init()
L2_task_go(D_task_BLED_SET);
// TTSS_Task_step(D_task_BLED_SET)
// //L0_uart0_sendArrayHex(R.led_status, 14);
// for(i=0;i<LED_BTN_NUM; i++)
// {
// //BLED_SET_STATUS(i, R.led_status[i]);
// bsp_bled_set(i, R.led_status[i]);
// }
// L2_task_go_Tdelay(D_task_BLED_SET,D_Tdelay_200ms);
// //L2_task_go_Tdelay(D_task_BLED_SET,D_Tdelay_1s);
// TTSS_Task_end();
TTSS_Task_step(D_task_BLED_SET)
//L0_uart0_sendArrayHex(R.led_status, 14);
//设置LED0
bsp_bled0_set();
//其他其他LED
bsp_bled_set_multi(L0_led_array_2_dat());
L2_task_go_Tdelay(D_task_BLED_SET,D_Tdelay_200ms);
//L2_task_go_Tdelay(D_task_BLED_SET,D_Tdelay_1s);
TTSS_Task_end();
}
U16 L0_led_array_2_dat()
{
int i = 0;
U16 dat = 0;
for(i = 1; i < LED_BTN_NUM; i++)
{
dat |= ((U16)R.led_status[i] << (i-1));
}
return dat;
}

17
source/app/task_register.h → source/app/task_bled.h

@ -11,22 +11,23 @@
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_REG_H
#define _APP_TASK_REG_H
#ifndef _APP_TASK_BLED_H
#define _APP_TASK_BLED_H
#include "../ctask/task.h"
#include "../clib/clib.h"
#include "../tpc/debug.h"
typedef struct _s_task_reglisten
typedef struct _s_task_bled
{
TS_task task;
}S_TASK_REGVAL_LISTEN;
}S_TASK_BLED;
extern S_TASK_REGVAL_LISTEN s_task_reglisten;
extern S_TASK_BLED _s_task_bled;
extern void L3_task_reglisten_init(void);
extern void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s);
extern void L3_task_bled_init(void);
extern void L3_task_bled_handler(S_TASK_BLED *s);
#endif // #ifndef _APP_TASK_ADC_H
#endif // #ifndef _APP_TASK_BLED_H

83
source/app/task_btn.c

@ -0,0 +1,83 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_btn.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../bsp/bsp_key.h"
#include "../bsp/bsp_led.h"
S_TASK_BTN _s_task_btn;
static int i;
static U8 key;
void L3_task_btn_init(void)
{
L1_task_init(&_s_task_btn.task);
L3_task_s_go(_s_task_btn,D_task_init);
}
#define D_task_BTN_SET 0x50
void L3_task_btn_handler(S_TASK_BTN *s)
{
TTSS_Task_init()
L2_task_go(D_task_BTN_SET);
TTSS_Task_step(D_task_BTN_SET)
key = bsp_key_scan();
if(key != BSP_KEY_NUM_MAX){
L0_uart0_uc('#');
L0_uart0_uchex(key);
//功能按键
if(key == 0)
{
//设置功能按键按下
R.func_btn = 1;
//此处代码注释掉:因为低功耗由上位机处理
//功能键按下退出低功耗模式
//L3_set_power_mode(POWER_NORMAL);
}
//心电模式
else if(key == 13)
{
//设置心电模式按下
R.xd_mode ^= 1;
//亮灯
R.led_status[key] = R.xd_mode;
}
else if(key>=1 && key <=12)
{
//如果不需要授权 or 需要但已经授权
if(!(R.auth_flag & 0xF0) || (R.auth_flag & 0x0F))
{
//L0_uart0_uc('$');
//L0_uart0_uchex(key);
//设置对应的rfid
L3_new_rfid(R.rfid_table[key], 0, 0xFF);
//亮灯
R.led_status[key] = 1;
}
}
}
L2_task_go_Tdelay(D_task_BTN_SET,0);
TTSS_Task_end();
}

32
source/app/task_btn.h

@ -0,0 +1,32 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_BTN_H
#define _APP_TASK_BTN_H
#include "../ctask/task.h"
#include "../clib/clib.h"
typedef struct _s_task_btn
{
TS_task task;
}S_TASK_BTN;
extern S_TASK_BTN _s_task_btn;
extern void L3_task_btn_init(void);
extern void L3_task_btn_handler(S_TASK_BTN *s);
#endif // #ifndef _APP_TASK_BTN_H

113
source/app/task_btn_nonblock.c

@ -0,0 +1,113 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_btn_nonblock.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../bsp/bsp_key_nonblock.h"
#include "../bsp/bsp_led.h"
S_TASK_BTN _s_task_btn;
static int i;
static U8 key;
void L3_task_btn_init(void)
{
L1_task_init(&_s_task_btn.task);
L3_task_s_go(_s_task_btn,D_task_init);
}
#define D_TASK_BTN_SCAN 0x50
#define D_TASK_BTN_SHAKE 0x51
#define D_TASK_BTN_COMPLETE 0x52
void L3_task_btn_handler(S_TASK_BTN *s)
{
TTSS_Task_init()
L2_task_go(D_TASK_BTN_SCAN);
TTSS_Task_step(D_TASK_BTN_SCAN)
//检测是否有按键按下,并记录行、列
key = bsp_key_nonblock_scan(&s->row, &s->col);
if(key != BSP_KEY_NUM_MAX)
{
//检测到的按键按下次数
s->times = 0;
//最大次数阈值,超过阈值停止检测,判定为按键放开
s->times_threshold = 100;
//再次检测(防抖动、检测按键弹起)
L2_task_go_Tdelay(D_TASK_BTN_SHAKE, D_Tdelay_5ms);
}
TTSS_Task_step(D_TASK_BTN_SHAKE)
//检测当前列是否仍处于按下状态,或者按下超时
//此时row仍处于检测状态,不需要再次调用scan_row()
if(bsp_key_nonblock_scan_col(s->col) == 0 || s->times > s->times_threshold)
{
L2_task_go_Tdelay(D_TASK_BTN_COMPLETE, 0);
}
else
{
s->times ++;
//每5s检测一次
L2_task_go_Tdelay(D_TASK_BTN_SHAKE, D_Tdelay_5ms);
}
TTSS_Task_step(D_TASK_BTN_COMPLETE)
//至少一次,防抖动
if(s->times > 1)
{
L0_uart0_uc('#');
L0_uart0_uchex(key);
//功能按键
if(key == 0)
{
//设置功能按键按下
R.func_btn = 1;
//此处代码注释掉:因为低功耗由上位机处理
//功能键按下退出低功耗模式
//L3_set_power_mode(POWER_NORMAL);
}
//心电模式
else if(key == 13)
{
//设置心电模式按下
R.xd_mode ^= 1;
//亮灯
R.led_status[key] = R.xd_mode;
}
else if(key>=1 && key <=12)
{
//如果不需要授权 or 需要但已经授权
if(!(R.auth_flag & 0xF0) || (R.auth_flag & 0x0F))
{
//L0_uart0_uc('$');
//L0_uart0_uchex(key);
//设置对应的rfid
L3_new_rfid(R.rfid_table[key], 0, 0xFF);
//亮灯
R.led_status[key] = 1;
}
}
}
L2_task_go_Tdelay(D_TASK_BTN_SCAN,0);
TTSS_Task_end();
}

35
source/app/task_btn_nonblock.h

@ -0,0 +1,35 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_BTN_NONBLOCK_H
#define _APP_TASK_BTN_NONBLOCK_H
#include "../ctask/task.h"
#include "../clib/clib.h"
typedef struct _s_task_btn
{
TS_task task;
U8 row, col;
U16 times;
U16 times_threshold;
}S_TASK_BTN;
extern S_TASK_BTN _s_task_btn;
extern void L3_task_btn_init(void);
extern void L3_task_btn_handler(S_TASK_BTN *s);
#endif // #ifndef _APP_TASK_BTN_NONBLOCK_H

4
source/app/task_debug.c

@ -39,8 +39,8 @@ void L3_task_debug(S_TASK_DEBUG *s)
L0_uart0_uc(' ');
L0_uart0_ulhex(R.adval[3]);
L0_uart0_uc(' ');*/
L0_uart0_ulhex(R.total_weight);
L0_uart0_0d0a();
// L0_uart0_ulhex(R.total_weight);
// L0_uart0_0d0a();
L2_task_go_Tdelay(D_task_ADC_CHx_DEBUG,D_Tdelay_Msec(15)); //延时15ms
TTSS_Task_end();

97
source/app/task_low_power.c

@ -0,0 +1,97 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_low_power.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../bsp/bsp_rfid.h"
#include "../msp/uart0.h"
#include "../app/task_rfid.h"
S_TASK_LOW_POWER _s_task_low_power;
void L3_task_low_power_init(void)
{
L1_task_init(&_s_task_low_power.task);
L3_task_s_go(_s_task_low_power,D_task_init);
}
#define D_task_LOW_POWER_SET 0x50
#define D_task_LOW_POWER_CHANGE 0x51
#define D_task_XD_CHANGE 0x52
void L3_task_low_power_handler(S_TASK_LOW_POWER *s)
{
TTSS_Task_init()
s->power_mode = R.power_mode;
s->xd_mode = R.xd_mode;
L2_task_go(D_task_LOW_POWER_SET);
TTSS_Task_step(D_task_LOW_POWER_SET)
if(R.power_mode == POWER_LOW)
{
//低功耗模式除了功能按键,所有灯全灭
L3_led_clear();
//低功耗模式下禁用RFID
bsp_rfid_en(RFID_DISABLE);
//低功耗模式下,无法(也不需要)开启心电模式
R.xd_mode = 0;
}
L2_task_go_Tdelay(D_task_LOW_POWER_CHANGE,0);
TTSS_Task_step(D_task_LOW_POWER_CHANGE)
if(s->power_mode != R.power_mode)
{
s->power_mode = R.power_mode;
//退出低功耗模式时,启用RFID
if(R.power_mode == POWER_NORMAL)
{
//启用rfid
bsp_rfid_en(RFID_ENABLE);
//重新初始化RFID任务
L3_task_rfid_init();
//心电进入正常模式
R.xd_mode = 0;
}
}
L2_task_go_Tdelay(D_task_XD_CHANGE,0);
TTSS_Task_step(D_task_XD_CHANGE)
//正常功耗模式下,心电模式才有意义
if(R.power_mode == POWER_NORMAL)
{
if(s->xd_mode != R.xd_mode)
{
s->xd_mode = R.xd_mode;
if(R.xd_mode == 0)
{
//启用rfid
bsp_rfid_en(RFID_ENABLE);
//重新初始化RFID任务
L3_task_rfid_init();
}
else
{
//禁用RFID
bsp_rfid_en(RFID_DISABLE);
}
}
}
L2_task_go_Tdelay(D_task_LOW_POWER_SET,D_Tdelay_500ms);
TTSS_Task_end();
}

34
source/app/task_low_power.h

@ -0,0 +1,34 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_LOW_POWER_H
#define _APP_TASK_LOW_POWER_H
#include "../ctask/task.h"
#include "../clib/clib.h"
typedef struct _s_task_low_power
{
U8 power_mode;
U8 xd_mode;
TS_task task;
}S_TASK_LOW_POWER;
extern S_TASK_LOW_POWER _s_task_low_power;
extern void L3_task_low_power_init(void);
extern void L3_task_low_power_handler(S_TASK_LOW_POWER *s);
#endif // #ifndef _APP_TASK_LOW_POWER_H

26
source/app/task_modbus.c

@ -177,20 +177,20 @@ void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_in
}
void L3_task_modbus_handler(TP_Handler_X *ph4)
void L3_task_modbus_handler(Ts_uart_recv_buf *ph4)
{
if(ph4->ok)
{
TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf;
//L0_uart0_sendArray(ph4->buf, 8);
//L0_uart0_sendArray("abcdefgh", 8);
ph4->ok = 0;
if(ts_modbus->slaver == R.p.slaver_id || ts_modbus->slaver == D_UART4_485_SLAVER_ID_BROADCAST) //从机
{
U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack);
L0_uart0_sendArray((U8*)&s_uart0_ack, acklen);
}
}
// if(ph4->ok)
// {
// TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf;
// //L0_uart0_sendArray(ph4->buf, 8);
// //L0_uart0_sendArray("abcdefgh", 8);
// ph4->ok = 0;
// if(ts_modbus->slaver == R.p.slaver_id || ts_modbus->slaver == D_UART4_485_SLAVER_ID_BROADCAST) //从机
// {
// U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack);
// L0_uart0_sendArray((U8*)&s_uart0_ack, acklen);
// }
// }
}

2
source/app/task_modbus.h

@ -4,6 +4,6 @@
#include "../ctask/task.h"
#include "../tpc/modbus.h"
extern void L3_task_modbus_handler(TP_Handler_X *ph4);
extern void L3_task_modbus_handler(Ts_uart_recv_buf *ph4);
#endif

98
source/app/task_nfc.c

@ -0,0 +1,98 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_nfc.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../msp/uart3.h"
S_TASK_NFC _s_task_nfc;
//=============================================
void L3_task_nfc_init(void)
{
L1_task_init(&_s_task_nfc.task);
L3_task_s_go(_s_task_nfc,D_task_init);
}
#define D_task_NFC_READ 0x50
void L3_task_nfc_handler(S_TASK_NFC *s)
{
TTSS_Task_init()
L2_task_go(D_task_NFC_READ);
TTSS_Task_step(D_task_NFC_READ)
if(ts_uart[uNum3].r.ok == 1)
{
ts_uart[uNum3].r.ok = 0;
parse_nfc_pkg();
}
//send next
L2_task_go_Tdelay(D_task_NFC_READ, 0);
TTSS_Task_end();
}
//NFC协议:60 20 00 07 10 02 04 00 99 83 33 4E 36
//起始帧:60
//设备ID:20
//数据长度:00 07
//命令:10
//数据:02 04 00 99 83 33 4E
//校验:36 从起始帧到数据字段 [60 20 00 07 10 02 04 00 99 83 33 4E] 的所有字节的依次异或值
void parse_nfc_pkg()
{
TPC_NFC *p = (TPC_NFC *) ts_uart[uNum3].r.buf;
p->ocr = p->buf[p->num[0] << 8 | p->num[1]];
if(p->head == 0x60 && 1 /*count_ocr() */)
{
U16 num = (U16)p->num[0] << 8 | p->num[1];
//只读取0x10的协议
if(p->cmd == 0x10 && num == 0x07){
//1.判定NFC卡号是否符合规则
//2.保存NFC卡号到寄存器
R.nfc.nfc_no[0] = p->buf[num-2];
R.nfc.nfc_no[1] = p->buf[num-1];
//3.设定授权标志
R.auth_flag |= 0x01;
//4.打印日志
print_nfc_pkg(p);
}
}
}
void print_nfc_pkg(TPC_NFC *p)
{
L0_uart0_sendstr("\r\n--------- Recv NFC --------\r\n");
L0_uart0_sendstr("id : ");
L0_uart0_uchex(p->slaveId);
L0_uart0_0d0a();
L0_uart0_sendstr("num: ");
L0_uart0_uchex(p->num[0]);
L0_uart0_uchex(p->num[1]);
L0_uart0_0d0a();
L0_uart0_sendstr("cmd: ");
L0_uart0_uchex(p->cmd);
L0_uart0_0d0a();
L0_uart0_sendstr("no : ");
L0_uart0_sendArrayHex(p->buf, (U16)p->num[0] << 8 | p->num[1]);
L0_uart0_0d0a();
L0_uart0_sendstr("ocr: ");
L0_uart0_uchex(p->buf[(U16)p->num[0] << 8 | p->num[1]]);
L0_uart0_0d0a();
}

42
source/app/task_nfc.h

@ -0,0 +1,42 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_NFC_H
#define _APP_TASK_NFC_H
#include "../ctask/task.h"
#include "../clib/clib.h"
typedef struct _s_task_nfc
{
TS_task task;
}S_TASK_NFC;
#define TPC_NFC_DAT_MAX 16
typedef struct _tpc_nfc_
{
U8 head;
U8 slaveId;
U8 num[2];
U8 cmd;
U8 buf[TPC_NFC_DAT_MAX];
U8 ocr;
}TPC_NFC;
extern S_TASK_NFC _s_task_nfc;
extern void L3_task_nfc_init(void);
extern void L3_task_nfc_handler(S_TASK_NFC *s);
extern void parse_nfc_pkg();
extern void print_nfc_pkg(TPC_NFC *p);
#endif // #ifndef _APP_TASK_NFC_H

60
source/app/task_nfc_auth.c

@ -0,0 +1,60 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_nfc_auth.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../msp/uart2.h"
S_TASK_AUTH _s_task_auth;
//=============================================
void L3_task_auth_init(void)
{
// _s_task_auth.auth_flag = R.auth_flag;
_s_task_auth.auth_flag = 0x00;
L1_task_init(&_s_task_auth.task);
L3_task_s_go(_s_task_auth,D_task_init);
}
#define D_task_AUTH_READ 0x50
#define D_task_AUTH_SETZERO 0x52
#define D_task_AUTH_PRINT 0x53
void L3_task_auth_handler(S_TASK_AUTH *s)
{
TTSS_Task_init()
L2_task_go(D_task_AUTH_READ);
TTSS_Task_step(D_task_AUTH_READ)
if(s->auth_flag != R.auth_flag){
s->auth_flag = R.auth_flag;
//授权中
if(R.auth_flag & 0x0F != 0){
L2_task_go_Tdelay(D_task_AUTH_SETZERO,D_Tdelay_10s);
}
}
TTSS_Task_step(D_task_AUTH_SETZERO)
//清除授权标志
R.auth_flag &= 0xF0;
// L0_uart0_sendstr("Auth Expired.");
// L2_task_go_Tdelay(D_task_AUTH_READ,0);
L2_task_go(D_task_AUTH_READ);
TTSS_Task_end();
}

34
source/app/task_nfc_auth.h

@ -0,0 +1,34 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_NFC_AUTH_H
#define _APP_TASK_NFC_AUTH_H
#include "../ctask/task.h"
#include "../clib/clib.h"
#include "../tpc/debug.h"
typedef struct _s_task_auth
{
TS_task task;
U8 auth_flag;
}S_TASK_AUTH;
extern S_TASK_AUTH _s_task_auth;
extern void L3_task_auth_init(void);
extern void L3_task_auth_handler(S_TASK_AUTH *s);
#endif // #ifndef _APP_TASK_NFC_AUTH_H

63
source/app/task_register.c

@ -1,63 +0,0 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_register.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
//=============================================
S_TASK_REGVAL_LISTEN s_task_reglisten;
void L3_task_reglisten_init(void)
{
L1_task_init(&s_task_reglisten.task);
L3_task_s_go(s_task_reglisten,D_task_init);
}
//清零任务
#define D_task_WEIGHT_COUNT 0x50
#define D_task_IAP 0x51
void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s)
{
TTSS_Task_init()
L2_task_go(D_task_WEIGHT_COUNT);
TTSS_Task_step(D_task_WEIGHT_COUNT)
if(R.zero != 0)
{
R.total_zweight = R.rough_weight; //皮重 = 毛重
R.total_weight = (R.rough_weight > R.total_zweight) ? (R.rough_weight - R.total_zweight) : (0);//净重
R.zero = 0;
}
L2_task_go(D_task_IAP); //延时100ms
TTSS_Task_step(D_task_IAP)
if(R.status_eep_save != 0)
{
R.status_eep_save = 0;
L3_reg_2_iap();//写入IAP
}
L2_task_go_Tdelay(D_task_WEIGHT_COUNT,D_Tdelay_Msec(100)); //延时100ms
TTSS_Task_end();
}

172
source/app/task_rfid.c

@ -0,0 +1,172 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_rfid.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../msp/uart4.h"
S_TASK_RFID _s_task_rfid;
// U8 RFID_READ_MASK[] = {'Y','F','R','S', 0x00, 0xAA};
U8 RFID_READ_MASK[] = {'Y','F','R','S', 0x00, 0xAA}; //59 46 52 53 00 AA
//4通道,读取次数 3 3 3 3
U8 rfidSetChannelCmd[] = {0xBB,0x00,0x1B,0x00,0x05,0x02,0x03,0x03,0x03,0x03,0x2E,0x7E};
//设置功率 26dBm
// U8 rfidSetWCmd[] = {0xBB,0x00,0xB6,0x00,0x02,0x0A,0x28,0xEA,0x7E};
//设置功率 24dBm
U8 rfidSetWCmd[] = {0xBB,0x00,0xB6,0x00,0x02,0x09,0x60,0x21,0x7E};
//选择卡片
U8 rfidSelCmd[] = {0x00};
//轮询读取(FFFF代表永久轮询)
U8 rfidLoopRead[] = {0xBB,0x00,0x27,0x00,0x03,0x22,0xFF,0xFF,0x4A,0x7E};
//=============================================
void L3_task_rfid_init(void)
{
_s_task_rfid.last_send_time = 0;
L1_task_init(&_s_task_rfid.task);
L3_task_s_go(_s_task_rfid,D_task_init);
}
#define D_task_RFID_SET 0x50
#define D_task_RFID_READ 0x51
void L3_task_rfid_handler(S_TASK_RFID *s)
{
TTSS_Task_init()
L0_uart0_uchex(sizeof(rfidSetChannelCmd) / sizeof(U8));
L0_uart0_uchex(sizeof(rfidSetWCmd) / sizeof(U8));
L0_uart0_uchex(sizeof(rfidSelCmd) / sizeof(U8));
L0_uart0_uchex(sizeof(rfidLoopRead) / sizeof(U8));
//注意这里加delay,因为rfid_en是强推挽模式,强推挽模式生效有延迟,经测试这里的时间需要>=2s
L2_task_go_Tdelay(D_task_RFID_SET,D_Tdelay_4s);
TTSS_Task_step(D_task_RFID_SET)
//1个小时发一次
if(s->last_send_time == 0 || D_sys_now - s->last_send_time > D_COUNT_JIFFIES(3600000))
{
//1.设置天线
L0_uart4_sendArray(rfidSetChannelCmd, sizeof(rfidSetChannelCmd) / sizeof(U8));
NOP10();
//2.设置功率
L0_uart4_sendArray(rfidSetWCmd, sizeof(rfidSetWCmd) / sizeof(U8));
NOP10();
//3.选择掩码
L0_uart4_sendArray(rfidSelCmd, sizeof(rfidSelCmd) / sizeof(U8));
NOP10();
//4.启动轮询
L0_uart4_sendArray(rfidLoopRead, sizeof(rfidLoopRead) / sizeof(U8));
NOP10();
//记录上次发送时间
s->last_send_time = D_sys_now;
}
L2_task_go(D_task_RFID_READ);
TTSS_Task_step(D_task_RFID_READ)
if(ts_uart[uNum4].r.ok == 1)
{
ts_uart[uNum4].r.ok = 0;
parse_rfid_pkg();
}
//read next
L2_task_go_Tdelay(D_task_RFID_SET,0);
TTSS_Task_end();
}
U8 verify_mask(U8 *rfid)
{
int i;
for(i=0;i<6;i++)
{
if(rfid[i] != RFID_READ_MASK[i])
{
return 0;
}
}
return 1;
}
//RFID协议:BB 02 22 00 11 D5 30 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 EB 98 0C 7E
//帧头:BB
//Type:00命令帧 /01响应帧 /02通知帧
//Command: 07指令桢 /22单次读写 /27多次轮询 /28停止轮询 /0C选择 / B6设置功率
//数据长度:00 11
//数据:RSSI PC PC EPC0 00 10 71 00 00 52 EPC7 ANT [EB 98]
//数据:D5 20 00 E2 00 10 71 00 00 52 9B 40 [EB 98]
//校验:0C 从Type到数据字段 [02 22 00 11 D5 30 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 EB 98] 的所有字节的累加和
//帧尾:7E
void parse_rfid_pkg()
{
TPC_RFID *p = (TPC_RFID *) ts_uart[uNum4].r.buf;
p->ocr = p->buf[p->num[0] << 8 | p->num[1]];
p->tail = p->buf[p->num[0] << 8 | p->num[1] + 1];
if(p->head == 0xBB && p->tail == 0x7E && 1 /*count_ocr() */)
{
//只读取type=0x02, cmd=0x22的协议
if(p->type == 0x02 && p->cmd == 0x22){
U8 index = 0;
U16 num = (U16)p->num[0] << 8 | p->num[1];
U16 rfidno = (U16)p->buf[num-5] << 8 | p->buf[num-4];
U8 rssi = p->buf[0];
U8 ant = p->buf[num-1];
//5.打印日志
print_rfid_pkg(p);
//校验RFID掩码
if(!verify_mask(&p->buf[num-11]))
{
L0_uart0_sendstr("---------- RFID Mask Error -------\r\n");
return;
}
//1.判定RFID卡号是否符合规则
//2.保存RFID卡号到寄存器
L3_new_rfid(rfidno, rssi, ant);
//3.查找编号是否在rfidtable中
index = L3_find_rfid_table(rfidno);
//4.亮灯
//TODO 如果缓冲区满了,没放进去,是否亮灯
if(index < LED_BTN_NUM){
R.led_status[index] = 1;
}
}
}
}
void print_rfid_pkg(TPC_RFID *p)
{
L0_uart0_sendstr("\r\n--------- Recv RFID --------\r\n");
L0_uart0_sendstr("type : ");
L0_uart0_uchex(p->type);
L0_uart0_0d0a();
L0_uart0_sendstr("cmd: ");
L0_uart0_uchex(p->cmd);
L0_uart0_0d0a();
L0_uart0_sendstr("num: ");
L0_uart0_uchex(p->num[0]);
L0_uart0_uchex(p->num[1]);
L0_uart0_0d0a();
L0_uart0_sendstr("dat : ");
L0_uart0_sendArrayHex(p->buf, p->num[0] << 8 | p->num[1]);
L0_uart0_0d0a();
L0_uart0_sendstr("ocr: ");
L0_uart0_uchex(p->ocr);
L0_uart0_0d0a();
}

45
source/app/task_rfid.h

@ -0,0 +1,45 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_RFID_H
#define _APP_TASK_RFID_H
#include "../ctask/task.h"
#include "../clib/clib.h"
typedef struct _s_task_rfid
{
U32 last_send_time;
TS_task task;
}S_TASK_RFID;
#define TPC_RFID_DAT_MAX 32
typedef struct _tpc_rfid_
{
U8 head;
U8 type;
U8 cmd;
U8 num[2];
U8 buf[TPC_RFID_DAT_MAX];
U8 ocr;
U8 tail;
}TPC_RFID;
extern S_TASK_RFID _s_task_rfid;
extern void L3_task_rfid_init(void);
extern void L3_task_rfid_handler(S_TASK_RFID *s);
extern void parse_rfid_pkg();
extern void print_rfid_pkg(TPC_RFID *p);
#endif // #ifndef _APP_TASK_RFID_H

158
source/app/task_rs485.c

@ -0,0 +1,158 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_rs485.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../msp/uart2.h"
S_TASK_RS485 _s_task_rs485;
TPC_RS485 tpc_rs485;
TPC_RS485_ACK tpc_rs485_ack;
static U8 acklen = 0;
static U8 i = 0;
U16 setLedStatus = 0;
//=============================================
void L3_task_rs485_init(void)
{
L1_task_init(&_s_task_rs485.task);
L3_task_s_go(_s_task_rs485,D_task_init);
}
#define D_task_RS485_READ 0x50
#define D_task_RS485_PRINT 0x51
#define D_task_RS485_ACK 0x52
#define D_task_RS485_MODE 0x53
void L3_task_rs485_handler(S_TASK_RS485 *s)
{
TTSS_Task_init()
L2_task_go(D_task_RS485_READ);
TTSS_Task_step(D_task_RS485_READ)
if(ts_uart[uNum2].r.ok == 1)
{
ts_uart[uNum2].r.ok = 0;
parse_rs485_pkg();
}
//read next
L2_task_go_Tdelay(D_task_RS485_READ,0);
TTSS_Task_end();
}
//485协议:AA 00 04 01 10 00 00 15
//FILTER:固定1个字节 AA
//SLAVEID:固定1个字节,代表从机ID
//CMDER: 固定1个字节,代表命令,每个从机自己定义。
//NUM: 固定2个字节,高字节在前,代表后续DATA的长度(不包括ocr),比如0x0010,代表后续 16个字节
//DATA:(Num 个字节)数据域
//OCR:1个字节,代表校验和, = 从SlaveId开始 - DATA结束的所有字节之和。
void parse_rs485_pkg()
{
TPC_RS485 *p = (TPC_RS485 *) ts_uart[uNum2].r.buf;
p->ocr = p->buf[p->num[0] << 8 | p->num[1]];
if(p->head[0] == 0xAA && 1 /*count_ocr() */)
{
if(p->slaveId == R.slave_id && p->cmd == 0x10)
{
//1.buf[0]高4位是否需要授权标志
R.auth_flag &= 0x0F;
R.auth_flag |= p->buf[0] & 0xF0;
//2.buf[0]低四位是否进入低功耗模式
// R.low_power_mode = p->buf[0] & 0x0F;
L3_set_power_mode(p->buf[0] & 0x0F);
//3.buf[1-2], rfid映射
//TODO 上位机发过来的rfid编号如何处理
setLedStatus = (U16)p->buf[1] << 8 | p->buf[2];
if(setLedStatus != 0x00)
{
//0位是功能按键,常亮,不提供设置功能
for(i=1;i<LED_BTN_NUM;i++)
{
//不处理0,只处理1的情况(代表其他端产生了sop中的节点,比如平板上触发谈话等)
if((setLedStatus >> i) & 0x0001)
{
R.led_status[i] = 1;
}
}
}
//构造响应包,并且返回
acklen = constructor_rs485_ack();
//写出
L0_uart2_sendArray((U8*)&tpc_rs485_ack, acklen);
//日志
print_rs485_pkg(p);
}
}
}
void print_rs485_pkg(TPC_RS485 *p)
{
L0_uart0_sendstr("\r\n--------- Recv RS485 --------\r\n");
L0_uart0_sendstr("slaveId : ");
L0_uart0_uchex(p->slaveId);
L0_uart0_0d0a();
L0_uart0_sendstr("cmd: ");
L0_uart0_uchex(p->cmd);
L0_uart0_0d0a();
L0_uart0_sendstr("num: ");
L0_uart0_uchex(p->num[0]);
L0_uart0_uchex(p->num[1]);
L0_uart0_0d0a();
L0_uart0_sendstr("dat : ");
L0_uart0_sendArrayHex(p->buf, p->num[0] << 8 | p->num[1]);
L0_uart0_0d0a();
L0_uart0_sendstr("ocr: ");
L0_uart0_uchex(p->ocr);
L0_uart0_0d0a();
}
U8 constructor_rs485_ack()
{
U8 num = (1 + sizeof(R.nfc) + sizeof(R.rfids));
tpc_rs485_ack.head[0] = 0xAA;
// tpc_rs485_ack.head[1] = 0x55;
tpc_rs485_ack.slaveId = R.slave_id;
tpc_rs485_ack.cmd = 0x10;
tpc_rs485_ack.num[0] = (num >> 8) & 0xFF;
tpc_rs485_ack.num[1] = num & 0xFF;
tpc_rs485_ack.buf[0] = R.func_btn;
Lc_buf_copy_uc((U8*)&tpc_rs485_ack.buf[1], (U8*)&R.nfc, sizeof(R.nfc));
Lc_buf_copy_uc((U8*)&tpc_rs485_ack.buf[1+sizeof(R.nfc)], (U8*)R.rfids, sizeof(R.rfids));
tpc_rs485_ack.ocr = 0;
tpc_rs485_ack.ocr += tpc_rs485_ack.slaveId;
tpc_rs485_ack.ocr += tpc_rs485_ack.cmd;
tpc_rs485_ack.ocr += tpc_rs485_ack.num[0];
tpc_rs485_ack.ocr += tpc_rs485_ack.num[1];
for(i=0;i<num;i++)
{
tpc_rs485_ack.ocr += tpc_rs485_ack.buf[i];
}
tpc_rs485_ack.buf[num] = tpc_rs485_ack.ocr;
//清0资源
R.func_btn = 0;
L3_nfc_clear();
L3_rfid_clear();
return 5 + num + 1;
}

56
source/app/task_rs485.h

@ -0,0 +1,56 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_RS485_H
#define _APP_TASK_RS485_H
#include "../ctask/task.h"
#include "../clib/clib.h"
typedef struct _s_task_rs485
{
TS_task task;
}S_TASK_RS485;
#define TPC_RS485_DAT_MAX 32
typedef struct _tpc_rs485_
{
U8 head[1];
U8 slaveId;
U8 cmd;
U8 num[2];
U8 buf[TPC_RS485_DAT_MAX];
U8 ocr;
}TPC_RS485;
#define TPC_RS485_ACK_DAT_MAX 32
typedef struct _tpc_rs485_ack_
{
U8 head[1];
U8 slaveId;
U8 cmd;
U8 num[2];
U8 buf[TPC_RS485_ACK_DAT_MAX];
U8 ocr;
}TPC_RS485_ACK;
extern S_TASK_RS485 _s_task_rs485;
extern void L3_task_rs485_init(void);
extern void L3_task_rs485_handler(S_TASK_RS485 *s);
extern void parse_rs485_pkg();
extern void print_rs485_pkg(TPC_RS485 *p);
extern U8 constructor_rs485_ack();
#endif // #ifndef _APP_TASK_RS485_H

58
source/bsp/bsp_config.c

@ -24,6 +24,15 @@
void L0_board_config(void)
{
//LED
D_stdIO_P0_ALL();
D_stdIO_P1_ALL();
D_stdIO_P2_ALL();
D_stdIO_P3_ALL();
D_stdIO_P4_ALL();
D_stdIO_P5_ALL();
//uart0
#if (PIN_UART0_Rxd_30_Txd_31 == D_PIN_UART0)
BITN_0(P_SW1 ,BITN7);//
BITN_0(P_SW1 ,BITN6);// rxd p3.0 txd p3.1
@ -42,35 +51,40 @@ void L0_board_config(void)
#endif
//uart2
#if (PIN_UART2_Rxd_10_Txd_11 == D_PIN_UART2)
BITN_0(P_SW2 ,BITN0);// rxd2 p1.0 txd2 p1.1
#elif (PIN_UART2_Rxd_46_Txd_47 == D_PIN_UART2)
BITN_1(P_SW2 ,BITN0);// rxd2 p4.06 txd2 p4.7
#else
BITN_0(P_SW2 ,BITN0);// rxd2 p1.0 txd2 p1.1
//BITN_1(P_SW2 ,BITN0);// rxd2 p4.0 txd2 p4.2
#endif
//uart3
//P_SW2 = 0x02; // RXD3_2/P5.0, TXD3_2/P5.1
#if (PIN_UART3_Rxd_00_Txd_01 == D_PIN_UART3)
BITN_0(P_SW2 ,BITN1);// rxd2 p1.0 txd2 p1.1
#elif (PIN_UART3_Rxd_50_Txd_51 == D_PIN_UART3)
BITN_1(P_SW2 ,BITN1);// rxd2 p4.06 txd2 p4.7
#else
BITN_0(P_SW2 ,BITN1);// rxd2 p1.0 txd2 p1.1
#endif
//uart4
//BITN_1(P_SW2 ,BITN2);// rxd4 p5.2 txd4 p5.3
//BITN_0(P_SW2 ,BITN2);// rxd4 p0.2 txd4 p0.3
//485 RE/DE 配置推完输出 P55
BITN_0(P5M1,BITN5);BITN_1(P5M0,BITN5);
#if (PIN_UART4_Rxd_02_Txd_03 == D_PIN_UART4)
BITN_0(P_SW2 ,BITN2);// rxd2 p1.0 txd2 p1.1
#elif (PIN_UART4_Rxd_52_Txd_53 == D_PIN_UART4)
BITN_1(P_SW2 ,BITN2);// rxd2 p4.06 txd2 p4.7
#else
BITN_0(P_SW2 ,BITN2);// rxd2 p1.0 txd2 p1.1
#endif
//LED
D_stdIO_P1(BITN7);
D_stdIO_P5(BITN4);
//485 RE/DE 配置推完输出 P47,P14
D_HighI_P4(BITN7);
D_HighI_P1(BITN4);
//IO
D_stdIO_P1(BITN0);
D_stdIO_P1(BITN1);
D_stdIO_P1(BITN2);
D_stdIO_P1(BITN6);
D_stdIO_P3(BITN2);
D_stdIO_P3(BITN3);
D_stdIO_P3(BITN4);
D_stdIO_P3(BITN5);
D_stdIO_P3(BITN6);
D_stdIO_P3(BITN7);
//RFID-EN 强推挽
D_HighI_P0(BITN4);
//WDT
#if (TYPE_WDT_ENABLE == D_WDT_STATUS)
WDT_CONTR = 0x27; //使能看门狗,22M时钟下溢出时间约为5s,请注意添加喂狗程序
#else
@ -80,5 +94,3 @@ void L0_board_config(void)
//Lp0_Sys_timer_extern_handler被timer0中断调用
//Lp0_Sys_timer_extern_handler = L1_Sys_timer_extern_handler;
}

88
source/bsp/bsp_config.h

@ -81,22 +81,35 @@
#define D_uart0_BRT BRT_115200
#define D_uart0_SBIT SBIT_1
#define D_PIN_UART0 PIN_UART0_Rxd_30_Txd_31 //RXD, TXD
#define D_uart2_BRT BRT_115200
#define D_PIN_UART2 PIN_UART2_Rxd_46_Txd_47 //RXD2_2, TXD2_2
#define D_uart3_BRT BRT_115200
#define D_PIN_UART3 PIN_UART3_Rxd_50_Txd_51 //RXD3_2, TXD3_2
#define D_uart2_BRT BRT_9600
#define D_PIN_UART2 PIN_UART2_Rxd_10_Txd_11 //RXD2, TXD2
#define D_uart3_BRT BRT_9600
#define D_PIN_UART3 PIN_UART3_Rxd_00_Txd_01 //RXD3, TXD3
#define D_uart4_BRT BRT_115200
#define D_PIN_UART4 PIN_UART4_Rxd_02_Txd_03 //RXD4, TXD4
//485配置
#define D_UART4_485_TYPE TYPE_485_SLAVER //UART4启用485
#define D_UART4_485_SLAVER_ID_BROADCAST 0xFF //485从机总是响应0xFF消息
#define D_UART4_485_SLAVER_ID 0x01 //板卡作为485从机 slaverId
#define D_UART4_485_TX() P01 = 1; P00=1;
#define D_UART4_485_RX() P01 = 0; P00=0;
#define D_UART2_485_TYPE TYPE_485_SLAVER //UART4启用485
#if(D_UART2_485_TYPE == TYPE_485_SLAVER)
#define D_UART2_485_SLAVER_ID_BROADCAST 0xFF //485从机总是响应0xFF消息
#define D_UART2_485_SLAVER_ID 0x03 //板卡作为485从机 slaverId
#endif
#define D_485_DE P47
#define D_485_RE P14
#define D_UART2_485_TX() D_485_DE = 1; D_485_RE = 1;
#define D_UART2_485_RX() D_485_DE = 0; D_485_RE = 0;
#define D_UART0_485_TYPE TYPE_485_NONE //UART0不启用485
#define D_UART2_485_TYPE TYPE_485_NONE //UART2不启用485
#define D_UART3_485_TYPE TYPE_485_NONE //UART3不启用485
#define D_UART0_485_TX()
#define D_UART0_485_RX()
#define D_UART3_485_TYPE TYPE_485_NONE //UART2不启用485
#define D_UART3_485_TX()
#define D_UART3_485_RX()
#define D_UART4_485_TYPE TYPE_485_NONE //UART3不启用485
#define D_UART4_485_TX()
#define D_UART4_485_RX()
//MODBUS协议配置
//#define D_MODBUS_ENABLE //MODBS启用开关,如果不使用modbus,可以注释掉本行
@ -104,33 +117,38 @@
#define D_MODBUS_REG_MAX_NUM 32 //每次最多读取/写入的寄存器数量,此处的数量要注意和 D_tp_handle_x_len 对应
//外设定义
#define LED0_ON 1
#define LED0_OFF 0
#define LED0 P23 //LED5
//Button LED
#define BLED0_ON 0
#define BLED0_OFF 1
//0 1 2 3 4 5 6
//13 12 11 10 9 8 7
#define BLED0 P42 //NET9
#define BLED1 P41 //NET10
#define BLED2 P37 //NET11
#define BLED3 P35 //NET12
#define BLED4 P16 //NET13
#define BLED5 P15 //NET14
#define BLED6 P14 //NET15
#define BLED7 P47 //NET16
#define BLED8 P11 //NET17
#define BLED9 P26 //NET18
#define BLED10 P25 //NET19
#define BLED11 P21 //NET20
#define BLED12 P44 //NET21
#define BLED13 P22 //NET22
#define BLED0 P52 //NET9
//LED驱动芯片
#define MBI_SDI P07
#define MBI_CLK P06
#define MBI_LE P05
#define MBI_OE P53
//K->Key, R->ROW, C->COL
#define KR1 P36 //NET1
#define KR2 P17 //NET2
#define KR3 P06 //NET3
#define KR4 P43 //NET4
#define KC1 P10 //NET5
#define KC2 P07 //NET6
#define KC3 P13 //NET7
#define KC4 P20 //NET8
#define KR1 P50 //NET1
#define KR2 P15 //NET2
#define KR3 P27 //NET3
#define KR4 P25 //NET4
#define KC1 P46 //NET5
#define KC2 P45 //NET6
#define KC3 P26 //NET7
#define KC4 P34 //NET8
//RFID EN -- 暂未定义
#define RFID_ENABLE 1
#define RFID_DISABLE 0
#define RFID_EN_PIN P04 //RFID-EN >1.1v使能
//EEP存储地址定义
#define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes
@ -223,12 +241,12 @@
//STEP 5 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Uart CONFIG
#define SERIAL_MAX_NUM 1
#define SERIAL_MAX_NUM 4
////fixme:和cpu的程序容量息息相关
#define D_UART_send_buf_max 16 /// 9600bps = 10000bps = 1000 Bps = 1Byte/ms
/// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms
/// 128Bytes = 128*0.5ms = 64ms
#define D_UART_send_buf2_max 8 //此处改动会影响L0_uartN_ulhex函数
#define D_UART_send_buf2_max 8 //此处改动会影响L0_uartN_ulhex函数
//STEP 5 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Uart CONFIG End

214
source/bsp/bsp_config_delay.c

@ -0,0 +1,214 @@
#include "bsp_config_delay.h"
#if ((TYPE_MCU == TYPE_MCU_STC_8H) \
|| (TYPE_MCU == TYPE_MCU_STC_8G) \
|| (TYPE_MCU == TYPE_MCU_STC_8A) \
|| (TYPE_MCU == TYPE_MCU_STC_8F)) \
#if (D_sys_MainFre == MainFre_22M)
void Delay100us() //@22.1184MHz
{
unsigned char i, j;
i = 3;
j = 221;
do
{
while (--j);
} while (--i);
}
void Delay200us() //@22.1184MHz
{
unsigned char i, j;
_nop_();
i = 6;
j = 188;
do
{
while (--j);
} while (--i);
}
void Delay500us() //@22.1184MHz
{
unsigned char i, j;
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
void Delay600us() //@22.1184MHz
{
unsigned char i, j;
_nop_();
i = 18;
j = 57;
do
{
while (--j);
} while (--i);
}
void Delay1ms() //@22.1184MHz
{
unsigned char i, j;
i = 29;
j = 183;
do
{
while (--j);
} while (--i);
}
void Delay100ms() //@22.1184MHz
{
unsigned char i, j, k;
i = 12;
j = 57;
k = 122;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay200ms() //@22.1184MHz
{
unsigned char i, j, k;
i = 23;
j = 113;
k = 248;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay500ms() //@22.1184MHz
{
unsigned char i, j, k;
i = 57;
j = 27;
k = 112;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay600ms() //@22.1184MHz
{
unsigned char i, j, k;
i = 68;
j = 83;
k = 238;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay1000ms() //@22.1184MHz
{
unsigned char i, j, k;
i = 113;
j = 53;
k = 228;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void delayInMs(U16 n)
{
if(n<=50)
{
do{
Delay1ms();
}while(n--);
}
else if(n<=100)
{
Delay100ms();
}
else if(n<=200)
{
Delay200ms();
}
else if(n<=500)
{
Delay500ms();
}
else if(n<=600)
{
Delay600ms();
}
else if(n<=1000)
{
Delay1000ms();
}
else
{
}
}
void delayInUs(U16 n)
{
if(n<=100)
{
Delay100us();
}
else if(n<=200)
{
Delay200us();
}
else if(n<=500)
{
Delay500us();
}
else if(n<=600)
{
Delay600us();
}
else if(n<=1000)
{
Delay1ms();
}
else
{
}
}
#endif //end (D_sys_MainFre == MainFre_22M)
#endif

9
source/bsp/bsp_config_delay.h

@ -0,0 +1,9 @@
#ifndef _BSP_CONFIG_DELAY_H
#define _BSP_CONFIG_DELAY_H
#include "bsp_config.h"
extern void delayInUs(U16 n);
extern void delayInMs(U16 n);
#endif

150
source/bsp/bsp_key.c

@ -0,0 +1,150 @@
#include "bsp_key.h"
#include "bsp_config_delay.h"
U32 timeout = 0x3FFFFF;
U8 bsp_key_init(void)
{
//初始化为高电平
KR1 = KR2 = KR3 = KR4 = 1;
//初始化为高电平
KC1 = KC2 = KC3 = KC4 = 1;
return 0;
}
void scan_row(U8 r)
{
KR1 = 1;
KR2 = 1;
KR3 = 1;
KR4 = 1;
switch(r){
case 1:
KR1 = 0;break;
case 2:
KR2 = 0;break;
case 3:
KR3 = 0;break;
case 4:
KR4 = 0;break;
default:
break;
}
}
U8 scan_col(U8 c)
{
timeout = 0x3FFFFF;
if(c == 1)
{
if(KC1 == 0)
{
delayInMs(10);
if(KC1 == 0)
{
while(KC1 == 0 && timeout--);
return 1;
}
}
}
else if(c == 2){
if(KC2 == 0)
{
delayInMs(10);
if(KC2 == 0)
{
while(KC2 == 0 && timeout--);
return 1;
}
}
}
else if(c == 3){
if(KC3 == 0)
{
delayInMs(10);
if(KC3 == 0)
{
while(KC3 == 0 && timeout--);
return 1;
}
}
}
else if(c == 4){
if(KC4 == 0)
{
delayInMs(10);
if(KC4 == 0)
{
while(KC4 == 0 && timeout--);
return 1;
}
}
}
return 0;
}
U8 bsp_key_scan(void)
{
//扫描第1行
scan_row(1);
if(scan_col(1) > 0){
return 0;
}
if(scan_col(2) > 0){
return 1;
}
if(scan_col(3) > 0){
return 2;
}
if(scan_col(4) > 0){
return 3;
}
//扫描第2行
scan_row(2);
if(scan_col(1) > 0){
return 4;
}
if(scan_col(2) > 0){
return 5;
}
if(scan_col(3) > 0){
return 6;
}
if(scan_col(4) > 0){
return 7;
}
//扫描第3行
scan_row(3);
if(scan_col(1) > 0){
return 8;
}
if(scan_col(2) > 0){
return 9;
}
if(scan_col(3) > 0){
return 10;
}
if(scan_col(4) > 0){
return 11;
}
//扫描第4行
scan_row(4);
if(scan_col(1) > 0){
return 12;
}
if(scan_col(2) > 0){
return 13;
}
// if(scan_col(KC3) > 0){
// return 14;
// }
// if(scan_col(KC4) > 0){
// return 15;
// }
return BSP_KEY_NUM_MAX;
}

11
source/bsp/bsp_key.h

@ -0,0 +1,11 @@
#ifndef _BSP_KEY_H
#define _BSP_KEY_H
#include "bsp_config.h"
#define BSP_KEY_NUM_MAX 99
extern U8 bsp_key_init(void);
extern U8 bsp_key_scan(void);
#endif

138
source/bsp/bsp_key_nonblock.c

@ -0,0 +1,138 @@
#include "bsp_key_nonblock.h"
U32 timeout = 0x3FFFFF;
U8 bsp_key_nonblock_init(void)
{
//初始化为高电平
KR1 = KR2 = KR3 = KR4 = 1;
//初始化为高电平
KC1 = KC2 = KC3 = KC4 = 1;
return 0;
}
void bsp_key_nonblock_scan_row(U8 r)
{
KR1 = 1;
KR2 = 1;
KR3 = 1;
KR4 = 1;
switch(r){
case 1:
KR1 = 0;break;
case 2:
KR2 = 0;break;
case 3:
KR3 = 0;break;
case 4:
KR4 = 0;break;
default:
break;
}
}
U8 bsp_key_nonblock_scan_col(U8 c)
{
if(c == 1)
{
return (KC1 == 0);
}
else if(c == 2)
{
return (KC2 == 0);
}
else if(c == 3)
{
return (KC3 == 0);
}
else if(c == 4)
{
return (KC4 == 0);
}
return 0;
}
U8 bsp_key_nonblock_scan(U8 *row, U8 *col)
{
//扫描第1行
bsp_key_nonblock_scan_row(1);
*row = 1;
if(bsp_key_nonblock_scan_col(1) > 0){
*col = 1;
return 0;
}
if(bsp_key_nonblock_scan_col(2) > 0){
*col = 2;
return 1;
}
if(bsp_key_nonblock_scan_col(3) > 0){
*col = 3;
return 2;
}
if(bsp_key_nonblock_scan_col(4) > 0){
*col = 4;
return 3;
}
//扫描第2行
bsp_key_nonblock_scan_row(2);
*row = 2;
if(bsp_key_nonblock_scan_col(1) > 0){
*col = 1;
return 4;
}
if(bsp_key_nonblock_scan_col(2) > 0){
*col = 2;
return 5;
}
if(bsp_key_nonblock_scan_col(3) > 0){
*col = 3;
return 6;
}
if(bsp_key_nonblock_scan_col(4) > 0){
*col = 4;
return 7;
}
//扫描第3行
bsp_key_nonblock_scan_row(3);
*row = 3;
if(bsp_key_nonblock_scan_col(1) > 0){
*col = 1;
return 8;
}
if(bsp_key_nonblock_scan_col(2) > 0){
*col = 2;
return 9;
}
if(bsp_key_nonblock_scan_col(3) > 0){
*col = 3;
return 10;
}
if(bsp_key_nonblock_scan_col(4) > 0){
*col = 4;
return 11;
}
//扫描第4行
bsp_key_nonblock_scan_row(4);
*row = 4;
if(bsp_key_nonblock_scan_col(1) > 0){
*col = 1;
return 12;
}
if(bsp_key_nonblock_scan_col(2) > 0){
*col = 2;
return 13;
}
// if(bsp_key_nonblock_scan_col(KC3) > 0){
// return 14;
// }
// if(bsp_key_nonblock_scan_col(KC4) > 0){
// return 15;
// }
return BSP_KEY_NUM_MAX;
}

12
source/bsp/bsp_key_nonblock.h

@ -0,0 +1,12 @@
#ifndef _BSP_KEY_NONBLOCK_H
#define _BSP_KEY_NONBLOCK_H
#include "bsp_config.h"
#define BSP_KEY_NUM_MAX 99
extern U8 bsp_key_nonblock_init(void);
extern U8 bsp_key_nonblock_scan(U8 *row, U8 *col);
extern U8 bsp_key_nonblock_scan_col(U8 col);
#endif

52
source/bsp/bsp_led.c

@ -0,0 +1,52 @@
#include "bsp_led.h"
void bsp_led_init(void)
{
//初始化
LED0 = LED0_OFF;
BLED0 = BLED0_OFF;
//BLED1 = BLED2 = BLED3 = BLED4 = BLED5 = BLED6 = BLED0_OFF;
//BLED7 = BLED8 = BLED9 = BLED10 = BLED11 = BLED12 = BLED13 = BLED0_OFF;
MBI_CLK = 0;
MBI_SDI = 0;
}
void bsp_led_set(U8 status)
{
LED0 = status;
}
void bsp_bled0_set()
{
BLED0 = BLED0_ON;
}
extern void delay(unsigned int i);
void bsp_bled_set_multi(unsigned int dat)
{
unsigned char i;
//其他led通过芯片驱动
for(i=0; i<16; i++)
{
MBI_SDI = (dat & 0x8000) ? 1 : 0;
MBI_CLK = 1;
dat <<= 1;
MBI_CLK = 0;
}
//锁存
MBI_LE = 1;
delay(100);
MBI_LE = 0;
//输出
delay(1000);
MBI_OE = 0;
}
void delay(unsigned int i)
{
while(i>0)
i--;
}

15
source/bsp/bsp_led.h

@ -0,0 +1,15 @@
#ifndef _BSP_LED_H
#define _BSP_LED_H
#include "bsp_config.h"
extern void bsp_led_init(void);
extern void bsp_led_set(U8 status);
extern void bsp_bled0_set();
extern void bsp_bled_set_multi(unsigned int dat);
#define BLED_SET_STATUS(N, status); do { \
BLED##N = status; \
}while(0);
#endif //_BSP_LED_H

13
source/bsp/bsp_rfid.c

@ -0,0 +1,13 @@
#include "bsp_rfid.h"
#include "bsp_config_delay.h"
U8 bsp_rfid_init(void)
{
bsp_rfid_en(RFID_ENABLE);
return 0;
}
void bsp_rfid_en(U8 status)
{
RFID_EN_PIN = status;
}

9
source/bsp/bsp_rfid.h

@ -0,0 +1,9 @@
#ifndef _BSP_RFID_H
#define _BSP_RFID_H
#include "bsp_config.h"
extern U8 bsp_rfid_init(void);
extern void bsp_rfid_en(U8 status);
#endif

16
source/bsp/chipid.c

@ -12,30 +12,34 @@
#include "chipid.h"
#include "../bsp/bsp_config.h"
void L0_id_get_ram(U8 *id)
U8 mcuid[MSP_ID_LEN];
void L0_id_get_ram()
{
U8 i = 0;
for(i=0;i<MSP_ID_LEN;i++)
{
id[i] = (U8)(ID_ADDR_IN_RAM[i]);
mcuid[i] = (U8)(ID_ADDR_IN_RAM[i]);
}
}
void L0_id_get_rom(U8 *id)
void L0_id_get_rom()
{
U8 i = 0;
for(i=0;i<MSP_ID_LEN;i++)
{
id[i] = (U8)ID_ADDR_IN_ROM[i];
mcuid[i] = (U8)ID_ADDR_IN_ROM[i];
}
}
void L0_id_get_chipid(U8 *id)
void L0_id_get_chipid()
{
U8 i = 0;
//使能访问XFR
P_SW2 |= 0x80;
for(i=0;i<MSP_ID_LEN;i++)
{
id[i] = ID_ADDR_IN_CHIPID[i];
mcuid[i] = ID_ADDR_IN_CHIPID[i];
}
}

7
source/bsp/chipid.h

@ -28,8 +28,11 @@
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
extern void L0_id_get(U8 *id);
extern void L0_id_get_rom(U8 *id);
extern U8 mcuid[];
extern void L0_id_get();
extern void L0_id_get_rom();
extern void L0_id_get_chipid();
extern void L0_id_main(void);
#endif// #ifndef _msp_eeprom_H_

1
source/clib/clib.c

@ -13,7 +13,6 @@
#include "type.h"
#include "clib.h"
#include "../msp/uart0.h"
#include "../msp/time.h"
#if 0

589
source/cpu/STC_stc8a8k.H

@ -1,589 +0,0 @@
#ifndef __STC_stc8a8k_H_
#define __STC_stc8a8k_H_
// STC_stc8a8k.h
#include<intrins.h>
/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////
/////////////////////////////////////////////////
//包含本头文件后,不用另外再包含"REG51.H"
//内核特殊功能寄存器 // 复位值 描述
sfr ACC = 0xE0; //0000,0000 累加器Accumulator
sfr B = 0xF0; //0000,0000 B寄存器
sfr PSW = 0xD0; //0000,0000 程序状态字
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;
sfr SP = 0x81; //0000,0111 堆栈指针
sfr DPL = 0x82; //0000,0000 数据指针低字节
sfr DPH = 0x83; //0000,0000 数据指针高字节
//I/O 口特殊功能寄存器
sfr P0 = 0x80; //1111,1111 端口0
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P1 = 0x90; //1111,1111 端口1
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P2 = 0xA0; //1111,1111 端口2
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P3 = 0xB0; //1111,1111 端口3
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr P4 = 0xC0; //1111,1111 端口4
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sfr P5 = 0xC8; //xxxx,1111 端口5
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
sfr P6 = 0xE8; //0000,0000 端口6
sbit P60 = P6^0;
sbit P61 = P6^1;
sbit P62 = P6^2;
sbit P63 = P6^3;
sbit P64 = P6^4;
sbit P65 = P6^5;
sbit P66 = P6^6;
sbit P67 = P6^7;
sfr P7 = 0xF8; //0000,0000 端口7
sbit P70 = P7^0;
sbit P71 = P7^1;
sbit P72 = P7^2;
sbit P73 = P7^3;
sbit P74 = P7^4;
sbit P75 = P7^5;
sbit P76 = P7^6;
sbit P77 = P7^7;
///00 准双向口 灌电流20mA 拉电流270-150uS
///01 推挽输出 20mA 加限流
///10 高阻
///11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0
sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1
sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0
sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1
sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0
sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1
sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0
sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1
sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0
sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1
sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0
sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1
sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0
sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1
sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0
sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1
//系统管理特殊功能寄存器
sfr PCON = 0x87; //0001,0000 电源控制寄存器
sfr AUXR = 0x8E; //0000,0000 辅助寄存器
#define TOx12 BITN7
#define T1x12 BITN6
#define UART_M0x6 BITN5 //串口1模式0速度 =0 12倍 = 1 两倍
#define T2R BITN4 //定时器2 运行 =1
#define T2_C BITN3 //定时器/计数器选择
#define T2x12 BITN2
#define EXTRAM BITN1
#define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1
sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1
sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1
sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器
sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器
sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器
//-----------------------------------------------------------------
sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器
#define EAXFR BITN7
#define I2C_S1 BITN5
#define I2C_S2 BITN4
#define CMPO_S BITN3
#define S4_S BITN2
#define S3_S BITN1
#define S2_S BITN0
//-----------------------------------------------------------------
//中断特殊功能寄存器
sfr IE = 0xA8; //0000,0000 中断控制寄存器
sbit EA = IE^7;
sbit ELVD = IE^6;
sbit EADC = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
sfr IP = 0xB8; //0000,0000 中断优先级寄存器
sbit PPCA = IP^7;
sbit PLVD = IP^6;
sbit PADC = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2
/// 不可位寻址
#define ET4 BITN6
#define ET3 BITN5
#define ES4 BITN4
#define ES3 BITN3
#define ET2 BITN2
#define ESPI BITN1
#define ES2 BITN0
sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2
sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器
//定时器特殊功能寄存器
sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器
sfr TL0 = 0x8A; //0000,0000 T0低字节
sfr TL1 = 0x8B; //0000,0000 T1低字节
sfr TH0 = 0x8C; //0000,0000 T0高字节
sfr TH1 = 0x8D; //0000,0000 T1高字节
sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T4H = 0xD2; //0000,0000 T4高字节
sfr T4L = 0xD3; //0000,0000 T4低字节
sfr T3H = 0xD4; //0000,0000 T3高字节
sfr T3L = 0xD5; //0000,0000 T3低字节
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节
sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节
sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器
//串行口特殊功能寄存器
sfr SCON = 0x98; //0000,0000 串口1控制寄存器
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
//sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器
//sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器
//sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器
//sfr SADDR = 0xA9; //0000,0000 从机地址寄存器
//sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器
sfr SBUF = 0x99; //Serial Data Buffer
sfr SBUF0 = 0x99; //Serial Data Buffer xxxx,xxxx
sfr SADEN = 0xB9; //Slave Address Mask 0000,0000
sfr SADDR = 0xA9; //Slave Address 0000,0000
//-----------------------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B
#define S2SM0 BITN7
#define S2ST4 BITN6
#define S2SM2 BITN5
#define S2REN BITN4
#define S2TB8 BITN3
#define S2RB8 BITN2
#define S2TI BITN1
#define S2RI BITN0
sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx
//sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000
//---------------------------------------------------------------
sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器
#define S3SM0 BITN7
#define S3ST4 BITN6
#define S3SM2 BITN5
#define S3REN BITN4
#define S3TB8 BITN3
#define S3RB8 BITN2
#define S3TI BITN1
#define S3RI BITN0
sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器
//---------------------------------------------------------------
sfr S4CON = 0x84; //0000,0000 串口4控制寄存器
#define S4SM0 BITN7
#define S4ST4 BITN6
#define S4SM2 BITN5
#define S4REN BITN4
#define S4TB8 BITN3
#define S4RB8 BITN2
#define S4TI BITN1
#define S4RI BITN0
sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器
//ADC 特殊功能寄存器
sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器
sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位
sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位
//SPI 特殊功能寄存器
sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器
sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器
sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器
//IAP/ISP 特殊功能寄存器
sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器
sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节
sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节
sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器
sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器
sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器
//PCA/PWM 特殊功能寄存器
sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器
sfr CL = 0xE9; //0000,0000 PCA计数器低字节
sfr CH = 0xF9; //0000,0000 PCA计数器高字节
sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器
sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器
sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器
sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节
sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节
sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节
sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器
sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器
sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器
sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节
sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节
sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节
//比较器特殊功能寄存器
sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1
sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2
//sfr P_SW2 = 0xba;
sfr PWMCFG = 0xf1;
sfr PWMIF = 0xf6;
sfr PWMFDCR = 0xf7;
sfr PWMCR = 0xfe;
#define PWMC (*(unsigned int volatile xdata *)0xfff0)
#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)
#define TADCP (*(unsigned int volatile xdata *)0xfff3)
#define PWM0T1 (*(unsigned int volatile xdata *)0xff00)
#define PWM0T2 (*(unsigned int volatile xdata *)0xff02)
#define PWM0CR (*(unsigned char volatile xdata *)0xff04)
#define PWM0HLD (*(unsigned char volatile xdata *)0xff05)
#define PWM1T1 (*(unsigned int volatile xdata *)0xff10)
#define PWM1T2 (*(unsigned int volatile xdata *)0xff12)
#define PWM1CR (*(unsigned char volatile xdata *)0xff14)
#define PWM1HLD (*(unsigned char volatile xdata *)0xff15)
#define PWM2T1 (*(unsigned int volatile xdata *)0xff20)
#define PWM2T2 (*(unsigned int volatile xdata *)0xff22)
#define PWM2CR (*(unsigned char volatile xdata *)0xff24)
#define PWM2HLD (*(unsigned char volatile xdata *)0xff25)
#define PWM3T1 (*(unsigned int volatile xdata *)0xff30)
#define PWM3T2 (*(unsigned int volatile xdata *)0xff32)
#define PWM3CR (*(unsigned char volatile xdata *)0xff34)
#define PWM3HLD (*(unsigned char volatile xdata *)0xff35)
#define PWM4T1 (*(unsigned int volatile xdata *)0xff40)
#define PWM4T2 (*(unsigned int volatile xdata *)0xff42)
#define PWM4CR (*(unsigned char volatile xdata *)0xff44)
#define PWM4HLD (*(unsigned char volatile xdata *)0xff45)
#define PWM5T1 (*(unsigned int volatile xdata *)0xff50)
#define PWM5T2 (*(unsigned int volatile xdata *)0xff52)
#define PWM5CR (*(unsigned char volatile xdata *)0xff54)
#define PWM5HLD (*(unsigned char volatile xdata *)0xff55)
#define PWM6T1 (*(unsigned int volatile xdata *)0xff60)
#define PWM6T2 (*(unsigned int volatile xdata *)0xff62)
#define PWM6CR (*(unsigned char volatile xdata *)0xff64)
#define PWM6HLD (*(unsigned char volatile xdata *)0xff65)
#define PWM7T1 (*(unsigned int volatile xdata *)0xff70)
#define PWM7T2 (*(unsigned int volatile xdata *)0xff72)
#define PWM7CR (*(unsigned char volatile xdata *)0xff74)
#define PWM7HLD (*(unsigned char volatile xdata *)0xff75)
#define CKSEL (*(unsigned char volatile xdata *)0xfE00)//108@ST8.PDF
#define MCLKODIV BIT4
#define MCLKO_S BITN3
#define MCLKSEL BIT0
#define CLKDIV (*(unsigned char volatile xdata *)0xfE01)//108@ST8.PDF
#define IRC24MCR (*(unsigned char volatile xdata *)0xfE02)//108@ST8.PDF
#define XOSCCR (*(unsigned char volatile xdata *)0xfE03)//108@ST8.PDF
#define IRC32KCR (*(unsigned char volatile xdata *)0xfE04)//108@ST8.PDF
/////////////////////////////////////////////////
/* P3 */
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;
#if 0
/// >>>>> add by cc
//sbit P34=P3^4; //定义SDA数据线
//sbit P35=P3^5; //定义SCL时钟线
#define mBIT_1(X,N) X|= (1<<N)
#define mBIT_0(X,N) X&=~(1<<N)
#define mBIT_G(X,N) (X&(1<<N))
/// add by cc 20181118
#define D_IO_normal_P0(n); mBIT_0(P0M1,n);mBIT_0(P0M0,n);
#define D_IO_normal_P1(n); mBIT_0(P1M1,n);mBIT_0(P1M0,n);
#define D_IO_normal_P2(n); mBIT_0(P2M1,n);mBIT_0(P2M0,n);
#define D_IO_normal_P3(n); mBIT_0(P3M1,n);mBIT_0(P3M0,n);
#define D_IO_HighOut_P0(n); mBIT_0(P0M1,n);mBIT_1(P0M0,n);
#define D_IO_HighOut_P1(n); mBIT_0(P1M1,n);mBIT_1(P1M0,n);
#define D_IO_HighOut_P2(n); mBIT_0(P2M1,n);mBIT_1(P2M0,n);
#define D_IO_HighOut_P3(n); mBIT_0(P3M1,n);mBIT_1(P3M0,n);
//高阻状态
#define D_IO_HighR_P0(n); mBIT_1(P0M1,n);mBIT_0(P0M0,n);
#define D_IO_HighR_P1(n); mBIT_1(P1M1,n);mBIT_0(P1M0,n);
#define D_IO_HighR_P2(n); mBIT_1(P2M1,n);mBIT_0(P2M0,n);
#define D_IO_HighR_P3(n); mBIT_1(P3M1,n);mBIT_0(P3M0,n);
#define D_IO_OpenDrain_P0(n); mBIT_1(P0M1,n);mBIT_1(P0M0,n);
#define D_IO_OpenDrain_P1(n); mBIT_1(P1M1,n);mBIT_1(P1M0,n);
#define D_IO_OpenDrain_P2(n); mBIT_1(P2M1,n);mBIT_1(P2M0,n);
#define D_IO_OpenDrain_P3(n); mBIT_1(P3M1,n);mBIT_1(P3M0,n);
//高阻状态
#define P0_conf_in(n) mBIT_1(P0M1,n);mBIT_0(P0M0,n);
#define P1_conf_in(n) mBIT_1(P1M1,n);mBIT_0(P1M0,n);
#define P2_conf_in(n) mBIT_1(P2M1,n);mBIT_0(P2M0,n);
#define P2_conf_port(n) mBIT_0(P2M1,n);mBIT_0(P2M0,n);
#define P3_conf_in(n) mBIT_1(P3M1,n);mBIT_0(P3M0,n);
#define P3_conf_port(n) mBIT_0(P3M1,n);mBIT_0(P3M0,n);
#define P4_conf_in(n) mBIT_1(P4M1,n);mBIT_0(P4M0,n);
#define P5_conf_in(n) mBIT_1(P5M1,n);mBIT_0(P5M0,n);
#define NOP() _nop_()
//added by cc
#define D_stdIO_P0_ALL() P0M1=0;P0M0=0;
#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF;
#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0;
#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF;
#define D_stdIO_P1_ALL() P1M1=0;P1M0=0;
#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF;
#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0;
#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF;
//// n: BITN0---BITN7
#define D_stdIO_P0(BITN) BITN_0(P0M1,BITN);BITN_0(P0M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P0(BITN) BITN_0(P0M1,BITN);BITN_1(P0M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P0(BITN) BITN_1(P0M1,BITN);BITN_0(P0M0,BITN); /////////10 高阻
#define D_OpenD_P0(BITN) BITN_1(P0M1,BITN);BITN_1(P0M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P1(BITN) BITN_0(P1M1,BITN);BITN_0(P1M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P1(BITN) BITN_0(P1M1,BITN);BITN_1(P1M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P1(BITN) BITN_1(P1M1,BITN);BITN_0(P1M0,BITN); /////////10 高阻
#define D_OpenD_P1(BITN) BITN_1(P1M1,BITN);BITN_1(P1M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P2(BITN) BITN_0(P2M1,BITN);BITN_0(P2M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P2(BITN) BITN_0(P2M1,BITN);BITN_1(P2M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P2(BITN) BITN_1(P2M1,BITN);BITN_0(P2M0,BITN); /////////10 高阻
#define D_OpenD_P2(BITN) BITN_1(P2M1,BITN);BITN_1(P2M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P3(BITN) BITN_0(P3M1,BITN);BITN_0(P3M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P3(BITN) BITN_0(P3M1,BITN);BITN_1(P3M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P3(BITN) BITN_1(P3M1,BITN);BITN_0(P3M0,BITN); /////////10 高阻
#define D_OpenD_P3(BITN) BITN_1(P3M1,BITN);BITN_1(P3M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P4(BITN) BITN_0(P4M1,BITN);BITN_0(P4M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P4(BITN) BITN_0(P4M1,BITN);BITN_1(P4M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P4(BITN) BITN_1(P4M1,BITN);BITN_0(P4M0,BITN); /////////10 高阻
#define D_OpenD_P4(BITN) BITN_1(P4M1,BITN);BITN_1(P4M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P5(BITN) BITN_0(P5M1,BITN);BITN_0(P5M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P5(BITN) BITN_0(P5M1,BITN);BITN_1(P5M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P5(BITN) BITN_1(P5M1,BITN);BITN_0(P5M0,BITN); /////////10 高阻
#define D_OpenD_P5(BITN) BITN_1(P5M1,BITN);BITN_1(P5M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P6(BITN) BITN_0(P6M1,BITN);BITN_0(P6M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P6(BITN) BITN_0(P6M1,BITN);BITN_1(P6M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P6(BITN) BITN_1(P6M1,BITN);BITN_0(P6M0,BITN); /////////10 高阻
#define D_OpenD_P6(BITN) BITN_1(P6M1,BITN);BITN_1(P6M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P7(BITN) BITN_0(P7M1,BITN);BITN_0(P7M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P7(BITN) BITN_0(P7M1,BITN);BITN_1(P7M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P7(BITN) BITN_1(P7M1,BITN);BITN_0(P7M0,BITN); /////////10 高阻
#define D_OpenD_P7(BITN) BITN_1(P7M1,BITN);BITN_1(P7M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#endif
/***
#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n);
#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n);
#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n);
#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n);
#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n);
#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n);
#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n);
#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n);
***/
#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4)
#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4)
#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4)
#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF)
#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF)
#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF)
//////
#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3);
#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3);
#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2);
#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2);
#define L0_INT1_OPEN() EX1 = 1;
#define L0_INT1_CLOSE() EX1 = 0;
#define L0_INT0_OPEN() EX0 = 1;
#define L0_INT0_CLOSE() EX0 = 0;
#define D_ISR_int0 0 ///int0 下降沿触发 = 0 上下沿均可触发
#define D_ISR_timer0 1
#define D_ISR_int1 2 ///int1 下降沿触发 = 0 上下沿均可触发
#define D_ISR_timer1 3
#define D_ISR_int2 10 /////只有下降沿
#define D_ISR_int3 11 /////只有下降沿
#define D_SERVE_UART 4
#define D_ISR_int4 16 /////只有下降沿
#if 0
#define L0_TIMER1_start() TR1 = 1;
#define L0_TIMER1_end() TR1 = 0;
#define L0_TIMER1_isr_OPEN() ET1 = 1;
#define L0_TIMER1_isr_CLOSE() ET1 = 0;
#else
#define L0_TIMER1_start() ET1 = 1;
#define L0_TIMER1_end() ET1 = 0;
#define L0_TIMER1_isr_OPEN() TR1 = 1;
#define L0_TIMER1_isr_CLOSE() TR1 = 0;
#endif
/// fixme 颠倒定义会让c51锁死#define _nop_() NOP()
///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断
///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3);
#endif //STC_stc8a8k

466
source/cpu/stc_stc15w.H

@ -1,466 +0,0 @@
#ifndef __STC15F2K60S2_H_
#define __STC15F2K60S2_H_
// stc_stc15w.h
#include<intrins.h>
/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////
/////////////////////////////////////////////////
//包含本头文件后,不用另外再包含"REG51.H"
//内核特殊功能寄存器 // 复位值 描述
sfr ACC = 0xE0; //0000,0000 累加器Accumulator
sfr B = 0xF0; //0000,0000 B寄存器
sfr PSW = 0xD0; //0000,0000 程序状态字
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;
sfr SP = 0x81; //0000,0111 堆栈指针
sfr DPL = 0x82; //0000,0000 数据指针低字节
sfr DPH = 0x83; //0000,0000 数据指针高字节
//I/O 口特殊功能寄存器
sfr P0 = 0x80; //1111,1111 端口0
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P1 = 0x90; //1111,1111 端口1
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P2 = 0xA0; //1111,1111 端口2
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P3 = 0xB0; //1111,1111 端口3
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr P4 = 0xC0; //1111,1111 端口4
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sfr P5 = 0xC8; //xxxx,1111 端口5
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
sfr P6 = 0xE8; //0000,0000 端口6
sbit P60 = P6^0;
sbit P61 = P6^1;
sbit P62 = P6^2;
sbit P63 = P6^3;
sbit P64 = P6^4;
sbit P65 = P6^5;
sbit P66 = P6^6;
sbit P67 = P6^7;
sfr P7 = 0xF8; //0000,0000 端口7
sbit P70 = P7^0;
sbit P71 = P7^1;
sbit P72 = P7^2;
sbit P73 = P7^3;
sbit P74 = P7^4;
sbit P75 = P7^5;
sbit P76 = P7^6;
sbit P77 = P7^7;
sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0
sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1
sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0
sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1
sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0
sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1
sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0
sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1
sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0
sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1
sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0
sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1
sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0
sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1
sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0
sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1
//系统管理特殊功能寄存器
sfr PCON = 0x87; //0001,0000 电源控制寄存器
sfr AUXR = 0x8E; //0000,0000 辅助寄存器
#define TOx12 BITN7
#define T1x12 BITN6
#define UART_M0x6 BITN5 //串口1模式0速度 =0 12倍 = 1 两倍
#define T2R BITN4 //定时器2 运行 =1
#define T2_C BITN3 //定时器/计数器选择
#define T2x12 BITN2
#define EXTRAM BITN1
#define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1
sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1
sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1
sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器
sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器
sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器
sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器
//中断特殊功能寄存器
sfr IE = 0xA8; //0000,0000 中断控制寄存器
sbit EA = IE^7;
sbit ELVD = IE^6;
sbit EADC = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
sfr IP = 0xB8; //0000,0000 中断优先级寄存器
sbit PPCA = IP^7;
sbit PLVD = IP^6;
sbit PADC = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2
/// 不可位寻址
#define ET4 BITN6
#define ET3 BITN5
#define ES4 BITN4
#define ES3 BITN3
#define ET2 BITN2
#define ESPI BITN1
#define ES2 BITN0
sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2
sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器
//定时器特殊功能寄存器
sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器
sfr TL0 = 0x8A; //0000,0000 T0低字节
sfr TL1 = 0x8B; //0000,0000 T1低字节
sfr TH0 = 0x8C; //0000,0000 T0高字节
sfr TH1 = 0x8D; //0000,0000 T1高字节
sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T4H = 0xD2; //0000,0000 T4高字节
sfr T4L = 0xD3; //0000,0000 T4低字节
sfr T3H = 0xD4; //0000,0000 T3高字节
sfr T3L = 0xD5; //0000,0000 T3低字节
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节
sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节
sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器
//串行口特殊功能寄存器
sfr SCON = 0x98; //0000,0000 串口1控制寄存器
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
//sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器
//sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器
//sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器
//sfr SADDR = 0xA9; //0000,0000 从机地址寄存器
//sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器
sfr SBUF = 0x99; //Serial Data Buffer
sfr SBUF0 = 0x99; //Serial Data Buffer xxxx,xxxx
sfr SADEN = 0xB9; //Slave Address Mask 0000,0000
sfr SADDR = 0xA9; //Slave Address 0000,0000
//-----------------------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B
#define S2SM0 BITN7
#define S2ST4 BITN6
#define S2SM2 BITN5
#define S2REN BITN4
#define S2TB8 BITN3
#define S2RB8 BITN2
#define S2TI BITN1
#define S2RI BITN0
sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx
//sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000
//---------------------------------------------------------------
sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器
#define S3SM0 BITN7
#define S3ST4 BITN6
#define S3SM2 BITN5
#define S3REN BITN4
#define S3TB8 BITN3
#define S3RB8 BITN2
#define S3TI BITN1
#define S3RI BITN0
sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器
//---------------------------------------------------------------
sfr S4CON = 0x84; //0000,0000 串口4控制寄存器
#define S4SM0 BITN7
#define S4ST4 BITN6
#define S4SM2 BITN5
#define S4REN BITN4
#define S4TB8 BITN3
#define S4RB8 BITN2
#define S4TI BITN1
#define S4RI BITN0
sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器
//ADC 特殊功能寄存器
sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器
sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位
sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位
//SPI 特殊功能寄存器
sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器
sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器
sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器
//IAP/ISP 特殊功能寄存器
sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器
sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节
sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节
sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器
sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器
sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器
//PCA/PWM 特殊功能寄存器
sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器
sfr CL = 0xE9; //0000,0000 PCA计数器低字节
sfr CH = 0xF9; //0000,0000 PCA计数器高字节
sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器
sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器
sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器
sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节
sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节
sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节
sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器
sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器
sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器
sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节
sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节
sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节
//比较器特殊功能寄存器
sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1
sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2
//增强型PWM波形发生器特殊功能寄存器
sfr PWMCFG = 0xf1; //x000,0000 PWM配置寄存器
sfr PWMCR = 0xf5; //0000,0000 PWM控制寄存器
sfr PWMIF = 0xf6; //x000,0000 PWM中断标志寄存器
sfr PWMFDCR = 0xf7; //xx00,0000 PWM外部异常检测控制寄存器
//如下特殊功能寄存器位于扩展RAM区域
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
#define PWMC (*(unsigned int volatile xdata *)0xfff0)
#define PWMCH (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1 (*(unsigned int volatile xdata *)0xff00)
#define PWM2T1H (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2 (*(unsigned int volatile xdata *)0xff02)
#define PWM2T2H (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1 (*(unsigned int volatile xdata *)0xff10)
#define PWM3T1H (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L (*(unsigned char volatile xdata *)0xff11)
#define PWM3T2 (*(unsigned int volatile xdata *)0xff12)
#define PWM3T2H (*(unsigned char volatile xdata *)0xff12)
#define PWM3T2L (*(unsigned char volatile xdata *)0xff13)
#define PWM3CR (*(unsigned char volatile xdata *)0xff14)
#define PWM4T1 (*(unsigned int volatile xdata *)0xff20)
#define PWM4T1H (*(unsigned char volatile xdata *)0xff20)
#define PWM4T1L (*(unsigned char volatile xdata *)0xff21)
#define PWM4T2 (*(unsigned int volatile xdata *)0xff22)
#define PWM4T2H (*(unsigned char volatile xdata *)0xff22)
#define PWM4T2L (*(unsigned char volatile xdata *)0xff23)
#define PWM4CR (*(unsigned char volatile xdata *)0xff24)
#define PWM5T1 (*(unsigned int volatile xdata *)0xff30)
#define PWM5T1H (*(unsigned char volatile xdata *)0xff30)
#define PWM5T1L (*(unsigned char volatile xdata *)0xff31)
#define PWM5T2 (*(unsigned int volatile xdata *)0xff32)
#define PWM5T2H (*(unsigned char volatile xdata *)0xff32)
#define PWM5T2L (*(unsigned char volatile xdata *)0xff33)
#define PWM5CR (*(unsigned char volatile xdata *)0xff34)
#define PWM6T1 (*(unsigned int volatile xdata *)0xff40)
#define PWM6T1H (*(unsigned char volatile xdata *)0xff40)
#define PWM6T1L (*(unsigned char volatile xdata *)0xff41)
#define PWM6T2 (*(unsigned int volatile xdata *)0xff42)
#define PWM6T2H (*(unsigned char volatile xdata *)0xff42)
#define PWM6T2L (*(unsigned char volatile xdata *)0xff43)
#define PWM6CR (*(unsigned char volatile xdata *)0xff44)
#define PWM7T1 (*(unsigned int volatile xdata *)0xff50)
#define PWM7T1H (*(unsigned char volatile xdata *)0xff50)
#define PWM7T1L (*(unsigned char volatile xdata *)0xff51)
#define PWM7T2 (*(unsigned int volatile xdata *)0xff52)
#define PWM7T2H (*(unsigned char volatile xdata *)0xff52)
#define PWM7T2L (*(unsigned char volatile xdata *)0xff53)
#define PWM7CR (*(unsigned char volatile xdata *)0xff54)
/////////////////////////////////////////////////
/* P3 */
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;
/// >>>>> add by cc
//sbit P34=P3^4; //定义SDA数据线
//sbit P35=P3^5; //定义SCL时钟线
#define mBIT_1(X,N) X|= (1<<N)
#define mBIT_0(X,N) X&=~(1<<N)
#define mBIT_G(X,N) (X&(1<<N))
//高阻状态
#define P0_conf_in(n) mBIT_1(P0M1,n);mBIT_0(P0M0,n);
#define P1_conf_in(n) mBIT_1(P1M1,n);mBIT_0(P1M0,n);
#define P2_conf_in(n) mBIT_1(P2M1,n);mBIT_0(P2M0,n);
#define P2_conf_port(n) mBIT_0(P2M1,n);mBIT_0(P2M0,n);
#define P3_conf_in(n) mBIT_1(P3M1,n);mBIT_0(P3M0,n);
#define P3_conf_port(n) mBIT_0(P3M1,n);mBIT_0(P3M0,n);
#define P4_conf_in(n) mBIT_1(P4M1,n);mBIT_0(P4M0,n);
#define P5_conf_in(n) mBIT_1(P5M1,n);mBIT_0(P5M0,n);
#define NOP() _nop_()
#define D_stdIO_P0_ALL() P0M1=0;P0M0=0;
#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF;
#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0;
#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF;
#define D_stdIO_P1_ALL() P1M1=0;P1M0=0;
#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF;
#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0;
#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF;
//// n: BITN0---BITN7
#define D_stdIO_P0(BITN) BITN_0(P0M1,BITN);BITN_0(P0M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P0(BITN) BITN_0(P0M1,BITN);BITN_1(P0M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P0(BITN) BITN_1(P0M1,BITN);BITN_0(P0M0,BITN); /////////10 高阻
#define D_OpenD_P0(BITN) BITN_1(P0M1,BITN);BITN_1(P0M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P1(BITN) BITN_0(P1M1,BITN);BITN_0(P1M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P1(BITN) BITN_0(P1M1,BITN);BITN_1(P1M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P1(BITN) BITN_1(P1M1,BITN);BITN_0(P1M0,BITN); /////////10 高阻
#define D_OpenD_P1(BITN) BITN_1(P1M1,BITN);BITN_1(P1M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P2(BITN) BITN_0(P2M1,BITN);BITN_0(P2M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P2(BITN) BITN_0(P2M1,BITN);BITN_1(P2M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P2(BITN) BITN_1(P2M1,BITN);BITN_0(P2M0,BITN); /////////10 高阻
#define D_OpenD_P2(BITN) BITN_1(P2M1,BITN);BITN_1(P2M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P3(BITN) BITN_0(P3M1,BITN);BITN_0(P3M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P3(BITN) BITN_0(P3M1,BITN);BITN_1(P3M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P3(BITN) BITN_1(P3M1,BITN);BITN_0(P3M0,BITN); /////////10 高阻
#define D_OpenD_P3(BITN) BITN_1(P3M1,BITN);BITN_1(P3M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P4(BITN) BITN_0(P4M1,BITN);BITN_0(P4M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P4(BITN) BITN_0(P4M1,BITN);BITN_1(P4M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P4(BITN) BITN_1(P4M1,BITN);BITN_0(P4M0,BITN); /////////10 高阻
#define D_OpenD_P4(BITN) BITN_1(P4M1,BITN);BITN_1(P4M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P5(BITN) BITN_0(P5M1,BITN);BITN_0(P5M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P5(BITN) BITN_0(P5M1,BITN);BITN_1(P5M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P5(BITN) BITN_1(P5M1,BITN);BITN_0(P5M0,BITN); /////////10 高阻
#define D_OpenD_P5(BITN) BITN_1(P5M1,BITN);BITN_1(P5M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P6(BITN) BITN_0(P6M1,BITN);BITN_0(P6M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P6(BITN) BITN_0(P6M1,BITN);BITN_1(P6M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P6(BITN) BITN_1(P6M1,BITN);BITN_0(P6M0,BITN); /////////10 高阻
#define D_OpenD_P6(BITN) BITN_1(P6M1,BITN);BITN_1(P6M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P7(BITN) BITN_0(P7M1,BITN);BITN_0(P7M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P7(BITN) BITN_0(P7M1,BITN);BITN_1(P7M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P7(BITN) BITN_1(P7M1,BITN);BITN_0(P7M0,BITN); /////////10 高阻
#define D_OpenD_P7(BITN) BITN_1(P7M1,BITN);BITN_1(P7M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#endif

746
source/cpu/stc_stc8G1k.H

@ -1,746 +0,0 @@
#ifndef __STC8G_H_
#define __STC8G_H_
// STC_stc8a8k.h
#include<intrins.h>
/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////
/////////////////////////////////////////////////
//包含本头文件后,不用另外再包含"REG51.H"
/////////////////////////////////////////////////
//包含本头文件后,不用另外再包含"REG51.H"
sfr P0 = 0x80;
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr S4CON = 0x84;
sfr S4BUF = 0x85;
sfr PCON = 0x87;
sfr TCON = 0x88;
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr AUXR = 0x8E;
sfr INTCLKO = 0x8F;
sfr P1 = 0x90;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr SCON = 0x98;
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
sfr SBUF = 0x99;
sfr S2CON = 0x9A;
sfr S2BUF = 0x9B;
sfr IRCBAND = 0x9D;
sfr LIRTRIM = 0x9E;
sfr IRTRIM = 0x9F;
sfr P2 = 0xA0;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P_SW1 = 0xA2;
sfr IE = 0xA8;
sbit EA = IE^7;
sbit ELVD = IE^6;
sbit EADC = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
sfr SADDR = 0xA9;
sfr WKTCL = 0xAA;
sfr WKTCH = 0xAB;
sfr S3CON = 0xAC;
sfr S3BUF = 0xAD;
sfr TA = 0xAE;
sfr IE2 = 0xAF;
sfr P3 = 0xB0;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P4M1 = 0xB3;
sfr P4M0 = 0xB4;
sfr IP2 = 0xB5;
sfr IP2H = 0xB6;
sfr IPH = 0xB7;
sfr IP = 0xB8;
sbit PPCA = IP^7;
sbit PLVD = IP^6;
sbit PADC = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
sfr SADEN = 0xB9;
sfr P_SW2 = 0xBA;
sfr ADC_CONTR = 0xBC;
sfr ADC_RES = 0xBD;
sfr ADC_RESL = 0xBE;
sfr P4 = 0xC0;
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sfr WDT_CONTR = 0xC1;
sfr IAP_DATA = 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
sfr IAP_CMD = 0xC5;
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7;
sfr P5 = 0xC8;
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr SPSTAT = 0xCD;
sfr SPCTL = 0xCE;
sfr SPDAT = 0xCF;
sfr PSW = 0xD0;
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;
sfr T4T3M = 0xD1;
sfr T4H = 0xD2;
sfr T4L = 0xD3;
sfr T3H = 0xD4;
sfr T3L = 0xD5;
sfr T2H = 0xD6;
sfr T2L = 0xD7;
sfr CCON = 0xD8;
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
sfr CMOD = 0xD9;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sfr CCAPM2 = 0xDC;
sfr ADCCFG = 0xDE;
sfr IP3 = 0xDF;
sfr ACC = 0xE0;
sfr DPS = 0xE3;
sfr DPL1 = 0xE4;
sfr DPH1 = 0xE5;
sfr CMPCR1 = 0xE6;
sfr CMPCR2 = 0xE7;
sfr CL = 0xE9;
sfr CCAP0L = 0xEA;
sfr CCAP1L = 0xEB;
sfr CCAP2L = 0xEC;
sfr IP3H = 0xEE;
sfr AUXINTIF = 0xEF;
sfr B = 0xF0;
sfr PWMSET = 0xF1;
sfr PCA_PWM0 = 0xF2;
sfr PCA_PWM1 = 0xF3;
sfr PCA_PWM2 = 0xF4;
sfr IAP_TPS = 0xF5;
sfr PWMCFG01 = 0xF6;
sfr PWMCFG23 = 0xF7;
sfr CH = 0xF9;
sfr CCAP0H = 0xFA;
sfr CCAP1H = 0xFB;
sfr CCAP2H = 0xFC;
sfr PWMCFG45 = 0xFE;
sfr RSTCFG = 0xFF;
//如下特殊功能寄存器位于扩展RAM区域
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
#define CKSEL (*(unsigned char volatile xdata *)0xFE00)
#define CLKDIV (*(unsigned char volatile xdata *)0xFE01)
#define HIRCCR (*(unsigned char volatile xdata *)0xFE02)
#define XOSCCR (*(unsigned char volatile xdata *)0xFE03)
#define IRC32KCR (*(unsigned char volatile xdata *)0xFE04)
#define MCLKOCR (*(unsigned char volatile xdata *)0xFE05)
#define IRCDB (*(unsigned char volatile xdata *)0xFE06)
#define P0PU (*(unsigned char volatile xdata *)0xFE10)
#define P1PU (*(unsigned char volatile xdata *)0xFE11)
#define P2PU (*(unsigned char volatile xdata *)0xFE12)
#define P3PU (*(unsigned char volatile xdata *)0xFE13)
#define P4PU (*(unsigned char volatile xdata *)0xFE14)
#define P5PU (*(unsigned char volatile xdata *)0xFE15)
#define P0NCS (*(unsigned char volatile xdata *)0xFE18)
#define P1NCS (*(unsigned char volatile xdata *)0xFE19)
#define P2NCS (*(unsigned char volatile xdata *)0xFE1A)
#define P3NCS (*(unsigned char volatile xdata *)0xFE1B)
#define P4NCS (*(unsigned char volatile xdata *)0xFE1C)
#define P5NCS (*(unsigned char volatile xdata *)0xFE1D)
#define P0SR (*(unsigned char volatile xdata *)0xFE20)
#define P1SR (*(unsigned char volatile xdata *)0xFE21)
#define P2SR (*(unsigned char volatile xdata *)0xFE22)
#define P3SR (*(unsigned char volatile xdata *)0xFE23)
#define P4SR (*(unsigned char volatile xdata *)0xFE24)
#define P5SR (*(unsigned char volatile xdata *)0xFE25)
#define P0DR (*(unsigned char volatile xdata *)0xFE28)
#define P1DR (*(unsigned char volatile xdata *)0xFE29)
#define P2DR (*(unsigned char volatile xdata *)0xFE2A)
#define P3DR (*(unsigned char volatile xdata *)0xFE2B)
#define P4DR (*(unsigned char volatile xdata *)0xFE2C)
#define P5DR (*(unsigned char volatile xdata *)0xFE2D)
#define P0IE (*(unsigned char volatile xdata *)0xFE30)
#define P1IE (*(unsigned char volatile xdata *)0xFE31)
#define P3IE (*(unsigned char volatile xdata *)0xFE33)
#define I2CCFG (*(unsigned char volatile xdata *)0xFE80)
#define I2CMSCR (*(unsigned char volatile xdata *)0xFE81)
#define I2CMSST (*(unsigned char volatile xdata *)0xFE82)
#define I2CSLCR (*(unsigned char volatile xdata *)0xFE83)
#define I2CSLST (*(unsigned char volatile xdata *)0xFE84)
#define I2CSLADR (*(unsigned char volatile xdata *)0xFE85)
#define I2CTXD (*(unsigned char volatile xdata *)0xFE86)
#define I2CRXD (*(unsigned char volatile xdata *)0xFE87)
#define I2CMSAUX (*(unsigned char volatile xdata *)0xFE88)
#define TM2PS (*(unsigned char volatile xdata *)0xFEA2)
#define TM3PS (*(unsigned char volatile xdata *)0xFEA3)
#define TM4PS (*(unsigned char volatile xdata *)0xFEA4)
#define ADCTIM (*(unsigned char volatile xdata *)0xFEA8)
#define PWM0CH (*(unsigned char volatile xdata *)0xFF00)
#define PWM0CL (*(unsigned char volatile xdata *)0xFF01)
#define PWM0CKS (*(unsigned char volatile xdata *)0xFF02)
#define PWM0TADCH (*(unsigned char volatile xdata *)0xFF03)
#define PWM0TADCL (*(unsigned char volatile xdata *)0xFF04)
#define PWM0IF (*(unsigned char volatile xdata *)0xFF05)
#define PWM0FDCR (*(unsigned char volatile xdata *)0xFF06)
#define PWM00T1H (*(unsigned char volatile xdata *)0xFF10)
#define PWM00T1L (*(unsigned char volatile xdata *)0xFF11)
#define PWM00T2H (*(unsigned char volatile xdata *)0xFF12)
#define PWM00T2L (*(unsigned char volatile xdata *)0xFF13)
#define PWM00CR (*(unsigned char volatile xdata *)0xFF14)
#define PWM00HLD (*(unsigned char volatile xdata *)0xFF15)
#define PWM01T1H (*(unsigned char volatile xdata *)0xFF18)
#define PWM01T1L (*(unsigned char volatile xdata *)0xFF19)
#define PWM01T2H (*(unsigned char volatile xdata *)0xFF1A)
#define PWM01T2L (*(unsigned char volatile xdata *)0xFF1B)
#define PWM01CR (*(unsigned char volatile xdata *)0xFF1C)
#define PWM01HLD (*(unsigned char volatile xdata *)0xFF1D)
#define PWM02T1H (*(unsigned char volatile xdata *)0xFF20)
#define PWM02T1L (*(unsigned char volatile xdata *)0xFF21)
#define PWM02T2H (*(unsigned char volatile xdata *)0xFF22)
#define PWM02T2L (*(unsigned char volatile xdata *)0xFF23)
#define PWM02CR (*(unsigned char volatile xdata *)0xFF24)
#define PWM02HLD (*(unsigned char volatile xdata *)0xFF25)
#define PWM03T1H (*(unsigned char volatile xdata *)0xFF28)
#define PWM03T1L (*(unsigned char volatile xdata *)0xFF29)
#define PWM03T2H (*(unsigned char volatile xdata *)0xFF2A)
#define PWM03T2L (*(unsigned char volatile xdata *)0xFF2B)
#define PWM03CR (*(unsigned char volatile xdata *)0xFF2C)
#define PWM03HLD (*(unsigned char volatile xdata *)0xFF2D)
#define PWM04T1H (*(unsigned char volatile xdata *)0xFF30)
#define PWM04T1L (*(unsigned char volatile xdata *)0xFF31)
#define PWM04T2H (*(unsigned char volatile xdata *)0xFF32)
#define PWM04T2L (*(unsigned char volatile xdata *)0xFF33)
#define PWM04CR (*(unsigned char volatile xdata *)0xFF34)
#define PWM04HLD (*(unsigned char volatile xdata *)0xFF35)
#define PWM05T1H (*(unsigned char volatile xdata *)0xFF38)
#define PWM05T1L (*(unsigned char volatile xdata *)0xFF39)
#define PWM05T2H (*(unsigned char volatile xdata *)0xFF3A)
#define PWM05T2L (*(unsigned char volatile xdata *)0xFF3B)
#define PWM05CR (*(unsigned char volatile xdata *)0xFF3C)
#define PWM05HLD (*(unsigned char volatile xdata *)0xFF3D)
#define PWM06T1H (*(unsigned char volatile xdata *)0xFF40)
#define PWM06T1L (*(unsigned char volatile xdata *)0xFF41)
#define PWM06T2H (*(unsigned char volatile xdata *)0xFF42)
#define PWM06T2L (*(unsigned char volatile xdata *)0xFF43)
#define PWM06CR (*(unsigned char volatile xdata *)0xFF44)
#define PWM06HLD (*(unsigned char volatile xdata *)0xFF45)
#define PWM07T1H (*(unsigned char volatile xdata *)0xFF48)
#define PWM07T1L (*(unsigned char volatile xdata *)0xFF49)
#define PWM07T2H (*(unsigned char volatile xdata *)0xFF4A)
#define PWM07T2L (*(unsigned char volatile xdata *)0xFF4B)
#define PWM07CR (*(unsigned char volatile xdata *)0xFF4C)
#define PWM07HLD (*(unsigned char volatile xdata *)0xFF4D)
#define PWM1CH (*(unsigned char volatile xdata *)0xFF50)
#define PWM1CL (*(unsigned char volatile xdata *)0xFF51)
#define PWM1CKS (*(unsigned char volatile xdata *)0xFF52)
#define PWM1IF (*(unsigned char volatile xdata *)0xFF55)
#define PWM1FDCR (*(unsigned char volatile xdata *)0xFF56)
#define PWM10T1H (*(unsigned char volatile xdata *)0xFF60)
#define PWM10T1L (*(unsigned char volatile xdata *)0xFF61)
#define PWM10T2H (*(unsigned char volatile xdata *)0xFF62)
#define PWM10T2L (*(unsigned char volatile xdata *)0xFF63)
#define PWM10CR (*(unsigned char volatile xdata *)0xFF64)
#define PWM10HLD (*(unsigned char volatile xdata *)0xFF65)
#define PWM11T1H (*(unsigned char volatile xdata *)0xFF68)
#define PWM11T1L (*(unsigned char volatile xdata *)0xFF69)
#define PWM11T2H (*(unsigned char volatile xdata *)0xFF6A)
#define PWM11T2L (*(unsigned char volatile xdata *)0xFF6B)
#define PWM11CR (*(unsigned char volatile xdata *)0xFF6C)
#define PWM11HLD (*(unsigned char volatile xdata *)0xFF6D)
#define PWM12T1H (*(unsigned char volatile xdata *)0xFF70)
#define PWM12T1L (*(unsigned char volatile xdata *)0xFF71)
#define PWM12T2H (*(unsigned char volatile xdata *)0xFF72)
#define PWM12T2L (*(unsigned char volatile xdata *)0xFF73)
#define PWM12CR (*(unsigned char volatile xdata *)0xFF74)
#define PWM12HLD (*(unsigned char volatile xdata *)0xFF75)
#define PWM13T1H (*(unsigned char volatile xdata *)0xFF78)
#define PWM13T1L (*(unsigned char volatile xdata *)0xFF79)
#define PWM13T2H (*(unsigned char volatile xdata *)0xFF7A)
#define PWM13T2L (*(unsigned char volatile xdata *)0xFF7B)
#define PWM13CR (*(unsigned char volatile xdata *)0xFF7C)
#define PWM13HLD (*(unsigned char volatile xdata *)0xFF7D)
#define PWM14T1H (*(unsigned char volatile xdata *)0xFF80)
#define PWM14T1L (*(unsigned char volatile xdata *)0xFF81)
#define PWM14T2H (*(unsigned char volatile xdata *)0xFF82)
#define PWM14T2L (*(unsigned char volatile xdata *)0xFF83)
#define PWM14CR (*(unsigned char volatile xdata *)0xFF84)
#define PWM14HLD (*(unsigned char volatile xdata *)0xFF85)
#define PWM15T1H (*(unsigned char volatile xdata *)0xFF88)
#define PWM15T1L (*(unsigned char volatile xdata *)0xFF89)
#define PWM15T2H (*(unsigned char volatile xdata *)0xFF8A)
#define PWM15T2L (*(unsigned char volatile xdata *)0xFF8B)
#define PWM15CR (*(unsigned char volatile xdata *)0xFF8C)
#define PWM15HLD (*(unsigned char volatile xdata *)0xFF8D)
#define PWM16T1H (*(unsigned char volatile xdata *)0xFF90)
#define PWM16T1L (*(unsigned char volatile xdata *)0xFF91)
#define PWM16T2H (*(unsigned char volatile xdata *)0xFF92)
#define PWM16T2L (*(unsigned char volatile xdata *)0xFF93)
#define PWM16CR (*(unsigned char volatile xdata *)0xFF94)
#define PWM16HLD (*(unsigned char volatile xdata *)0xFF95)
#define PWM17T1H (*(unsigned char volatile xdata *)0xFF98)
#define PWM17T1L (*(unsigned char volatile xdata *)0xFF99)
#define PWM17T2H (*(unsigned char volatile xdata *)0xFF9A)
#define PWM17T2L (*(unsigned char volatile xdata *)0xFF9B)
#define PWM17CR (*(unsigned char volatile xdata *)0xFF9C)
#define PWM17HLD (*(unsigned char volatile xdata *)0xFF9D)
#define PWM2CH (*(unsigned char volatile xdata *)0xFFA0)
#define PWM2CL (*(unsigned char volatile xdata *)0xFFA1)
#define PWM2CKS (*(unsigned char volatile xdata *)0xFFA2)
#define PWM2TADCH (*(unsigned char volatile xdata *)0xFFA3)
#define PWM2TADCL (*(unsigned char volatile xdata *)0xFFA4)
#define PWM2IF (*(unsigned char volatile xdata *)0xFFA5)
#define PWM2FDCR (*(unsigned char volatile xdata *)0xFFA6)
#define PWM20T1H (*(unsigned char volatile xdata *)0xFFB0)
#define PWM20T1L (*(unsigned char volatile xdata *)0xFFB1)
#define PWM20T2H (*(unsigned char volatile xdata *)0xFFB2)
#define PWM20T2L (*(unsigned char volatile xdata *)0xFFB3)
#define PWM20CR (*(unsigned char volatile xdata *)0xFFB4)
#define PWM20HLD (*(unsigned char volatile xdata *)0xFFB5)
#define PWM21T1H (*(unsigned char volatile xdata *)0xFFB8)
#define PWM21T1L (*(unsigned char volatile xdata *)0xFFB9)
#define PWM21T2H (*(unsigned char volatile xdata *)0xFFBA)
#define PWM21T2L (*(unsigned char volatile xdata *)0xFFBB)
#define PWM21CR (*(unsigned char volatile xdata *)0xFFBC)
#define PWM21HLD (*(unsigned char volatile xdata *)0xFFBD)
#define PWM22T1H (*(unsigned char volatile xdata *)0xFFC0)
#define PWM22T1L (*(unsigned char volatile xdata *)0xFFC1)
#define PWM22T2H (*(unsigned char volatile xdata *)0xFFC2)
#define PWM22T2L (*(unsigned char volatile xdata *)0xFFC3)
#define PWM22CR (*(unsigned char volatile xdata *)0xFFC4)
#define PWM22HLD (*(unsigned char volatile xdata *)0xFFC5)
#define PWM23T1H (*(unsigned char volatile xdata *)0xFFC8)
#define PWM23T1L (*(unsigned char volatile xdata *)0xFFC9)
#define PWM23T2H (*(unsigned char volatile xdata *)0xFFCA)
#define PWM23T2L (*(unsigned char volatile xdata *)0xFFCB)
#define PWM23CR (*(unsigned char volatile xdata *)0xFFCC)
#define PWM23HLD (*(unsigned char volatile xdata *)0xFFCD)
#define PWM24T1H (*(unsigned char volatile xdata *)0xFFD0)
#define PWM24T1L (*(unsigned char volatile xdata *)0xFFD1)
#define PWM24T2H (*(unsigned char volatile xdata *)0xFFD2)
#define PWM24T2L (*(unsigned char volatile xdata *)0xFFD3)
#define PWM24CR (*(unsigned char volatile xdata *)0xFFD4)
#define PWM24HLD (*(unsigned char volatile xdata *)0xFFD5)
#define PWM25T1H (*(unsigned char volatile xdata *)0xFFD8)
#define PWM25T1L (*(unsigned char volatile xdata *)0xFFD9)
#define PWM25T2H (*(unsigned char volatile xdata *)0xFFDA)
#define PWM25T2L (*(unsigned char volatile xdata *)0xFFDB)
#define PWM25CR (*(unsigned char volatile xdata *)0xFFDC)
#define PWM25HLD (*(unsigned char volatile xdata *)0xFFDD)
#define PWM26T1H (*(unsigned char volatile xdata *)0xFFE0)
#define PWM26T1L (*(unsigned char volatile xdata *)0xFFE1)
#define PWM26T2H (*(unsigned char volatile xdata *)0xFFE2)
#define PWM26T2L (*(unsigned char volatile xdata *)0xFFE3)
#define PWM26CR (*(unsigned char volatile xdata *)0xFFE4)
#define PWM26HLD (*(unsigned char volatile xdata *)0xFFE5)
#define PWM27T1H (*(unsigned char volatile xdata *)0xFFE8)
#define PWM27T1L (*(unsigned char volatile xdata *)0xFFE9)
#define PWM27T2H (*(unsigned char volatile xdata *)0xFFEA)
#define PWM27T2L (*(unsigned char volatile xdata *)0xFFEB)
#define PWM27CR (*(unsigned char volatile xdata *)0xFFEC)
#define PWM27HLD (*(unsigned char volatile xdata *)0xFFED)
#define PWM3CH (*(unsigned char volatile xdata *)0xFC00)
#define PWM3CL (*(unsigned char volatile xdata *)0xFC01)
#define PWM3CKS (*(unsigned char volatile xdata *)0xFC02)
#define PWM3IF (*(unsigned char volatile xdata *)0xFC05)
#define PWM3FDCR (*(unsigned char volatile xdata *)0xFC06)
#define PWM30T1H (*(unsigned char volatile xdata *)0xFC10)
#define PWM30T1L (*(unsigned char volatile xdata *)0xFC11)
#define PWM30T2H (*(unsigned char volatile xdata *)0xFC12)
#define PWM30T2L (*(unsigned char volatile xdata *)0xFC13)
#define PWM30CR (*(unsigned char volatile xdata *)0xFC14)
#define PWM30HLD (*(unsigned char volatile xdata *)0xFC15)
#define PWM31T1H (*(unsigned char volatile xdata *)0xFC18)
#define PWM31T1L (*(unsigned char volatile xdata *)0xFC19)
#define PWM31T2H (*(unsigned char volatile xdata *)0xFC1A)
#define PWM31T2L (*(unsigned char volatile xdata *)0xFC1B)
#define PWM31CR (*(unsigned char volatile xdata *)0xFC1C)
#define PWM31HLD (*(unsigned char volatile xdata *)0xFC1D)
#define PWM32T1H (*(unsigned char volatile xdata *)0xFC20)
#define PWM32T1L (*(unsigned char volatile xdata *)0xFC21)
#define PWM32T2H (*(unsigned char volatile xdata *)0xFC22)
#define PWM32T2L (*(unsigned char volatile xdata *)0xFC23)
#define PWM32CR (*(unsigned char volatile xdata *)0xFC24)
#define PWM32HLD (*(unsigned char volatile xdata *)0xFC25)
#define PWM33T1H (*(unsigned char volatile xdata *)0xFC28)
#define PWM33T1L (*(unsigned char volatile xdata *)0xFC29)
#define PWM33T2H (*(unsigned char volatile xdata *)0xFC2A)
#define PWM33T2L (*(unsigned char volatile xdata *)0xFC2B)
#define PWM33CR (*(unsigned char volatile xdata *)0xFC2C)
#define PWM33HLD (*(unsigned char volatile xdata *)0xFC2D)
#define PWM34T1H (*(unsigned char volatile xdata *)0xFC30)
#define PWM34T1L (*(unsigned char volatile xdata *)0xFC31)
#define PWM34T2H (*(unsigned char volatile xdata *)0xFC32)
#define PWM34T2L (*(unsigned char volatile xdata *)0xFC33)
#define PWM34CR (*(unsigned char volatile xdata *)0xFC34)
#define PWM34HLD (*(unsigned char volatile xdata *)0xFC35)
#define PWM35T1H (*(unsigned char volatile xdata *)0xFC38)
#define PWM35T1L (*(unsigned char volatile xdata *)0xFC39)
#define PWM35T2H (*(unsigned char volatile xdata *)0xFC3A)
#define PWM35T2L (*(unsigned char volatile xdata *)0xFC3B)
#define PWM35CR (*(unsigned char volatile xdata *)0xFC3C)
#define PWM35HLD (*(unsigned char volatile xdata *)0xFC3D)
#define PWM36T1H (*(unsigned char volatile xdata *)0xFC40)
#define PWM36T1L (*(unsigned char volatile xdata *)0xFC41)
#define PWM36T2H (*(unsigned char volatile xdata *)0xFC42)
#define PWM36T2L (*(unsigned char volatile xdata *)0xFC43)
#define PWM36CR (*(unsigned char volatile xdata *)0xFC44)
#define PWM36HLD (*(unsigned char volatile xdata *)0xFC45)
#define PWM37T1H (*(unsigned char volatile xdata *)0xFC48)
#define PWM37T1L (*(unsigned char volatile xdata *)0xFC49)
#define PWM37T2H (*(unsigned char volatile xdata *)0xFC4A)
#define PWM37T2L (*(unsigned char volatile xdata *)0xFC4B)
#define PWM37CR (*(unsigned char volatile xdata *)0xFC4C)
#define PWM37HLD (*(unsigned char volatile xdata *)0xFC4D)
#define PWM4CH (*(unsigned char volatile xdata *)0xFC50)
#define PWM4CL (*(unsigned char volatile xdata *)0xFC51)
#define PWM4CKS (*(unsigned char volatile xdata *)0xFC52)
#define PWM4TADCH (*(unsigned char volatile xdata *)0xFC53)
#define PWM4TADCL (*(unsigned char volatile xdata *)0xFC54)
#define PWM4IF (*(unsigned char volatile xdata *)0xFC55)
#define PWM4FDCR (*(unsigned char volatile xdata *)0xFC56)
#define PWM40T1H (*(unsigned char volatile xdata *)0xFC60)
#define PWM40T1L (*(unsigned char volatile xdata *)0xFC61)
#define PWM40T2H (*(unsigned char volatile xdata *)0xFC62)
#define PWM40T2L (*(unsigned char volatile xdata *)0xFC63)
#define PWM40CR (*(unsigned char volatile xdata *)0xFC64)
#define PWM40HLD (*(unsigned char volatile xdata *)0xFC65)
#define PWM41T1H (*(unsigned char volatile xdata *)0xFC68)
#define PWM41T1L (*(unsigned char volatile xdata *)0xFC69)
#define PWM41T2H (*(unsigned char volatile xdata *)0xFC6A)
#define PWM41T2L (*(unsigned char volatile xdata *)0xFC6B)
#define PWM41CR (*(unsigned char volatile xdata *)0xFC6C)
#define PWM41HLD (*(unsigned char volatile xdata *)0xFC6D)
#define PWM42T1H (*(unsigned char volatile xdata *)0xFC70)
#define PWM42T1L (*(unsigned char volatile xdata *)0xFC71)
#define PWM42T2H (*(unsigned char volatile xdata *)0xFC72)
#define PWM42T2L (*(unsigned char volatile xdata *)0xFC73)
#define PWM42CR (*(unsigned char volatile xdata *)0xFC74)
#define PWM42HLD (*(unsigned char volatile xdata *)0xFC75)
#define PWM43T1H (*(unsigned char volatile xdata *)0xFC78)
#define PWM43T1L (*(unsigned char volatile xdata *)0xFC79)
#define PWM43T2H (*(unsigned char volatile xdata *)0xFC7A)
#define PWM43T2L (*(unsigned char volatile xdata *)0xFC7B)
#define PWM43CR (*(unsigned char volatile xdata *)0xFC7C)
#define PWM43HLD (*(unsigned char volatile xdata *)0xFC7D)
#define PWM44T1H (*(unsigned char volatile xdata *)0xFC80)
#define PWM44T1L (*(unsigned char volatile xdata *)0xFC81)
#define PWM44T2H (*(unsigned char volatile xdata *)0xFC82)
#define PWM44T2L (*(unsigned char volatile xdata *)0xFC83)
#define PWM44CR (*(unsigned char volatile xdata *)0xFC84)
#define PWM44HLD (*(unsigned char volatile xdata *)0xFC85)
#define PWM45T1H (*(unsigned char volatile xdata *)0xFC88)
#define PWM45T1L (*(unsigned char volatile xdata *)0xFC89)
#define PWM45T2H (*(unsigned char volatile xdata *)0xFC8A)
#define PWM45T2L (*(unsigned char volatile xdata *)0xFC8B)
#define PWM45CR (*(unsigned char volatile xdata *)0xFC8C)
#define PWM45HLD (*(unsigned char volatile xdata *)0xFC8D)
#define PWM46T1H (*(unsigned char volatile xdata *)0xFC90)
#define PWM46T1L (*(unsigned char volatile xdata *)0xFC91)
#define PWM46T2H (*(unsigned char volatile xdata *)0xFC92)
#define PWM46T2L (*(unsigned char volatile xdata *)0xFC93)
#define PWM46CR (*(unsigned char volatile xdata *)0xFC94)
#define PWM46HLD (*(unsigned char volatile xdata *)0xFC95)
#define PWM47T1H (*(unsigned char volatile xdata *)0xFC98)
#define PWM47T1L (*(unsigned char volatile xdata *)0xFC99)
#define PWM47T2H (*(unsigned char volatile xdata *)0xFC9A)
#define PWM47T2L (*(unsigned char volatile xdata *)0xFC9B)
#define PWM47CR (*(unsigned char volatile xdata *)0xFC9C)
#define PWM47HLD (*(unsigned char volatile xdata *)0xFC9D)
#define PWM5CH (*(unsigned char volatile xdata *)0xFCA0)
#define PWM5CL (*(unsigned char volatile xdata *)0xFCA1)
#define PWM5CKS (*(unsigned char volatile xdata *)0xFCA2)
#define PWM5IF (*(unsigned char volatile xdata *)0xFCA5)
#define PWM5FDCR (*(unsigned char volatile xdata *)0xFCA6)
#define PWM50T1H (*(unsigned char volatile xdata *)0xFCB0)
#define PWM50T1L (*(unsigned char volatile xdata *)0xFCB1)
#define PWM50T2H (*(unsigned char volatile xdata *)0xFCB2)
#define PWM50T2L (*(unsigned char volatile xdata *)0xFCB3)
#define PWM50CR (*(unsigned char volatile xdata *)0xFCB4)
#define PWM50HLD (*(unsigned char volatile xdata *)0xFCB5)
#define PWM51T1H (*(unsigned char volatile xdata *)0xFCB8)
#define PWM51T1L (*(unsigned char volatile xdata *)0xFCB9)
#define PWM51T2H (*(unsigned char volatile xdata *)0xFCBA)
#define PWM51T2L (*(unsigned char volatile xdata *)0xFCBB)
#define PWM51CR (*(unsigned char volatile xdata *)0xFCBC)
#define PWM51HLD (*(unsigned char volatile xdata *)0xFCBD)
#define PWM52T1H (*(unsigned char volatile xdata *)0xFCC0)
#define PWM52T1L (*(unsigned char volatile xdata *)0xFCC1)
#define PWM52T2H (*(unsigned char volatile xdata *)0xFCC2)
#define PWM52T2L (*(unsigned char volatile xdata *)0xFCC3)
#define PWM52CR (*(unsigned char volatile xdata *)0xFCC4)
#define PWM52HLD (*(unsigned char volatile xdata *)0xFCC5)
#define PWM53T1H (*(unsigned char volatile xdata *)0xFCC8)
#define PWM53T1L (*(unsigned char volatile xdata *)0xFCC9)
#define PWM53T2H (*(unsigned char volatile xdata *)0xFCCA)
#define PWM53T2L (*(unsigned char volatile xdata *)0xFCCB)
#define PWM53CR (*(unsigned char volatile xdata *)0xFCCC)
#define PWM53HLD (*(unsigned char volatile xdata *)0xFCCD)
#define PWM54T1H (*(unsigned char volatile xdata *)0xFCD0)
#define PWM54T1L (*(unsigned char volatile xdata *)0xFCD1)
#define PWM54T2H (*(unsigned char volatile xdata *)0xFCD2)
#define PWM54T2L (*(unsigned char volatile xdata *)0xFCD3)
#define PWM54CR (*(unsigned char volatile xdata *)0xFCD4)
#define PWM54HLD (*(unsigned char volatile xdata *)0xFCD5)
#define PWM55T1H (*(unsigned char volatile xdata *)0xFCD8)
#define PWM55T1L (*(unsigned char volatile xdata *)0xFCD9)
#define PWM55T2H (*(unsigned char volatile xdata *)0xFCDA)
#define PWM55T2L (*(unsigned char volatile xdata *)0xFCDB)
#define PWM55CR (*(unsigned char volatile xdata *)0xFCDC)
#define PWM55HLD (*(unsigned char volatile xdata *)0xFCDD)
#define PWM56T1H (*(unsigned char volatile xdata *)0xFCE0)
#define PWM56T1L (*(unsigned char volatile xdata *)0xFCE1)
#define PWM56T2H (*(unsigned char volatile xdata *)0xFCE2)
#define PWM56T2L (*(unsigned char volatile xdata *)0xFCE3)
#define PWM56CR (*(unsigned char volatile xdata *)0xFCE4)
#define PWM56HLD (*(unsigned char volatile xdata *)0xFCE5)
#define PWM57T1H (*(unsigned char volatile xdata *)0xFCE8)
#define PWM57T1L (*(unsigned char volatile xdata *)0xFCE9)
#define PWM57T2H (*(unsigned char volatile xdata *)0xFCEA)
#define PWM57T2L (*(unsigned char volatile xdata *)0xFCEB)
#define PWM57CR (*(unsigned char volatile xdata *)0xFCEC)
#define PWM57HLD (*(unsigned char volatile xdata *)0xFCED)
/////////////////////////////////////////////////
/// >>>>> add by cc
#include "../clib/bit.h"
#define D_stdIO_P0_ALL() P0M1=0;P0M0=0;
#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF;
#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0;
#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF;
#define D_stdIO_P1_ALL() P1M1=0;P1M0=0;
#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF;
#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0;
#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF;
#define D_stdIO_P0(n) BITN_0(P0M1,n);BITN_0(P0M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P0(n) BITN_0(P0M1,n);BITN_1(P0M0,n); //////01 推挽输出 20mA 加限流
#define D_HighR_P0(n) BITN_1(P0M1,n);BITN_0(P0M0,n); /////////10 高阻
#define D_OpenD_P0(n) BITN_1(P0M1,n);BITN_1(P0M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P1(n) BITN_0(P1M1,n);BITN_0(P1M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P1(n) BITN_0(P1M1,n);BITN_1(P1M0,n); //////01 推挽输出 20mA 加限流
#define D_HighR_P1(n) BITN_1(P1M1,n);BITN_0(P1M0,n); /////////10 高阻
#define D_OpenD_P1(n) BITN_1(P1M1,n);BITN_1(P1M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P2(n) BITN_0(P2M1,n);BITN_0(P2M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P2(n) BITN_0(P2M1,n);BITN_1(P2M0,n); //////01 推挽输出 20mA 加限流
#define D_HighR_P2(n) BITN_1(P2M1,n);BITN_0(P2M0,n); /////////10 高阻
#define D_OpenD_P2(n) BITN_1(P2M1,n);BITN_1(P2M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P3(n) BITN_0(P3M1,n);BITN_0(P3M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P3(n) BITN_0(P3M1,n);BITN_1(P3M0,n); //////01 推挽输出 20mA 加限流
#define D_HighR_P3(n) BITN_1(P3M1,n);BITN_0(P3M0,n); /////////10 高阻
#define D_OpenD_P3(n) BITN_1(P3M1,n);BITN_1(P3M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P4(n) BITN_0(P4M1,n);BITN_0(P4M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P4(n) BITN_0(P4M1,n);BITN_1(P4M0,n); //////01 推挽输出 20mA 加限流
#define D_HighR_P4(n) BITN_1(P4M1,n);BITN_0(P4M0,n); /////////10 高阻
#define D_OpenD_P4(n) BITN_1(P4M1,n);BITN_1(P4M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流
#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻
#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P6(n) BITN_0(P6M1,n);BITN_0(P6M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P6(n) BITN_0(P6M1,n);BITN_1(P6M0,n); //////01 推挽输出 20mA 加限流
#define D_HighR_P6(n) BITN_1(P6M1,n);BITN_0(P6M0,n); /////////10 高阻
#define D_OpenD_P6(n) BITN_1(P6M1,n);BITN_1(P6M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P7(n) BITN_0(P7M1,n);BITN_0(P7M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P7(n) BITN_0(P7M1,n);BITN_1(P7M0,n); //////01 推挽输出 20mA 加限流
#define D_HighR_P7(n) BITN_1(P7M1,n);BITN_0(P7M0,n); /////////10 高阻
#define D_OpenD_P7(n) BITN_1(P7M1,n);BITN_1(P7M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
/***
#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n);
#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n);
#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n);
#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n);
#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n);
#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n);
#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n);
#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n);
***/
#define NOP() _nop_()
#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4)
#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4)
#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4)
#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF)
#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF)
#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF)
//////
#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3);
#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3);
#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2);
#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2);
#define L0_INT1_OPEN() EX1 = 1;
#define L0_INT1_CLOSE() EX1 = 0;
#define L0_INT0_OPEN() EX0 = 1;
#define L0_INT0_CLOSE() EX0 = 0;
#define D_ISR_int0 0 ///int0 下降沿触发 = 0 上下沿均可触发
#define D_ISR_timer0 1
#define D_ISR_int1 2 ///int1 下降沿触发 = 0 上下沿均可触发
#define D_ISR_timer1 3
#define D_ISR_int2 10 /////只有下降沿
#define D_ISR_int3 11 /////只有下降沿
#define D_SERVE_UART 4
#define D_ISR_int4 16 /////只有下降沿
#if 0
#define L0_TIMER1_start() TR1 = 1;
#define L0_TIMER1_end() TR1 = 0;
#define L0_TIMER1_isr_OPEN() ET1 = 1;
#define L0_TIMER1_isr_CLOSE() ET1 = 0;
#else
#define L0_TIMER1_start() ET1 = 1;
#define L0_TIMER1_end() ET1 = 0;
#define L0_TIMER1_isr_OPEN() TR1 = 1;
#define L0_TIMER1_isr_CLOSE() TR1 = 0;
#endif
/// fixme 颠倒定义会让c51锁死#define _nop_() NOP()
///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断
///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3);
#endif //STC_stc8a8k

593
source/cpu/stc_stc8f.h

@ -1,593 +0,0 @@
#ifndef __STC8F_H_
#define __STC8F_H_
/////////////////////////////////////////////////
//包含本头文件后,不用另外再包含"REG51.H"
//内核特殊功能寄存器
sfr ACC = 0xe0;
sfr B = 0xf0;
sfr PSW = 0xd0;
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit F1 = PSW^1;
sbit P = PSW^0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr TA = 0xae;
sfr DPS = 0xe3;
sfr DPL1 = 0xe4;
sfr DPH1 = 0xe5;
//I/O 口特殊功能寄存器
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xa0;
sfr P3 = 0xb0;
sfr P4 = 0xc0;
sfr P5 = 0xc8;
sfr P6 = 0xe8;
sfr P7 = 0xf8;
sfr P0M0 = 0x94;
sfr P0M1 = 0x93;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sfr P2M0 = 0x96;
sfr P2M1 = 0x95;
sfr P3M0 = 0xb2;
sfr P3M1 = 0xb1;
sfr P4M0 = 0xb4;
sfr P4M1 = 0xb3;
sfr P5M0 = 0xca;
sfr P5M1 = 0xc9;
sfr P6M0 = 0xcc;
sfr P6M1 = 0xcb;
sfr P7M0 = 0xe2;
sfr P7M1 = 0xe1;
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
sbit P60 = P6^0;
sbit P61 = P6^1;
sbit P62 = P6^2;
sbit P63 = P6^3;
sbit P64 = P6^4;
sbit P65 = P6^5;
sbit P66 = P6^6;
sbit P67 = P6^7;
sbit P70 = P7^0;
sbit P71 = P7^1;
sbit P72 = P7^2;
sbit P73 = P7^3;
sbit P74 = P7^4;
sbit P75 = P7^5;
sbit P76 = P7^6;
sbit P77 = P7^7;
//如下特殊功能寄存器位于扩展RAM区域
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
#define P0PU (*(unsigned char volatile xdata *)0xfe10)
#define P1PU (*(unsigned char volatile xdata *)0xfe11)
#define P2PU (*(unsigned char volatile xdata *)0xfe12)
#define P3PU (*(unsigned char volatile xdata *)0xfe13)
#define P4PU (*(unsigned char volatile xdata *)0xfe14)
#define P5PU (*(unsigned char volatile xdata *)0xfe15)
#define P6PU (*(unsigned char volatile xdata *)0xfe16)
#define P7PU (*(unsigned char volatile xdata *)0xfe17)
#define P0NCS (*(unsigned char volatile xdata *)0xfe18)
#define P1NCS (*(unsigned char volatile xdata *)0xfe19)
#define P2NCS (*(unsigned char volatile xdata *)0xfe1a)
#define P3NCS (*(unsigned char volatile xdata *)0xfe1b)
#define P4NCS (*(unsigned char volatile xdata *)0xfe1c)
#define P5NCS (*(unsigned char volatile xdata *)0xfe1d)
#define P6NCS (*(unsigned char volatile xdata *)0xfe1e)
#define P7NCS (*(unsigned char volatile xdata *)0xfe1f)
//系统管理特殊功能寄存器
sfr PCON = 0x87;
#define SMOD 0x80
#define SMOD0 0x40
#define LVDF 0x20
#define POF 0x10
#define GF1 0x08
#define GF0 0x04
#define PD 0x02
#define IDL 0x01
sfr AUXR = 0x8e;
#define T0x12 0x80
#define T1x12 0x40
#define UART_M0x6 0x20
#define T2R 0x10
#define T2_CT 0x08
#define T2x12 0x04
#define EXTRAM 0x02
#define S1ST2 0x01
sfr AUXR2 = 0x97;
#define TXLNRX 0x10
sfr BUS_SPEED = 0xa1;
sfr P_SW1 = 0xa2;
sfr P_SW2 = 0xba;
#define EAXFR 0x80
sfr VOCTRL = 0xbb;
sfr RSTCFG = 0xff;
//如下特殊功能寄存器位于扩展RAM区域
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
#define CKSEL (*(unsigned char volatile xdata *)0xfe00)
#define CLKDIV (*(unsigned char volatile xdata *)0xfe01)
#define IRC24MCR (*(unsigned char volatile xdata *)0xfe02)
#define XOSCCR (*(unsigned char volatile xdata *)0xfe03)
#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04)
//中断特殊功能寄存器
sfr IE = 0xa8;
sbit EA = IE^7;
sbit ELVD = IE^6;
sbit EADC = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
sfr IE2 = 0xaf;
#define ET4 0x40
#define ET3 0x20
#define ES4 0x10
#define ES3 0x08
#define ET2 0x04
#define ESPI 0x02
#define ES2 0x01
sfr IP = 0xb8;
sbit PPCA = IP^7;
sbit PLVD = IP^6;
sbit PADC = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
sfr IP2 = 0xb5;
#define PI2C 0x40
#define PCMP 0x20
#define PX4 0x10
#define PPWMFD 0x08
#define PPWM 0x04
#define PSPI 0x02
#define PS2 0x01
sfr IPH = 0xb7;
#define PPCAH 0x80
#define PLVDH 0x40
#define PADCH 0x20
#define PSH 0x10
#define PT1H 0x08
#define PX1H 0x04
#define PT0H 0x02
#define PX0H 0x01
sfr IP2H = 0xb6;
#define PI2CH 0x40
#define PCMPH 0x20
#define PX4H 0x10
#define PPWMFDH 0x08
#define PPWMH 0x04
#define PSPIH 0x02
#define PS2H 0x01
sfr INTCLKO = 0x8f;
#define EX4 0x40
#define EX3 0x20
#define EX2 0x10
#define T2CLKO 0x04
#define T1CLKO 0x02
#define T0CLKO 0x01
sfr AUXINTIF = 0xef;
#define INT4IF 0x40
#define INT3IF 0x20
#define INT2IF 0x10
#define T4IF 0x04
#define T3IF 0x02
#define T2IF 0x01
//定时器特殊功能寄存器
sfr TCON = 0x88;
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
sfr TMOD = 0x89;
#define T1_GATE 0x80
#define T1_CT 0x40
#define T1_M1 0x20
#define T1_M0 0x10
#define T0_GATE 0x08
#define T0_CT 0x04
#define T0_M1 0x02
#define T0_M0 0x01
sfr TL0 = 0x8a;
sfr TL1 = 0x8b;
sfr TH0 = 0x8c;
sfr TH1 = 0x8d;
sfr T4T3M = 0xd1;
#define T4R 0x80
#define T4_CT 0x40
#define T4x12 0x20
#define T4CLKO 0x10
#define T3R 0x08
#define T3_CT 0x04
#define T3x12 0x02
#define T3CLKO 0x01
sfr T4H = 0xd2;
sfr T4L = 0xd3;
sfr T3H = 0xd4;
sfr T3L = 0xd5;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr TH4 = 0xd2;
sfr TL4 = 0xd3;
sfr TH3 = 0xd4;
sfr TL3 = 0xd5;
sfr TH2 = 0xd6;
sfr TL2 = 0xd7;
sfr WKTCL = 0xaa;
sfr WKTCH = 0xab;
#define WKTEN 0x80
sfr WDT_CONTR = 0xc1;
#define WDT_FLAG 0x80
#define EN_WDT 0x20
#define CLR_WDT 0x10
#define IDL_WDT 0x08
//串行口特殊功能寄存器
sfr SCON = 0x98;
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
sfr SBUF = 0x99;
sfr S2CON = 0x9a;
#define S2SM0 0x80
#define S2ST4 0x40
#define S2SM2 0x20
#define S2REN 0x10
#define S2TB8 0x08
#define S2RB8 0x04
#define S2TI 0x02
#define S2RI 0x01
sfr S2BUF = 0x9b;
sfr S3CON = 0xac;
#define S3SM0 0x80
#define S3ST4 0x40
#define S3SM2 0x20
#define S3REN 0x10
#define S3TB8 0x08
#define S3RB8 0x04
#define S3TI 0x02
#define S3RI 0x01
sfr S3BUF = 0xad;
sfr S4CON = 0x84;
#define S4SM0 0x80
#define S4ST4 0x40
#define S4SM2 0x20
#define S4REN 0x10
#define S4TB8 0x08
#define S4RB8 0x04
#define S4TI 0x02
#define S4RI 0x01
sfr S4BUF = 0x85;
sfr SADDR = 0xa9;
sfr SADEN = 0xb9;
//ADC 特殊功能寄存器
sfr ADC_CONTR = 0xbc;
#define ADC_POWER 0x80
#define ADC_START 0x40
#define ADC_FLAG 0x20
sfr ADC_RES = 0xbd;
sfr ADC_RESL = 0xbe;
sfr ADCCFG = 0xde;
#define ADC_RESFMT 0x20
//SPI 特殊功能寄存器
sfr SPSTAT = 0xcd;
#define SPIF 0x80
#define WCOL 0x40
sfr SPCTL = 0xce;
#define SSIG 0x80
#define SPEN 0x40
#define DORD 0x20
#define MSTR 0x10
#define CPOL 0x08
#define CPHA 0x04
sfr SPDAT = 0xcf;
//IAP/ISP 特殊功能寄存器
sfr IAP_DATA = 0xc2;
sfr IAP_ADDRH = 0xc3;
sfr IAP_ADDRL = 0xc4;
sfr IAP_CMD = 0xc5;
#define IAP_IDL 0x00
#define IAP_READ 0x01
#define IAP_WRITE 0x02
#define IAP_ERASE 0x03
sfr IAP_TRIG = 0xc6;
sfr IAP_CONTR = 0xc7;
#define IAPEN 0x80
#define SWBS 0x40
#define SWRST 0x20
#define CMD_FAIL 0x10
sfr ISP_DATA = 0xc2;
sfr ISP_ADDRH = 0xc3;
sfr ISP_ADDRL = 0xc4;
sfr ISP_CMD = 0xc5;
sfr ISP_TRIG = 0xc6;
sfr ISP_CONTR = 0xc7;
//比较器特殊功能寄存器
sfr CMPCR1 = 0xe6;
#define CMPEN 0x80
#define CMPIF 0x40
#define PIE 0x20
#define NIE 0x10
#define PIS 0x08
#define NIS 0x04
#define CMPOE 0x02
#define CMPRES 0x01
sfr CMPCR2 = 0xe7;
#define INVCMPO 0x80
#define DISFLT 0x40
//PCA/PWM 特殊功能寄存器
sfr CCON = 0xd8;
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF3 = CCON^3;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
sfr CMOD = 0xd9;
#define CIDL 0x80
#define ECF 0x01
sfr CL = 0xe9;
sfr CH = 0xf9;
sfr CCAPM0 = 0xda;
#define ECOM0 0x40
#define CCAPP0 0x20
#define CCAPN0 0x10
#define MAT0 0x08
#define TOG0 0x04
#define PWM0 0x02
#define ECCF0 0x01
sfr CCAPM1 = 0xdb;
#define ECOM1 0x40
#define CCAPP1 0x20
#define CCAPN1 0x10
#define MAT1 0x08
#define TOG1 0x04
#define PWM1 0x02
#define ECCF1 0x01
sfr CCAPM2 = 0xdc;
#define ECOM2 0x40
#define CCAPP2 0x20
#define CCAPN2 0x10
#define MAT2 0x08
#define TOG2 0x04
#define PWM2 0x02
#define ECCF2 0x01
sfr CCAPM3 = 0xdd;
#define ECOM3 0x40
#define CCAPP3 0x20
#define CCAPN3 0x10
#define MAT3 0x08
#define TOG3 0x04
#define PWM3 0x02
#define ECCF3 0x01
sfr CCAP0L = 0xea;
sfr CCAP1L = 0xeb;
sfr CCAP2L = 0xec;
sfr CCAP3L = 0xed;
sfr CCAP0H = 0xfa;
sfr CCAP1H = 0xfb;
sfr CCAP2H = 0xfc;
sfr CCAP3H = 0xfd;
sfr PCA_PWM0 = 0xf2;
sfr PCA_PWM1 = 0xf3;
sfr PCA_PWM2 = 0xf4;
sfr PCA_PWM3 = 0xf5;
//增强型PWM波形发生器特殊功能寄存器
sfr PWMCFG = 0xf1;
#define CBIF 0x80
#define ETADC 0x40
sfr PWMIF = 0xf6;
#define C7IF 0x80
#define C6IF 0x40
#define C5IF 0x20
#define C4IF 0x10
#define C3IF 0x08
#define C2IF 0x04
#define C1IF 0x02
#define C0IF 0x01
sfr PWMFDCR = 0xf7;
#define INVCMP 0x80
#define INVIO 0x40
#define ENFD 0x20
#define FLTFLIO 0x10
#define EFDI 0x08
#define FDCMP 0x04
#define FDIO 0x02
#define FDIF 0x01
sfr PWMCR = 0xfe;
#define ENPWM 0x80
#define ECBI 0x40
//如下特殊功能寄存器位于扩展RAM区域
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
#define PWMC (*(unsigned int volatile xdata *)0xfff0)
#define PWMCH (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)
#define TADCP (*(unsigned char volatile xdata *)0xfff3)
#define TADCPH (*(unsigned char volatile xdata *)0xfff3)
#define TADCPL (*(unsigned char volatile xdata *)0xfff4)
#define PWM0T1 (*(unsigned int volatile xdata *)0xff00)
#define PWM0T1H (*(unsigned char volatile xdata *)0xff00)
#define PWM0T1L (*(unsigned char volatile xdata *)0xff01)
#define PWM0T2 (*(unsigned int volatile xdata *)0xff02)
#define PWM0T2H (*(unsigned char volatile xdata *)0xff02)
#define PWM0T2L (*(unsigned char volatile xdata *)0xff03)
#define PWM0CR (*(unsigned char volatile xdata *)0xff04)
#define PWM0HLD (*(unsigned char volatile xdata *)0xff05)
#define PWM1T1 (*(unsigned int volatile xdata *)0xff10)
#define PWM1T1H (*(unsigned char volatile xdata *)0xff10)
#define PWM1T1L (*(unsigned char volatile xdata *)0xff11)
#define PWM1T2 (*(unsigned int volatile xdata *)0xff12)
#define PWM1T2H (*(unsigned char volatile xdata *)0xff12)
#define PWM1T2L (*(unsigned char volatile xdata *)0xff13)
#define PWM1CR (*(unsigned char volatile xdata *)0xff14)
#define PWM1HLD (*(unsigned char volatile xdata *)0xff15)
#define PWM2T1 (*(unsigned int volatile xdata *)0xff20)
#define PWM2T1H (*(unsigned char volatile xdata *)0xff20)
#define PWM2T1L (*(unsigned char volatile xdata *)0xff21)
#define PWM2T2 (*(unsigned int volatile xdata *)0xff22)
#define PWM2T2H (*(unsigned char volatile xdata *)0xff22)
#define PWM2T2L (*(unsigned char volatile xdata *)0xff23)
#define PWM2CR (*(unsigned char volatile xdata *)0xff24)
#define PWM2HLD (*(unsigned char volatile xdata *)0xff25)
#define PWM3T1 (*(unsigned int volatile xdata *)0xff30)
#define PWM3T1H (*(unsigned char volatile xdata *)0xff30)
#define PWM3T1L (*(unsigned char volatile xdata *)0xff31)
#define PWM3T2 (*(unsigned int volatile xdata *)0xff32)
#define PWM3T2H (*(unsigned char volatile xdata *)0xff32)
#define PWM3T2L (*(unsigned char volatile xdata *)0xff33)
#define PWM3CR (*(unsigned char volatile xdata *)0xff34)
#define PWM3HLD (*(unsigned char volatile xdata *)0xff35)
#define PWM4T1 (*(unsigned int volatile xdata *)0xff40)
#define PWM4T1H (*(unsigned char volatile xdata *)0xff40)
#define PWM4T1L (*(unsigned char volatile xdata *)0xff41)
#define PWM4T2 (*(unsigned int volatile xdata *)0xff42)
#define PWM4T2H (*(unsigned char volatile xdata *)0xff42)
#define PWM4T2L (*(unsigned char volatile xdata *)0xff43)
#define PWM4CR (*(unsigned char volatile xdata *)0xff44)
#define PWM4HLD (*(unsigned char volatile xdata *)0xff45)
#define PWM5T1 (*(unsigned int volatile xdata *)0xff50)
#define PWM5T1H (*(unsigned char volatile xdata *)0xff50)
#define PWM5T1L (*(unsigned char volatile xdata *)0xff51)
#define PWM5T2 (*(unsigned int volatile xdata *)0xff52)
#define PWM5T2H (*(unsigned char volatile xdata *)0xff52)
#define PWM5T2L (*(unsigned char volatile xdata *)0xff53)
#define PWM5CR (*(unsigned char volatile xdata *)0xff54)
#define PWM5HLD (*(unsigned char volatile xdata *)0xff55)
#define PWM6T1 (*(unsigned int volatile xdata *)0xff60)
#define PWM6T1H (*(unsigned char volatile xdata *)0xff60)
#define PWM6T1L (*(unsigned char volatile xdata *)0xff61)
#define PWM6T2 (*(unsigned int volatile xdata *)0xff62)
#define PWM6T2H (*(unsigned char volatile xdata *)0xff62)
#define PWM6T2L (*(unsigned char volatile xdata *)0xff63)
#define PWM6CR (*(unsigned char volatile xdata *)0xff64)
#define PWM6HLD (*(unsigned char volatile xdata *)0xff65)
#define PWM7T1 (*(unsigned int volatile xdata *)0xff70)
#define PWM7T1H (*(unsigned char volatile xdata *)0xff70)
#define PWM7T1L (*(unsigned char volatile xdata *)0xff71)
#define PWM7T2 (*(unsigned int volatile xdata *)0xff72)
#define PWM7T2H (*(unsigned char volatile xdata *)0xff72)
#define PWM7T2L (*(unsigned char volatile xdata *)0xff73)
#define PWM7CR (*(unsigned char volatile xdata *)0xff74)
#define PWM7HLD (*(unsigned char volatile xdata *)0xff75)
//I2C特殊功能寄存器
//如下特殊功能寄存器位于扩展RAM区域
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
#define I2CCFG (*(unsigned char volatile xdata *)0xfe80)
#define ENI2C 0x80
#define MSSL 0x40
#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81)
#define EMSI 0x80
#define I2CMSST (*(unsigned char volatile xdata *)0xfe82)
#define MSBUSY 0x80
#define MSIF 0x40
#define MSACKI 0x02
#define MSACKO 0x01
#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83)
#define ESTAI 0x40
#define ERXI 0x20
#define ETXI 0x10
#define ESTOI 0x08
#define SLRST 0x01
#define I2CSLST (*(unsigned char volatile xdata *)0xfe84)
#define SLBUSY 0x80
#define STAIF 0x40
#define RXIF 0x20
#define TXIF 0x10
#define STOIF 0x08
#define TXING 0x04
#define SLACKI 0x02
#define SLACKO 0x01
#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85)
#define I2CTXD (*(unsigned char volatile xdata *)0xfe86)
#define I2CRXD (*(unsigned char volatile xdata *)0xfe87)
/////////////////////////////////////////////////
#endif

35
source/cpu/stc_stc8h.h

@ -1089,7 +1089,42 @@ sfr RSTCFG = 0xff;
#define NOP_N(N) NOP##N()
/////////////////////////////////////////////////
#define ET4 0x40
#define ET3 0x20
#define ES4 0x10
#define ES3 0x08
#define ET2 0x04
#define ESPI 0x02
#define ES2 0x01
#define S2SM0 BITN7
#define S2ST2 BITN6
#define S2SM2 BITN5
#define S2REN BITN4
#define S2TB8 BITN3
#define S2RB8 BITN2
#define S2TI BITN1
#define S2RI BITN0
#define S3SM0 BITN7
#define S3ST3 BITN6
#define S3SM2 BITN5
#define S3REN BITN4
#define S3TB8 BITN3
#define S3RB8 BITN2
#define S3TI BITN1
#define S3RI BITN0
#define S4SM0 BITN7
#define S4ST4 BITN6
#define S4SM2 BITN5
#define S4REN BITN4
#define S4TB8 BITN3
#define S4RB8 BITN2
#define S4TI BITN1
#define S4RI BITN0
#endif

640
source/cpu/stc_stc8hxx.h

@ -1,640 +0,0 @@
#ifndef __STC8H_H__
#define __STC8H_H__
/////////////////////////////////////////////////
//������ͷ�ļ���,���������ٰ���"REG51.H"
sfr P0 = 0x80;
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr S4CON = 0x84;
sfr S4BUF = 0x85;
sfr PCON = 0x87;
sfr TCON = 0x88;
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
sfr TMOD = 0x89;
sfr TL0 = 0x8a;
sfr TL1 = 0x8b;
sfr TH0 = 0x8c;
sfr TH1 = 0x8d;
sfr AUXR = 0x8e;
sfr INTCLKO = 0x8f;
sfr P1 = 0x90;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr SCON = 0x98;
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
sfr SBUF = 0x99;
sfr S2CON = 0x9a;
sfr S2BUF = 0x9b;
sfr IRCBAND = 0x9d;
sfr LIRTRIM = 0x9e;
sfr IRTRIM = 0x9f;
sfr P2 = 0xa0;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P_SW1 = 0xa2;
sfr IE = 0xa8;
sbit EA = IE^7;
sbit ELVD = IE^6;
sbit EADC = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
sfr SADDR = 0xa9;
sfr WKTCL = 0xaa;
sfr WKTCH = 0xab;
sfr S3CON = 0xac;
sfr S3BUF = 0xad;
sfr TA = 0xae;
sfr IE2 = 0xaf;
sfr P3 = 0xb0;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr IP2 = 0xb5;
sfr IP2H = 0xb6;
sfr IPH = 0xb7;
sfr IP = 0xb8;
sbit PPCA = IP^7;
sbit PLVD = IP^6;
sbit PADC = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
sfr SADEN = 0xb9;
sfr P_SW2 = 0xba;
sfr ADC_CONTR = 0xbc;
sfr ADC_RES = 0xbd;
sfr ADC_RESL = 0xbe;
sfr P4 = 0xc0;
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sfr WDT_CONTR = 0xc1;
sfr IAP_DATA = 0xc2;
sfr IAP_ADDRH = 0xc3;
sfr IAP_ADDRL = 0xc4;
sfr IAP_CMD = 0xc5;
sfr IAP_TRIG = 0xc6;
sfr IAP_CONTR = 0xc7;
sfr P5 = 0xc8;
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
sfr P6M1 = 0xcb;
sfr P6M0 = 0xcc;
sfr SPSTAT = 0xcd;
sfr SPCTL = 0xce;
sfr SPDAT = 0xcf;
sfr PSW = 0xd0;
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit F1 = PSW^1;
sbit P = PSW^0;
sfr T4T3M = 0xd1;
sfr T4H = 0xd2;
sfr T4L = 0xd3;
sfr T3H = 0xd4;
sfr T3L = 0xd5;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr USBCLK = 0xdc;
sfr ADCCFG = 0xde;
sfr IP3 = 0xdf;
sfr ACC = 0xe0;
sfr P7M1 = 0xe1;
sfr P7M0 = 0xe2;
sfr DPS = 0xe3;
sfr DPL1 = 0xe4;
sfr DPH1 = 0xe5;
sfr CMPCR1 = 0xe6;
sfr CMPCR2 = 0xe7;
sfr P6 = 0xe8;
sfr USBDAT = 0xec;
sfr IP3H = 0xee;
sfr AUXINTIF = 0xef;
sfr B = 0xf0;
sfr USBCON = 0xf4;
sfr IAP_TPS = 0xf5;
sfr P7 = 0xf8;
sfr USBADR = 0xfc;
sfr RSTCFG = 0xff;
//�������⹦�ܼĴ���λ����չRAM����
//������Щ�Ĵ���,���Ƚ�P_SW2��BIT7����Ϊ1,�ſ�������д
/////////////////////////////////////////////////
//FF00H-FFFFH
/////////////////////////////////////////////////
/////////////////////////////////////////////////
//FE00H-FEFFH
/////////////////////////////////////////////////
#define CKSEL (*(unsigned char volatile xdata *)0xfe00)
#define CLKDIV (*(unsigned char volatile xdata *)0xfe01)
#define HIRCCR (*(unsigned char volatile xdata *)0xfe02)
#define XOSCCR (*(unsigned char volatile xdata *)0xfe03)
#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04)
#define MCLKOCR (*(unsigned char volatile xdata *)0xfe05)
#define IRCDB (*(unsigned char volatile xdata *)0xfe06)
#define X32KCR (*(unsigned char volatile xdata *)0xfe08)
#define P0PU (*(unsigned char volatile xdata *)0xfe10)
#define P1PU (*(unsigned char volatile xdata *)0xfe11)
#define P2PU (*(unsigned char volatile xdata *)0xfe12)
#define P3PU (*(unsigned char volatile xdata *)0xfe13)
#define P4PU (*(unsigned char volatile xdata *)0xfe14)
#define P5PU (*(unsigned char volatile xdata *)0xfe15)
#define P6PU (*(unsigned char volatile xdata *)0xfe16)
#define P7PU (*(unsigned char volatile xdata *)0xfe17)
#define P0NCS (*(unsigned char volatile xdata *)0xfe18)
#define P1NCS (*(unsigned char volatile xdata *)0xfe19)
#define P2NCS (*(unsigned char volatile xdata *)0xfe1a)
#define P3NCS (*(unsigned char volatile xdata *)0xfe1b)
#define P4NCS (*(unsigned char volatile xdata *)0xfe1c)
#define P5NCS (*(unsigned char volatile xdata *)0xfe1d)
#define P6NCS (*(unsigned char volatile xdata *)0xfe1e)
#define P7NCS (*(unsigned char volatile xdata *)0xfe1f)
#define P0SR (*(unsigned char volatile xdata *)0xfe20)
#define P1SR (*(unsigned char volatile xdata *)0xfe21)
#define P2SR (*(unsigned char volatile xdata *)0xfe22)
#define P3SR (*(unsigned char volatile xdata *)0xfe23)
#define P4SR (*(unsigned char volatile xdata *)0xfe24)
#define P5SR (*(unsigned char volatile xdata *)0xfe25)
#define P6SR (*(unsigned char volatile xdata *)0xfe26)
#define P7SR (*(unsigned char volatile xdata *)0xfe27)
#define P0DR (*(unsigned char volatile xdata *)0xfe28)
#define P1DR (*(unsigned char volatile xdata *)0xfe29)
#define P2DR (*(unsigned char volatile xdata *)0xfe2a)
#define P3DR (*(unsigned char volatile xdata *)0xfe2b)
#define P4DR (*(unsigned char volatile xdata *)0xfe2c)
#define P5DR (*(unsigned char volatile xdata *)0xfe2d)
#define P6DR (*(unsigned char volatile xdata *)0xfe2e)
#define P7DR (*(unsigned char volatile xdata *)0xfe2f)
#define P0IE (*(unsigned char volatile xdata *)0xfe30)
#define P1IE (*(unsigned char volatile xdata *)0xfe31)
#define P2IE (*(unsigned char volatile xdata *)0xfe32)
#define P3IE (*(unsigned char volatile xdata *)0xfe33)
#define P4IE (*(unsigned char volatile xdata *)0xfe34)
#define P5IE (*(unsigned char volatile xdata *)0xfe35)
#define P6IE (*(unsigned char volatile xdata *)0xfe36)
#define P7IE (*(unsigned char volatile xdata *)0xfe37)
#define RTCCR (*(unsigned char volatile xdata *)0xfe60)
#define RTCCFG (*(unsigned char volatile xdata *)0xfe61)
#define RTCIEN (*(unsigned char volatile xdata *)0xfe62)
#define RTCIF (*(unsigned char volatile xdata *)0xfe63)
#define ALAHOUR (*(unsigned char volatile xdata *)0xfe64)
#define ALAMIN (*(unsigned char volatile xdata *)0xfe65)
#define ALASEC (*(unsigned char volatile xdata *)0xfe66)
#define ALASSEC (*(unsigned char volatile xdata *)0xfe67)
#define INIYEAR (*(unsigned char volatile xdata *)0xfe68)
#define INIMONTH (*(unsigned char volatile xdata *)0xfe69)
#define INIDAY (*(unsigned char volatile xdata *)0xfe6a)
#define INIHOUR (*(unsigned char volatile xdata *)0xfe6b)
#define INIMIN (*(unsigned char volatile xdata *)0xfe6c)
#define INISEC (*(unsigned char volatile xdata *)0xfe6d)
#define INISSEC (*(unsigned char volatile xdata *)0xfe6e)
#define YEAR (*(unsigned char volatile xdata *)0xfe70)
#define MONTH (*(unsigned char volatile xdata *)0xfe71)
#define DAY (*(unsigned char volatile xdata *)0xfe72)
#define HOUR (*(unsigned char volatile xdata *)0xfe73)
#define MIN (*(unsigned char volatile xdata *)0xfe74)
#define SEC (*(unsigned char volatile xdata *)0xfe75)
#define SSEC (*(unsigned char volatile xdata *)0xfe76)
#define I2CCFG (*(unsigned char volatile xdata *)0xfe80)
#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81)
#define I2CMSST (*(unsigned char volatile xdata *)0xfe82)
#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83)
#define I2CSLST (*(unsigned char volatile xdata *)0xfe84)
#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85)
#define I2CTXD (*(unsigned char volatile xdata *)0xfe86)
#define I2CRXD (*(unsigned char volatile xdata *)0xfe87)
#define I2CMSAUX (*(unsigned char volatile xdata *)0xfe88)
#define TM2PS (*(unsigned char volatile xdata *)0xfea2)
#define TM3PS (*(unsigned char volatile xdata *)0xfea3)
#define TM4PS (*(unsigned char volatile xdata *)0xfea4)
#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
#define PWM1_ETRPS (*(unsigned char volatile xdata *)0xfeb0)
#define PWM1_ENO (*(unsigned char volatile xdata *)0xfeb1)
#define PWM1_PS (*(unsigned char volatile xdata *)0xfeb2)
#define PWM1_IOAUX (*(unsigned char volatile xdata *)0xfeb3)
#define PWM2_ETRPS (*(unsigned char volatile xdata *)0xfeb4)
#define PWM2_ENO (*(unsigned char volatile xdata *)0xfeb5)
#define PWM2_PS (*(unsigned char volatile xdata *)0xfeb6)
#define PWM2_IOAUX (*(unsigned char volatile xdata *)0xfeb7)
#define PWM1_CR1 (*(unsigned char volatile xdata *)0xfec0)
#define PWM1_CR2 (*(unsigned char volatile xdata *)0xfec1)
#define PWM1_SMCR (*(unsigned char volatile xdata *)0xfec2)
#define PWM1_ETR (*(unsigned char volatile xdata *)0xfec3)
#define PWM1_IER (*(unsigned char volatile xdata *)0xfec4)
#define PWM1_SR1 (*(unsigned char volatile xdata *)0xfec5)
#define PWM1_SR2 (*(unsigned char volatile xdata *)0xfec6)
#define PWM1_EGR (*(unsigned char volatile xdata *)0xfec7)
#define PWM1_CCMR1 (*(unsigned char volatile xdata *)0xfec8)
#define PWM1_CCMR2 (*(unsigned char volatile xdata *)0xfec9)
#define PWM1_CCMR3 (*(unsigned char volatile xdata *)0xfeca)
#define PWM1_CCMR4 (*(unsigned char volatile xdata *)0xfecb)
#define PWM1_CCER1 (*(unsigned char volatile xdata *)0xfecc)
#define PWM1_CCER2 (*(unsigned char volatile xdata *)0xfecd)
#define PWM1_CNTR (*(unsigned int volatile xdata *)0xfece)
#define PWM1_CNTRH (*(unsigned char volatile xdata *)0xfece)
#define PWM1_CNTRL (*(unsigned char volatile xdata *)0xfecf)
#define PWM1_PSCR (*(unsigned int volatile xdata *)0xfed0)
#define PWM1_PSCRH (*(unsigned char volatile xdata *)0xfed0)
#define PWM1_PSCRL (*(unsigned char volatile xdata *)0xfed1)
#define PWM1_ARR (*(unsigned int volatile xdata *)0xfed2)
#define PWM1_ARRH (*(unsigned char volatile xdata *)0xfed2)
#define PWM1_ARRL (*(unsigned char volatile xdata *)0xfed3)
#define PWM1_RCR (*(unsigned char volatile xdata *)0xfed4)
#define PWM1_CCR1 (*(unsigned int volatile xdata *)0xfed5)
#define PWM1_CCR1H (*(unsigned char volatile xdata *)0xfed5)
#define PWM1_CCR1L (*(unsigned char volatile xdata *)0xfed6)
#define PWM1_CCR2 (*(unsigned int volatile xdata *)0xfed7)
#define PWM1_CCR2H (*(unsigned char volatile xdata *)0xfed7)
#define PWM1_CCR2L (*(unsigned char volatile xdata *)0xfed8)
#define PWM1_CCR3 (*(unsigned int volatile xdata *)0xfed9)
#define PWM1_CCR3H (*(unsigned char volatile xdata *)0xfed9)
#define PWM1_CCR3L (*(unsigned char volatile xdata *)0xfeda)
#define PWM1_CCR4 (*(unsigned int volatile xdata *)0xfedb)
#define PWM1_CCR4H (*(unsigned char volatile xdata *)0xfedb)
#define PWM1_CCR4L (*(unsigned char volatile xdata *)0xfedc)
#define PWM1_BKR (*(unsigned char volatile xdata *)0xfedd)
#define PWM1_DTR (*(unsigned char volatile xdata *)0xfede)
#define PWM1_OISR (*(unsigned char volatile xdata *)0xfedf)
#define PWM2_CR1 (*(unsigned char volatile xdata *)0xfee0)
#define PWM2_CR2 (*(unsigned char volatile xdata *)0xfee1)
#define PWM2_SMCR (*(unsigned char volatile xdata *)0xfee2)
#define PWM2_ETR (*(unsigned char volatile xdata *)0xfee3)
#define PWM2_IER (*(unsigned char volatile xdata *)0xfee4)
#define PWM2_SR1 (*(unsigned char volatile xdata *)0xfee5)
#define PWM2_SR2 (*(unsigned char volatile xdata *)0xfee6)
#define PWM2_EGR (*(unsigned char volatile xdata *)0xfee7)
#define PWM2_CCMR1 (*(unsigned char volatile xdata *)0xfee8)
#define PWM2_CCMR2 (*(unsigned char volatile xdata *)0xfee9)
#define PWM2_CCMR3 (*(unsigned char volatile xdata *)0xfeea)
#define PWM2_CCMR4 (*(unsigned char volatile xdata *)0xfeeb)
#define PWM2_CCER1 (*(unsigned char volatile xdata *)0xfeec)
#define PWM2_CCER2 (*(unsigned char volatile xdata *)0xfeed)
#define PWM2_CNTR (*(unsigned int volatile xdata *)0xfeee)
#define PWM2_CNTRH (*(unsigned char volatile xdata *)0xfeee)
#define PWM2_CNTRL (*(unsigned char volatile xdata *)0xfeef)
#define PWM2_PSCR (*(unsigned int volatile xdata *)0xfef0)
#define PWM2_PSCRH (*(unsigned char volatile xdata *)0xfef0)
#define PWM2_PSCRL (*(unsigned char volatile xdata *)0xfef1)
#define PWM2_ARR (*(unsigned int volatile xdata *)0xfef2)
#define PWM2_ARRH (*(unsigned char volatile xdata *)0xfef2)
#define PWM2_ARRL (*(unsigned char volatile xdata *)0xfef3)
#define PWM2_RCR (*(unsigned char volatile xdata *)0xfef4)
#define PWM2_CCR1 (*(unsigned int volatile xdata *)0xfef5)
#define PWM2_CCR1H (*(unsigned char volatile xdata *)0xfef5)
#define PWM2_CCR1L (*(unsigned char volatile xdata *)0xfef6)
#define PWM2_CCR2 (*(unsigned int volatile xdata *)0xfef7)
#define PWM2_CCR2H (*(unsigned char volatile xdata *)0xfef7)
#define PWM2_CCR2L (*(unsigned char volatile xdata *)0xfef8)
#define PWM2_CCR3 (*(unsigned int volatile xdata *)0xfef9)
#define PWM2_CCR3H (*(unsigned char volatile xdata *)0xfef9)
#define PWM2_CCR3L (*(unsigned char volatile xdata *)0xfefa)
#define PWM2_CCR4 (*(unsigned int volatile xdata *)0xfefb)
#define PWM2_CCR4H (*(unsigned char volatile xdata *)0xfefb)
#define PWM2_CCR4L (*(unsigned char volatile xdata *)0xfefc)
#define PWM2_BKR (*(unsigned char volatile xdata *)0xfefd)
#define PWM2_DTR (*(unsigned char volatile xdata *)0xfefe)
#define PWM2_OISR (*(unsigned char volatile xdata *)0xfeff)
#define PWMA_ETRPS (*(unsigned char volatile xdata *)0xfeb0)
#define PWMA_ENO (*(unsigned char volatile xdata *)0xfeb1)
#define PWMA_PS (*(unsigned char volatile xdata *)0xfeb2)
#define PWMA_IOAUX (*(unsigned char volatile xdata *)0xfeb3)
#define PWMB_ETRPS (*(unsigned char volatile xdata *)0xfeb4)
#define PWMB_ENO (*(unsigned char volatile xdata *)0xfeb5)
#define PWMB_PS (*(unsigned char volatile xdata *)0xfeb6)
#define PWMB_IOAUX (*(unsigned char volatile xdata *)0xfeb7)
#define PWMA_CR1 (*(unsigned char volatile xdata *)0xfec0)
#define PWMA_CR2 (*(unsigned char volatile xdata *)0xfec1)
#define PWMA_SMCR (*(unsigned char volatile xdata *)0xfec2)
#define PWMA_ETR (*(unsigned char volatile xdata *)0xfec3)
#define PWMA_IER (*(unsigned char volatile xdata *)0xfec4)
#define PWMA_SR1 (*(unsigned char volatile xdata *)0xfec5)
#define PWMA_SR2 (*(unsigned char volatile xdata *)0xfec6)
#define PWMA_EGR (*(unsigned char volatile xdata *)0xfec7)
#define PWMA_CCMR1 (*(unsigned char volatile xdata *)0xfec8)
#define PWMA_CCMR2 (*(unsigned char volatile xdata *)0xfec9)
#define PWMA_CCMR3 (*(unsigned char volatile xdata *)0xfeca)
#define PWMA_CCMR4 (*(unsigned char volatile xdata *)0xfecb)
#define PWMA_CCER1 (*(unsigned char volatile xdata *)0xfecc)
#define PWMA_CCER2 (*(unsigned char volatile xdata *)0xfecd)
#define PWMA_CNTR (*(unsigned int volatile xdata *)0xfece)
#define PWMA_CNTRH (*(unsigned char volatile xdata *)0xfece)
#define PWMA_CNTRL (*(unsigned char volatile xdata *)0xfecf)
#define PWMA_PSCR (*(unsigned int volatile xdata *)0xfed0)
#define PWMA_PSCRH (*(unsigned char volatile xdata *)0xfed0)
#define PWMA_PSCRL (*(unsigned char volatile xdata *)0xfed1)
#define PWMA_ARR (*(unsigned int volatile xdata *)0xfed2)
#define PWMA_ARRH (*(unsigned char volatile xdata *)0xfed2)
#define PWMA_ARRL (*(unsigned char volatile xdata *)0xfed3)
#define PWMA_RCR (*(unsigned char volatile xdata *)0xfed4)
#define PWMA_CCR1 (*(unsigned int volatile xdata *)0xfed5)
#define PWMA_CCR1H (*(unsigned char volatile xdata *)0xfed5)
#define PWMA_CCR1L (*(unsigned char volatile xdata *)0xfed6)
#define PWMA_CCR2 (*(unsigned int volatile xdata *)0xfed7)
#define PWMA_CCR2H (*(unsigned char volatile xdata *)0xfed7)
#define PWMA_CCR2L (*(unsigned char volatile xdata *)0xfed8)
#define PWMA_CCR3 (*(unsigned int volatile xdata *)0xfed9)
#define PWMA_CCR3H (*(unsigned char volatile xdata *)0xfed9)
#define PWMA_CCR3L (*(unsigned char volatile xdata *)0xfeda)
#define PWMA_CCR4 (*(unsigned int volatile xdata *)0xfedb)
#define PWMA_CCR4H (*(unsigned char volatile xdata *)0xfedb)
#define PWMA_CCR4L (*(unsigned char volatile xdata *)0xfedc)
#define PWMA_BKR (*(unsigned char volatile xdata *)0xfedd)
#define PWMA_DTR (*(unsigned char volatile xdata *)0xfede)
#define PWMA_OISR (*(unsigned char volatile xdata *)0xfedf)
#define PWMB_CR1 (*(unsigned char volatile xdata *)0xfee0)
#define PWMB_CR2 (*(unsigned char volatile xdata *)0xfee1)
#define PWMB_SMCR (*(unsigned char volatile xdata *)0xfee2)
#define PWMB_ETR (*(unsigned char volatile xdata *)0xfee3)
#define PWMB_IER (*(unsigned char volatile xdata *)0xfee4)
#define PWMB_SR1 (*(unsigned char volatile xdata *)0xfee5)
#define PWMB_SR2 (*(unsigned char volatile xdata *)0xfee6)
#define PWMB_EGR (*(unsigned char volatile xdata *)0xfee7)
#define PWMB_CCMR1 (*(unsigned char volatile xdata *)0xfee8)
#define PWMB_CCMR2 (*(unsigned char volatile xdata *)0xfee9)
#define PWMB_CCMR3 (*(unsigned char volatile xdata *)0xfeea)
#define PWMB_CCMR4 (*(unsigned char volatile xdata *)0xfeeb)
#define PWMB_CCER1 (*(unsigned char volatile xdata *)0xfeec)
#define PWMB_CCER2 (*(unsigned char volatile xdata *)0xfeed)
#define PWMB_CNTR (*(unsigned int volatile xdata *)0xfeee)
#define PWMB_CNTRH (*(unsigned char volatile xdata *)0xfeee)
#define PWMB_CNTRL (*(unsigned char volatile xdata *)0xfeef)
#define PWMB_PSCR (*(unsigned int volatile xdata *)0xfef0)
#define PWMB_PSCRH (*(unsigned char volatile xdata *)0xfef0)
#define PWMB_PSCRL (*(unsigned char volatile xdata *)0xfef1)
#define PWMB_ARR (*(unsigned int volatile xdata *)0xfef2)
#define PWMB_ARRH (*(unsigned char volatile xdata *)0xfef2)
#define PWMB_ARRL (*(unsigned char volatile xdata *)0xfef3)
#define PWMB_RCR (*(unsigned char volatile xdata *)0xfef4)
#define PWMB_CCR5 (*(unsigned int volatile xdata *)0xfef5)
#define PWMB_CCR5H (*(unsigned char volatile xdata *)0xfef5)
#define PWMB_CCR5L (*(unsigned char volatile xdata *)0xfef6)
#define PWMB_CCR6 (*(unsigned int volatile xdata *)0xfef7)
#define PWMB_CCR6H (*(unsigned char volatile xdata *)0xfef7)
#define PWMB_CCR6L (*(unsigned char volatile xdata *)0xfef8)
#define PWMB_CCR7 (*(unsigned int volatile xdata *)0xfef9)
#define PWMB_CCR7H (*(unsigned char volatile xdata *)0xfef9)
#define PWMB_CCR7L (*(unsigned char volatile xdata *)0xfefa)
#define PWMB_CCR8 (*(unsigned int volatile xdata *)0xfefb)
#define PWMB_CCR8H (*(unsigned char volatile xdata *)0xfefb)
#define PWMB_CCR8L (*(unsigned char volatile xdata *)0xfefc)
#define PWMB_BKR (*(unsigned char volatile xdata *)0xfefd)
#define PWMB_DTR (*(unsigned char volatile xdata *)0xfefe)
#define PWMB_OISR (*(unsigned char volatile xdata *)0xfeff)
/////////////////////////////////////////////////
//FD00H-FDFFH
/////////////////////////////////////////////////
#define P0INTE (*(unsigned char volatile xdata *)0xfd00)
#define P1INTE (*(unsigned char volatile xdata *)0xfd01)
#define P2INTE (*(unsigned char volatile xdata *)0xfd02)
#define P3INTE (*(unsigned char volatile xdata *)0xfd03)
#define P4INTE (*(unsigned char volatile xdata *)0xfd04)
#define P5INTE (*(unsigned char volatile xdata *)0xfd05)
#define P6INTE (*(unsigned char volatile xdata *)0xfd06)
#define P7INTE (*(unsigned char volatile xdata *)0xfd07)
#define P0INTF (*(unsigned char volatile xdata *)0xfd10)
#define P1INTF (*(unsigned char volatile xdata *)0xfd11)
#define P2INTF (*(unsigned char volatile xdata *)0xfd12)
#define P3INTF (*(unsigned char volatile xdata *)0xfd13)
#define P4INTF (*(unsigned char volatile xdata *)0xfd14)
#define P5INTF (*(unsigned char volatile xdata *)0xfd15)
#define P6INTF (*(unsigned char volatile xdata *)0xfd16)
#define P7INTF (*(unsigned char volatile xdata *)0xfd17)
#define P0IM0 (*(unsigned char volatile xdata *)0xfd20)
#define P1IM0 (*(unsigned char volatile xdata *)0xfd21)
#define P2IM0 (*(unsigned char volatile xdata *)0xfd22)
#define P3IM0 (*(unsigned char volatile xdata *)0xfd23)
#define P4IM0 (*(unsigned char volatile xdata *)0xfd24)
#define P5IM0 (*(unsigned char volatile xdata *)0xfd25)
#define P6IM0 (*(unsigned char volatile xdata *)0xfd26)
#define P7IM0 (*(unsigned char volatile xdata *)0xfd27)
#define P0IM1 (*(unsigned char volatile xdata *)0xfd30)
#define P1IM1 (*(unsigned char volatile xdata *)0xfd31)
#define P2IM1 (*(unsigned char volatile xdata *)0xfd32)
#define P3IM1 (*(unsigned char volatile xdata *)0xfd33)
#define P4IM1 (*(unsigned char volatile xdata *)0xfd34)
#define P5IM1 (*(unsigned char volatile xdata *)0xfd35)
#define P6IM1 (*(unsigned char volatile xdata *)0xfd36)
#define P7IM1 (*(unsigned char volatile xdata *)0xfd37)
#define P0WKUE (*(unsigned char volatile xdata *)0xfd40)
#define P1WKUE (*(unsigned char volatile xdata *)0xfd41)
#define P2WKUE (*(unsigned char volatile xdata *)0xfd42)
#define P3WKUE (*(unsigned char volatile xdata *)0xfd43)
#define P4WKUE (*(unsigned char volatile xdata *)0xfd44)
#define P5WKUE (*(unsigned char volatile xdata *)0xfd45)
#define P6WKUE (*(unsigned char volatile xdata *)0xfd46)
#define P7WKUE (*(unsigned char volatile xdata *)0xfd47)
#define PIN_IP (*(unsigned char volatile xdata *)0xfd60)
#define PIN_IPH (*(unsigned char volatile xdata *)0xfd61)
/////////////////////////////////////////////////
//FC00H-FCFFH
/////////////////////////////////////////////////
#define MD3 (*(unsigned char volatile xdata *)0xfcf0)
#define MD2 (*(unsigned char volatile xdata *)0xfcf1)
#define MD1 (*(unsigned char volatile xdata *)0xfcf2)
#define MD0 (*(unsigned char volatile xdata *)0xfcf3)
#define MD5 (*(unsigned char volatile xdata *)0xfcf4)
#define MD4 (*(unsigned char volatile xdata *)0xfcf5)
#define ARCON (*(unsigned char volatile xdata *)0xfcf6)
#define OPCON (*(unsigned char volatile xdata *)0xfcf7)
/////////////////////////////////////////////////
//FB00H-FBFFH
/////////////////////////////////////////////////
#define COMEN (*(unsigned char volatile xdata *)0xfb00)
#define SEGENL (*(unsigned char volatile xdata *)0xfb01)
#define SEGENH (*(unsigned char volatile xdata *)0xfb02)
#define LEDCTRL (*(unsigned char volatile xdata *)0xfb03)
#define LEDCKS (*(unsigned char volatile xdata *)0xfb04)
#define COM0_DA_L (*(unsigned char volatile xdata *)0xfb10)
#define COM1_DA_L (*(unsigned char volatile xdata *)0xfb11)
#define COM2_DA_L (*(unsigned char volatile xdata *)0xfb12)
#define COM3_DA_L (*(unsigned char volatile xdata *)0xfb13)
#define COM4_DA_L (*(unsigned char volatile xdata *)0xfb14)
#define COM5_DA_L (*(unsigned char volatile xdata *)0xfb15)
#define COM6_DA_L (*(unsigned char volatile xdata *)0xfb16)
#define COM7_DA_L (*(unsigned char volatile xdata *)0xfb17)
#define COM0_DA_H (*(unsigned char volatile xdata *)0xfb18)
#define COM1_DA_H (*(unsigned char volatile xdata *)0xfb19)
#define COM2_DA_H (*(unsigned char volatile xdata *)0xfb1a)
#define COM3_DA_H (*(unsigned char volatile xdata *)0xfb1b)
#define COM4_DA_H (*(unsigned char volatile xdata *)0xfb1c)
#define COM5_DA_H (*(unsigned char volatile xdata *)0xfb1d)
#define COM6_DA_H (*(unsigned char volatile xdata *)0xfb1e)
#define COM7_DA_H (*(unsigned char volatile xdata *)0xfb1f)
#define COM0_DC_L (*(unsigned char volatile xdata *)0xfb20)
#define COM1_DC_L (*(unsigned char volatile xdata *)0xfb21)
#define COM2_DC_L (*(unsigned char volatile xdata *)0xfb22)
#define COM3_DC_L (*(unsigned char volatile xdata *)0xfb23)
#define COM4_DC_L (*(unsigned char volatile xdata *)0xfb24)
#define COM5_DC_L (*(unsigned char volatile xdata *)0xfb25)
#define COM6_DC_L (*(unsigned char volatile xdata *)0xfb26)
#define COM7_DC_L (*(unsigned char volatile xdata *)0xfb27)
#define COM0_DC_H (*(unsigned char volatile xdata *)0xfb28)
#define COM1_DC_H (*(unsigned char volatile xdata *)0xfb29)
#define COM2_DC_H (*(unsigned char volatile xdata *)0xfb2a)
#define COM3_DC_H (*(unsigned char volatile xdata *)0xfb2b)
#define COM4_DC_H (*(unsigned char volatile xdata *)0xfb2c)
#define COM5_DC_H (*(unsigned char volatile xdata *)0xfb2d)
#define COM6_DC_H (*(unsigned char volatile xdata *)0xfb2e)
#define COM7_DC_H (*(unsigned char volatile xdata *)0xfb2f)
#define TSCHEN1 (*(unsigned char volatile xdata *)0xfb40)
#define TSCHEN2 (*(unsigned char volatile xdata *)0xfb41)
#define TSCFG1 (*(unsigned char volatile xdata *)0xfb42)
#define TSCFG2 (*(unsigned char volatile xdata *)0xfb43)
#define TSWUTC (*(unsigned char volatile xdata *)0xfb44)
#define TSCTRL (*(unsigned char volatile xdata *)0xfb45)
#define TSSTA1 (*(unsigned char volatile xdata *)0xfb46)
#define TSSTA2 (*(unsigned char volatile xdata *)0xfb47)
#define TSRT (*(unsigned char volatile xdata *)0xfb48)
#define TSDAT (*(unsigned int volatile xdata *)0xfb49)
#define TSDATH (*(unsigned char volatile xdata *)0xfb49)
#define TSDATL (*(unsigned char volatile xdata *)0xfb4A)
#define TSTH00 (*(unsigned int volatile xdata *)0xfb50)
#define TSTH00H (*(unsigned char volatile xdata *)0xfb50)
#define TSTH00L (*(unsigned char volatile xdata *)0xfb51)
#define TSTH01 (*(unsigned int volatile xdata *)0xfb52)
#define TSTH01H (*(unsigned char volatile xdata *)0xfb52)
#define TSTH01L (*(unsigned char volatile xdata *)0xfb53)
#define TSTH02 (*(unsigned int volatile xdata *)0xfb54)
#define TSTH02H (*(unsigned char volatile xdata *)0xfb54)
#define TSTH02L (*(unsigned char volatile xdata *)0xfb55)
#define TSTH03 (*(unsigned int volatile xdata *)0xfb56)
#define TSTH03H (*(unsigned char volatile xdata *)0xfb56)
#define TSTH03L (*(unsigned char volatile xdata *)0xfb57)
#define TSTH04 (*(unsigned int volatile xdata *)0xfb58)
#define TSTH04H (*(unsigned char volatile xdata *)0xfb58)
#define TSTH04L (*(unsigned char volatile xdata *)0xfb59)
#define TSTH05 (*(unsigned int volatile xdata *)0xfb5a)
#define TSTH05H (*(unsigned char volatile xdata *)0xfb5a)
#define TSTH05L (*(unsigned char volatile xdata *)0xfb5b)
#define TSTH06 (*(unsigned int volatile xdata *)0xfb5c)
#define TSTH06H (*(unsigned char volatile xdata *)0xfb5c)
#define TSTH06L (*(unsigned char volatile xdata *)0xfb5d)
#define TSTH07 (*(unsigned int volatile xdata *)0xfb5e)
#define TSTH07H (*(unsigned char volatile xdata *)0xfb5e)
#define TSTH07L (*(unsigned char volatile xdata *)0xfb5f)
#define TSTH08 (*(unsigned int volatile xdata *)0xfb60)
#define TSTH08H (*(unsigned char volatile xdata *)0xfb60)
#define TSTH08L (*(unsigned char volatile xdata *)0xfb61)
#define TSTH09 (*(unsigned int volatile xdata *)0xfb62)
#define TSTH09H (*(unsigned char volatile xdata *)0xfb62)
#define TSTH09L (*(unsigned char volatile xdata *)0xfb63)
#define TSTH10 (*(unsigned int volatile xdata *)0xfb64)
#define TSTH10H (*(unsigned char volatile xdata *)0xfb64)
#define TSTH10L (*(unsigned char volatile xdata *)0xfb65)
#define TSTH11 (*(unsigned int volatile xdata *)0xfb66)
#define TSTH11H (*(unsigned char volatile xdata *)0xfb66)
#define TSTH11L (*(unsigned char volatile xdata *)0xfb67)
#define TSTH12 (*(unsigned int volatile xdata *)0xfb68)
#define TSTH12H (*(unsigned char volatile xdata *)0xfb68)
#define TSTH12L (*(unsigned char volatile xdata *)0xfb69)
#define TSTH13 (*(unsigned int volatile xdata *)0xfb6a)
#define TSTH13H (*(unsigned char volatile xdata *)0xfb6a)
#define TSTH13L (*(unsigned char volatile xdata *)0xfb6b)
#define TSTH14 (*(unsigned int volatile xdata *)0xfb6c)
#define TSTH14H (*(unsigned char volatile xdata *)0xfb6c)
#define TSTH14L (*(unsigned char volatile xdata *)0xfb6d)
#define TSTH15 (*(unsigned int volatile xdata *)0xfb6e)
#define TSTH15H (*(unsigned char volatile xdata *)0xfb6e)
#define TSTH15L (*(unsigned char volatile xdata *)0xfb6f)
/////////////////////////////////////////////////
//FA00H-FAFFH
/////////////////////////////////////////////////
/////////////////////////////////////////////////
#endif

2
source/ctask/task.c

@ -61,7 +61,7 @@ void L2_task_voice_handle(struct _s_task_music_ *s)
{
s->volume_change --;
s->volume_temp = s->volume;
s->volume = s->volume_change*s->volume_shop/20;//
s->volume = s->volume_change*s->volume_buf/20;//
if (s->volume_temp != s->volume)
{
s->sector = D_voice_volume|s->volume;

4
source/ctask/task.h

@ -20,7 +20,7 @@
#ifndef _TASK_H_
#define _TASK_H_
#include "../clib/type.h"
#include "../msp/time.h"
#include "../ctask/time.h"
#include "task.h"
#include "tick.h"
@ -150,7 +150,7 @@ extern void L1_task_init(TS_task *s);
#endif//_TASK_H_
/*****************************************************
*==============================================================
* HISTORY
* HISTORY
* Below this line, this part is controlled by TSTS. DO NOT MODIFY!!
(Task Step by Step Turn by Turn StructureTSTS
*==============================================================

5
source/ctask/tick.h

@ -11,7 +11,7 @@
#ifndef __tick_H
#define __tick_H
#include "../clib/Type.h"
#include "../msp/time.h"
#include "../ctask/time.h"
struct _s_nos_tick_
{
@ -44,10 +44,12 @@ extern struct _s_nos_tick_ s_nos_tick;
#define D_Tdelay_Sec(n) (((n)*1000-1) /JIFFIES + 1)
#define D_Tdelay_5ms ((5-1) / JIFFIES + 1)
#define D_Tdelay_10ms ((10-1) / JIFFIES + 1)
#define D_Tdelay_60ms ((60-1) / JIFFIES + 1)
#define D_Tdelay_100ms ((100-1) / JIFFIES + 1)
#define D_Tdelay_200ms ((200-1) / JIFFIES+ 1)
#define D_Tdelay_300ms ((300-1) / JIFFIES + 1)
#define D_Tdelay_400ms ((400-1) / JIFFIES + 1)
#define D_Tdelay_500ms ((500-1) / JIFFIES + 1)
#define D_Tdelay_1s (1 * HZ)
#define D_Tdelay_2s (2 * HZ)
#define D_Tdelay_3s (3 * HZ)
@ -61,6 +63,7 @@ extern struct _s_nos_tick_ s_nos_tick;
#define D_Tdelay_1h (60 * 60 * HZ)
#define D_Tdelay_1day (24 * 60 * 60 * HZ)
#define D_COUNT_JIFFIES(N) ((N - 1) / JIFFIES + 1)
//必须配对
#define L0_nos_tick10ms_start(start_n) start_n = s_nos_tick.t_50ms

81
source/msp/time.c → source/ctask/time.c

@ -1,4 +1,6 @@
#include "time.h"
#include "../msp/uartx.h"
#define D_TIMER_COUNT(t,clk,timeInUs) (U16)(65536 - 1.0 * (clk) / 1000 * (1.0 * timeInUs / 1000) / t)
//#define D_TIMER_COUNT(t,clk,timeInUs) (U16)(65536 - (clk) / 1000 * timeInUs / 1000 / t)
@ -17,13 +19,16 @@ void L0_timer0_Init(void)
ET0 = 1; //add by cc
}
/******************************END*********************************/
//10---87 10s
/********************** Timer0中断函数************************/
/// 和 L0_timer0_Init 关联,需要配置 bsp_config.h中的 D_sys_MainFre
/// 默认10ms 作为TTSS系统的定时引擎
void timer0_isrHandle (void) D_SERVE_TIMER0
{//
{
U8 i = 0;
NOP(); NOP(); NOP();
TF0 = 0;
#if 0
@ -31,11 +36,19 @@ void timer0_isrHandle (void) D_SERVE_TIMER0
///相当于1.39年后t_10ms 溢出,对于电池供电的系统而言 完全可以满足
// 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000秒/年
s_nos_tick.t_10ms ++;//D_led_D1_REV(); 20160522 验证
#else
//系统时钟
L1_tick_tick(); ///系统中的1sflag 和以10ms为颗粒的延时使用 为tdelay服务
//串口回调
for(i=0; i< SERIAL_MAX_NUM; i++)
{
if(ts_uart[i].tp_handler != NULL)
{
ts_uart[i].tp_handler(ts_uart[i].uartx);
}
}
#endif
/// BITN_1(DR_who_wakeup, DRB_who_wakeup_timer0);
NOP(); NOP(); NOP();
@ -43,67 +56,5 @@ void timer0_isrHandle (void) D_SERVE_TIMER0
void L0_timer1_Init() //600微秒@11.0592MHz
{
#if 0
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x14; //设置定时初值
TH1 = 0xE6; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //add by cc
#else
U16 val = D_TIMER_COUNT(1,D_sys_MainFre,600);
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
//TL1 = 0xCD; //设置定时初始值
//TH1 = 0xD4; //设置定时初始值
TL1 = val; //设置定时初值
TH1 = val >>8; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //add by cc
#endif
}
void L0_timer1_restart() //600微秒@11.0592MHz
{
U16 val = D_TIMER_COUNT(1,D_sys_MainFre,600);
TR1 = 0; //先关闭,否则会重复中断,起不到resetart效果
#if 1
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
//TL1 = 0x14; //设置定时初值
//TH1 = 0xE6; //设置定时初值
TL1 = val; //设置定时初值
TH1 = val >>8; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //add by cc
#else
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xCD; //设置定时初始值
TH1 = 0xD4; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //add by cc
#endif
}
void L0_timer1_stop(void)
{
TR1 = 0;
TF1 = 0;
}
/******************************END*********************************/

0
source/msp/time.h → source/ctask/time.h

187
source/msp/UART0.C

@ -1,160 +1,77 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
// 20160413 CC-ACC-VH02
// 连接至 J22 RXD0 TXD0
//P5_DIR &= ~BITN1; //p5.1输出TXD
//P5_DIR |= BITN0; //p5.0输入RXD
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
//P5_SEL1 |= BITN0 +BITN1;
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uart0.h"
#include "../msp/time.h"
//#define _USE_485
static volatile Ts_uart_send_buf idata ts_uart_send_shop;
#include "../tpc/debug.h"
TP_Handler_X s_uart0_rec;
TS_PH4_modbus s_uart0_ack;
void L0_uart0_init(void)
{
U16 val = D_BRT_COUNT(12,D_sys_MainFre,D_uart0_BRT);
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T
//T2L = 0xFE; //设定定时初值
//T2H = 0xFF; //设定定时初值
T2L = val;
T2H = val >> 8;
AUXR |= 0x10; //启动定时器2
void L0_uart0_init(void)
{
U16 val = D_BRT_COUNT(12, D_sys_MainFre, D_uart0_BRT);
SCON = 0x50; // 8位数据,可变波特率
AUXR &= 0xBF; //定时器时钟12T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = val; //设置定时初始值
TH1 = val >> 8; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
void L0_uart0_buf_init(void)
{
ts_uart[uNum0].p = &ts_uart_send_shop;
ts_uart[uNum0].p->max = ts_uart[uNum0].p->now = 0;
ts_uart[uNum0].p->ok = D_ready;
ts_uart[uNum0].t = &s_uart0_rec;
ts_uart[uNum0].t->head = 0;
ts_uart[uNum0].t->ok = 0;
//ts_uart[uNum0].tp_handler = L1_s2b_PH4;
ts_uart[uNum0].tp_handler = NULL; //使用函数指针导致错误
ts_uart[uNum0].ack = (U8*)&s_uart0_ack;
L0_uart0_init();
D_uart0_ES_INT(1); //打开串口中断
//定义发送缓冲区
ts_uart[uNum0].s.buf = ts_send_buf.s1;
ts_uart[uNum0].s.bufmax = D_send1_max;
ts_uart[uNum0].s.max = ts_uart[uNum0].s.now = 0;
ts_uart[uNum0].s.ok = D_ready;
#if (D_UART0_485_TYPE != TYPE_485_NONE)
D_UART0_485_RX() //默认处于接收状态
#endif
}
//定义接收缓冲区
ts_uart[uNum0].r.buf = ts_recv_buf.r1;
ts_uart[uNum0].r.bufmax = D_recv1_max;
ts_uart[uNum0].r.head = 0;
ts_uart[uNum0].r.ok = 0;
ts_uart[uNum0].r.idle = 1;
ts_uart[uNum0].r.overtime_t = 0;
void L0_uart0_sendArray(U8 * buf, U16 len)
{
#if (D_UART0_485_TYPE != TYPE_485_NONE)
D_UART0_485_TX() //切换到输出状态
#endif
L0_uartN_sendArray(uNum0,buf,len);
//定义接收处理协议
ts_uart[uNum0].tp_handler = L0_uartN_overtime_callback;
ts_uart[uNum0].uartx = uNum0;
//串口初始化
L0_uart0_init();
//打开串口中断
D_uart0_ES_INT(1);
//默认处于接收状态
D_UART0_485_RX()
}
/*************************************************
UART
*************************************************/
void INTERRUPT_UART(void) D_SERVE_UART
void INTERRUPT_UART(void) D_SERVE_UART
{
//NOP(); NOP(); NOP();
if(L0_uart0_IntRI()) //如果是U0接收中断
// NOP(); NOP(); NOP();
if (L0_uart0_IntRI()) //如果是U0接收中断
{
L0_uart0_IntRIClear(); //清除接收中断标志
ts_uart[uNum0].t->reg = L0_uartN_get(uNum0);
//ts_uart[uNum0].tp_handler(ts_uart[uNum0].t);
L1_s2b_PH4(ts_uart[uNum0].t);
L0_timer1_restart();
L0_uart0_IntRIClear(); //清除接收中断标志
ts_uart[uNum0].r.reg = SBUF; //获取当前数据
L0_uartN_s2b(uNum0); //接收数据至缓冲区
}
if(L0_uart0_IntTI()) //如果是U0发送中断
if (L0_uart0_IntTI()) //如果是U0发送中断
{
L0_uart0_IntTIClear(); //清除发送中断标志
if(ts_uart[uNum0].p->max != ts_uart[uNum0].p->now)
L0_uart0_IntTIClear(); //清除发送中断标志
if (ts_uart[uNum0].s.max > ts_uart[uNum0].s.now)
{
L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]);
ts_uart[uNum0].p->now ++;
SBUF = ts_uart[uNum0].s.p[ts_uart[uNum0].s.now];
ts_uart[uNum0].s.now++;
}
else
{
ts_uart[uNum0].p->ok = D_ready;
ts_uart[uNum0].p->max = 0;
ts_uart[uNum0].p->now = 0;//可以发送下一个数据
#if (D_UART0_485_TYPE != TYPE_485_NONE)
D_UART0_485_RX() //切换到接收状态
#endif
}
}
//NOP(); NOP(); NOP();
}
void timer1_isrHanddle(void) D_SERVE_TIMER1
{
struct _tp_handler_x *p = &s_uart0_rec;
if((p->head == 1) && (p->num >= D_s_modbus_min))
{
//LED1 ^= 1;
p->head = 0;
crc16(p->crc,p->buf,p->num - 2); //校验CRC
if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1])
{
p->ok = 1;
LED0 ^= 1;
ts_uart[uNum0].s.ok = D_ready;
ts_uart[uNum0].s.max = 0;
ts_uart[uNum0].s.now = 0; //可以发送下一个数据
D_UART0_485_RX() //切换到接收状态
}
}
L0_timer1_stop();
// NOP(); NOP(); NOP();
}

10
source/msp/UART0.h

@ -53,8 +53,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
#ifndef _uart0_H
#define _uart0_H
#include "../bsp/bsp_config.h"
#include "../tpc/modbus.h"
#include "uart_x.h"
#include "uartx.h"
//#include "../tpc/tpc_x.h"
@ -69,7 +68,6 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void L0_uart0_buf_init(void);
void L0_uart0_sendArray(U8 * buf, U16 len);
#define L0_uart0_uc(X) L0_uartN_uc(uNum0,X)
#define L0_uart0_us(X) L0_uartN_us(uNum0,X)
@ -79,10 +77,8 @@ void L0_uart0_sendArray(U8 * buf, U16 len);
#define L0_uart0_ushex(X) L0_uartN_ushex(uNum0,X)
#define L0_uart0_ulhex(X) L0_uartN_ulhex(uNum0,X)
#define L0_uart0_sendstr(buf) L0_uartN_sendstr(uNum0,buf)
#define L1_uart0_uchexArray(buf) L1_uartN_uchexArray(uNum0,buf)
extern TP_Handler_X s_uart0_rec;
extern TS_PH4_modbus s_uart0_ack;
#define L0_uart0_sendArray(buf, n) L0_uartN_sendArray(uNum0,buf,n)
#define L0_uart0_sendArrayHex(buf, n) L0_uartN_sendArrayHex(uNum0,buf,n)
#endif //#ifndef _uart0_H

191
source/msp/UART2.c

@ -1,156 +1,93 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
// 20160413 CC-ACC-VH02
// 连接至 J22 RXD0 TXD0
//P5_DIR &= ~BITN1; //p5.1输出TXD
//P5_DIR |= BITN0; //p5.0输入RXD
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
//P5_SEL1 |= BITN0 +BITN1;
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uart2.h"
#include "../app/common.h"
//#define _USE_485
static volatile Ts_uart_send_buf idata ts_uart_send_shop;
TP_Handler_X s_uart2_rec;
TS_PH3_ccmodbus s_uart2_ack;
#include "uart2.h"
#include "../tpc/debug.h"
void L0_uart2_init(void)
{
#if(MainFre_11M == D_sys_MainFre) //115200bps@11.0592MHz
#if (MainFre_11M == D_sys_MainFre) // 115200bps@11.0592MHz
S2CON = 0x50;
AUXR |= 0x04;
T2L = 0xE8;
T2H = 0xFF;
AUXR |= 0x10;
#elif (MainFre_22M == D_sys_MainFre) // 9600bps@22.1184MHz
#if (D_uart2_BRT == BRT_115200)
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE8; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x10; //启动定时器2
#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xD0; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x10; //启动定时器2
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xD0; //设置定时初始值
T2H = 0xFF; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
#elif(D_uart2_BRT == BRT_9600)
S2CON = 0x50; // 8位数据,可变波特率
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xC0; //设置定时初始值
T2H = 0xFD; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
#endif
#endif
}
void L0_uart2_buf_init(void)
{
ts_uart[uNum2].p = &ts_uart_send_shop;
ts_uart[uNum2].p->now = 0;
ts_uart[uNum2].p->ok = D_ready;
ts_uart[uNum2].t = &s_uart2_rec;
ts_uart[uNum2].t->head_0 = D_CMD_Filter1_ff;
ts_uart[uNum2].t->head_1 = D_CMD_Filter2_fe;
ts_uart[uNum2].t->head = 0;
ts_uart[uNum2].t->ok = 0;
ts_uart[uNum2].tp_handler = L1_s2b_PH3;
ts_uart[uNum2].ack = (U8*)&s_uart2_ack;
{
//定义发送缓冲区
ts_uart[uNum2].s.buf = ts_send_buf.s2;
ts_uart[uNum2].s.bufmax = D_send2_max;
ts_uart[uNum2].s.max = ts_uart[uNum2].s.now = 0;
ts_uart[uNum2].s.ok = D_ready;
//定义接收缓冲区
ts_uart[uNum2].r.buf = ts_recv_buf.r2;
ts_uart[uNum2].r.bufmax = D_recv2_max;
ts_uart[uNum2].r.head = 0;
ts_uart[uNum2].r.ok = 0;
ts_uart[uNum2].r.idle = 1;
ts_uart[uNum2].r.overtime_t = 0;
//定义接收处理协议
ts_uart[uNum2].tp_handler = L0_uartN_overtime_callback;
ts_uart[uNum2].uartx = uNum2;
//串口初始化
L0_uart2_init();
D_uart2_ES_INT(1); //打开串口中断
#if (D_UART2_485_TYPE != TYPE_485_NONE)
D_UART2_485_RX() //默认处于接收状态
#endif
}
//打开串口中断
D_uart2_ES_INT(1);
void L0_uart2_sendArray(U8 * buf, U16 len)
{
#if (D_UART2_485_TYPE != TYPE_485_NONE)
D_UART2_485_TX() //切换到输出状态
#endif
L0_uartN_sendArray(uNum2,buf,len);
//默认处于接收状态
D_UART2_485_RX()
}
/*************************************************
UART
*************************************************/
#define D_SERVE_uart2 interrupt 8
void INTERRUPT_uart2(void) D_SERVE_uart2// using 2
#define D_SERVE_uart2 interrupt 8
void INTERRUPT_uart2(void) D_SERVE_uart2 // using 2
{
//NOP(); NOP(); NOP();
if(L0_uart2_IntRI()) //如果是U2接收中断
NOP();NOP();NOP();
if (L0_uart2_IntRI()) //如果是U2接收中断
{
L0_uart2_IntRIClear(); //清除接收中断标志
ts_uart[uNum2].t->reg = L0_uartN_get(uNum2);
ts_uart[uNum2].tp_handler(ts_uart[uNum2].t);
L0_uart2_IntRIClear(); //清除接收中断标志
ts_uart[uNum2].r.reg = S2BUF; //获取当前数据
L0_uartN_s2b(uNum2); //接收数据至缓冲区
}
if(L0_uart2_IntTI()) //如果是U0发送中断
if (L0_uart2_IntTI()) //如果是U0发送中断
{
L0_uart2_IntTIClear(); //清除发送中断标志
if(ts_uart[uNum2].p->max != ts_uart[uNum2].p->now)
L0_uart2_IntTIClear(); //清除发送中断标志
if (ts_uart[uNum2].s.max != ts_uart[uNum2].s.now)
{
L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]);
ts_uart[uNum2].p->now ++;
S2BUF = ts_uart[uNum2].s.p[ts_uart[uNum2].s.now];
ts_uart[uNum2].s.now++;
}
else
{
ts_uart[uNum2].p->ok = D_ready;
ts_uart[uNum2].p->max = 0;
ts_uart[uNum2].p->now = 0;//可以发送下一个数据
#if (D_UART2_485_TYPE != TYPE_485_NONE)
ts_uart[uNum2].s.ok = D_ready;
ts_uart[uNum2].s.max = 0;
ts_uart[uNum2].s.now = 0; //可以发送下一个数据
D_UART2_485_RX() //切换到接收状态
#endif
}
}
//NOP(); NOP(); NOP();
NOP();NOP();NOP();
}

9
source/msp/UART2.h

@ -54,8 +54,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
#define _uart2_H
#include "../bsp/bsp_config.h"
#include "../tpc/tpc_ccmodbus.h"
#include "uartN.h"
#include "uartx.h"
#define uNum2 1
@ -68,7 +67,6 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void L0_uart2_buf_init(void);
void L0_uart2_sendArray(U8 * buf, U16 len);
#define L0_uart2_uc(X) L0_uartN_uc(uNum2,X)
#define L0_uart2_us(X) L0_uartN_us(uNum2,X)
@ -78,9 +76,8 @@ void L0_uart2_sendArray(U8 * buf, U16 len);
#define L0_uart2_ushex(X) L0_uartN_ushex(uNum2,X)
#define L0_uart2_ulhex(X) L0_uartN_ulhex(uNum2,X)
#define L0_uart2_sendstr(buf) L0_uartN_sendstr(uNum2,buf)
extern TP_Handler_X s_uart2_rec;
extern TS_PH3_ccmodbus s_uart2_ack;
#define L0_uart2_sendArray(buf, n) L0_uartN_sendArray(uNum2,buf,n)
#define L0_uart2_sendArrayHex(buf, n) L0_uartN_sendArrayHex(uNum2,buf,n)
#endif //#ifndef _uart2_H

181
source/msp/UART3.c

@ -1,70 +1,9 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
// 20160413 CC-ACC-VH02
// 连接至 J22 RXD0 TXD0
//P5_DIR &= ~BITN1; //p5.1输出TXD
//P5_DIR |= BITN0; //p5.0输入RXD
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
//P5_SEL1 |= BITN0 +BITN1;
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uart3.h"
#include "time.h"
#include <stdio.h>
static volatile Ts_uart_send_buf idata ts_uart_send_shop;
struct _tp_handler_x s_uart3_rec;
TS_PH4_modbus s_uart3_ack;
#include "../tpc/debug.h"
void L0_uart3_init(void)
{
#if(MainFre_11M == D_sys_MainFre) //115200bps@11.0592MHz
#if (MainFre_11M == D_sys_MainFre) //115200bps@11.0592MHz
S3CON = 0x10; //8位数据,可变波特率
S3CON |= 0x40; //串口3选择定时器3为波特率发生器
T4T3M |= 0x02; //定时器3时钟为Fosc,即1T
@ -73,41 +12,56 @@ void L0_uart3_init(void)
T4T3M |= 0x08; //启动定时器3
#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz
#if (D_uart3_BRT == BRT_115200)
S3CON = 0x10; //8位数据,可变波特率
S3CON |= 0x40; //串口3选择定时器3为波特率发生器
T4T3M |= 0x02; //定时器3时钟为Fosc,即1T
T3L = 0xD0; //设定定时初值
T3H = 0xFF; //设定定时初值
T4T3M |= 0x08; //启动定时器3
T4T3M &= 0xFD; //定时器时钟12T模式
T3L = 0xFC; //设置定时初始值
T3H = 0xFF; //设置定时初始值
T4T3M |= 0x08; //定时器3开始计时
#elif (D_uart3_BRT == BRT_9600)
S3CON = 0x10; //8位数据,可变波特率
S3CON |= 0x40; //串口3选择定时器3为波特率发生器
T4T3M |= 0x02; //定时器时钟1T模式
T3L = 0xC0; //设置定时初始值
T3H = 0xFD; //设置定时初始值
T4T3M |= 0x08; //定时器3开始计时
#endif
#endif
}
void L0_uart3_buf_init(void)
{
ts_uart[uNum3].p = &ts_uart_send_shop;
ts_uart[uNum3].p->now = 0;
ts_uart[uNum3].p->ok = D_ready;
ts_uart[uNum3].t = &s_uart3_rec;
ts_uart[uNum3].t->head = 0;
ts_uart[uNum3].t->ok = 0;
ts_uart[uNum3].tp_handler = L1_s2b_PH4;
ts_uart[uNum3].ack = (U8*)&s_uart3_ack;
//定义发送缓冲区
ts_uart[uNum3].s.buf = ts_send_buf.s3;
ts_uart[uNum3].s.bufmax = D_send3_max;
ts_uart[uNum3].s.max = ts_uart[uNum3].s.now = 0;
ts_uart[uNum3].s.ok = D_ready;
//定义接收缓冲区
ts_uart[uNum3].r.buf = ts_recv_buf.r3;
ts_uart[uNum3].r.bufmax = D_recv3_max;
ts_uart[uNum3].r.head = 0;
ts_uart[uNum3].r.ok = 0;
ts_uart[uNum3].r.idle = 1;
ts_uart[uNum3].r.overtime_t = 0;
//串口协议解析专用字段
ts_uart[uNum3].tp_handler = L0_uartN_overtime_callback;
ts_uart[uNum3].uartx = uNum3;
//串口初始化
L0_uart3_init();
//D_uart3_ES_INT_OPEN(); //打开串口中断
D_uart3_ES_INT(1); //打开串口中断
#if (D_UART3_485_TYPE != TYPE_485_NONE)
D_UART3_485_RX() //默认处于接收状态
#endif
}
//打开串口中断
D_uart3_ES_INT(1);
void L0_uart3_sendArray(U8 * buf, U16 len)
{
#if (D_UART3_485_TYPE != TYPE_485_NONE)
D_UART3_485_TX() //切换到输出状态
#endif
L0_uartN_sendArray(uNum3,buf,len);
//默认处于接收状态
D_UART3_485_RX()
}
/*************************************************
@ -117,54 +71,29 @@ UART 中断
void INTERRUPT_UART3(void) D_SERVE_UART3// using 3
{
NOP(); NOP(); NOP();
if(L0_uart3_IntRI()) //如果是U0接收中断
if(L0_uart3_IntRI()) //如果是U3接收中断
{
L0_uart3_IntRIClear(); //清除接收中断标志
ts_uart[uNum3].t->reg = L0_uartN_get(uNum3);
ts_uart[uNum3].tp_handler(ts_uart[uNum3].t);
//L0_timer4_start(0);
ts_uart[uNum3].r.reg = S3BUF; //获取当前数据
L0_uartN_s2b(uNum3); //接收数据至缓冲区
}
if(L0_uart3_IntTI())
if(L0_uart3_IntTI()) //如果是U0发送中断
{
if(L0_uart3_IntTI()) //如果是U0发送中断
L0_uart3_IntTIClear(); //清除发送中断标志
if(ts_uart[uNum3].s.max != ts_uart[uNum3].s.now)
{
L0_uart3_IntTIClear(); //清除发送中断标志
if(ts_uart[uNum3].p->max != ts_uart[uNum3].p->now)
{
L0_uartN_set(uNum3,ts_uart[uNum3].p->p[ts_uart[uNum3].p->now]);
ts_uart[uNum3].p->now ++;
}
else
{
ts_uart[uNum3].p->ok = D_ready;
ts_uart[uNum3].p->max = 0;
ts_uart[uNum3].p->now = 0;//可以发送下一个数据
#if (D_UART3_485_TYPE != TYPE_485_NONE)
D_UART3_485_RX() //切换到接收状态
#endif
}
S3BUF = ts_uart[uNum3].s.p[ts_uart[uNum3].s.now];
ts_uart[uNum3].s.now ++;
}
}
NOP(); NOP(); NOP();
}
void timer4_isrHanddle(void) D_SERVE_TIMER4
{
struct _tp_handler_x *p = &s_uart3_rec;
if((p->head == 1) && (p->num >= D_s_modbus_min))
{
p->head = 0;
crc16_irq(p->crc,p->buf,p->num - 2); //校验CRC
if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1])
else
{
if(p->ok == 0)
{
p->ok = 1;
}
ts_uart[uNum3].s.ok = D_ready;
ts_uart[uNum3].s.max = 0;
ts_uart[uNum3].s.now = 0;//可以发送下一个数据
D_UART3_485_RX() //切换到接收状态
}
LED0 ^= 1;
}
L0_timer4_stop();
NOP(); NOP(); NOP();
}

64
source/msp/UART3.h

@ -1,61 +1,8 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
//////////////////////////////////////////////////////////////////////////
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_uart3_Init
uart3_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#ifndef _uart3_H
#define _uart3_H
#include "../bsp/bsp_config.h"
#include "../tpc/tpc_modbus.h"
#include "uartN.h"
#include "uartx.h"
#define uNum3 2
@ -74,7 +21,8 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void L0_uart3_buf_init(void);
void L0_uart3_sendArray(U8 * buf, U16 len);
void FOUR_G_ATEST(void);
#define L0_uart3_uc(X) L0_uartN_uc(uNum3,X)
#define L0_uart3_us(X) L0_uartN_us(uNum3,X)
@ -84,10 +32,8 @@ void L0_uart3_sendArray(U8 * buf, U16 len);
#define L0_uart3_ushex(X) L0_uartN_ushex(uNum3,X)
#define L0_uart3_ulhex(X) L0_uartN_ulhex(uNum3,X)
#define L0_uart3_sendstr(buf) L0_uartN_sendstr(uNum3,buf)
#define L1_uart3_uchexArray(buf) L1_uartN_uchexArray(uNum3,buf)
extern TP_Handler_X s_uart3_rec;
extern TS_PH4_modbus s_uart3_ack;
#define L0_uart3_sendArray(buf, n) L0_uartN_sendArray(uNum3,buf,n)
#define L0_uart3_sendArrayHex(buf, n) L0_uartN_sendArrayHex(uNum3,buf,n)
#endif //#ifndef _uart3_H

188
source/msp/UART4.C

@ -1,131 +1,74 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
// 20160413 CC-ACC-VH02
// 连接至 J22 RXD0 TXD0
//P5_DIR &= ~BITN1; //p5.1输出TXD
//P5_DIR |= BITN0; //p5.0输入RXD
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为uart4 RXD TXD
//P5_SEL1 |= BITN0 +BITN1;
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_uart4_Init
uart4_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uart4.h"
//#define _USE_485
static volatile Ts_uart_send_buf idata ts_uart_send_shop;
//TP_Handler_X s_uart4_at_rec;
//TP_Handler_X s_uart4_tcp_rec;
TP_Handler_X s_uart4_rec;
TS_PH3_ccmodbus s_uart4_ack;
#include "../tpc/debug.h"
//#define FOSC 11059200L //系统频率
//#define BAUD4 115200 //串口波特率
void L0_uart4_init(void)//115200bps@11.0592MHz
{
#if(MainFre_11M == D_sys_MainFre)
#if 0
S4CON = 0x50; //8位可变波特率
T4L = (65536 - (FOSC/4/BAUD4)); //设置波特率重装值
T4H = (65536 - (FOSC/4/BAUD4))>>8;
T4T3M |= 0x20; //定时器4为1T模式
T4T3M |= 0x80; //定时器4开始计时
#else
S4CON = 0x10; //8位数据,可变波特率
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
T4T3M |= 0x20; //定时器4时钟为Fosc,即1T
T4L = 0xE8; //设定定时初值
T4H = 0xFF; //设定定时初值
T4T3M |= 0x80; //启动定时器4
#endif
#if(MainFre_11M == D_sys_MainFre)
#if 0
S4CON = 0x50; //8位可变波特率
T4L = (65536 - (FOSC/4/BAUD4)); //设置波特率重装值
T4H = (65536 - (FOSC/4/BAUD4))>>8;
T4T3M |= 0x20; //定时器4为1T模式
T4T3M |= 0x80; //定时器4开始计时
#else
S4CON = 0x10; //8位数据,可变波特率
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
T4T3M |= 0x20; //定时器4时钟为Fosc,即1T
T4L = 0xE8; //设定定时初值
T4H = 0xFF; //设定定时初值
T4T3M |= 0x80; //启动定时器4
#endif
#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz
S4CON = 0x10; //8位数据,可变波特率
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
T4T3M |= 0x20; //定时器4时钟为Fosc,即1T
T4L = 0xD0; //设定定时初值
T4H = 0xFF; //设定定时初值
T4T3M |= 0x80; //启动定时器4
#elif (MainFre_22M == D_sys_MainFre)
#if (D_uart4_BRT == BRT_115200)
S4CON = 0x10; //8位数据,可变波特率
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
T4T3M |= 0x20; //定时器时钟1T模式
T4L = 0xD0; //设置定时初始值
T4H = 0xFF; //设置定时初始值
T4T3M |= 0x80; //定时器4开始计时
#elif (D_uart4_BRT == BRT_9600) //9600bps@22.1184MHz
S4CON = 0x10; //8位数据,可变波特率
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
T4T3M |= 0x20; //定时器时钟1T模式
T4L = 0xC0; //设置定时初始值
T4H = 0xFD; //设置定时初始值
T4T3M |= 0x80; //定时器4开始计时
#endif
#endif
}
void L0_uart4_buf_init(void)
{
ts_uart[uNum4].p = &ts_uart_send_shop;
ts_uart[uNum4].p->now = 0;
ts_uart[uNum4].p->ok = D_ready;
ts_uart[uNum4].t = &s_uart4_rec;
ts_uart[uNum4].t->head_0 = D_CMD_Filter1_ff;
ts_uart[uNum4].t->head_1 = D_CMD_Filter2_fe;
ts_uart[uNum4].t->head = 0;
ts_uart[uNum4].t->ok = 0;
ts_uart[uNum4].tp_handler = L1_s2b_PH3;
ts_uart[uNum4].ack = (U8*)&s_uart4_ack;
//s_uart4_tcp_rec.head_0 = D_CMD_Filter1_ff;
//s_uart4_tcp_rec.head_1 = D_CMD_Filter2_fe;
//s_uart4_tcp_rec.head = 0;
//s_uart4_tcp_rec.ok = 0;
//定义发送缓冲区
ts_uart[uNum4].s.buf = ts_send_buf.s4;
ts_uart[uNum4].s.bufmax = D_send4_max;
ts_uart[uNum4].s.max = ts_uart[uNum4].s.now = 0;
ts_uart[uNum4].s.ok = D_ready;
//定义接收缓冲区
ts_uart[uNum4].r.buf = ts_recv_buf.r4;
ts_uart[uNum4].r.bufmax = D_recv4_max;
ts_uart[uNum4].r.head = 0;
ts_uart[uNum4].r.ok = 0;
ts_uart[uNum4].r.idle = 1;
ts_uart[uNum4].r.overtime_t = 0;
//串口协议解析专用字段
ts_uart[uNum4].tp_handler = L0_uartN_overtime_callback;
ts_uart[uNum4].uartx = uNum4;
//串口初始化
L0_uart4_init();
D_uart4_ES_INT(1); //打开串口中断
#if (D_UART4_485_TYPE != TYPE_485_NONE)
D_UART4_485_RX() //默认处于接收状态
#endif
}
void L0_uart4_sendArray(U8 * buf, U16 len)
{
#if (D_UART4_485_TYPE != TYPE_485_NONE)
D_UART4_485_TX() //切换到输出状态
#endif
L0_uartN_sendArray(uNum4,buf,len);
//打开串口中断
D_uart4_ES_INT(1);
//默认处于接收状态
D_UART4_485_RX()
}
/*************************************************
@ -140,26 +83,23 @@ void INTERRUPT_uart4(void) D_SERVE_uart4// using 2
if(L0_uart4_IntRI()) //如果是U0接收中断
{
L0_uart4_IntRIClear(); //清除接收中断标志
ts_uart[uNum4].t->reg = L0_uartN_get(uNum4);
ts_uart[uNum4].tp_handler(ts_uart[uNum4].t);
ts_uart[uNum4].r.reg = S4BUF; //获取当前数据
L0_uartN_s2b(uNum4); //接收数据至缓冲区
}
if(L0_uart4_IntTI()) //如果是U0发送中断
{
L0_uart4_IntTIClear(); //清除发送中断标志
if(ts_uart[uNum4].p->max != ts_uart[uNum4].p->now)
if(ts_uart[uNum4].s.max != ts_uart[uNum4].s.now)
{
L0_uartN_set(uNum4,ts_uart[uNum4].p->p[ts_uart[uNum4].p->now]);
ts_uart[uNum4].p->now ++;
S4BUF = ts_uart[uNum4].s.p[ts_uart[uNum4].s.now];
ts_uart[uNum4].s.now ++;
}
else
{
ts_uart[uNum4].p->ok = D_ready;
ts_uart[uNum4].p->max = 0;
ts_uart[uNum4].p->now = 0;//可以发送下一个数据
#if (D_UART4_485_TYPE != TYPE_485_NONE)
ts_uart[uNum4].s.ok = D_ready;
ts_uart[uNum4].s.max = 0;
ts_uart[uNum4].s.now = 0;//可以发送下一个数据
D_UART4_485_RX() //切换到接收状态
#endif
}
}
//NOP(); NOP(); NOP();

10
source/msp/UART4.h

@ -54,8 +54,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
#define _uart4_H
#include "../bsp/bsp_config.h"
#include "../tpc/tpc_ccmodbus.h"
#include "uartN.h"
#include "uartx.h"
#define uNum4 3
@ -69,7 +68,6 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void L0_uart4_buf_init(void);
void L0_uart4_sendArray(U8 * buf, U16 len);
#define L0_uart4_uc(X) L0_uartN_uc(uNum4,X)
#define L0_uart4_us(X) L0_uartN_us(uNum4,X)
@ -79,10 +77,8 @@ void L0_uart4_sendArray(U8 * buf, U16 len);
#define L0_uart4_ushex(X) L0_uartN_ushex(uNum4,X)
#define L0_uart4_ulhex(X) L0_uartN_ulhex(uNum4,X)
#define L0_uart4_sendstr(buf) L0_uartN_sendstr(uNum4,buf)
#define L1_uart4_uchexArray(buf) L1_uartN_uchexArray(uNum4,buf)
extern TP_Handler_X s_uart4_rec;
extern TS_PH3_ccmodbus s_uart4_ack;
#define L0_uart4_sendArray(buf, n) L0_uartN_sendArray(uNum4,buf,n)
#define L0_uart4_sendArrayHex(buf, n) L0_uartN_sendArrayHex(uNum4,buf,n)
#endif //#ifndef _uart4_H

240
source/msp/UARTX.c

@ -0,0 +1,240 @@
#include "uartx.h"
TS_uart_reg ts_uart[SERIAL_MAX_NUM] = {0};
TS_send_buf ts_send_buf;
TS_recv_buf ts_recv_buf;
void L0_uartN_set(U8 uartx, U8 x) /*reentrant*/
{
switch (uartx)
{
case 0:
SBUF = (x);
break;
case 1:
S2BUF = (x);
break;
case 2:
S3BUF = (x);
break;
case 3:
S4BUF = (x);
break;
default:
break;
}
}
U8 L0_uartN_get(U8 uartx)
{
U8 x = 0;
switch (uartx)
{
case 0:
x = SBUF;
break;
case 1:
x = S2BUF;
break;
case 2:
x = S3BUF;
break;
case 3:
x = S4BUF;
break;
default:
break;
}
return x;
}
void L0_uartN_485(U8 uartx)
{
switch(uartx)
{
case 0: D_UART0_485_TX(); break;
case 1: D_UART2_485_TX(); break;
case 2: D_UART3_485_TX(); break;
case 3: D_UART4_485_TX(); break;
default: break;
}
}
void L0_waitFree_uartN(U8 uartx)
{
ts_uart[uartx].s.over = 0;
while (ts_uart[uartx].s.ok != D_ready)
{
#if 1 //发送数据特别快时,某些情况下会导致数据发送出错
ts_uart[uartx].s.over++;
if (ts_uart[uartx].s.over > 20000)
{
ts_uart[uartx].s.max = 0;
ts_uart[uartx].s.now = 0;
ts_uart[uartx].s.ok = D_ready;
break;
}
#endif
}
}
void L0_uartN_sendArray(U8 uartx, void *buf, U16 len)
{
U16 i;
if (len == 0)
{
return;
}
L0_waitFree_uartN(uartx);
L0_uartN_485(uartx);
ts_uart[uartx].s.ok = D_clear;
ts_uart[uartx].s.over = 0;
ts_uart[uartx].s.max = len;
ts_uart[uartx].s.now = 1;
if (len <= ts_uart[uartx].s.bufmax)
{
//将参数buf拷贝至内部buf
for (i = 0; i < len; i++)
{
ts_uart[uartx].s.buf[i] = ((U8 *)buf)[i];
}
ts_uart[uartx].s.p = ts_uart[uartx].s.buf;
}
else
{
//不使用内部buf,如果再发送完毕之前,参数buf被回收,发送会出错
ts_uart[uartx].s.p = (U8 *)buf;
}
L0_uartN_set(uartx, ts_uart[uartx].s.p[0]);
}
void L0_uartN_uc(U8 uartx, U8 ww)
{
L0_uartN_sendArray(uartx, &ww, 1);
}
void L0_uartN_us(U8 uartx, vU16 ww)
{
U_U16 uStemp;
uStemp.word = ww;
ts_uart[uartx].s.buf3[0] = uStemp.BYTE2.h;
ts_uart[uartx].s.buf3[1] = uStemp.BYTE2.l;
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 2);
}
void L0_uartN_ul(U8 uartx, vU32 ww)
{
U_U32 uStemp;
L0_waitFree_uartN(uartx);
uStemp.dWord = ww;
ts_uart[uartx].s.buf3[0] = uStemp.BYTE4.byte0;
ts_uart[uartx].s.buf3[1] = uStemp.BYTE4.byte1;
ts_uart[uartx].s.buf3[2] = uStemp.BYTE4.byte2;
ts_uart[uartx].s.buf3[3] = uStemp.BYTE4.byte3;
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 4);
}
void L0_uartN_0d0a(U8 uartx)
{
L0_waitFree_uartN(uartx);
ts_uart[uartx].s.buf3[0] = 0x0d;
ts_uart[uartx].s.buf3[1] = 0x0a;
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 2);
}
void L0_uartN_uchex(U8 uartx, U8 ww)
{
L0_waitFree_uartN(uartx);
ts_uart[uartx].s.buf3[0] = cguHex2Char[D_uc_high(ww)][1];
ts_uart[uartx].s.buf3[1] = cguHex2Char[D_uc_low(ww)][1];
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 2);
}
void L0_uartN_ushex(U8 uartx, vU16 ww)
{
U_F16 k;
L0_waitFree_uartN(uartx);
k.us = ww;
ts_uart[uartx].s.buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1];
ts_uart[uartx].s.buf3[1] = cguHex2Char[D_uc_low(k.BYTE2.H)][1];
ts_uart[uartx].s.buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1];
ts_uart[uartx].s.buf3[3] = cguHex2Char[D_uc_low(k.BYTE2.L)][1];
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 4);
}
void L0_uartN_ulhex(U8 uartx, U32 ww)
{
U_U32 k;
L0_waitFree_uartN(uartx);
k.dWord = ww;
ts_uart[uartx].s.buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1];
ts_uart[uartx].s.buf3[1] = cguHex2Char[D_uc_low(k.BYTE4.byte0)][1];
ts_uart[uartx].s.buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1];
ts_uart[uartx].s.buf3[3] = cguHex2Char[D_uc_low(k.BYTE4.byte1)][1];
ts_uart[uartx].s.buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1];
ts_uart[uartx].s.buf3[5] = cguHex2Char[D_uc_low(k.BYTE4.byte2)][1];
ts_uart[uartx].s.buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1];
ts_uart[uartx].s.buf3[7] = cguHex2Char[D_uc_low(k.BYTE4.byte3)][1];
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 8);
}
void L0_uartN_sendstr(U8 uartx, U8 *str)
{
L0_uartN_sendArray(uartx, str, Lc_strlen(str));
}
void L0_uartN_sendArrayHex(U8 uartx, vU8 *buf, U16 n)
{
U16 i;
for (i = 0; i < n; i++)
{
L0_uartN_uchex(uartx, buf[i]);
L0_uartN_uc(uartx, ' ');
}
}
void L0_uartN_s2b(U8 uartx)
{
if(ts_uart[uartx].r.head == 0)
{
ts_uart[uartx].r.head = 1;
ts_uart[uartx].r.ok = 0;
ts_uart[uartx].r.num = 0;
}
else
{
if(ts_uart[uartx].r.num >= ts_uart[uartx].r.bufmax)
{
ts_uart[uartx].r.num = 0;
}
}
ts_uart[uartx].r.buf[ ts_uart[uartx].r.num ] = ts_uart[uartx].r.reg;
ts_uart[uartx].r.num++;
ts_uart[uartx].r.idle = 0;
ts_uart[uartx].r.overtime_t = 0;
}
void L0_uartN_overtime_callback(U8 uartx)
{
if(0 == ts_uart[uartx].r.idle)
{
if(ts_uart[uartx].r.overtime_t >= 2)
{
//设置总线空闲
ts_uart[uartx].r.idle = 1;
ts_uart[uartx].r.head = 0;
ts_uart[uartx].r.overtime_t = 0;
//数据不为空
if(ts_uart[uartx].r.num > 0)
{
/// 接收到的数据结束: 总线空闲+buf非空
// ts_uart[uartx].r.num = 0;
ts_uart[uartx].r.ok = 1;
}
}
ts_uart[uartx].r.overtime_t ++;
}
}

97
source/msp/UARTX.h

@ -0,0 +1,97 @@
#ifndef _uartN_H
#define _uartN_H
#include "../clib/clib.h"
#include "../tpc/tpc_x.h"
#include "../bsp/bsp_config.h"
#define SERIAL_MAX_NUM 4
#define D_UART_send_buf2_max 8 //此处改动会影响L0_uartN_ulhex函数
#define D_uartN_free() (0 == ts_uart_send_buf[uartx].max)
#define D_uartN_busy() (0 != ts_uart_send_buf[uartx].max)
#define D_BRT_COUNT(t,clk,uartBRT) (U16)(65536- (clk / (4 * uartBRT * t)))
/////可以依据实际使用独立定制
#define D_send1_max 64
#define D_send2_max 64
#define D_send3_max 64
#define D_send4_max 64
/////可以依据实际使用独立定制
#define D_recv1_max 64
#define D_recv2_max 64
#define D_recv3_max 64
#define D_recv4_max 64
typedef struct
{
U8 r1[D_recv1_max];
U8 r2[D_recv2_max];
U8 r3[D_recv3_max];
U8 r4[D_recv4_max];
}TS_recv_buf;
typedef struct
{
U8 s1[D_send1_max];
U8 s2[D_send2_max];
U8 s3[D_send3_max];
U8 s4[D_send4_max];
}TS_send_buf;
typedef struct _TS_uart_reg
{
struct
{
vU8 num; //接收到的数目注意数据长度的范围
vU8 *p;
vU16 now; /// 当前buf所在的位置 0------(max-1)
vU16 max; /// 当前buf中数据长度,也就是需要发送的长度
vU32 over; /// 结束等待标志,over累加到某个值时,结束等待
vU8 ok; /// 发送完成标志
vU8 *buf;
vU8 buf3[D_UART_send_buf2_max];
U16 bufmax; ///buf的最大长度
}s;
struct
{
vU8 reg;
vU8 ok; //接收协议ok标志,串口初始化设置为0
vU8 idle; //空闲标志
vU8 overtime_t; //超时溢出的计数器
vU8 head; //接收标志头标志,串口初始化设置0
vU8 num; //协议实际长度
vU8 *buf; ////协议缓冲,由每个串口根据需要的缓冲区大小自己定义
U16 bufmax; ///buf的最大长度
}r;
void (*tp_handler)(U8 uartx);
U8 uartx;
}TS_uart_reg;
extern TS_uart_reg ts_uart[SERIAL_MAX_NUM];
extern TS_send_buf ts_send_buf;
extern TS_recv_buf ts_recv_buf;
extern void L0_uartN_init(U8 uartx);
extern void L0_uartN_set(U8 uartx,U8 x);
extern U8 L0_uartN_get(U8 uartx);
extern void L0_uartN_sendArray(U8 uartx,void *buf,U16 len);
extern void L0_uartN_uc(U8 uartx,U8 ww);
extern void L0_uartN_us(U8 uartx,vU16 ww);
extern void L0_uartN_ul(U8 uartx,vU32 ww);
extern void L0_uartN_0d0a(U8 uartx);
extern void L0_uartN_uchex(U8 uartx, U8 ww);
extern void L0_uartN_ushex(U8 uartx, U16 ww);
extern void L0_uartN_ulhex(U8 uartx, U32 ww);
extern void L0_uartN_sendstr(U8 uartx,U8 *buf);
extern void L0_uartN_sendArrayHex(U8 uartx,vU8 *buf,U16 n);
extern void L0_uartN_s2b(U8 uartx);
extern void L0_uartN_overtime_callback(U8 uartx);
#endif //#ifndef _uartN_H

211
source/msp/uart_x.c

@ -1,211 +0,0 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
// 20160413 CC-ACC-VH02
// 连接至 J22 RXD0 TXD0
//P5_DIR &= ~BITN1; //p5.1输出TXD
//P5_DIR |= BITN0; //p5.0输入RXD
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
//P5_SEL1 |= BITN0 +BITN1;
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uart_x.h"
TS_uart_reg idata ts_uart[SERIAL_MAX_NUM] = {0};
void L0_uartN_set(U8 uartx,U8 x) /*reentrant*/
{
switch(uartx)
{
case 0:SBUF = (x);break;
case 1:S2BUF = (x);break;
case 2:S3BUF = (x);break;
case 3:S4BUF = (x);break;
default:break;
}
}
U8 L0_uartN_get(U8 uartx)
{
U8 x = 0;
switch(uartx)
{
case 0:x = SBUF; break;
case 1:x = S2BUF;break;
case 2:x = S3BUF;break;
case 3:x = S4BUF;break;
default:break;
}
return x;
}
void L0_waitFree_uartN(U8 uartx)
{
ts_uart[uartx].p->over = 0;
while(ts_uart[uartx].p->ok != D_ready)
{
#if 0 //发送数据特别快时,某些情况下会导致数据发送出错
if(ts_uart[uartx].p->over ++ > 600000)
{
break;
}
#endif
}
}
void L0_uartN_sendArray(U8 uartx,void *buf,U16 len)
{
L0_waitFree_uartN(uartx);
ts_uart[uartx].p->ok = D_clear;
ts_uart[uartx].p->over = 0;
ts_uart[uartx].p->max = len;
ts_uart[uartx].p->now = 1;
if(len <= D_UART_send_buf_max)
{
//将参数buf拷贝至内部buf
for(ts_uart[uartx].p->num = 0;ts_uart[uartx].p->num < len;ts_uart[uartx].p->num ++)
{
ts_uart[uartx].p->buf[ts_uart[uartx].p->num] = ((U8*)buf)[ts_uart[uartx].p->num];
}
ts_uart[uartx].p->p = ts_uart[uartx].p->buf;
}
else
{
//不使用内部buf,如果再发送完毕之前,参数buf被回收,发送会出错
ts_uart[uartx].p->p = (U8 *)buf;
}
L0_uartN_set(uartx,ts_uart[uartx].p->p[0]);
}
void L0_uartN_uc(U8 uartx,U8 ww)
{
L0_uartN_sendArray(uartx,&ww,1);
}
void L0_uartN_us(U8 uartx,vU16 ww)
{
U_U16 uStemp;
uStemp.word = ww;
ts_uart[uartx].p->buf3[0] = uStemp.BYTE2.h;
ts_uart[uartx].p->buf3[1] = uStemp.BYTE2.l;
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2);
}
void L0_uartN_ul(U8 uartx,vU32 ww)
{
U_U32 uStemp;
L0_waitFree_uartN(uartx);
uStemp.dWord = ww;
ts_uart[uartx].p->buf3[0] = uStemp.BYTE4.byte0;
ts_uart[uartx].p->buf3[1] = uStemp.BYTE4.byte1;
ts_uart[uartx].p->buf3[2] = uStemp.BYTE4.byte2;
ts_uart[uartx].p->buf3[3] = uStemp.BYTE4.byte3;
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4);
}
void L0_uartN_0d0a(U8 uartx)
{
L0_waitFree_uartN(uartx);
ts_uart[uartx].p->buf3[0] = 0x0d;
ts_uart[uartx].p->buf3[1] = 0x0a;
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2);
}
void L0_uartN_uchex(U8 uartx,U8 ww)
{
L0_waitFree_uartN(uartx);
ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(ww)][1];
ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (ww)][1];
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2);
}
void L0_uartN_ushex(U8 uartx,vU16 ww)
{
U_F16 k;
L0_waitFree_uartN(uartx);
k.us = ww;
ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1];
ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE2.H)][1];
ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1];
ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE2.L)][1];
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4);
}
void L0_uartN_ulhex(U8 uartx,U32 ww)
{
U_U32 k;
L0_waitFree_uartN(uartx);
k.dWord = ww;
ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1];
ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE4.byte0)][1];
ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1];
ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE4.byte1)][1];
ts_uart[uartx].p->buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1];
ts_uart[uartx].p->buf3[5] = cguHex2Char[D_uc_low (k.BYTE4.byte2)][1];
ts_uart[uartx].p->buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1];
ts_uart[uartx].p->buf3[7] = cguHex2Char[D_uc_low (k.BYTE4.byte3)][1];
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,8);
}
void L0_uartN_sendstr(U8 uartx,U8 *str)
{
L0_uartN_sendArray(uartx,str,Lc_strlen(str));
}
void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n)
{
int i;
for(i=0;i<n;i++)
{
L0_uartN_uchex(uartx,buf[i]);
L0_uartN_uc(uartx,' ');
}
L0_uartN_0d0a(uartx);
}

105
source/msp/uart_x.h

@ -1,105 +0,0 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
//////////////////////////////////////////////////////////////////////////
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#ifndef _uartN_H
#define _uartN_H
#include "../clib/clib.h"
#include "../tpc/tpc_x.h"
#include "../bsp/bsp_config.h"
#define D_uartN_free() (0 == ts_uart_send_shop[uartx].max)
#define D_uartN_busy() (0 != ts_uart_send_shop[uartx].max)
#define D_BRT_COUNT(t,clk,uartBRT) (U16)(65536- (clk / (4 * uartBRT * t)))
typedef struct _ts_uart0_send_buf_
{
vU8 num; //接收到的数目注意数据长度的范围
vU8 *p;
vU16 now; /// 当前buf所在的位置 0------(max-1)
vU16 max; /// 当前buf的最大值,也就是需要发送的长度
vU32 over; /// 结束等待标志,over累加到某个值时,结束等待
vU8 ok; /// 发送完成标志
vU8 buf[D_UART_send_buf_max + 1];
/// U8 buf2[D_send_buf2_max];
vU8 buf3[D_UART_send_buf2_max];
//// U8 buf4[D_send_buf_max];
/// U8 buf[D_send_buf_max + 1];//buffer 的第一位是 长度
}Ts_uart_send_buf;
typedef struct _TS_uart_reg
{
Ts_uart_send_buf idata *p;
TP_Handler_X *t;
void (*tp_handler)(TP_Handler_X *);
U8 *ack; //ack
}TS_uart_reg;
extern TS_uart_reg idata ts_uart[SERIAL_MAX_NUM];
extern void L0_uartN_init(U8 uartx);
extern void L0_uartN_set(U8 uartx,U8 x);
extern U8 L0_uartN_get(U8 uartx);
extern void L0_uartN_sendArray(U8 uartx,void *buf,U16 len);
extern void L0_uartN_uc(U8 uartx,U8 ww);
extern void L0_uartN_us(U8 uartx,vU16 ww);
extern void L0_uartN_ul(U8 uartx,vU32 ww);
extern void L0_uartN_0d0a(U8 uartx);
extern void L0_uartN_uchex(U8 uartx, U8 ww);
extern void L0_uartN_ushex(U8 uartx, U16 ww);
extern void L0_uartN_ulhex(U8 uartx, U32 ww);
extern void L0_uartN_sendstr(U8 uartx,U8 *buf);
extern void L1_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n);
#endif //#ifndef _uartN_H

2
source/tpc/0d0a.c

@ -8,7 +8,7 @@
//对于连续的多条协议,比如:abcdefg\r\n12345\r\n,如果前一条处理不及时,可能会被后一条覆盖
void L1_s2b_0d0a(struct _tp_handler_x *p) //reentrant
void L1_s2b_0d0a(Ts_uart_recv_buf *p) //reentrant
{
if(p->head == 0)
{

2
source/tpc/0d0a.h

@ -28,6 +28,6 @@ typedef struct _s_PC1_0D0A_
// U8 pro[16]; ///解析协议用
}TS_Handle_0d0a;
#endif
extern void L1_s2b_0d0a(struct _tp_handler_x *p); //reentrant;
extern void L1_s2b_0d0a(Ts_uart_recv_buf *p); //reentrant;
#endif

2
source/tpc/ccmodbus.c

@ -131,7 +131,7 @@ void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slave
///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F )
/// 0 1 2 3 4 5 6 7 8 9 10
/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F
void L1_s2b_PH3(struct _tp_handler_x *p)// reentrant
void L1_s2b_PH3(Ts_uart_recv_buf *p)// reentrant
{
p->cashe[1] = p->cashe[0];
p->cashe[0] = p->reg;//

2
source/tpc/ccmodbus.h

@ -92,7 +92,7 @@ typedef struct
extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info);
extern U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck);
extern void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info);
extern void L1_s2b_PH3(struct _tp_handler_x *p);// reentrant;
extern void L1_s2b_PH3(Ts_uart_recv_buf *p);// reentrant;
#endif /* end __TPC_CCMODBUS_H_ */

379
source/tpc/debug.c

@ -1,88 +1,301 @@

/*****************************************************************************
update by cc @201501101001
.
uartcom/uartlib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/uartcom0
uart相关的通讯协议 com + n
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/uprotocol: uartcom + n服务的
struct _s_protocol_ ()------struct _s_protocol_
void L1_uart_2buf(struct _s_protocol_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc----------s_at0
-----------------------------------------------------------------------------------------
********************************************************************************/
// /*****************************************************************************
// update by cc @201501101001
// 针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是
// 个需要平衡的事情.
// uartcom/uartlib.c:
// 公用的函数 和硬件无关
// 放置串行模式(串口等其他通讯总线类的输出)输出的函数,
// 一些覆盖模式输出的(lcd等固屏输出的)的也可使用
// void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
// -----------------------------------------------------------------------------------------
// uartcom/uartcom0
// 和uart相关的通讯协议 com + n
// 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关
// typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------
// L3_UARTcom0_exp_protocol 解析应用协议
// -----------------------------------------------------------------------------------------
// uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度
// 公用的串口通讯定义
// struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_
// void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中
// --------------------------------------------------------------------------------------------
// msp/uartx.c 底层代码 和cpu相关
// L0_UART0_Init
// UART0_IRQHandler
// L0_Usend_uc----------s_at0
// -----------------------------------------------------------------------------------------
// ********************************************************************************/
#include "debug.h"
#include "../clib/clib.h"
//NUM: 0 1 2 3 4
// Fx R1 R2 R3 ocr
// F+从机 R1 R2 R3 校验
//相关功能移动到tpc_fx.c
/// 实践中发现 如果收到多个以0d0a结束的短协议时,如果
/// 协议之间间隔时间太短,ok处理不及时 会出现丢失协议的
/// 的情况,所以 对于短暂的多个协议 应该有一定容量的缓冲
/// 保留 ,同时 处理完协议后,应该清除接收缓冲,否则缓冲
/// 会在自身满了后自动清除
//_s_HRTU_P_rf_
/// _s_HRTU_Pfx_
/// fx 11 22 33 oc -- oc = 11+ 22+33
//buf 0 1 2 3 [4]
//fd 01 02 03 06 fd为头 010203为数据 06为数据校验和(01+02+03)
//对于连续的多条协议,如果前一条处理不及时,可能会被后一条覆盖
void L1_s2b_PH1 (struct _tp_handler_x *p) //reentrant
{
if (0 == p->head)
{
if (D_HETU_FX_fi == (p->reg & p->head_0))
{
p->head = 1;
p->num = 1;
p->buf[0] = p->reg;
//p->ok = 1;
}
}
else
{
p->buf[p->num++] = p->reg;
if(p->num >= D_HETU_FX_buf_max) // [D_HETU_FX_buf_max == 5]
{
p->ocr = p->buf[1];
p->ocr += p->buf[2];
p->ocr += p->buf[3];
if(p->ocr == p->buf[D_HETU_FX_buf_max-1])
{
if (p->ok != 1)
{
p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文
}
}
p->head = 0; //放在if (p->ok != 1) 外
}
}
}
/******************************************************************************
** End Of File
******************************************************************************/
// //NUM: 0 1 2 3 4
// // Fx R1 R2 R3 ocr
// // F+从机 R1 R2 R3 校验
// //相关功能移动到tpc_fx.c
// /// 实践中发现 如果收到多个以0d0a结束的短协议时,如果
// /// 协议之间间隔时间太短,ok处理不及时 会出现丢失协议的
// /// 的情况,所以 对于短暂的多个协议 应该有一定容量的缓冲
// /// 保留 ,同时 处理完协议后,应该清除接收缓冲,否则缓冲
// /// 会在自身满了后自动清除
// //_s_HRTU_P_rf_
// /// _s_HRTU_Pfx_
// /// fx 11 22 33 oc -- oc = 11+ 22+33
// //buf 0 1 2 3 [4]
// //fd 01 02 03 06 fd为头 010203为数据 06为数据校验和(01+02+03)
// //对于连续的多条协议,如果前一条处理不及时,可能会被后一条覆盖
// void L1_s2b_debug (Ts_uart_recv_buf *p) //reentrant
// {
// p->ok = 1;
// return;
// }
// //NFC协议:60 20 00 07 10 02 04 00 99 83 33 4E 36
// //起始帧:60
// //设备ID:20
// //数据长度:00 07
// //命令:10
// //数据:02 04 00 99 83 33 4E
// //校验:36 从起始帧到数据字段 [60 20 00 07 10 02 04 00 99 83 33 4E] 的所有字节的依次异或值
// void L1_s2b_nfc (Ts_uart_recv_buf *p) //reentrant
// {
// if (0 == p->head)
// {
// if (p->head_0 == (p->reg & 0xFF))
// {
// p->head = 1;
// p->buf[0] = p->reg;
// p->index = 0;
// p->num = p->maxnum;
// p->ocr = p->reg;
// }
// }
// else
// {
// p->buf[++p->index] = p->reg;
// if(p->index == 3)
// {
// //5个字节协议头 + 1校验 + 数据(长度由2、3字节计算)
// p->num = 5 + 1 + ((p->buf[2] << 8) | (p->buf[3]));
// if(p->num > p->maxnum){
// //error
// p->head = 0;
// p->ok = 0;
// return;
// }
// }
// if(p->index < p->num - 1)
// {
// //计算OCR
// p->ocr ^= p->reg;
// }
// else
// {
// if(p->ocr == p->buf[p->num-1])
// {
// if (p->ok != 1)
// {
// //命令结束,必须有个地方清0,否则无法再次接受报文
// p->ok = 1;
// }
// }
// p->head = 0;
// }
// }
// }
// //RFID协议:BB 02 22 00 11 D5 30 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 EB 98 0C 7E
// //帧头:BB
// //Type:00命令帧 /01响应帧 /02通知帧
// //Command: 07指令桢 /22单次读写 /27多次轮询 /28停止轮询 /0C选择 / B6设置功率
// //数据长度:00 11
// //数据:D5 30 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 [EB 98]
// //校验:0C 从Type到数据字段 [02 22 00 11 D5 30 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 EB 98] 的所有字节的累加和
// //帧尾:7E
// void L1_s2b_rfid (Ts_uart_recv_buf *p) //reentrant
// {
// LED0 ^= 1;
// if (0 == p->head)
// {
// if (p->head_0 == (p->reg & 0xFF))
// {
// p->head = 1;
// p->buf[0] = p->reg;
// p->index = 0;
// p->num = p->maxnum;
// //header字节不算累加和
// p->ocr = 0;
// }
// }
// else
// {
// p->buf[++p->index] = p->reg;
// if(p->index == 4)
// {
// //5个字节协议头 + 1校验 + 1尾字节 + 数据(长度由2、3字节计算)
// p->num = 5 + 1 + 1 + ((p->buf[3] << 8) | (p->buf[4]));
// if(p->num > p->maxnum){
// //error
// p->head = 0;
// p->ok = 0;
// return;
// }
// }
// if(p->index < p->num - 2)
// {
// //计算OCR
// p->ocr += p->reg;
// }
// else if(p->index == p->num - 1)
// {
// if((p->buf[p->num - 1] == p->tail_0) && (p->ocr == p->buf[p->num-2]))
// {
// if (p->ok != 1)
// {
// //命令结束,必须有个地方清0,否则无法再次接受报文
// p->ok = 1;
// }
// }
// p->head = 0;
// }
// }
// }
// //485协议:AA 55 00 04 01 10 00 00 15
// //FILTER:固定2个字节 AA55
// //SLAVEID:固定1个字节,代表从机ID
// //CMDER: 固定1个字节,代表命令,每个从机自己定义。
// //NUM: 固定2个字节,高字节在前,代表后续DATA的长度(不包括ocr),比如0x0010,代表后续 16个字节
// //DATA:(Num 个字节)数据域
// //OCR:1个字节,代表校验和, = 从SlaveId开始 - DATA结束的所有字节之和。
// void L1_s2b_rs485 (Ts_uart_recv_buf *p) //reentrant
// {
// // p->ok = 1;
// // return;
// if (0 == p->head)
// {
// if (p->head_0 == (p->reg & 0xFF))
// {
// p->head = 1;
// p->buf[0] = p->reg;
// p->index = 0;
// p->num = p->maxnum;
// //header字节不算累加和
// p->ocr = 0;
// }
// }
// else
// {
// p->buf[++p->index] = p->reg;
// if(p->index == 4)
// {
// //1个字节协议头 + 1SlaveId + 1Cmder + 2字节数据长度 + 数据 + 1ocr
// p->num = 5 + 1 + ((p->buf[3] << 8) | (p->buf[4]));
// if(p->num > p->maxnum){
// //error
// p->head = 0;
// p->ok = 0;
// p->index = 0;
// return;
// }
// }
// if(p->index < p->num - 1)
// {
// //计算OCR
// p->ocr += p->reg;
// }
// else if(p->index == p->num - 1)
// {
// if(p->ocr == p->buf[p->num-1])
// {
// if (p->ok != 1)
// {
// //命令结束,必须有个地方清0,否则无法再次接受报文
// // LED0 ^= 1;
// p->ok = 1;
// }
// }
// p->head = 0;
// }
// }
// }
// // void L1_s2b_rs485 (Ts_uart_recv_buf *p) //reentrant
// // {
// // // LED0 ^= 1;
// // // p->ok = 1;
// // // return;
// // if (0 == p->head)
// // {
// // p->buf[p->index++] = p->reg;
// // if(p->index == 2){
// // if (p->head_0 == p->buf[0] && p->head_1 == p->buf[1])
// // {
// // p->head = 1;
// // p->index = 1;
// // p->num = p->maxnum;
// // p->ocr = 0;
// // }
// // else
// // {
// // p->head = 0;
// // p->ok = 0;
// // p->index = 0;
// // //往前移动一位
// // p->buf[p->index++] = p->buf[1];
// // }
// // }
// // }
// // else
// // {
// // p->buf[++p->index] = p->reg;
// // if(p->index == 5)
// // {
// // //2个字节协议头 + 1SlaveId + 1Cmder + 2字节数据长度 + 数据 + 1ocr
// // p->num = 6 + 1 + ((p->buf[4] << 8) | (p->buf[5]));
// // if(p->num > p->maxnum){
// // //error
// // p->head = 0;
// // p->ok = 0;
// // p->index = 0;
// // return;
// // }
// // }
// // if(p->index < p->num - 1)
// // {
// // //计算OCR
// // p->ocr += p->reg;
// // }
// // else if(p->index == p->num - 1)
// // {
// // if(p->ocr == p->buf[p->num-1])
// // {
// // if (p->ok != 1)
// // {
// // //命令结束,必须有个地方清0,否则无法再次接受报文
// // p->ok = 1;
// // }
// // }
// // p->head = 0;
// // p->index = 0;
// // }
// // }
// // }
// /******************************************************************************
// ** End Of File
// ******************************************************************************/

15
source/tpc/debug.h

@ -38,9 +38,20 @@ typedef struct
vU8 ocr;
}TS_P_debug;
#define D_HETU_FX_buf_max 5 //定长协议 长度为5
// #define TPC_RS485_DAT_MAX 32
// typedef struct _tpc_rs485_
// {
// U8 head[2];
// U8 slaveId;
// U8 cmd;
// U8 num[2];
// U8 buf[TPC_RS485_DAT_MAX];
// U8 ocr;
// }TPC_RS485;
extern void L1_s2b_PH1 (struct _tp_handler_x *p);// reentrant;
#define D_HETU_FX_buf_max 5 //定长协议 长度为5
#define D_HETU_FX_fi 0x60
#endif /* end __TPC_DEBUG_H_ */
/*****************************************************************************

62
source/tpc/modbus.c

@ -1,62 +0,0 @@
/*****************************************************************************
update by cc @201501101001
.d
uartcom/uartlib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/uartcom0
uart相关的通讯协议 com + n
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/uprotocol: uartcom + n服务的
struct _s_protocol_ ()------struct _s_protocol_
void L1_uart_2buf(struct _s_protocol_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc----------s_at0
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "modbus.h"
#include "../bsp/bsp_config.h"
#include "../ctask/tick.h"
#include "../clib/clib.h"
//MODBUS协议解析函数
//超出D_tp_handle_x_len,不继续保存数据
void L1_s2b_PH4(struct _tp_handler_x *p)
{
//p->modbusstmp = D_sys_now;
if(p->head == 0)
{
p->head = 1;
p->max = D_TPC_HANDLER_X_LEN;
p->sp = p->buf;
p->num = 0;
p->sp[p->num++] = p->reg;
}
else
{
if(p->num < p->max)
{
p->sp[p->num++] = p->reg;
}
}
}
/******************************************************************************
** End Of File
******************************************************************************/

114
source/tpc/modbus.h

@ -1,114 +0,0 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2018, 传控科技
/// All rights reserved.
///
/// @file tpc_fsk.c
/// @brief transaction protocol control of fsk
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// @version 1.2 CCsens technology
/// @author CC
/// @date 20180308
/// @info 整理
//
//////////////////////////////////////////////////////////////////////////
#ifndef __TPC_MODBUS_H_
#define __TPC_MODBUS_H_
#include "tpc_x.h"
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**
*
*/
enum MODBUS_OPER
{
MODBUS_OPER_READ = 0x03,
MODBUS_OPER_READCONFIG = 0x04,
MODBUS_OPER_WRITE = 0x06,
MODBUS_OPER_WRITE_M = 0x10,
MODBUS_OPER_ERR = 0x8F,
};
//协议类型: MODBUS RTU模式
//#define D_s_PH4_modbus_max (128)
//#define D_s_PH4_modbus_max (64)
#define D_s_modbus_min 4 //modbus协议的最小长度
typedef struct ts_ph4_modbus
{
U8 slaver; //从机地址
U8 oper; //功能码
U8 buf[D_TPC_HANDLER_X_LEN + 8];
U8 crc[2];
}TS_PH4_modbus;
typedef struct s_modbus_03_ack
{
U8 bytes;
U8 buf[D_TPC_HANDLER_X_LEN-1];
}Modbus03Ack;
typedef struct s_modbus_06_ack
{
U16 reg;
U16 val;
}Modbus06Ack;
typedef struct s_modbus_10_ack
{
U16 reg;
U16 num;
}Modbus10Ack;
typedef struct
{
U16 slaver;
U16 oper;
U16 reg;
U16 regnum;
U16 bytes;
U8 *buf;
U16 mask;
}MD_SLAVER_INFO;
#if 0
typedef struct
{
U8 reg;
U8 slaver; //对于主设备,slaver代表当前轮询的包的id,主设备每次轮询时,总是应该将slaver设置为轮询到的从设备id;对于从设备,slaver总是等于slaverId
U8 max; //接收到的数目的最大值
vU8 head; //接收标志头标志
vU8 ok; //接收协议ok标志
vU8 num;
vU8 *sp;
U8 buf[D_s_PH4_modbus_max + 8];
vU8 crc[2];
vU32 modbusstmp;
}TS_Handle_PH4;
#endif
extern U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info);
//extern U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize);
extern U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck);
extern void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info);
extern void L1_s2b_PH4(struct _tp_handler_x *p);
extern void L1_modbus_split(struct _tp_handler_x *p);
#endif /* end __TPC_UART_H_ */
/*****************************************************************************
** End Of File
******************************************************************************/

18
source/tpc/tpc_x.h

@ -3,22 +3,6 @@
#include "../bsp/bsp_config.h"
#include "../clib/type.h"
typedef struct _tp_handler_x
{//8byte
vU8 reg;
vU8 head; //接收标志头标志
vU8 cashe[2];
vU8 head_0;
vU8 head_1;
vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围
vU8 ok; //接收协议ok标志
vU8 max; //接收到的数目的最大值
vU8 buf[D_TPC_HANDLER_X_LEN+16];////协议缓冲
vU8 *sp;
vU8 *sp2; //备份值,如果协议需要备份,单独提供备份缓冲区
vU8 ocr;
vU8 crc[2];
}TP_Handler_X;
#include "../msp/UARTX.h"
#endif

Loading…
Cancel
Save