📄 project.lst
字号:
(0068) // Description : ATmega16 Interrupt Initialization
(0069) //***************************************************************
(0070) void Interrupt_Init(void)
(0071) {
(0072) SREG |= 0x80; //Enable Global Interrupt
_Interrupt_Init:
0187 9478 BSET 7
(0073) }
0188 9508 RET
(0074)
(0075) //***************************************************************
(0076) // Function : Get_Key0/1/2/3
(0077) // Input : none
(0078) // Output : Key Press Status
(0079) // Description : Key Press Status Check
(0080) //***************************************************************
(0081) INT8U Get_Key0(void)
(0082) {
(0083) static INT8U Key_Flag = 0;
(0084) if(Key_Flag == 0)
_Get_Key0:
0189 902000E5 LDS R2,0xE5
018B 2022 TST R2
018C F431 BNE 0x0193
(0085) {
(0086) if((PINB & 0x10) == 0x00)
018D 99B4 SBIC 0x16,4
018E C011 RJMP 0x01A0
(0087) {
(0088) Key_Flag = 1;
018F E081 LDI R24,1
0190 938000E5 STS 0xE5,R24
(0089) }
(0090) }
0192 C00D RJMP 0x01A0
(0091) else if(Key_Flag == 1)
0193 918000E5 LDS R24,0xE5
0195 3081 CPI R24,1
0196 F449 BNE 0x01A0
(0092) {
(0093) if((PINB & 0x10) == 0x10)
0197 B386 IN R24,0x16
0198 7180 ANDI R24,0x10
0199 3180 CPI R24,0x10
019A F429 BNE 0x01A0
(0094) {
(0095) Key_Flag = 0;
019B 2422 CLR R2
019C 922000E5 STS 0xE5,R2
(0096) return(true);
019E E001 LDI R16,1
019F C001 RJMP 0x01A1
(0097) }
(0098) }
(0099) return(false);
01A0 2700 CLR R16
01A1 9508 RET
(0100) }
(0101)
(0102) INT8U Get_Key1(void)
(0103) {
(0104) static INT8U Key_Flag = 0;
(0105) if(Key_Flag == 0)
_Get_Key1:
01A2 902000E6 LDS R2,0xE6
01A4 2022 TST R2
01A5 F431 BNE 0x01AC
(0106) {
(0107) if((PINB & 0x20) == 0x00)
01A6 99B5 SBIC 0x16,5
01A7 C011 RJMP 0x01B9
(0108) {
(0109) Key_Flag = 1;
01A8 E081 LDI R24,1
01A9 938000E6 STS 0xE6,R24
(0110) }
(0111) }
01AB C00D RJMP 0x01B9
(0112) else if(Key_Flag == 1)
01AC 918000E6 LDS R24,0xE6
01AE 3081 CPI R24,1
01AF F449 BNE 0x01B9
(0113) {
(0114) if((PINB & 0x20) == 0x20)
01B0 B386 IN R24,0x16
01B1 7280 ANDI R24,0x20
01B2 3280 CPI R24,0x20
01B3 F429 BNE 0x01B9
(0115) {
(0116) Key_Flag = 0;
01B4 2422 CLR R2
01B5 922000E6 STS 0xE6,R2
(0117) return(true);
01B7 E001 LDI R16,1
01B8 C001 RJMP 0x01BA
(0118) }
(0119) }
(0120) return(false);
01B9 2700 CLR R16
01BA 9508 RET
(0121) }
(0122)
(0123) INT8U Get_Key2(void)
(0124) {
(0125) static INT8U Key_Flag = 0;
(0126) if(Key_Flag == 0)
_Get_Key2:
01BB 902000E7 LDS R2,0xE7
01BD 2022 TST R2
01BE F431 BNE 0x01C5
(0127) {
(0128) if((PINB & 0x40) == 0x00)
01BF 99B6 SBIC 0x16,6
01C0 C011 RJMP 0x01D2
(0129) {
(0130) Key_Flag = 1;
01C1 E081 LDI R24,1
01C2 938000E7 STS 0xE7,R24
(0131) }
(0132) }
01C4 C00D RJMP 0x01D2
(0133) else if(Key_Flag == 1)
01C5 918000E7 LDS R24,0xE7
01C7 3081 CPI R24,1
01C8 F449 BNE 0x01D2
(0134) {
(0135) if((PINB & 0x40) == 0x40)
01C9 B386 IN R24,0x16
01CA 7480 ANDI R24,0x40
01CB 3480 CPI R24,0x40
01CC F429 BNE 0x01D2
(0136) {
(0137) Key_Flag = 0;
01CD 2422 CLR R2
01CE 922000E7 STS 0xE7,R2
(0138) return(true);
01D0 E001 LDI R16,1
01D1 C001 RJMP 0x01D3
(0139) }
(0140) }
(0141) return(false);
01D2 2700 CLR R16
01D3 9508 RET
(0142) }
(0143)
(0144) INT8U Get_Key3(void)
(0145) {
(0146) static INT8U Key_Flag = 0;
(0147) if(Key_Flag == 0)
_Get_Key3:
01D4 902000E8 LDS R2,0xE8
01D6 2022 TST R2
01D7 F431 BNE 0x01DE
(0148) {
(0149) if((PINB & 0x80) == 0x00)
01D8 99B7 SBIC 0x16,7
01D9 C011 RJMP 0x01EB
(0150) {
(0151) Key_Flag = 1;
01DA E081 LDI R24,1
01DB 938000E8 STS 0xE8,R24
(0152) }
(0153) }
01DD C00D RJMP 0x01EB
(0154) else if(Key_Flag == 1)
01DE 918000E8 LDS R24,0xE8
01E0 3081 CPI R24,1
01E1 F449 BNE 0x01EB
(0155) {
(0156) if((PINB & 0x80) == 0x80)
01E2 B386 IN R24,0x16
01E3 7880 ANDI R24,0x80
01E4 3880 CPI R24,0x80
01E5 F429 BNE 0x01EB
(0157) {
(0158) Key_Flag = 0;
01E6 2422 CLR R2
01E7 922000E8 STS 0xE8,R2
(0159) return(true);
01E9 E001 LDI R16,1
01EA C001 RJMP 0x01EC
(0160) }
(0161) }
(0162) return(false);
01EB 2700 CLR R16
01EC 9508 RET
(0163) }
(0164)
(0165) //***************************************************************
(0166) // Function : Buzzer_ON/OFF
(0167) // Input : none
(0168) // Output : none
(0169) // Description : Buzzer ON/OFF Control
(0170) //***************************************************************
(0171) void Buzzer_ON(void)
(0172) {
(0173) PORTB |= 0x08;
_Buzzer_ON:
01ED 9AC3 SBI 0x18,3
(0174) }
01EE 9508 RET
(0175)
(0176) void Buzzer_OFF(void)
(0177) {
(0178) PORTB &= ~0x08;
_Buzzer_OFF:
01EF 98C3 CBI 0x18,3
(0179) }
01F0 9508 RET
FILE: E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\字符型LCD显示应用设计\LCD.c
(0001) //******************************************************************************
(0002) // File Name : LCD.c
(0003) // Author : Steaven
(0004) // Created : 2008-07-27
(0005) // Modified :
(0006) // Revision : V0.0
(0007) //******************************************************************************
(0008)
(0009) //PIN DESCRIPTION
(0010) //01 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
(0011) //GND VCC V0 RS RW EN D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK
(0012) //GND +5V V0 PB0 PB1 PB2 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 GND +5V
(0013)
(0014) #include "iom16v.h"
(0015) #include "DataType.h"
(0016) #include "LCD.h"
(0017) #include "macros.h"
(0018)
(0019) //local functions declaration
(0020) void Set_RS(INT8U RS);
(0021) void Set_RW(INT8U RW);
(0022) void Set_EN(INT8U EN);
(0023) void Set_Data(INT8U data);
(0024) void LCD_Write_Command(INT8U command,INT8U status);
(0025) void LCD_Write_Data(INT8U data,INT8U status);
(0026) void Delay_ms(INT8U time);
(0027) INT8U LCD_Read_BF(void);
(0028) INT8U LCD_Read_Data(INT8U status);
(0029)
(0030) //******************************************************************************
(0031) // Function : Set_RS
(0032) // Input : RS - RS Control Line Level
(0033) // Output : none
(0034) // Description : LCD(1602) Low Level Interface Function
(0035) //******************************************************************************
(0036) void Set_RS(INT8U RS)
(0037) {
(0038) if(RS == 0)
_Set_RS:
RS --> R16
01F1 2300 TST R16
01F2 F411 BNE 0x01F5
(0039) {
(0040) PORTB &= ~0x01;
01F3 98C0 CBI 0x18,0
(0041) }
01F4 C001 RJMP 0x01F6
(0042) else
(0043) {
(0044) PORTB |= 0x01;
01F5 9AC0 SBI 0x18,0
(0045) }
(0046) }
01F6 9508 RET
(0047)
(0048) //******************************************************************************
(0049) // Function : Set_RW
(0050) // Input : RW - RW Control Line Level
(0051) // Output : none
(0052) // Description : Low Level Interface Function
(0053) //******************************************************************************
(0054) void Set_RW(INT8U RW)
(0055) {
(0056) if(RW == 0)
_Set_RW:
RW --> R16
01F7 2300 TST R16
01F8 F411 BNE 0x01FB
(0057) {
(0058) PORTB &= ~0x02;
01F9 98C1 CBI 0x18,1
(0059) }
01FA C001 RJMP 0x01FC
(0060) else
(0061) {
(0062) PORTB |= 0x02;
01FB 9AC1 SBI 0x18,1
(0063) }
(0064) }
01FC 9508 RET
(0065)
(0066) //******************************************************************************
(0067) // Function : Set_EN
(0068) // Input : RW - RW Control Line Level
(0069) // Output : none
(0070) // Description : Low Level Interface Function
(0071) //******************************************************************************
(0072) void Set_EN(INT8U EN)
(0073) {
(0074) if(EN == 0)
_Set_EN:
EN --> R16
01FD 2300 TST R16
01FE F411 BNE 0x0201
(0075) {
(0076) PORTB &= ~0x04;
01FF 98C2 CBI 0x18,2
(0077) }
0200 C001 RJMP 0x0202
(0078) else
(0079) {
(0080) PORTB |= 0x04;
0201 9AC2 SBI 0x18,2
(0081) }
(0082) }
0202 9508 RET
(0083)
(0084) //******************************************************************************
(0085) // Function : Set_RW
(0086) // Input : data - Data Line Level
(0087) // Output : none
(0088) // Description : Low Level Interface Function
(0089) //******************************************************************************
(0090) void Set_Data(INT8U data)
(0091) {
(0092) PORTA = data;
_Set_Data:
data --> R16
0203 BB0B OUT 0x1B,R16
(0093) }
0204 9508 RET
_LCD_Read_BF:
status --> R20
0205 940E02E5 CALL push_gset1
(0094)
(0095) //******************************************************************************
(0096) // Function : LCD_Read_BF
(0097) // Input : none
(0098) // Output : 0 = LCD Controller is Free,0x80 = LCD Busy
(0099) // Description : Read LCD Controller Status
(0100) //******************************************************************************
(0101) INT8U LCD_Read_BF(void)
(0102) {
(0103) INT8U status;
(0104) DDRA = 0x00;
0207 2422 CLR R2
0208 BA2A OUT 0x1A,R2
(0105) Set_EN(0);
0209 2700 CLR R16
020A DFF2 RCALL _Set_EN
(0106) Set_RS(0);
020B 2700 CLR R16
020C DFE4 RCALL _Set_RS
(0107) Set_RW(1);
020D E001 LDI R16,1
020E DFE8 RCALL _Set_RW
(0108) Set_EN(1);
020F E001 LDI R16,1
0210 DFEC RCALL _Set_EN
(0109) NOP();
0211 0000 NOP
(0110) status = PINA;
0212 B349 IN R20,0x19
(0111) Set_EN(0);
0213 2700 CLR R16
0214 DFE8 RCALL _Set_EN
(0112) DDRA = 0xFF;
0215 EF8F LDI R24,0xFF
0216 BB8A OUT 0x1A,R24
(0113) return(status & 0x80);
0217 2F04 MOV R16,R20
0218 7800 ANDI R16,0x80
0219 940E02E8 CALL pop_gset1
021B 9508 RET
_LCD_Write_Command:
status --> R22
command --> R20
021C 940E02FC CALL push_gset2
021E 2F62 MOV R22,R18
021F 2F40 MOV R20,R16
(0114) }
(0115)
(0116) //******************************************************************************
(0117) // Function : LCD_Write_Command
(0118) // Input : command - Command to be written to LCD
(0119) // status - Detect LCD Status when 1
(0120) // Output : none
(0121) // Description : Write Command to LCD
(0122) //******************************************************************************
(0123) void LCD_Write_Command(INT8U command,INT8U status)
(0124) {
(0125) if(status == 1)
0220 3061 CPI R22,1
0221 F419 BNE 0x0225
(0126) {
(0127) while(LCD_Read_BF() != 0) {;}
0222 DFE2 RCALL _LCD_Read_BF
0223 2300 TST R16
0224 F7E9 BNE 0x0222
(0128) }
(0129) Set_EN(0);
0225 2700 CLR R16
0226 DFD6 RCALL _Set_EN
(0130) Set_RS(0);
0227 2700 CLR R16
0228 DFC8 RCALL _Set_RS
(0131) Set_RW(0);
0229 2700 CLR R16
022A DFCC RCALL _Set_RW
(0132) Set_Data(command);
022B 2F04 MOV R16,R20
022C DFD6 RCALL _Set_Data
(0133) Set_EN(1);
022D E001 LDI R16,1
022E DFCE RCALL _Set_EN
(0134) NOP();
022F 0000 NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -