'---------------------------------------------------------------------------' ' Program for test Keyboard PS / 2 ' ' Compiler : HBBR Basic v.1.100 ' '---------------------------------------------------------------------------' dim data as integer = 0 '-------------Interrupt service routine for receive data from keyboard--------------------' IRQ irq_eint0 ( ) dim i as byte = 0 if ( ( IO0PIN and &h00010000 ) = 0 ) then 'check start bit at P0.16 do while((IO0PIN and &h00010000)= 0) 'wait for 1 after start bit loop for i = 0 to 9 'for loop count 10 for receive data 8 bit do while ((IO0PIN and &h00010000) = &h00010000) 'wait for 0 after data bit loop data = data >>1 'shift data bit to right 1 time if ((IO0PIN and &h00008000) = &h00008000) then data = (data or &h8000) 'Config data bit = 1 end if do while((IO0PIN and &h00010000)=0) 'wait for 1 after data bit loop next i do while((IO0PIN and &h00010000)=0) 'wait for 1 after stop bit loop data = data >>6 'shift data bit to right 6 time data = data and &h00FF 'keep data end if EXTINT = EXTINT or &h01 'clear interrupt flag EINT0 VICVectAddr = 0 'Acknowledge interrupt End IRQ '-------------------------------MAIN FUNCTION--------------------------------' FUNCTION main() as integer dim result as Byte = 0 dim temp as Byte = 0 dim check as byte = 0 '-----------------------arrray for decode-----------------------' Dim array_ASCII(0 to 127) As Byte array_ASCII(0)=&h00 array_ASCII(1)=&h01 array_ASCII(2)=&h02 array_ASCII(3)=&h03 array_ASCII(4)=&h04 array_ASCII(5)=&h05 array_ASCII(6)=&h06 array_ASCII(7)=&h07 array_ASCII(8)=&h08 array_ASCII(9)=&h09 array_ASCII(10)=&h0A array_ASCII(11)=&h0B array_ASCII(12)=&h0C array_ASCII(13)=&hB 'tab array_ASCII(14)=&h7E '~ array_ASCII(15)=&h0F array_ASCII(16)=&h10 array_ASCII(17)=&h11 array_ASCII(18)=&h12 array_ASCII(19)=&h13 array_ASCII(20)=&h14 array_ASCII(21)=&h51 'Q array_ASCII(22)=&h21 '! array_ASCII(23)=&h17 array_ASCII(24)=&h18 array_ASCII(25)=&h19 array_ASCII(26)=&h5A 'Z array_ASCII(27)=&h53 'S array_ASCII(28)=&h41 'A array_ASCII(29)=&h57 'W array_ASCII(30)=&h40 '@ array_ASCII(31)=&h1F array_ASCII(32)=&h20 array_ASCII(33)=&h43 'C array_ASCII(34)=&h58 'X array_ASCII(35)=&h44 'D array_ASCII(36)=&h45 'E array_ASCII(37)=&h24 '$ array_ASCII(38)=&h23 '# array_ASCII(39)=&h27 array_ASCII(40)=&h28 array_ASCII(41)=&h20 'space array_ASCII(42)=&h56 'V array_ASCII(43)=&h46 'F array_ASCII(44)=&h54 'T array_ASCII(45)=&h52 'R array_ASCII(46)=&h25 '% array_ASCII(47)=&h2F array_ASCII(48)=&h30 array_ASCII(49)=&h4E 'N array_ASCII(50)=&h42 'B array_ASCII(51)=&h48 'H array_ASCII(52)=&h47 'G array_ASCII(53)=&h59 'Y array_ASCII(54)=&h5E '^ array_ASCII(55)=&h37 array_ASCII(56)=&h38 array_ASCII(57)=&h39 array_ASCII(58)=&h4D 'M array_ASCII(59)=&h4A 'J array_ASCII(60)=&h55 'U array_ASCII(61)=&h26 '& array_ASCII(62)=&h2A '* array_ASCII(63)=&h3F array_ASCII(64)=&h40 array_ASCII(65)=&h2C ', array_ASCII(66)=&h4B 'K array_ASCII(67)=&h49 'I array_ASCII(68)=&h4F 'O array_ASCII(69)=&h29 ') array_ASCII(70)=&h28 '( array_ASCII(71)=&h47 array_ASCII(72)=&h48 array_ASCII(73)=&h2E '. array_ASCII(74)=&h2F '/ array_ASCII(75)=&h4C 'L array_ASCII(76)=&h3B '; array_ASCII(77)=&h50 'P array_ASCII(78)=&h2D '- array_ASCII(79)=&h4F array_ASCII(80)=&h50 array_ASCII(81)=&h51 array_ASCII(82)=&h27 '' array_ASCII(83)=&h53 array_ASCII(84)=&h5B '[ array_ASCII(85)=&h3D '= array_ASCII(86)=&h56 array_ASCII(87)=&h57 array_ASCII(88)=&h58 array_ASCII(89)=&h59 array_ASCII(90)=&hD 'carrtage return array_ASCII(91)=&h5D '] array_ASCII(92)=&h5C array_ASCII(93)=&h5C '92 \ array_ASCII(94)=&h5E array_ASCII(95)=&h5F array_ASCII(96)=&h60 array_ASCII(97)=&h61 array_ASCII(98)=&h62 array_ASCII(99)=&h63 array_ASCII(100)=&h64 array_ASCII(101)=&h65 array_ASCII(102)=&h8 'backspace array_ASCII(103)=&h67 array_ASCII(104)=&h68 array_ASCII(105)=&h31 '1 array_ASCII(106)=&h6A array_ASCII(107)=&h34 '4 array_ASCII(108)=&h37 '7 array_ASCII(109)=&h6D array_ASCII(110)=&h6E array_ASCII(111)=&h6F array_ASCII(112)=&h30 '0 array_ASCII(113)=&h2E '. array_ASCII(114)=&h32 '2 array_ASCII(115)=&h35 '5 array_ASCII(116)=&h36 '6 array_ASCII(117)=&h38 '8 array_ASCII(118)=&h1B 'ESC array_ASCII(119)=&h77 array_ASCII(120)=&h78 array_ASCII(121)=&h2B '+ array_ASCII(122)=&h33 '3 array_ASCII(123)=&h2D '- array_ASCII(124)=&h2A '* array_ASCII(125)=&h39 '9 array_ASCII(126)=&h7E array_ASCII(127)=&h7F '--------------------------------------------------------------------' ' Install interrupt handler main = __hbbr_install_irq(EINT0_INT, AddressOf irq_eint0) PINSEL0 = PINSEL0 and &h3FFFFFFF 'set P0.15 to GPIO PINSEL1 = PINSEL1 and &hFFFFFFFC 'set P0.16 to GPIO IO0DIR = IO0DIR and &hFFFE7FFF 'set P0.15 and P0.16 to input EXTMODE = EXTMODE or &h01 'EINT0 edge sensitive PINSEL1 = PINSEL1 OR &h00000001 'set P0.16 to EINT0 '-----------------------enable interrupt-----------------------' call __hbbr_enable_irq() do do while(data = 0) loop 'wait for key code support temp = data 'keep data to temp if(check = 2) then check = 0 end if 'clear code for &hF0 ,&hE0,&hE1 if(check = 1) then check = 2 end if 'clear code for &hF0 ,&hE0,&hE1 if((data = &hF0) or (data = &hE0)) 'check break code and none key support then check = 1 'start clear code end if data = 0 'clear old code if( ( ( (temp<>&hF0) or (temp<>&hE0) or (temp<>&hE1) )and check) = 0) then 'check code support result = array_ASCII(temp) 'convert data end if if check = 2 then 'for do 1 time print #0 , Chr$(result) 'decode data to string and show at terminal end if loop end function