?? 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; //數據總線定義為輸入
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
(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 + -