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

📄 key_lcd.lst

📁 键盘扫描及其LCD显示输出,有源程序与仿真文件,都测试通过.
💻 LST
📖 第 1 页 / 共 3 页
字号:
(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 + -