| 
             第6部分:优化的Arduino代码 
实现前一节中讨论的优化,我们将编写一个修改的ARDIIO草图,并尝试以最大速度扫描矩阵阵列。 
  
注意,我们牺牲了一些可移植性(由于直接的端口操作),代码现在特定于Arduino Uno和具有兼容端口/头映射的板。我们还消除了输出间隔和换行符,因此我们必须创建一个新的接收应用程序(在第8部分中)来理解发送的数据。 
  
性能改进结果显示在下一页。 
  
下载代码:fastmarixarray.zip 
代码: 
/********************************************************************************************************** 
  
*项目:FastMatrixArray.ino 
  
*签署人:Chris Wittmier@Sensitronics LLC 
  
*上次修订日期:2014年4月22日 
  
*说明:演示Sensitronics的16x10元件电阻直通模式矩阵。扫描 
  
*电子设备包括2个HCT595移位寄存器和2个4051多路复用器,它们连接到Arduino Uno。 
  
*这个草图是Uno特定的,并且优化了速度。 
  
**********************************************************************************************************/ 
  
  
  
/********************************************************************************************************** 
  
*宏/引脚定义 
  
**********************************************************************************************************/ 
  
#定义波特率115200 
  
#定义行计数10 
  
#定义列计数16 
  
  
#定义PIN_ADC_输入A0 
  
#定义管脚移位寄存器数据2 
  
#定义引脚移位寄存器时钟3 
  
#define PIN_MUX_CHANNEL_04//CHANNEL PIN 0、1、2等必须连接到连续的Arduino PIN 
  
#定义PIN_MUX_CHANNEL_15 
  
#定义PIN_MUX_信道 
  
#define PIN_MUX_INHIBIT_0 7//INHIBIT=active low enable。所有mux IC启用必须连接到连续的Arduino管脚 
  
#定义PIN_MUX_INHIBIT_18 
  
  
#define SET_SR_DATA_HIGH()端口d |=b0000100 
  
#define SET_SR_DATA_LOW()端口d&=~b0000100 
  
#define SET_SR_CLK_HIGH()端口d |=b0001000 
  
#define SET_SR_CLK_LOW()端口d&=~b0001000 
  
  
#定义每个MUX 8行 
  
#定义MUX_计数2 
  
#定义通道PINS peru MUX 3 
  
  
#定义数据包结束字节0xFF 
  
#定义MAX_SEND_VALUE 254//reserve 255(0xFF)以标记数据包结束 
  
#定义压缩极限254 
  
#define MIN_SEND_VALUE 1//低于此阈值的值将被视为零并发送 
  
  
#ifndef cbi公司 
  
#定义cbi(sfr,位)(sfr字节(sfr)&=~~ BV(位) 
  
#恩迪夫 
  
#ifndef附属履行机构 
  
#定义sbi(sfr,位)(sfr字节(sfr)=BV(位) 
  
#恩迪夫 
  
  
/********************************************************************************************************** 
  
*全球性的 
  
**********************************************************************************************************/ 
  
int current_enabled_mux=mux_COUNT-1;//init to number of last mux so enabled mux increments to first mux on first scan。 
  
int compressed_zero_count=0; 
  
  
  
/********************************************************************************************************** 
  
*设置() 
  
**********************************************************************************************************/ 
  
无效设置() 
  
{ 
  
串行开始(波特率); 
  
pinMode(PIN_ADC_输入,输入); 
  
pinMode(PIN_移位寄存器数据,输出); 
  
pinMode(PIN_移位寄存器时钟,输出); 
  
pinMode(PIN_MUX_CHANNEL_0,输出); 
  
pinMode(PIN_MUX_CHANNEL_1,输出); 
  
pinMode(PIN_MUX_CHANNEL_2,输出); 
  
pinMode(PIN_MUX_INHIBIT_0,输出); 
  
pinMode(PIN_MUX_INHIBIT_1,输出); 
  
  
sbi(ADCSRA,ADPS2);//ADC预分频器设置为CLK/16 
  
cbi(ADCSRA,ADPS1); 
  
cbi(ADCSRA,ADPS0); 
  
} 
  
  
  
/********************************************************************************************************** 
  
*循环() 
  
**********************************************************************************************************/ 
  
无效循环() 
  
{ 
  
压缩计数=0; 
  
对于(int i=0;i<行计数;i++) 
  
{ 
  
刚毛(i); 
  
shiftColumn(真); 
  
对于(int j=0;j<列计数;j++) 
  
{ 
  
int raw_reading=模拟读取(PIN_ADC_输入); 
  
字节发送读取=(字节)(低字节(原始读取>>2)); 
  
shiftColumn(错误); 
  
发送压缩(发送读取); 
  
} 
  
} 
  
如果(压缩的计数大于0) 
  
{ 
  
串行写入((字节)0); 
  
串行写入(字节)压缩计数; 
  
} 
  
串行写入(字节)数据包结束字节; 
  
} 
  
  
  
/********************************************************************************************************** 
  
*setRow()-允许单个mux IC和通道读取指定的矩阵行。digitalWrite()尚未 
  
*在这个函数中被替换,因为mux的变化相对较少。 
  
*********************************************************************************              |