atmega16 UART同步模式接收PS2键盘扫描码.docx
- 文档编号:30499706
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:9
- 大小:15.57KB
atmega16 UART同步模式接收PS2键盘扫描码.docx
《atmega16 UART同步模式接收PS2键盘扫描码.docx》由会员分享,可在线阅读,更多相关《atmega16 UART同步模式接收PS2键盘扫描码.docx(9页珍藏版)》请在冰豆网上搜索。
atmega16UART同步模式接收PS2键盘扫描码
有关PS2键盘的大多是以中断方式接收扫描码,这样不停的中断,效率低,对于实验验证是可以的,UART的格式与PS2键盘的数据发送格式相同,这里提供atmge16使用USART的同步模式,接收PS2键盘扫描码。
并在1602液晶上显示
//LCD1602.h头文件
#include
#defineuintunsignedint
#defineEn_HPORTD|=(1< #defineEn_LPORTD&=~(1< #defineRW_RPORTD|=(1< #defineRW_WPORTD&=~(1< #defineRS_HPORTD|=(1< #defineRS_LPORTD&=~(1< voidPort_init(void) { PORTA=0XFF; DDRA=0X00; PORTD=0XFF; DDRD=0X00; } voidEn_Toggle(void) { En_H; _delay_us(20); En_L; _delay_us(20); } voidWrite_Command(uint8_tCommand) {RW_W; RS_L; En_H; PORTA=Command; En_Toggle(); } voidWrite_Data(uint8_tData) { RW_W; RS_H; En_H; PORTA=Data; En_Toggle(); } voidWrite_Position(uint8_trow,uint8_tcolum) { uint8_tp; if(row==0) p=0x80+colum; else p=0xc0+colum; Write_Command(p); } voidWrite_String(char*s) { for(;*s! ='\0';s++) Write_Data(*s); } voidInitialize_LCD(void) {DDRA=0xFF; DDRD|=(1< _delay_ms(15); Write_Command(0x38); Write_Command(0x08); Write_Command(0x01); _delay_ms(5); Write_Command(0x04); _delay_ms(5); Write_Command(0x0c); } //UART同步模式接收PS2扫描码 #include #include #include #include"LCD1602.h" #defineF_CPU7372800UL constcharunshifted[36][2]= { {0x1c,'a'}, {0x32,'b'}, {0x21,'c'}, {0x23,'d'}, {0x24,'e'}, {0x2B,'f'}, {0x34,'g'}, {0x33,'h'}, {0x43,'i'}, {0x3B,'j'}, {0x42,'k'}, {0x4B,'l'}, {0x3A,'m'}, {0x31,'n'}, {0x44,'o'}, {0x4D,'p'}, {0x15,'q'}, {0x2D,'r'}, {0x1B,'s'}, {0x2C,'t'}, {0x3C,'u'}, {0x2A,'v'}, {0x1D,'w'}, {0x22,'x'}, {0x35,'y'}, {0x1A,'z'}, {0x45,'0'}, {0x16,'1'}, {0x1E,'2'}, {0x26,'3'}, {0x25,'4'}, {0x2E,'5'}, {0x36,'6'}, {0x3D,'7'}, {0x3E,'8'}, {0x46,'9'}, }; constcharshifted[36][2]= { {0x1c,'A'}, {0x32,'B'}, {0x21,'C'}, {0x23,'D'}, {0x24,'E'}, {0x2B,'F'}, {0x34,'G'}, {0x33,'H'}, {0x43,'I'}, {0x3B,'J'}, {0x42,'K'}, {0x4B,'L'}, {0x3A,'M'}, {0x31,'N'}, {0x44,'O'}, {0x4D,'P'}, {0x15,'Q'},// {0x2D,'R'}, {0x1B,'S'},// {0x2C,'T'}, {0x3C,'U'}, {0x2A,'V'}, {0x1D,'W'},// {0x22,'X'}, {0x35,'Y'}, {0x1A,'Z'}, {0x45,'0'}, {0x16,'1'}, {0x1E,'2'}, {0x26,'3'}, {0x25,'4'}, {0x2E,'5'}, {0x36,'6'}, {0x3D,'7'}, {0x3E,'8'}, {0x46,'9'}, }; intdata; intup,shift; SIGNAL(SIG_USART_RECV)//接收 { inti; data=UDR; if(! up)//已接收的11位数据是通码(up为0) { switch(data)//开始翻译扫描码 { case0x13: up=1;break; case0x12: shift=1;break; case0x59: shift=1;break; default: if(! shift) { for(i=0;i<36;i++) if(unshifted[i][0]==data) { data=unshifted[i][1]; break; } } else { for(i=0;i<36;i++) if(shifted[i][0]==data) { data=shifted[i][1]; break; } } } } else { up=0; switch(data)//检测shift键释放 { case0x12: shift=0;break; case0x59: shift=0;break; default: break; } } voidLCDplay(intdata) { Write_Position(0,0); Write_Data(data); } voidLCD_set(void) { Port_init(); Initialize_LCD(); Write_Command(0x01); _delay_ms(5); } intmain() { DDRB&=~(1< PORTD&=~(1< DDRD&=~(1< LCD_set(); UCSRB=(1< UCSRC=(1< sei(); while (1) { LCDplay(data); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- atmega16 UART同步模式接收PS2键盘扫描码 UART 同步 模式 接收 PS2 键盘 扫描