《嵌入式人机界面中的键盘及其接口设计》P24
具体程序如下:
SUBDESIGN keyboard
( clk, reset, col[3..0] : INPUT;
row[3..0], d[3..0], keypress : OUTPUT; )
VARIABLE
ring[3..0] : JKFF ;
kp : DFF ;
adiv : TFF ;
array[3..0] : DFF ;
clk/2 : NODE ;
BEGIN
adiv.t = VCC ;
adiv.clk = clk ;
clk/2 = adiv.q ;
ring[].clk = clk/2 ;
ring[2..0].clrn = reset ;
ring3.prn = reset ;
ring0.j = ring3.q ;
ring0.k = !ring3.q ;
ring1.j = ring0.q ;
ring1.k = !ring0.q ;
ring2.j = ring1.q ;
ring2.k = !ring1.q ;
ring3.j = ring2.q ;
ring3.k = !ring2.q ;
row[] = !ring[].q ;
TABLE
ring[].q, col[] => array[].d, kp.d;
B"XXXX",B"1111" => B"XXXX", 0 ;
B"0001", B"1110" => B"0000", 1 ;
B"0001", B"1101" => B"0001", 1 ;
B"0001", B"1011" => B"0010", 1 ;
B"0001", B"0111" => B"0011", 1 ;
B"0010", B"1110" => B"0100", 1 ;
B"0010", B"1101" => B"0101", 1 ;
B"0010", B"1011" => B"0110", 1 ;
B"0010", B"0111" => B"0111", 1 ;
B"0100", B"1110" => B"1000", 1 ;
B"0100", B"1101" => B"1001", 1 ;
B"0100", B"1011" => B"1010", 1 ;
B"0100", B"0111" => B"1011", 1 ;
B"1000", B"1110" => B"1100", 1 ;
B"1000", B"1101" => B"1101", 1 ;
B"1000", B"1011" => B"1110", 1 ;
B"1000", B"0111" => B"1111", 1 ;
END TABLE;
array[].clk = clk ;
d[] = array[].q ;
kp.clk = clk ;
keypress = kp.q ;
END
#include <m8c.h> // 特定常量与宏的定义
#include "PSoCAPI.h" // 用户模块API接口定义
void main()
{ BYTE t, m; WORD ttt;
CSR_1_Start(); // 启动CSR模块
M8C_EnableGInt;
CSR_1_SetDacCurrent(0x32,0); // 相关设置
CSR_1_SetScanSpeed(255);
CSR_1_StartScan(0,10,1);// 启动感测盘扫描
PRT1DR |= 0xf0; // 编码输出端口设置
m = 0;
while(1)
{if (CSR_1_GetScanStatus() &
CSR_1_SCAN_SET_COMPLETE)
{ m += 1;
ttt = CSR_1_iUpdateBaseline(0,10); // 取值
ttt >>= 2;
switch(ttt) // 按键识别
{case 0x01: t = 0; break;
case 0x02: t = 1; break;
case 0x04: t = 2; break;
case 0x08: t = 3; break;
case 0x10: t = 4; break;
case 0x20: t = 5; break;
case 0x40: t = 6; break;
case 0x80: t = 7; break;
default: t = 8; break;
}
if(t<8) // 按键编码输出
{ if(m==1) // 编码输出
{ PRT1DR &= 0x8f;
PRT1DR |= (t<<4);
}
else if(m==5) PRT1DR &= 0x7f;
// 键动作中断信号输出
else if(m>20) // 结束一次键编码输出
{PRT1DR |= 0xf0;
m = 0;
}
}
}
}
}
char KeyIdentify(void)
{ char ADC_result;
ADC_result = ADCR; // 读取ADC转换结果
if((ADC_result>0xe0)&&(ADC_result<0xe4))
return(1); // 按键0动作
else if((ADC_result>0xe4)&&(ADC_result<0xec))
return(1); // 按键1动作
else if((ADC_result>0xec)&&(ADC_result<0xf4))
return(1); // 按键2动作
else if((ADC_result>0xf4)&&(ADC_result<0xfc))
return(1); // 按键3动作
else if((ADC_result>0xfc)&&(ADC_result<0x04))
return(1); // 按键4动作
else if((ADC_result>0x04)&&(ADC_result<0x0c))
return(1); // 按键5动作
else if((ADC_result>0x0c)&&(ADC_result<0x14))
return(1); // 按键6动作
else if((ADC_result>0x14)&&(ADC_result<0x1a))
return(1); // 按键7动作
}
1楼
0
0
回复
具体程序如下:
SUBDESIGN keyboard
( clk, reset, col[3..0] : INPUT;
row[3..0], d[3..0], keypress : OUTPUT; )
VARIABLE
ring[3..0] : JKFF ;
kp : DFF ;
adiv : TFF ;
array[3..0] : DFF ;
clk/2 : NODE ;
BEGIN
adiv.t = VCC ;
adiv.clk = clk ;
clk/2 = adiv.q ;
ring[].clk = clk/2 ;
ring[2..0].clrn = reset ;
ring3.prn = reset ;
ring0.j = ring3.q ;
ring0.k = !ring3.q ;
ring1.j = ring0.q ;
ring1.k = !ring0.q ;
ring2.j = ring1.q ;
ring2.k = !ring1.q ;
ring3.j = ring2.q ;
ring3.k = !ring2.q ;
row[] = !ring[].q ;
TABLE
ring[].q, col[] => array[].d, kp.d;
B"XXXX",B"1111" => B"XXXX", 0 ;
B"0001", B"1110" => B"0000", 1 ;
B"0001", B"1101" => B"0001", 1 ;
B"0001", B"1011" => B"0010", 1 ;
B"0001", B"0111" => B"0011", 1 ;
B"0010", B"1110" => B"0100", 1 ;
B"0010", B"1101" => B"0101", 1 ;
B"0010", B"1011" => B"0110", 1 ;
B"0010", B"0111" => B"0111", 1 ;
B"0100", B"1110" => B"1000", 1 ;
B"0100", B"1101" => B"1001", 1 ;
B"0100", B"1011" => B"1010", 1 ;
B"0100", B"0111" => B"1011", 1 ;
B"1000", B"1110" => B"1100", 1 ;
B"1000", B"1101" => B"1101", 1 ;
B"1000", B"1011" => B"1110", 1 ;
B"1000", B"0111" => B"1111", 1 ;
END TABLE;
array[].clk = clk ;
d[] = array[].q ;
kp.clk = clk ;
keypress = kp.q ;
END
#include <m8c.h> // 特定常量与宏的定义
#include "PSoCAPI.h" // 用户模块API接口定义
void main()
{ BYTE t, m; WORD ttt;
CSR_1_Start(); // 启动CSR模块
M8C_EnableGInt;
CSR_1_SetDacCurrent(0x32,0); // 相关设置
CSR_1_SetScanSpeed(255);
CSR_1_StartScan(0,10,1);// 启动感测盘扫描
PRT1DR |= 0xf0; // 编码输出端口设置
m = 0;
while(1)
{if (CSR_1_GetScanStatus() &
CSR_1_SCAN_SET_COMPLETE)
{ m += 1;
ttt = CSR_1_iUpdateBaseline(0,10); // 取值
ttt >>= 2;
switch(ttt) // 按键识别
{case 0x01: t = 0; break;
case 0x02: t = 1; break;
case 0x04: t = 2; break;
case 0x08: t = 3; break;
case 0x10: t = 4; break;
case 0x20: t = 5; break;
case 0x40: t = 6; break;
case 0x80: t = 7; break;
default: t = 8; break;
}
if(t<8) // 按键编码输出
{ if(m==1) // 编码输出
{ PRT1DR &= 0x8f;
PRT1DR |= (t<<4);
}
else if(m==5) PRT1DR &= 0x7f;
// 键动作中断信号输出
else if(m>20) // 结束一次键编码输出
{PRT1DR |= 0xf0;
m = 0;
}
}
}
}
}
char KeyIdentify(void)
{ char ADC_result;
ADC_result = ADCR; // 读取ADC转换结果
if((ADC_result>0xe0)&&(ADC_result<0xe4))
return(1); // 按键0动作
else if((ADC_result>0xe4)&&(ADC_result<0xec))
return(1); // 按键1动作
else if((ADC_result>0xec)&&(ADC_result<0xf4))
return(1); // 按键2动作
else if((ADC_result>0xf4)&&(ADC_result<0xfc))
return(1); // 按键3动作
else if((ADC_result>0xfc)&&(ADC_result<0x04))
return(1); // 按键4动作
else if((ADC_result>0x04)&&(ADC_result<0x0c))
return(1); // 按键5动作
else if((ADC_result>0x0c)&&(ADC_result<0x14))
return(1); // 按键6动作
else if((ADC_result>0x14)&&(ADC_result<0x1a))
return(1); // 按键7动作
}