📄 ps2_kb.lst
字号:
__start:
__text_start:
00B9 E5CF LDI R28,0x5F
00BA E0D4 LDI R29,4
00BB BFCD OUT P3D,R28
00BC BFDE OUT P3E,R29
00BD 51C0 SUBI R28,0x10
00BE 40D0 SBCI R29,0
00BF EA0A LDI R16,0xAA
00C0 8308 STD R16,0+Y
00C1 2400 CLR R0
00C2 E6EE LDI R30,0x6E
00C3 E0F0 LDI R31,0
00C4 E010 LDI R17,0
00C5 37E1 CPI R30,0x71
00C6 07F1 CPC R31,R17
00C7 F011 BEQ 0x00CA
00C8 9201 ST R0,Z+
00C9 CFFB RJMP 0x00C5
00CA 8300 STD R16,0+Z
00CB E6E4 LDI R30,0x64
00CC E0F1 LDI R31,1
00CD E6A0 LDI R26,0x60
00CE E0B0 LDI R27,0
00CF E011 LDI R17,1
00D0 37E2 CPI R30,0x72
00D1 07F1 CPC R31,R17
00D2 F021 BEQ 0x00D7
00D3 95C8 LPM
00D4 9631 ADIW R30,1
00D5 920D ST R0,X+
00D6 CFF9 RJMP 0x00D0
00D7 940E029A CALL _main
_exit:
00D9 CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
00DA 940E02F8 CALL push_gset2
00DC 01B8 MOVW R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002) 文件:AVR_PQ1A.H
(0003) 功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005)
(0006) #include <iom16v.h> //包含型号头文件
(0007) #include <macros.h> //包含"位"操作头文件
(0008)
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2 //LED锁存器控制端
(0015) #define SEGLK PA3 //数码管段选锁存器控制端
(0016) #define BITLK PA4 //数码管位选锁存器控制端
(0017)
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功 能: 延时指定微秒(8M晶振)
(0024) 参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值 : 无
(0026) /********************************************/
(0027) void Delayus(uint US)
(0028) {
(0029) uint i;
(0030) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
00DD E005 LDI R16,5
00DE E010 LDI R17,0
00DF 019B MOVW R18,R22
00E0 940E02A3 CALL empy16s
00E2 01B8 MOVW R22,R16
00E3 9576 LSR R23
00E4 9567 ROR R22
00E5 9576 LSR R23
00E6 9567 ROR R22
(0031) for( i=0;i<US;i++);
00E7 2744 CLR R20
00E8 2755 CLR R21
00E9 C002 RJMP 0x00EC
00EA 5F4F SUBI R20,0xFF
00EB 4F5F SBCI R21,0xFF
00EC 1746 CP R20,R22
00ED 0757 CPC R21,R23
00EE F3D8 BCS 0x00EA
(0032) }
00EF 940E02FC CALL pop_gset2
00F1 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
00F2 940E02F8 CALL push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功 能: 延时指定毫秒(8M晶振)
(0036) 参 数: MS--延时的毫秒数
(0037) 返回值 : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)
(0040) {
(0041) uint i,j;
(0042) for( i=0;i<MS;i++)
00F4 2744 CLR R20
00F5 2755 CLR R21
00F6 C00B RJMP 0x0102
(0043) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
00F7 2766 CLR R22
00F8 2777 CLR R23
00F9 C002 RJMP 0x00FC
00FA 5F6F SUBI R22,0xFF
00FB 4F7F SBCI R23,0xFF
00FC 3765 CPI R22,0x75
00FD E0E4 LDI R30,4
00FE 077E CPC R23,R30
00FF F3D0 BCS 0x00FA
0100 5F4F SUBI R20,0xFF
0101 4F5F SBCI R21,0xFF
0102 1740 CP R20,R16
0103 0751 CPC R21,R17
0104 F390 BCS 0x00F7
(0044) }
0105 940E02FC CALL pop_gset2
0107 9508 RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功 能: 初始化实验板,关闭全部功能
(0048) 参 数: 无
(0049) 返回值 : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) DDRA=0xFF; //将四个IO口全部配置为输出
_Board_init:
0108 EF8F LDI R24,0xFF
0109 BB8A OUT P1A,R24
(0054) DDRB=0xFF;
010A BB87 OUT P17,R24
(0055) DDRC=0xFF;
010B BB84 OUT P14,R24
(0056) DDRD=0xFF;
010C BB81 OUT P11,R24
(0057)
(0058) SPCR=0x00; //还原SPI口,使其为正常端口
010D 2422 CLR R2
010E B82D OUT P0D,R2
(0059)
(0060) PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
010F 9ADE SBI P1B,6
(0061) PORTC&=~BIT(PC6); //(RELAY)初始化继电器为常闭连接状态
0110 98AE CBI P15,6
(0062) PORTA&=~BIT(PA1); //关闭SPI总线DA
0111 98D9 CBI P1B,1
(0063) PORTB=0xFF; //关闭LED
0112 BB88 OUT P18,R24
(0064) PORTA|=BIT(LEDLK); //锁存数据,使LED熄灭
0113 9ADA SBI P1B,2
(0065) Delayus(5);
0114 E005 LDI R16,5
0115 E010 LDI R17,0
0116 DFC3 RCALL _Delayus
(0066) PORTA&=~BIT(LEDLK);
0117 98DA CBI P1B,2
(0067)
(0068) PORTB=0x00; //输出段选
0118 2422 CLR R2
0119 BA28 OUT P18,R2
(0069) PORTA|=BIT(SEGLK);
011A 9ADB SBI P1B,3
(0070) Delayus(50);
011B E302 LDI R16,0x32
011C E010 LDI R17,0
011D DFBC RCALL _Delayus
(0071) PORTA&=~BIT(SEGLK);
011E 98DB CBI P1B,3
(0072)
(0073) PORTB=0xFF; //输出位选
011F EF8F LDI R24,0xFF
0120 BB88 OUT P18,R24
(0074) PORTA|=BIT(BITLK);
0121 9ADC SBI P1B,4
(0075) Delayus(50);
0122 E302 LDI R16,0x32
0123 E010 LDI R17,0
0124 DFB5 RCALL _Delayus
(0076) PORTA&=~BIT(BITLK);
0125 98DC CBI P1B,4
(0077)
(0078) PORTD=0xFF;
0126 EF8F LDI R24,0xFF
0127 BB82 OUT P12,R24
(0079) PORTA|=BIT(PA7);
0128 9ADF SBI P1B,7
(0080) Delayus(50);
0129 E302 LDI R16,0x32
012A E010 LDI R17,0
012B DFAE RCALL _Delayus
(0081) PORTA&=~BIT(PA7);
012C 98DF CBI P1B,7
(0082)
(0083)
(0084) }
012D 9508 RET
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\YJ1602.C
(0001) /*******************************************
(0002) 文件:YJ1602.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:驱动开发板上的1602液晶
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h> //包含型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include <stdio.h> //标准输入输出头文件
(0012)
(0013) /*******************************************
(0014) 函数名称: LCD1602_portini
(0015) 功 能: 初始化1602液晶用到的IO口
(0016) 参 数: 无
(0017) 返回值 : 无
(0018) /********************************************/
(0019) void LCD1602_portini(void)
(0020) {
(0021) LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
_LCD1602_portini:
012E B381 IN R24,P11
012F 6780 ORI R24,0x70
0130 BB81 OUT P11,R24
(0022) LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
0131 B387 IN R24,P17
0132 6F8F ORI R24,0xFF
0133 BB87 OUT P17,R24
(0023) }
0134 9508 RET
_LCD1602_readbyte:
dByte --> R20
DatCmd --> R20
0135 940E02E1 CALL push_gset1
0137 2F40 MOV R20,R16
(0024) /*******************************************
(0025) 函数名称: LCD1602_readbyte
(0026) 功 能: 从1602液晶读出一个字节数据或者指令
(0027) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0028) 返回值 : dByte--读回的数据或者指令
(0029) /********************************************/
(0030) uchar LCD1602_readbyte(uchar DatCmd)
(0031) {
(0032) uchar dByte;
(0033) if (DatCmd == iCmd) //指令操作
0138 2344 TST R20
0139 F411 BNE 0x013C
(0034) LCDa_CLR_RS;
013A 9894 CBI P12,4
013B C001 RJMP 0x013D
(0035) else
(0036) LCDa_SET_RS;
013C 9A94 SBI P12,4
(0037)
(0038) LCDa_SET_RW; //读操作
013D 9A95 SBI P12,5
(0039) LCDa_SET_E;
013E 9A96 SBI P12,6
(0040) LCDa_DATA_DDR=0x00; //数据总线定义为输入
013F 2422 CLR R2
0140 BA27 OUT P17,R2
(0041) dByte=LCDa_DI; //读数据或者指令
0141 B346 IN R20,P16
(0042) Delayms(1); //时序调整
0142 E001 LDI R16,1
0143 E010 LDI R17,0
0144 DFAD RCALL _Delayms
(0043) LCDa_CLR_E;
0145 9896 CBI P12,6
(0044) LCDa_DATA_DDR|=0xff; //数据总线还原为输出
0146 B387 IN R24,P17
0147 6F8F ORI R24,0xFF
0148 BB87 OUT P17,R24
(0045) return dByte;
0149 2F04 MOV R16,R20
014A 940E02E4 CALL pop_gset1
014C 9508 RET
_LCD1602_sendbyte:
dByte --> R20
DatCmd --> R22
014D 940E02F8 CALL push_gset2
014F 2F42 MOV R20,R18
0150 2F60 MOV R22,R16
(0046) }
(0047) /*******************************************
(0048) 函数名称: LCD1602_sendbyte
(0049) 功 能: 向1602液晶写入一个字节数据或者指令
(0050) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0051) dByte--为写入1602的数据或者指令
(0052) 返回值 : 无
(0053) /********************************************/
(0054) void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
(0055) {
(0056) if (DatCmd == iCmd) //指令操作
0151 2366 TST R22
0152 F411 BNE 0x0155
(0057) LCDa_CLR_RS;
0153 9894 CBI P12,4
0154 C001 RJMP 0x0156
(0058) else
(0059) LCDa_SET_RS;
0155 9A94 SBI P12,4
(0060)
(0061) LCDa_CLR_RW; //写操作
0156 9895 CBI P12,5
(0062) LCDa_SET_E;
0157 9A96 SBI P12,6
(0063) LCDa_DO = dByte; //写入数据
0158 BB48 OUT P18,R20
(0064) Delayms(1);
0159 E001 LDI R16,1
015A E010 LDI R17,0
015B DF96 RCALL _Delayms
(0065) LCDa_CLR_E;
015C 9896 CBI P12,6
(0066) }
015D 940E02FC CALL pop_gset2
015F 9508 RET
_LCD1602_sendstr:
ptString --> R20
0160 940E02E1 CALL push_gset1
0162 01A8 MOVW R20,R16
(0067) /*******************************************
(0068) 函数名称: LCD1602_sendstr
(0069) 功 能: 向1602液晶写入一个字符串
(0070) 参 数: ptString--字符串指针
(0071) 返回值 : 无
(0072) /********************************************/
(0073) void LCD1602_sendstr(uchar *ptString)
(0074) {
0163 C005 RJMP 0x0169
(0075) while((*ptString)!='\0') //字符串未结束
(0076) {
(0077) LCD1602_sendbyte(iDat, *ptString++);
0164 01FA MOVW R30,R20
0165 9121 LD R18,Z+
0166 01AF MOVW R20,R30
0167 E001 LDI R16,1
0168 DFE4 RCALL _LCD1602_sendbyte
0169 01FA MOVW R30,R20
016A 8020 LDD R2,0+Z
016B 2022 TST R2
016C F7B9 BNE 0x0164
(0078) }
(0079) }
016D 940E02E4 CALL pop_gset1
016F 9508 RET
(0080) /*******************************************
(0081) 函数名称: LCD1602_clear
(0082) 功 能: 1602液晶清屏
(0083) 参 数: 无
(0084) 返回值 : 无
(0085) /********************************************/
(0086) void LCD1602_clear(void)
(0087) {
(0088) LCD1602_sendbyte(iCmd,LCDa_CLS);
_LCD1602_clear:
0170 E021 LDI R18,1
0171 2700 CLR R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -