⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 project.lst

📁 AVR单片机C语言程序设计实例精粹
💻 LST
📖 第 1 页 / 共 3 页
字号:
(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 + -