📄 key_lcd.lst
字号:
(0148) asm("nop");
01FC 0000 NOP
(0149) lcd_clear_e(); // Disable LCD
01FD 98C2 CBI 0x18,2
(0150) LCD_OP_PORT = (Data << 4)|temp; // Load low-data to port
01FE 2F86 MOV R24,R22
01FF 708F ANDI R24,0xF
0200 9582 SWAP R24
0201 2B84 OR R24,R20
0202 BB88 OUT 0x18,R24
(0151) lcd_clear_rw() ; // Set LCD to write
0203 98C1 CBI 0x18,1
(0152) lcd_set_rs(); // Set LCD to data
0204 9AC0 SBI 0x18,0
(0153) lcd_set_e(); // Write data to LCD
0205 9AC2 SBI 0x18,2
(0154) asm("nop");
0206 0000 NOP
(0155) asm("nop");
0207 0000 NOP
(0156) lcd_clear_e(); // Disable LCD
0208 98C2 CBI 0x18,2
0209 D0A9 RCALL pop_gset2
020A 9508 RET
(0157) }
(0158) // ********************************* //
(0159) // *** Initialize the LCD driver *** //
(0160) // ********************************* //
(0161) void Init_LCD(void)
(0162) {
(0163) LCD_INIT();
_Init_LCD:
020B DF80 RCALL _LCD_INIT
(0164) LCD_WriteControl (LCD_FUNCTION_SET);
020C E208 LDI R16,0x28
020D DFC1 RCALL _LCD_WriteControl
(0165) LCD_WriteControl (LCD_OFF);
020E E008 LDI R16,0x8
020F DFBF RCALL _LCD_WriteControl
(0166) LCD_WriteControl (LCD_CLEAR);
0210 E001 LDI R16,1
0211 DFBD RCALL _LCD_WriteControl
(0167) LCD_WriteControl (LCD_MODE_SET);
0212 E006 LDI R16,6
0213 DFBB RCALL _LCD_WriteControl
(0168) LCD_WriteControl (LCD_ON);
0214 E00C LDI R16,0xC
0215 DFB9 RCALL _LCD_WriteControl
(0169) LCD_WriteControl (LCD_HOME);
0216 E002 LDI R16,2
0217 DFB7 RCALL _LCD_WriteControl
0218 9508 RET
(0170) //LCD_WriteControl (0x90);
(0171)
(0172) }
(0173) // ************************************************ //
(0174) // *** Clear the LCD screen (also homes cursor) *** //
(0175) // ************************************************ //
(0176) void LCD_Clear(void)
(0177) {
(0178) LCD_WriteControl(0x01);
_LCD_Clear:
0219 E001 LDI R16,1
021A DFB4 RCALL _LCD_WriteControl
021B 9508 RET
(0179) }
(0180) // *********************************************** //
(0181) // *** Position the LCD cursor at row 1, col 1 *** //
(0182) // *********************************************** //
(0183) void LCD_Home(void)
(0184) {
(0185) LCD_WriteControl(0x02);
_LCD_Home:
021C E002 LDI R16,2
021D DFB1 RCALL _LCD_WriteControl
021E 9508 RET
_LCD_DisplayCharacter:
Char --> R20
021F D09F RCALL push_gset1
0220 2F40 MOV R20,R16
(0186) }
(0187) // ****************************************************************** //
(0188) // *** Display a single character, at the current cursor location *** //
(0189) // ****************************************************************** //
(0190) void LCD_DisplayCharacter (char Char)
(0191) {
(0192) LCD_WriteData (Char);
0221 2F04 MOV R16,R20
0222 DFCA RCALL _LCD_WriteData
0223 D09E RCALL pop_gset1
0224 9508 RET
_LCD_DisplayString_F:
string --> R20
column --> R10
row --> R22
0225 D095 RCALL push_gset3
0226 2EA2 MOV R10,R18
0227 2F60 MOV R22,R16
0228 814E LDD R20,Y+6
0229 815F LDD R21,Y+7
(0193) }
(0194) // ********************************************************************* //
(0195) // *** Display a string at the specified row and column, using FLASH *** //
(0196) // ********************************************************************* //
(0197) void LCD_DisplayString_F (char row, char column ,const unsigned char *string)
(0198) {
(0199) LCD_Cursor (row, column);
022A 2D2A MOV R18,R10
022B 2F06 MOV R16,R22
022C D027 RCALL _LCD_Cursor
022D C009 RJMP 0x0237
(0200) while (*string)
(0201) {
(0202) LCD_DisplayCharacter (*string++);
022E 2E24 MOV R2,R20
022F 2E35 MOV R3,R21
0230 5F4F SUBI R20,0xFF
0231 4F5F SBCI R21,0xFF
0232 2DE2 MOV R30,R2
0233 2DF3 MOV R31,R3
0234 95C8 LPM
0235 2D00 MOV R16,R0
0236 DFE8 RCALL _LCD_DisplayCharacter
0237 2FE4 MOV R30,R20
0238 2FF5 MOV R31,R21
0239 95C8 LPM
023A 2000 TST R0
023B F791 BNE 0x022E
023C D078 RCALL pop_gset3
023D 9508 RET
_LCD_DisplayString:
string --> R20
column --> R10
row --> R22
023E D07C RCALL push_gset3
023F 2EA2 MOV R10,R18
0240 2F60 MOV R22,R16
0241 814E LDD R20,Y+6
0242 815F LDD R21,Y+7
(0203) }
(0204) }
(0205) // ******************************************************************* //
(0206) // *** Display a string at the specified row and column, using RAM *** //
(0207) // ******************************************************************* //
(0208) void LCD_DisplayString (char row, char column ,unsigned char *string)
(0209) {
(0210) LCD_Cursor (row, column);
0243 2D2A MOV R18,R10
0244 2F06 MOV R16,R22
0245 D00E RCALL _LCD_Cursor
0246 C006 RJMP 0x024D
(0211) while (*string)
(0212) LCD_DisplayCharacter (*string++);
0247 2FE4 MOV R30,R20
0248 2FF5 MOV R31,R21
0249 9101 LD R16,Z+
024A 2F4E MOV R20,R30
024B 2F5F MOV R21,R31
024C DFD2 RCALL _LCD_DisplayCharacter
024D 2FE4 MOV R30,R20
024E 2FF5 MOV R31,R21
024F 8020 LDD R2,Z+0
0250 2022 TST R2
0251 F7A9 BNE 0x0247
0252 D062 RCALL pop_gset3
0253 9508 RET
_LCD_Cursor:
column --> R20
row --> R22
0254 D068 RCALL push_gset2
0255 2F42 MOV R20,R18
0256 2F60 MOV R22,R16
(0213) }
(0214) // *************************************************** //
(0215) // *** Position the LCD cursor at "row", "column". *** //
(0216) // *************************************************** //
(0217) void LCD_Cursor (char row, char column)
(0218) {
(0219) switch (row) {
0257 2777 CLR R23
0258 3061 CPI R22,1
0259 E0E0 LDI R30,0
025A 077E CPC R23,R30
025B F069 BEQ 0x0269
025C 3062 CPI R22,2
025D E0E0 LDI R30,0
025E 077E CPC R23,R30
025F F071 BEQ 0x026E
0260 3063 CPI R22,3
0261 E0E0 LDI R30,0
0262 077E CPC R23,R30
0263 F079 BEQ 0x0273
0264 3064 CPI R22,4
0265 E0E0 LDI R30,0
0266 077E CPC R23,R30
0267 F081 BEQ 0x0278
0268 C013 RJMP 0x027C
(0220) case 1: LCD_WriteControl (0x80 + column - 1); break;
0269 2F04 MOV R16,R20
026A 5800 SUBI R16,0x80
026B 5001 SUBI R16,1
026C DF62 RCALL _LCD_WriteControl
026D C00E RJMP 0x027C
(0221) case 2: LCD_WriteControl (0xc0 + column - 1); break;
026E 2F04 MOV R16,R20
026F 5400 SUBI R16,0x40
0270 5001 SUBI R16,1
0271 DF5D RCALL _LCD_WriteControl
0272 C009 RJMP 0x027C
(0222) case 3: LCD_WriteControl (0x94 + column - 1); break;
0273 2F04 MOV R16,R20
0274 560C SUBI R16,0x6C
0275 5001 SUBI R16,1
0276 DF58 RCALL _LCD_WriteControl
0277 C004 RJMP 0x027C
(0223) case 4: LCD_WriteControl (0xd4 + column - 1); break;
0278 2F04 MOV R16,R20
0279 520C SUBI R16,0x2C
027A 5001 SUBI R16,1
027B DF53 RCALL _LCD_WriteControl
(0224) default: break;
027C D036 RCALL pop_gset2
027D 9508 RET
(0225) }
(0226) }
(0227) // ************************** //
(0228) // *** Turn the cursor on *** //
(0229) // ************************** //
(0230) void LCD_Cursor_On (void)
(0231) {
(0232) LCD_WriteControl (LCD_CURS_ON);
_LCD_Cursor_On:
027E E00D LDI R16,0xD
027F DF4F RCALL _LCD_WriteControl
0280 9508 RET
(0233) }
(0234) // *************************** //
(0235) // *** Turn the cursor off *** //
(0236) // *************************** //
(0237) void LCD_Cursor_Off (void)
(0238) {
(0239) LCD_WriteControl (LCD_ON);
_LCD_Cursor_Off:
0281 E00C LDI R16,0xC
0282 DF4C RCALL _LCD_WriteControl
0283 9508 RET
(0240) }
(0241) // ******************** //
(0242) // *** Turn Off LCD *** //
(0243) // ******************** //
(0244) void LCD_Display_Off (void)
(0245) {
(0246) LCD_WriteControl(LCD_OFF);
_LCD_Display_Off:
0284 E008 LDI R16,0x8
0285 DF49 RCALL _LCD_WriteControl
0286 9508 RET
(0247) }
(0248) // ******************* //
(0249) // *** Turn On LCD *** //
(0250) // ******************* //
(0251) void LCD_Display_On (void)
(0252) {
(0253) LCD_WriteControl(LCD_ON);
_LCD_Display_On:
0287 E00C LDI R16,0xC
0288 DF46 RCALL _LCD_WriteControl
0289 9508 RET
FILE: F:\AVR练习\key_lcd\delay.c
(0001) #define DELAY_C
(0002) #include "includes.h"
(0003) #define XTAL 4 //晶振频率,单位MHz
(0004) void delay_1us(void) //1us延时函数
(0005) {
(0006) asm("nop");
_delay_1us:
028A 0000 NOP
028B 9508 RET
_delay_nus:
i --> R20
n --> R22
028C D030 RCALL push_gset2
028D 2F60 MOV R22,R16
028E 2F71 MOV R23,R17
(0007) }
(0008)
(0009) void delay_nus(unsigned int n) //N us延时函数
(0010) {
(0011) unsigned int i=0;
028F 2744 CLR R20
0290 2755 CLR R21
(0012) for (i=0;i<n;i++)
0291 C003 RJMP 0x0295
(0013) delay_1us();
0292 DFF7 RCALL _delay_1us
0293 5F4F SUBI R20,0xFF
0294 4F5F SBCI R21,0xFF
0295 1746 CP R20,R22
0296 0757 CPC R21,R23
0297 F3D0 BCS 0x0292
0298 D01A RCALL pop_gset2
0299 9508 RET
(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
029A 2700 CLR R16
029B 2711 CLR R17
029C C002 RJMP 0x029F
029D 5F0F SUBI R16,0xFF
029E 4F1F SBCI R17,0xFF
029F E38A LDI R24,0x3A
02A0 E092 LDI R25,2
02A1 1708 CP R16,R24
02A2 0719 CPC R17,R25
02A3 F3C8 BCS 0x029D
02A4 9508 RET
_delay_nms:
i --> R20
n --> R22
02A5 D017 RCALL push_gset2
02A6 2F60 MOV R22,R16
02A7 2F71 MOV R23,R17
(0020) }
(0021)
(0022) void delay_nms(unsigned int n) //N ms延时函数
(0023) {
(0024) unsigned int i=0;
02A8 2744 CLR R20
02A9 2755 CLR R21
(0025) for (i=0;i<n;i++)
02AA C003 RJMP 0x02AE
(0026) {
(0027) delay_1ms();
FILE: <library>
02AB DFEE RCALL _delay_1ms
02AC 5F4F SUBI R20,0xFF
02AD 4F5F SBCI R21,0xFF
02AE 1746 CP R20,R22
02AF 0757 CPC R21,R23
02B0 F3D0 BCS 0x02AB
02B1 D001 RCALL pop_gset2
02B2 9508 RET
pop_gset2:
02B3 E0E2 LDI R30,2
02B4 C00E RJMP pop
pop_gset3:
02B5 E0E4 LDI R30,4
02B6 C00C RJMP pop
push_gset5:
02B7 92FA ST R15,-Y
02B8 92EA ST R14,-Y
push_gset4:
02B9 92DA ST R13,-Y
02BA 92CA ST R12,-Y
push_gset3:
02BB 92BA ST R11,-Y
02BC 92AA ST R10,-Y
push_gset2:
02BD 937A ST R23,-Y
02BE 936A ST R22,-Y
push_gset1:
02BF 935A ST R21,-Y
02C0 934A ST R20,-Y
02C1 9508 RET
pop_gset1:
02C2 E0E1 LDI R30,1
pop:
02C3 9149 LD R20,Y+
02C4 9159 LD R21,Y+
02C5 FDE0 SBRC R30,0
02C6 9508 RET
02C7 9169 LD R22,Y+
02C8 9179 LD R23,Y+
02C9 FDE1 SBRC R30,1
02CA 9508 RET
02CB 90A9 LD R10,Y+
02CC 90B9 LD R11,Y+
02CD FDE2 SBRC R30,2
02CE 9508 RET
02CF 90C9 LD R12,Y+
02D0 90D9 LD R13,Y+
02D1 FDE3 SBRC R30,3
02D2 9508 RET
02D3 90E9 LD R14,Y+
02D4 90F9 LD R15,Y+
02D5 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -