📄 prj.lst
字号:
__text_start:
__start:
63 EFCF LDI R28,0xFF
64 E1D0 LDI R29,0x10
65 BFCD OUT 0x3D,R28
66 BFDE OUT 0x3E,R29
67 53CC SUBI R28,0x3C
68 40D0 SBCI R29,0
69 EA0A LDI R16,0xAA
6A 8308 STD Y+0,R16
6B 2400 CLR R0
6C E3EA LDI R30,0x3A
6D E0F1 LDI R31,1
6E E011 LDI R17,1
6F 33EA CPI R30,0x3A
70 07F1 CPC R31,R17
71 F011 BEQ 0x0074
72 9201 ST R0,Z+
73 CFFB RJMP 0x006F
74 8300 STD Z+0,R16
75 E8EC LDI R30,0x8C
76 E0F0 LDI R31,0
77 E0A0 LDI R26,0
78 E0B1 LDI R27,1
79 E010 LDI R17,0
7A E000 LDI R16,0
7B BF0B OUT 0x3B,R16
7C 3CE6 CPI R30,0xC6
7D 07F1 CPC R31,R17
7E F021 BEQ 0x0083
7F 95C8 LPM
80 9631 ADIW R30,1
81 920D ST R0,X+
82 CFF9 RJMP 0x007C
83 940E 01E7 CALL _main
_exit:
85 CFFF RJMP _exit
FILE: D:\ICCAVR~1\模块化~1\src\delay.c
(0001) #define DELAY_C
(0002) #include "common.h"
(0003) #define XTAL 1 //晶振频率,单位MHz
(0004) void delay_1us(void) //1us延时函数
(0005) {
(0006) asm("nop");
_delay_1us:
86 0000 NOP
87 9508 RET
_delay_nus:
i --> R20
n --> R10
88 940E 024A CALL push_xgset300C
8A 0158 MOVW R10,R16
(0007) }
(0008)
(0009) void delay_nus(unsigned int n) //N us延时函数
(0010) {
(0011) unsigned int i=0;
8B 2744 CLR R20
8C 2755 CLR R21
(0012) for (i=0;i<n;i++)
8D C003 RJMP 0x0091
(0013) delay_1us();
8E DFF7 RCALL _delay_1us
8F 5F4F SUBI R20,0xFF
90 4F5F SBCI R21,0xFF
91 154A CP R20,R10
92 055B CPC R21,R11
93 F3D0 BCS 0x008E
94 940C 024F JMP pop_xgset300C
(0014) }
(0015)
(0016) void delay_1ms(void) //1ms延时函数
(0017) {
(0018) unsigned int i;
(0019) for (i=0;i<(unsigned int)(XTAL*143-2);i++);
_delay_1ms:
i --> R16
96 2700 CLR R16
97 2711 CLR R17
98 C002 RJMP 0x009B
99 5F0F SUBI R16,0xFF
9A 4F1F SBCI R17,0xFF
9B E88D LDI R24,0x8D
9C E090 LDI R25,0
9D 1708 CP R16,R24
9E 0719 CPC R17,R25
9F F3C8 BCS 0x0099
A0 9508 RET
_delay_nms:
i --> R20
n --> R10
A1 940E 024A CALL push_xgset300C
A3 0158 MOVW R10,R16
(0020) }
(0021)
(0022) void delay_nms(unsigned int n) //N ms延时函数
(0023) {
(0024) unsigned int i=0;
A4 2744 CLR R20
A5 2755 CLR R21
(0025) for (i=0;i<n;i++)
A6 C003 RJMP 0x00AA
(0026) {
(0027) delay_1ms();
A7 DFEE RCALL _delay_1ms
A8 5F4F SUBI R20,0xFF
A9 4F5F SBCI R21,0xFF
AA 154A CP R20,R10
AB 055B CPC R21,R11
AC F3D0 BCS 0x00A7
AD 940C 024F JMP pop_xgset300C
_key_scan:
keynum --> R12
x --> R20
keytemp --> R10
y --> R22
AF 940E 0270 CALL push_xgsetF03C
FILE: D:\ICCAVR~1\模块化~1\src\key.c
(0001) #include "common.h"
(0002)
(0003) unsigned char key_scan(void);
(0004)
(0005) /********************************************************************************************
(0006) * 函数名称:key_scan()
(0007) * 功 能:返回用户按下的键盘所对应的键盘号
(0008) * 入口参数:无
(0009) * 出口参数:返回0表示没有键盘被按动,返回1~24对应被按动的键盘
(0010) * 说 明:用户可根据自己的键盘编号修改该函数
(0011) *********************************************************************************************/
(0012) unsigned char key_scan(void)
(0013) {
(0014) unsigned char x,y;
(0015) unsigned char keynum;
(0016) unsigned char keytemp;
(0017) for(x=0;x<4;x++)
B1 2744 CLR R20
B2 C027 RJMP 0x00DA
(0018) {
(0019) PORTB=~(1<<x);
B3 E001 LDI R16,1
B4 2F14 MOV R17,R20
B5 940E 0282 CALL lsl8
B7 2E20 MOV R2,R16
B8 9420 COM R2
B9 BA28 OUT 0x18,R2
(0020) keytemp=PINE;
BA B0A1 IN R10,0x01
(0021) for(y=0;y<4;y++)
BB 2766 CLR R22
BC C01A RJMP 0x00D7
(0022) {
(0023) if(((keytemp>>y)&0x01)!=0)
BD 2D0A MOV R16,R10
BE 2F16 MOV R17,R22
BF 940E 0288 CALL lsr8
C1 2F80 MOV R24,R16
C2 7081 ANDI R24,1
C3 F091 BEQ 0x00D6
(0024) {
(0025) delay_nms(5);
C4 E005 LDI R16,5
C5 E010 LDI R17,0
C6 940E 00A1 CALL _delay_nms
(0026) if(((keytemp>>y)&0x01)!=0)
C8 2D0A MOV R16,R10
C9 2F16 MOV R17,R22
CA 940E 0288 CALL lsr8
CC 2F80 MOV R24,R16
CD 7081 ANDI R24,1
CE F039 BEQ 0x00D6
(0027) {
(0028) keynum=6*x+y;
CF E086 LDI R24,6
D0 9F84 MUL R24,R20
D1 2CC0 MOV R12,R0
D2 0EC6 ADD R12,R22
(0029) return (keynum+1);
D3 2D0C MOV R16,R12
D4 5F0F SUBI R16,0xFF
D5 C006 RJMP 0x00DC
D6 9563 INC R22
D7 3064 CPI R22,4
D8 F320 BCS 0x00BD
D9 9543 INC R20
DA 3044 CPI R20,4
DB F2B8 BCS 0x00B3
DC 940C 0279 JMP pop_xgsetF03C
FILE: D:\ICCAVR~1\模块化~1\src\LCD.c
(0001) // ************************************************
(0002) // *** LCD_4BIT Driver V1.1 ***
(0003) // *** LCD.C ***
(0004) // ************************************************
(0005) #include "common.h"
(0006)
(0007) #define LCD_C
(0008) // ***** Define I/O pins ***** //
(0009) #define BIT7 0x80
(0010) #define BIT6 0x40
(0011) #define BIT5 0x20
(0012) #define BIT4 0x10
(0013) #define BIT3 0x08
(0014) #define BIT2 0x04
(0015) #define BIT1 0x02
(0016) #define BIT0 0x01
(0017) // *** Set port for LCD Data Bus 8 bit mode *** //
(0018) #define LCD_OP_PORT PORTD
(0019) #define LCD_IP_PORT PIND
(0020) #define LCD_DIR_PORT DDRD
(0021) // *** Set LCD Enable Port and Bit values *** //
(0022) //#define LCD_EN LCD_OP_PORT.2
(0023) // *** Set LCD Register Select Port and Bit values *** //
(0024) //#define LCD_RS LCD_OP_PORT.0
(0025) // *** Set LCD Read/Write Port and Bit values *** //
(0026) //#define LCD_RW LCD_OP_PORT.1
(0027) /****************************************************************/
(0028)
(0029) #define LCD_EN (1 << 2) //引脚定义
(0030) #define LCD_RS (1 << 0)
(0031) #define LCD_RW (1 << 1)
(0032)
(0033) #define lcd_set_e() (LCD_OP_PORT |= LCD_EN) //置位与清零
(0034) #define lcd_set_rs() (LCD_OP_PORT |= LCD_RS)
(0035) #define lcd_set_rw() (LCD_OP_PORT |= LCD_RW)
(0036) #define lcd_clear_e() (LCD_OP_PORT &= ~LCD_EN)
(0037) #define lcd_clear_rs() (LCD_OP_PORT &= ~LCD_RS)
(0038) #define lcd_clear_rw() (LCD_OP_PORT &= ~LCD_RW)
(0039) /****************************************************************/
(0040)
(0041) #define LCD_ON 0x0C
(0042) #define LCD_CURS_ON 0x0D
(0043) #define LCD_OFF 0x08
(0044) #define LCD_HOME 0x02
(0045) #define LCD_CLEAR 0x01
(0046) #define LCD_NEW_LINE 0xC0
(0047) #define LCD_FUNCTION_SET 0x28
(0048) #define LCD_MODE_SET 0x06
(0049)
(0050)
(0051) void LCD_INIT(void)
(0052) {
(0053) LCD_DIR_PORT = 0xff; // LCD port output
_LCD_INIT:
DE EF8F LDI R24,0xFF
DF BB81 OUT 0x11,R24
(0054) LCD_OP_PORT = 0x30; // Load high-data to port
E0 E380 LDI R24,0x30
E1 BB82 OUT 0x12,R24
(0055) lcd_clear_rw(); // Set LCD to write
E2 9891 CBI 0x12,1
(0056) lcd_clear_rs(); // Set LCD to command
E3 9890 CBI 0x12,0
(0057) lcd_set_e(); // Write data to LCD
E4 9A92 SBI 0x12,2
(0058) asm("nop");
E5 0000 NOP
(0059) asm("nop");
E6 0000 NOP
(0060) lcd_clear_e(); // Disable LCD
E7 9892 CBI 0x12,2
(0061) delay_nus(40);
E8 E208 LDI R16,0x28
E9 E010 LDI R17,0
EA 940E 0088 CALL _delay_nus
(0062) lcd_clear_rw() ; // Set LCD to write
EC 9891 CBI 0x12,1
(0063) lcd_clear_rs(); // Set LCD to command
ED 9890 CBI 0x12,0
(0064) lcd_set_e(); // Write data to LCD
EE 9A92 SBI 0x12,2
(0065) asm("nop");
EF 0000 NOP
(0066) asm("nop");
F0 0000 NOP
(0067) lcd_clear_e(); // Disable LCD
F1 9892 CBI 0x12,2
(0068) delay_nus(40);
F2 E208 LDI R16,0x28
F3 E010 LDI R17,0
F4 940E 0088 CALL _delay_nus
(0069) lcd_set_e(); // Write data to LCD
F6 9A92 SBI 0x12,2
(0070) asm("nop");
F7 0000 NOP
(0071) asm("nop");
F8 0000 NOP
(0072) lcd_clear_e(); // Disable LCD
F9 9892 CBI 0x12,2
(0073) delay_nus(40);
FA E208 LDI R16,0x28
FB E010 LDI R17,0
FC 940E 0088 CALL _delay_nus
(0074) LCD_OP_PORT = 0x20;
FE E280 LDI R24,0x20
FF BB82 OUT 0x12,R24
(0075) lcd_set_e(); // Write data to LCD
100 9A92 SBI 0x12,2
(0076) asm("nop");
101 0000 NOP
(0077) asm("nop");
102 0000 NOP
(0078) lcd_clear_e(); // Disable LCD
103 9892 CBI 0x12,2
(0079) delay_nus(40);
104 E208 LDI R16,0x28
105 E010 LDI R17,0
106 940E 0088 CALL _delay_nus
108 9508 RET
_LCD_Busy:
low --> R12
high --> R10
temp --> R20
109 940E 0262 CALL push_xgset303C
(0080) }
(0081) //*****************************************************//
(0082) // This routine will return the busy flag from the LCD //
(0083) //*****************************************************//
(0084) void LCD_Busy ( void )
(0085) {
(0086) unsigned char temp,high;
(0087) unsigned char low;
(0088) LCD_DIR_PORT = 0x0f; // Make I/O Port input
10B E08F LDI R24,0xF
10C BB81 OUT 0x11,R24
(0089) do
(0090) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -