482 lines
7.7 KiB
C++
482 lines
7.7 KiB
C++
#line 1 "E:/Acer_D_Backup/DEVELOPMENT/PROJECTS/micros/openKeyboard03/openKeyboard.c"
|
|
#line 39 "E:/Acer_D_Backup/DEVELOPMENT/PROJECTS/micros/openKeyboard03/openKeyboard.c"
|
|
const char scanMap[50] = {
|
|
8, 9, 10, 40, 20, 30, 47,
|
|
41, 42, 43, 39, 44, 38, 45,
|
|
31, 32, 33, 35, 34, 36, 37,
|
|
21, 22, 23, 25, 24, 26, 27,
|
|
11, 12, 13, 15, 14, 16, 17,
|
|
1, 2, 3, 5, 4, 6, 7,
|
|
28, 18, 19, 0, 0, 29, 46 };
|
|
|
|
const char serialMap[4][49] = {
|
|
|
|
{56, 57, 48, 13, 112, 44, 0,
|
|
0, 0, 0, 46, 32, 109, 0,
|
|
0, 122, 120, 118, 99, 98, 110,
|
|
97, 115, 100, 103, 102, 104, 106,
|
|
113, 119, 101, 116, 114, 121, 117,
|
|
49, 50, 51, 53, 52, 54, 55,
|
|
107, 105, 111, 0, 0, 108, 8},
|
|
|
|
|
|
{56, 57, 48, 13, 80, 44, 0,
|
|
0, 0, 0, 46, 32, 77, 0,
|
|
0, 90, 88, 86, 67, 66, 78,
|
|
65, 83, 68, 71, 70, 72, 74,
|
|
81, 87, 69, 84, 82, 89, 85,
|
|
49, 50, 51, 53, 52, 54, 55,
|
|
75, 73, 79, 0, 0, 76, 8},
|
|
|
|
|
|
{56, 57, 48, 13, 41, 58, 0,
|
|
0, 0, 0, 63, 32, 62, 0,
|
|
0, 96, 39, 45, 187, 124, 60,
|
|
126, 154, 123, 168, 125, 47, 39,
|
|
33, 64, 128, 37, 35, 94, 38,
|
|
49, 50, 51, 53, 52, 54, 55,
|
|
91, 42, 40, 0, 0, 93, 8},
|
|
|
|
|
|
{56, 57, 48, 13, 61, 59, 0,
|
|
0, 0, 0, 191, 32, 181, 0,
|
|
0, 230, 156, 95, 231, 43, 241,
|
|
225, 223, 240, 165, 163, 92, 34,
|
|
161, 229, 232, 254, 36, 253, 249,
|
|
49, 50, 51, 53, 52, 54, 55,
|
|
169, 236, 242, 0, 0, 248, 8}
|
|
};
|
|
|
|
unsigned char data[7] = {0,0,0,0,0,0,0};
|
|
unsigned char oldData[7] = {0,0,0,0,0,0,0};
|
|
unsigned char justPressed[7] = {0,0,0,0,0,0,0};
|
|
|
|
unsigned char newlyPressd = 0;
|
|
|
|
unsigned char AMask = 0;
|
|
unsigned char BMask = 0;
|
|
|
|
unsigned char somethingChanged = 0;
|
|
|
|
unsigned long int timer = 0xFFFF;
|
|
unsigned long int lightFadeOffTime = 0x8000;
|
|
|
|
|
|
|
|
unsigned char alts [] = {0, 1, 2, 2, 3, 3, 3, 3};
|
|
unsigned char alt;
|
|
|
|
void (*send)() = 0;
|
|
void (*lightHandler)() = 0;
|
|
|
|
unsigned char baudrate = 0;
|
|
unsigned char sendMode = 0;
|
|
unsigned char lightMode = 0;
|
|
unsigned char lightStrenght = 0;
|
|
|
|
unsigned char pwmRunning = 0;
|
|
|
|
void enterPowerSave(){
|
|
PORTA = 0;
|
|
INTCON.RBIE = 1;
|
|
asm{
|
|
sleep;
|
|
}
|
|
}
|
|
|
|
void exitPowerSave(){
|
|
INTCON.RBIE = 0;
|
|
}
|
|
|
|
void setupUsart(unsigned char br){
|
|
switch(br){
|
|
case 1 : USART_Init(300);
|
|
break;
|
|
case 2 : USART_Init(1200);
|
|
break;
|
|
case 3 : USART_Init(2400);
|
|
break;
|
|
case 4 : USART_Init(4800);
|
|
break;
|
|
case 5 : USART_Init(9600);
|
|
break;
|
|
case 6 : USART_Init(19200);
|
|
break;
|
|
case 7 : USART_Init(38400);
|
|
break;
|
|
case 8 : USART_Init(57600);
|
|
break;
|
|
case 9 : USART_Init(115200);
|
|
break;
|
|
default: EEprom_write( 1 , 4 );
|
|
br = 4 ;
|
|
USART_Init(4800);
|
|
}
|
|
baudrate = br;
|
|
}
|
|
|
|
void turnBacklightOn(){
|
|
timer = lightFadeOffTime;
|
|
if (!pwmRunning) {
|
|
PWM1_Start();
|
|
PWM2_Start();
|
|
pwmRunning = 1;
|
|
}
|
|
PWM1_Change_Duty(lightStrenght);
|
|
PWM2_Change_Duty(lightStrenght);
|
|
}
|
|
|
|
void nop(){
|
|
|
|
}
|
|
|
|
void lightFade(){
|
|
unsigned char s;
|
|
if (newlyPressd) {
|
|
turnBacklightOn();
|
|
return;
|
|
}
|
|
|
|
if (timer>0) timer --;
|
|
else {
|
|
PWM1_Stop;
|
|
PWM2_Stop;
|
|
PORTC = 255;
|
|
pwmRunning = 0;
|
|
enterPowerSave();
|
|
}
|
|
|
|
if (timer<(~lightStrenght)){
|
|
PWM1_Change_Duty(~((unsigned char)timer));
|
|
PWM2_Change_Duty(~((unsigned char)timer));
|
|
}
|
|
|
|
}
|
|
|
|
void setupLightMode(unsigned char lm){
|
|
|
|
if (pwmRunning){
|
|
PWM1_Stop();
|
|
PWM2_Stop();
|
|
}
|
|
|
|
switch (lm){
|
|
case 0 : lightHandler = &nop;
|
|
lightStrenght = 0xFF;
|
|
lightMode = 0 ;
|
|
break;
|
|
|
|
case 1 : lightHandler = &nop;
|
|
turnBacklightOn();
|
|
lightMode = 1 ;
|
|
break;
|
|
|
|
case 2 : lightHandler = &lightFade;
|
|
turnBacklightOn();
|
|
lightStrenght = 0x80;
|
|
lightMode = 2 ;
|
|
break;
|
|
|
|
default : EEprom_write( 3 , 0 );
|
|
lightMode = 0 ;
|
|
lightHandler = &nop;
|
|
lightStrenght = 0xFF;
|
|
}
|
|
|
|
PORTC = 255;
|
|
|
|
|
|
if (lightMode != 0 ) {
|
|
PWM1_Init(40000);
|
|
PWM1_Change_Duty(lightStrenght);
|
|
PWM1_Start();
|
|
|
|
PWM2_Init(40000);
|
|
PWM2_Change_Duty(lightStrenght);
|
|
PWM2_Start();
|
|
|
|
pwmRunning = 1;
|
|
}
|
|
}
|
|
|
|
void doScan(){
|
|
unsigned char sc = 0;
|
|
|
|
newlyPressd = 0;
|
|
|
|
for (AMask=1; AMask<128; AMask<<=1){
|
|
|
|
oldData[sc] = data[sc];
|
|
|
|
PORTA = ~AMask;
|
|
data[sc] = PORTB;
|
|
data[sc] = data[sc] | PORTB;
|
|
data[sc] = data[sc] | PORTB;
|
|
data[sc] = ~data[sc];
|
|
|
|
justPressed[sc] = data[sc]&(~oldData[sc]);
|
|
|
|
newlyPressd = newlyPressd | justPressed[sc];
|
|
|
|
sc++;
|
|
}
|
|
}
|
|
|
|
|
|
void serialSend(){
|
|
unsigned char idx = 0;
|
|
unsigned char sc = 0;
|
|
|
|
for (AMask=1; AMask<128; AMask<<=1){
|
|
for (BMask=1; BMask<128; BMask<<=1){
|
|
if (justPressed[sc] & BMask) USART_Write(serialMap[alt][idx]);
|
|
idx++;
|
|
}
|
|
sc++;
|
|
}
|
|
alt = alts[data[2]&1|((data[1]&1)<<1)|((data[0]&64)>>4)];
|
|
}
|
|
|
|
void scanSend(){
|
|
unsigned char idx = 0;
|
|
unsigned char sc = 0;
|
|
unsigned char bs = 0;
|
|
|
|
for (AMask=1; AMask<128; AMask<<=1){
|
|
somethingChanged = data[sc] ^ oldData[sc];
|
|
bs = 0;
|
|
for (BMask=1; BMask<128; BMask<<=1){
|
|
if (someThingChanged & BMask)
|
|
USART_Write(scanMap[idx] | (((data[sc]&BMask)>>bs)<<6));
|
|
bs++;
|
|
idx++;
|
|
}
|
|
sc++;
|
|
}
|
|
}
|
|
|
|
void ps2Send(){
|
|
|
|
}
|
|
|
|
void setupSendMode(unsigned char sm){
|
|
switch (sm){
|
|
case 1 : send = &scanSend;
|
|
sendMode = 1 ;
|
|
break;
|
|
|
|
case 0 : send = &serialSend;
|
|
sendMode = 0 ;
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default : send = &serialSend;
|
|
EEprom_write( 2 , 0 );
|
|
sendMode = 0 ;
|
|
}
|
|
}
|
|
|
|
void config(){
|
|
timer = lightFadeOffTime;
|
|
|
|
if ((data[1]&4)&&(lightStrenght<0xff)) {
|
|
lightStrenght++;
|
|
PWM1_Change_Duty(lightStrenght);
|
|
PWM2_Change_Duty(lightStrenght);
|
|
if (lightMode== 0 ) lightMode = 2 ;
|
|
}
|
|
|
|
if ((data[1]&64)&&(lightStrenght>0)) {
|
|
lightStrenght--;
|
|
PWM1_Change_Duty(lightStrenght);
|
|
PWM2_Change_Duty(lightStrenght);
|
|
if (lightMode== 0 ) lightMode = 2 ;
|
|
}
|
|
|
|
|
|
if (justPressed[5]&1){
|
|
|
|
|
|
|
|
setupLightMode( 2 );
|
|
lightFadeOffTime = 2<<8;
|
|
|
|
}
|
|
|
|
if (justPressed[5]&2){
|
|
if (data[1]&1)
|
|
;
|
|
else {
|
|
setupLightMode( 2 );
|
|
lightFadeOffTime = 4<<8;
|
|
}
|
|
}
|
|
|
|
if (justPressed[5]&4){
|
|
if (data[1]&1)
|
|
;
|
|
else {
|
|
setupLightMode( 2 );
|
|
lightFadeOffTime = 8<<8;
|
|
}
|
|
}
|
|
|
|
if (justPressed[5]&16){
|
|
if (data[1]&1)
|
|
;
|
|
else {
|
|
setupLightMode( 2 );
|
|
lightFadeOffTime = 16<<8;
|
|
}
|
|
}
|
|
|
|
if (justPressed[5]&8){
|
|
if (data[1]&1)
|
|
setupUsart( 4 );
|
|
else {
|
|
setupLightMode( 2 );
|
|
lightFadeOffTime = 32<<8;
|
|
}
|
|
}
|
|
|
|
if (justPressed[5]&32){
|
|
if (data[1]&1)
|
|
setupUsart( 5 );
|
|
else {
|
|
setupLightMode( 2 );
|
|
lightFadeOffTime = 64<<8;
|
|
}
|
|
}
|
|
|
|
if (justPressed[5]&64){
|
|
if (data[1]&1)
|
|
;
|
|
else {
|
|
setupLightMode( 2 );
|
|
lightFadeOffTime = 128<<8;
|
|
}
|
|
}
|
|
|
|
if (justPressed[0]&1){
|
|
if (data[1]&1)
|
|
;
|
|
else {
|
|
setupLightMode( 2 );
|
|
lightFadeOffTime = 255<<8;
|
|
}
|
|
}
|
|
|
|
if (justPressed[0]&2){
|
|
if (data[1]&1)
|
|
;
|
|
else
|
|
setupLightMode( 1 );
|
|
}
|
|
|
|
if (justPressed[0]&4){
|
|
if (data[1]&1)
|
|
;
|
|
else
|
|
setupLightMode( 0 );
|
|
}
|
|
|
|
if (justPressed[3]&1){
|
|
setupSendMode( 1 );
|
|
}
|
|
|
|
if (justPressed[3]&2){
|
|
setupSendMode( 0 );
|
|
}
|
|
|
|
Delay_5ms();
|
|
|
|
}
|
|
|
|
void saveConfig(){
|
|
EEprom_write( 1 , baudrate);
|
|
EEprom_write( 2 , sendMode);
|
|
EEprom_write( 3 , lightMode);
|
|
EEprom_write( 4 , lightStrenght);
|
|
EEprom_write( 5 , lightFadeOffTime>>8);
|
|
}
|
|
|
|
void interrupt() {
|
|
if (INTCON.RBIF) {
|
|
exitPowerSave();
|
|
INTCON.RBIF = 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
void main() {
|
|
|
|
OSCCON = 0x67;
|
|
|
|
ANSEL = 0;
|
|
ANSELH = 0;
|
|
|
|
PORTA = 0;
|
|
TRISA = 0;
|
|
|
|
PORTB = 0;
|
|
TRISB = 255;
|
|
|
|
PORTC = 0;
|
|
TRISC = 0;
|
|
|
|
OPTION_REG = 0;
|
|
|
|
|
|
|
|
|
|
INTCON.RBIE = 0;
|
|
INTCON.RBIF = 0;
|
|
|
|
IOCB = 127;
|
|
|
|
PIE1 = 32;
|
|
|
|
INTCON.GIE = 1;
|
|
|
|
|
|
Delay_ms(20);
|
|
sendMode = EEprom_read( 2 );
|
|
setupSendMode(sendMode);
|
|
|
|
|
|
|
|
Delay_ms(20);
|
|
baudrate = EEprom_read( 1 );
|
|
setupUsart(baudrate);
|
|
|
|
|
|
Delay_ms(20);
|
|
lightFadeOffTime = EEprom_read( 5 ) << 8;
|
|
lightStrenght = EEprom_read( 4 );
|
|
|
|
Delay_ms(20);
|
|
lightMode = EEprom_read( 3 );
|
|
setUpLightMode(lightMode);
|
|
|
|
do {
|
|
|
|
doScan();
|
|
|
|
if (data[1]&2) {
|
|
config();
|
|
}else{
|
|
if (oldData[1]&2) saveConfig();
|
|
send();
|
|
}
|
|
lightHandler();
|
|
Delay_80us();
|
|
} while (1);
|
|
|
|
}
|