📄 ps2.lst
字号:
__text_start:
__start:
0084 E5CF LDI R28,0x5F
0085 E0D4 LDI R29,4
0086 BFCD OUT 0x3D,R28
0087 BFDE OUT 0x3E,R29
0088 51CE SUBI R28,0x1E
0089 40D0 SBCI R29,0
008A EA0A LDI R16,0xAA
008B 8308 STD Y+0,R16
008C 2400 CLR R0
008D E9ED LDI R30,0x9D
008E E0F0 LDI R31,0
008F E010 LDI R17,0
0090 39ED CPI R30,0x9D
0091 07F1 CPC R31,R17
0092 F011 BEQ 0x0095
0093 9201 ST R0,Z+
0094 CFFB RJMP 0x0090
0095 8300 STD Z+0,R16
0096 ECEA LDI R30,0xCA
0097 E0F0 LDI R31,0
0098 E6A0 LDI R26,0x60
0099 E0B0 LDI R27,0
009A E011 LDI R17,1
009B 30E7 CPI R30,7
009C 07F1 CPC R31,R17
009D F021 BEQ 0x00A2
009E 95C8 LPM
009F 9631 ADIW R30,1
00A0 920D ST R0,X+
00A1 CFF9 RJMP 0x009B
00A2 940E01B2 CALL _main
_exit:
00A4 CFFF RJMP _exit
FILE: D:\PROGRA~1\AVRTOO~1\Icc\include\delay.h
(0001) void delay_1us(void) //1us延时函数
(0002) {
(0003) asm("nop");
_delay_1us:
00A5 0000 NOP
00A6 9508 RET
_delay_nus:
i --> R20
n --> R22
00A7 940E0273 CALL push_gset2
00A9 01B8 MOVW R22,R16
(0004) }
(0005)
(0006) void delay_nus(unsigned int n) //N us延时函数
(0007) {
(0008) unsigned int i=0;
00AA 2744 CLR R20
00AB 2755 CLR R21
(0009) for (i=0;i<n;i++)
00AC C003 RJMP 0x00B0
(0010) delay_1us();
00AD DFF7 RCALL _delay_1us
00AE 5F4F SUBI R20,0xFF
00AF 4F5F SBCI R21,0xFF
00B0 1746 CP R20,R22
00B1 0757 CPC R21,R23
00B2 F3D0 BCS 0x00AD
00B3 940E0267 CALL pop_gset2
00B5 9508 RET
(0011) }
(0012)
(0013) void delay_1ms(void) //1ms延时函数
(0014) {
(0015) unsigned int i;
(0016) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
00B6 2700 CLR R16
00B7 2711 CLR R17
00B8 C002 RJMP 0x00BB
00B9 5F0F SUBI R16,0xFF
00BA 4F1F SBCI R17,0xFF
00BB 3704 CPI R16,0x74
00BC E0E4 LDI R30,4
00BD 071E CPC R17,R30
00BE F3D0 BCS 0x00B9
00BF 9508 RET
_delay_nms:
i --> R20
n --> R22
00C0 940E0273 CALL push_gset2
00C2 01B8 MOVW R22,R16
(0017) }
(0018)
(0019) void delay_nms(unsigned int n) //N ms延时函数
(0020) {
(0021) unsigned int i=0;
00C3 2744 CLR R20
00C4 2755 CLR R21
(0022) for (i=0;i<n;i++)
00C5 C003 RJMP 0x00C9
(0023) delay_1ms();
00C6 DFEF RCALL _delay_1ms
00C7 5F4F SUBI R20,0xFF
00C8 4F5F SBCI R21,0xFF
00C9 1746 CP R20,R22
00CA 0757 CPC R21,R23
00CB F3D0 BCS 0x00C6
00CC 940E0267 CALL pop_gset2
00CE 9508 RET
FILE: C:\DOCUME~1\wpzhao.USTC\MYDOCU~1\我的文档\我的ICC\我的PS2\1602.h
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include <delay.h>
(0004)
(0005) /********************************************
(0006) 液晶 LCD1602 4条数据线(D4~D7)
(0007) 编译器:ICC-AVR v6.31A 日期: 2007-4-7 下午
(0008) 目标芯片 : ATmega16
(0009) 时钟: 8.0000Mhz
(0010) 下面是AVR与LCD连接信息
(0011) PA2 ->RS
(0012) PA3 ->EN
(0013) 地 ->RW
(0014) PA4 ->D4
(0015) PA5 ->D5
(0016) PA6 ->D6
(0017) PA7 ->D7
(0018) *********************************************/
(0019)
(0020) #define uchar unsigned char
(0021)
(0022) #define C_On_B_On 0x0F //光标开,闪烁
(0023) #define C_On_B_Off 0x0E //光标开,不闪烁
(0024) #define C_Off_B_On 0x0D //光标关,闪烁
(0025) #define C_Off_B_Off 0x0C //光标关,不闪烁
(0026)
(0027) #define EN_PORT PORTA
(0028) #define EN_DDR DDRA
(0029) #define RS_PORT PORTA
(0030) #define RS_DDR DDRA
(0031)
(0032) #define DATA_OUT PORTA
(0033) #define DATA_DDR DDRA
(0034) #define DATA_IN PINA
(0035)
(0036) #define LCD_EN (1<<PA3)
(0037) #define LCD_RS (1<<PA2)
(0038) #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7))
(0039)
(0040) #define Set_RS_0 RS_PORT&=~LCD_RS
(0041) #define Set_RS_1 RS_PORT|=LCD_RS
(0042) #define Set_EN_0 EN_PORT&=~LCD_EN
(0043) #define Set_EN_1 EN_PORT|=LCD_EN
(0044)
(0045) /*****************************
(0046) 功能:EN下降沿写指令及数据
(0047) *****************************/
(0048) void LCD_Write(void)
(0049) {Set_EN_1;
_LCD_Write:
00CF 9ADB SBI 0x1B,3
(0050) delay_1us();
00D0 DFD4 RCALL _delay_1us
(0051) Set_EN_0;
00D1 98DB CBI 0x1B,3
00D2 9508 RET
_LCD_WriteC:
cmd --> R20
00D3 940E0275 CALL push_gset1
00D5 2F40 MOV R20,R16
(0052) }
(0053) /*****************************
(0054) 功能:写指令
(0055) *****************************/
(0056) void LCD_WriteC(uchar cmd)
(0057) {delay_nus(20);
00D6 E104 LDI R16,0x14
00D7 E010 LDI R17,0
00D8 DFCE RCALL _delay_nus
(0058) Set_RS_0;
00D9 98DA CBI 0x1B,2
(0059) DATA_OUT&=0x0F; // 清高四位
00DA B38B IN R24,0x1B
00DB 708F ANDI R24,0xF
00DC BB8B OUT 0x1B,R24
(0060) DATA_OUT|=cmd&0xF0; //写高四位
00DD 2F84 MOV R24,R20
00DE 7F80 ANDI R24,0xF0
00DF B22B IN R2,0x1B
00E0 2A28 OR R2,R24
00E1 BA2B OUT 0x1B,R2
(0061) LCD_Write();
00E2 DFEC RCALL _LCD_Write
(0062) cmd=cmd<<4;
00E3 2F84 MOV R24,R20
00E4 708F ANDI R24,0xF
00E5 9582 SWAP R24
00E6 2F48 MOV R20,R24
(0063) DATA_OUT&=0x0F; // 清高四位
00E7 B38B IN R24,0x1B
00E8 708F ANDI R24,0xF
00E9 BB8B OUT 0x1B,R24
(0064) DATA_OUT|=cmd&0xF0; //写低四位
00EA 2F84 MOV R24,R20
00EB 7F80 ANDI R24,0xF0
00EC B22B IN R2,0x1B
00ED 2A28 OR R2,R24
00EE BA2B OUT 0x1B,R2
(0065) LCD_Write();
00EF DFDF RCALL _LCD_Write
00F0 940E0278 CALL pop_gset1
00F2 9508 RET
_LCD_WriteD:
data --> R20
00F3 940E0275 CALL push_gset1
00F5 2F40 MOV R20,R16
(0066) }
(0067) /****************************
(0068) 功能:写数据
(0069) ****************************/
(0070) void LCD_WriteD(uchar data)
(0071) {delay_nus(20);
00F6 E104 LDI R16,0x14
00F7 E010 LDI R17,0
00F8 DFAE RCALL _delay_nus
(0072) Set_RS_1;
00F9 9ADA SBI 0x1B,2
(0073) DATA_OUT&=0x0F; // 清高四位
00FA B38B IN R24,0x1B
00FB 708F ANDI R24,0xF
00FC BB8B OUT 0x1B,R24
(0074) DATA_OUT|=data&0xF0; //写高四位
00FD 2F84 MOV R24,R20
00FE 7F80 ANDI R24,0xF0
00FF B22B IN R2,0x1B
0100 2A28 OR R2,R24
0101 BA2B OUT 0x1B,R2
(0075) LCD_Write();
0102 DFCC RCALL _LCD_Write
(0076) data=data<<4;
0103 2F84 MOV R24,R20
0104 708F ANDI R24,0xF
0105 9582 SWAP R24
0106 2F48 MOV R20,R24
(0077) DATA_OUT&=0x0F; // 清高四位
0107 B38B IN R24,0x1B
0108 708F ANDI R24,0xF
0109 BB8B OUT 0x1B,R24
(0078) DATA_OUT|=data&0xF0; //写低四位
010A 2F84 MOV R24,R20
010B 7F80 ANDI R24,0xF0
010C B22B IN R2,0x1B
010D 2A28 OR R2,R24
010E BA2B OUT 0x1B,R2
(0079) LCD_Write();
010F DFBF RCALL _LCD_Write
0110 940E0278 CALL pop_gset1
0112 9508 RET
_LCD_SetXY:
add --> R20
y --> R20
x --> R22
0113 940E0273 CALL push_gset2
0115 2F42 MOV R20,R18
0116 2F60 MOV R22,R16
(0080) }
(0081) /*************************************
(0082) 功能:设置位置坐标
(0083) LCD第一行显示寄存器地址:0x80-0x8F
(0084) LCD第一行显示寄存器地址:0xC0-0xCF
(0085) 输入:X:0-15,y:1-2
(0086) **************************************/
(0087) void LCD_SetXY(uchar x,uchar y)
(0088) {uchar add;
(0089) y++;
0117 9543 INC R20
(0090) x=x%16;y=y%2;
0118 E110 LDI R17,0x10
0119 2F06 MOV R16,R22
011A 940E024F CALL mod8u
011C 2F60 MOV R22,R16
011D E012 LDI R17,2
011E 2F04 MOV R16,R20
011F 940E024F CALL mod8u
0121 2F40 MOV R20,R16
(0091) if(y==0) add=0x80+x;
0122 2300 TST R16
0123 F419 BNE 0x0127
0124 2F46 MOV R20,R22
0125 5840 SUBI R20,0x80
0126 C002 RJMP 0x0129
(0092) else add=0xC0+x;
0127 2F46 MOV R20,R22
0128 5440 SUBI R20,0x40
(0093) LCD_WriteC(add);
0129 2F04 MOV R16,R20
012A DFA8 RCALL _LCD_WriteC
012B 940E0267 CALL pop_gset2
012D 9508 RET
(0094) }
(0095) /************************************
(0096) 功能:清屏,光标返回初始位置
(0097) *************************************/
(0098) void LCD_Clear()
(0099) {LCD_WriteC(0x01); //清屏
_LCD_Clear:
012E E001 LDI R16,1
012F DFA3 RCALL _LCD_WriteC
(0100) delay_nms(2); //指令执行时间:1.64ms
0130 E002 LDI R16,2
0131 E010 LDI R17,0
0132 DF8D RCALL _delay_nms
(0101) LCD_SetXY(0,1);
0133 E021 LDI R18,1
0134 2700 CLR R16
0135 DFDD RCALL _LCD_SetXY
0136 9508 RET
_LCD_Write_Char:
i --> Y+4
y --> R22
x --> R20
0137 940E0273 CALL push_gset2
0139 2F62 MOV R22,R18
013A 2F40 MOV R20,R16
(0102) }
(0103) /************************************
(0104) 功能:在(x,y)处显示字符
(0105) *************************************/
(0106) void LCD_Write_Char(uchar x,uchar y,uchar i)
(0107) {LCD_SetXY(x,y);
013B 2F26 MOV R18,R22
013C 2F04 MOV R16,R20
013D DFD5 RCALL _LCD_SetXY
(0108) LCD_WriteD(i);
013E 810C LDD R16,Y+4
013F DFB3 RCALL _LCD_WriteD
0140 940E0267 CALL pop_gset2
0142 9508 RET
_LCD_Write_String:
s --> R20
y --> R10
x --> R22
0143 940E0271 CALL push_gset3
0145 2EA2 MOV R10,R18
0146 2F60 MOV R22,R16
0147 814E LDD R20,Y+6
0148 815F LDD R21,Y+7
(0109) }
(0110) /***********************************
(0111) 功能:在(x,y)处开始显示字符串
(0112) ************************************/
(0113) void LCD_Write_String(uchar x,uchar y, uchar *s)
(0114) {LCD_SetXY(x,y);
0149 2D2A MOV R18,R10
014A 2F06 MOV R16,R22
014B DFC7 RCALL _LCD_SetXY
014C C005 RJMP 0x0152
(0115) while(*s){
(0116) LCD_WriteD(*s);
014D 01FA MOVW R30,R20
014E 8100 LDD R16,Z+0
014F DFA3 RCALL _LCD_WriteD
(0117) s++;}
0150 5F4F SUBI R20,0xFF
0151 4F5F SBCI R21,0xFF
0152 01FA MOVW R30,R20
0153 8020 LDD R2,Z+0
0154 2022 TST R2
0155 F7B9 BNE 0x014D
0156 940E026A CALL pop_gset3
0158 9508 RET
(0118) }
(0119) /************************************
(0120) 功能:LCD初始化
(0121) *************************************/
(0122) void LCD_Init(void)
(0123) {DATA_DDR|=LCD_DATA; //数据口方向:输出
_LCD_Init:
0159 B38A IN R24,0x1A
015A 6F80 ORI R24,0xF0
015B BB8A OUT 0x1A,R24
(0124) RS_DDR|=LCD_RS; //RS口方向:输出
015C 9AD2 SBI 0x1A,2
(0125) EN_DDR|=LCD_EN; //EN口方向:输出
015D 9AD3 SBI 0x1A,3
(0126) LCD_WriteC(0x28); //4位总线接口,两行显示
015E E208 LDI R16,0x28
015F DF73 RCALL _LCD_WriteC
(0127) LCD_Write(); // !! 此处需要一个下降沿!!!!!!
0160 DF6E RCALL _LCD_Write
(0128) LCD_WriteC(0x28); //!!! 此处需要两个0x28!!!!!!!!
0161 E208 LDI R16,0x28
0162 DF70 RCALL _LCD_WriteC
(0129) LCD_WriteC(C_Off_B_Off); //开显示,设置光标与闪烁开关
0163 E00C LDI R16,0xC
0164 DF6E RCALL _LCD_WriteC
(0130) LCD_WriteC(0x01); //清屏
0165 E001 LDI R16,1
0166 DF6C RCALL _LCD_WriteC
(0131) delay_nms(2); //指令执行时间:1.64ms
0167 E002 LDI R16,2
0168 E010 LDI R17,0
0169 DF56 RCALL _delay_nms
(0132) LCD_SetXY(0,1);
016A E021 LDI R18,1
016B 2700 CLR R16
016C DFA6 RCALL _LCD_SetXY
016D 9508 RET
_Decode:
i --> R20
temp --> R22
ScanCode --> R16
016E 940E0273 CALL push_gset2
FILE: C:\DOCUME~1\wpzhao.USTC\MYDOCU~1\我的文档\我的ICC\我的PS2\KeyCode.h
(0001) /*-------------------------------------------
(0002) 键盘通码编码表
(0003) PS/2接口:
(0004) 1(数据)--PD1
(0005) 5(时钟)--PD2(INT0)
(0006) 只需一个外部中断接口
(0007) 2007.4.8
(0008) ---------------------------------------------*/
(0009) #define uchar unsigned char
(0010)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -