?? lcd1602.lst
字號:
__text_start:
__start:
0039 E5CF LDI R28,0x5F
003A E0D4 LDI R29,4
003B BFCD OUT 0x3D,R28
003C BFDE OUT 0x3E,R29
003D 51C0 SUBI R28,0x10
003E 40D0 SBCI R29,0
003F EA0A LDI R16,0xAA
0040 8308 STD Y+0,R16
0041 2400 CLR R0
0042 E7ED LDI R30,0x7D
0043 E0F0 LDI R31,0
0044 E010 LDI R17,0
0045 37ED CPI R30,0x7D
0046 07F1 CPC R31,R17
0047 F011 BEQ 0x004A
0048 9201 ST R0,Z+
0049 CFFB RJMP 0x0045
004A 8300 STD Z+0,R16
004B E5E4 LDI R30,0x54
004C E0F0 LDI R31,0
004D E6A0 LDI R26,0x60
004E E0B0 LDI R27,0
004F E010 LDI R17,0
0050 37E1 CPI R30,0x71
0051 07F1 CPC R31,R17
0052 F021 BEQ 0x0057
0053 95C8 LPM
0054 9631 ADIW R30,1
0055 920D ST R0,X+
0056 CFF9 RJMP 0x0050
0057 940E00B6 CALL _main
_exit:
0059 CFFF RJMP _exit
FILE: C:\bak\YM200\lcd1602\lcd.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define LCD_RS (1 << 4)
(0004) #define LCD_RW (1 << 5)
(0005) #define LCD_E (1 << 7)
(0006) #define set_e() (PORTD |= LCD_E)
(0007) #define set_rs() (PORTD |= LCD_RS)
(0008) #define set_rw() (PORTD |= LCD_RW)
(0009) #define clr_e() (PORTD &= ~LCD_E)
(0010) #define clr_rs() (PORTD &= ~LCD_RS)
(0011) #define clr_rw() (PORTD &= ~LCD_RW)
(0012)
(0013) /*-----------------------------------------------------------
(0014) delay :短延時函數
(0015) 輸入參數 x :粗略延時,x越大,延時越長
(0016) 輸出參數 :無
(0017) ------------------------------------------------------------*/
(0018) void delay(unsigned int dk)
(0019) {
(0020) while(dk--);
_delay:
dk --> R16
005A 0118 MOVW R2,R16
005B 5001 SUBI R16,1
005C 4010 SBCI R17,0
005D 2022 TST R2
005E F7D9 BNE 0x005A
005F 2033 TST R3
0060 F7C9 BNE 0x005A
0061 9508 RET
(0021) }
(0022)
(0023) /*------------------------------------------------------------
(0024) lcdwait :液晶延時函數
(0025) 輸入參數 :無
(0026) 輸出參數 :無
(0027) --------------------------------------------------------------*/
(0028) void lcdwait(void)
(0029) {
(0030) delay(600);
_lcdwait:
0062 E508 LDI R16,0x58
0063 E012 LDI R17,2
0064 DFF5 RCALL _delay
0065 9508 RET
(0031) }
(0032) /*-----------------------------------------------------------
(0033) lcdpulse :脈沖函數,把數據寫入1602液晶
(0034) 輸入參數 :無
(0035) 輸出參數 :無
(0036) ---------------------------------------------------------------*/
(0037) void lcdpulse(void)
(0038) {
(0039) set_e();
_lcdpulse:
0066 9A97 SBI 0x12,7
(0040) clr_e();
0067 9897 CBI 0x12,7
0068 9508 RET
_lcdsend:
data --> R20
0069 940E0101 CALL push_gset1
006B 2F40 MOV R20,R16
(0041) }
(0042)
(0043) /*----------------------------------------------------------------
(0044) lcdsend :發送一字節數據函數
(0045) 輸入參數 data :要發送字節數據
(0046) 輸出參數 :無
(0047) ------------------------------------------------------------------*/
(0048) void lcdsend(unsigned char data)
(0049) {
(0050) lcdwait();
006C DFF5 RCALL _lcdwait
(0051) PORTB=data;
006D BB48 OUT 0x18,R20
(0052) lcdpulse();
006E DFF7 RCALL _lcdpulse
006F 940E0104 CALL pop_gset1
0071 9508 RET
_wcom:
com --> R20
0072 940E0101 CALL push_gset1
0074 2F40 MOV R20,R16
(0053) }
(0054) /*------------------------------------------------------------------
(0055) wcom :寫一字節控制字函數
(0056) 輸入參數 com :要寫入控制字
(0057) 輸出參數 :無
(0058) -----------------------------------------------------------------*/
(0059) void wcom(unsigned char com)
(0060) {
(0061) clr_rs();
0075 9894 CBI 0x12,4
(0062) clr_rw();
0076 9895 CBI 0x12,5
(0063) lcdsend(com);
0077 2F04 MOV R16,R20
0078 DFF0 RCALL _lcdsend
(0064) lcdwait();
0079 DFE8 RCALL _lcdwait
007A 940E0104 CALL pop_gset1
007C 9508 RET
_wdat:
dat --> R20
007D 940E0101 CALL push_gset1
007F 2F40 MOV R20,R16
(0065) }
(0066)
(0067) /*--------------------------------------------------------------
(0068) wdat :顯示一字節函數
(0069) 輸入參數 com :要顯示字符ASCⅡ碼
(0070) 輸出參數 :無
(0071) ----------------------------------------------------------------*/
(0072) void wdat(unsigned char dat)
(0073) {
(0074) set_rs();
0080 9A94 SBI 0x12,4
(0075) clr_rw();
0081 9895 CBI 0x12,5
(0076) lcdsend(dat);
0082 2F04 MOV R16,R20
0083 DFE5 RCALL _lcdsend
(0077) lcdwait();
0084 DFDD RCALL _lcdwait
0085 940E0104 CALL pop_gset1
0087 9508 RET
(0078) }
(0079) /*------------------------------------------------------------------
(0080) LCM1602Reset :LCM1602復位
(0081) 輸入參數 :無
(0082) 輸出參數 :無
(0083) ------------------------------------------------------------------*/
(0084) void LCM1602Reset(void)
(0085) {
(0086) delay(65000);
_LCM1602Reset:
0088 EE08 LDI R16,0xE8
0089 EF1D LDI R17,0xFD
008A DFCF RCALL _delay
(0087) wcom(0x38);
008B E308 LDI R16,0x38
008C DFE5 RCALL _wcom
(0088) delay(5000);
008D E808 LDI R16,0x88
008E E113 LDI R17,0x13
008F DFCA RCALL _delay
(0089) wcom(0x38);
0090 E308 LDI R16,0x38
0091 DFE0 RCALL _wcom
(0090) delay(5000);
0092 E808 LDI R16,0x88
0093 E113 LDI R17,0x13
0094 DFC5 RCALL _delay
(0091) wcom(0x38);
0095 E308 LDI R16,0x38
0096 DFDB RCALL _wcom
(0092) delay(5000);
0097 E808 LDI R16,0x88
0098 E113 LDI R17,0x13
0099 DFC0 RCALL _delay
(0093) wcom(0x38);
009A E308 LDI R16,0x38
009B DFD6 RCALL _wcom
009C 9508 RET
(0094) }
(0095)
(0096) /*------------------------------------------------------------------
(0097) lcdinit :LCM1602初始化
(0098) 輸入參數 :無
(0099) 輸出參數 :無
(0100) -------------------------------------------------------------------*/
(0101) void lcdinit(void)
(0102) {
(0103) wcom(0x01); //清屏
_lcdinit:
009D E001 LDI R16,1
009E DFD3 RCALL _wcom
(0104) wcom(0x3c); //顯示開關控制:8bit,2行顯示,5x7
009F E30C LDI R16,0x3C
00A0 DFD1 RCALL _wcom
(0105) wcom(0x0c); //光標開,閃爍關
00A1 E00C LDI R16,0xC
00A2 DFCF RCALL _wcom
(0106) wcom(0x06); //輸入方式,增量方式,不移動
00A3 E006 LDI R16,6
00A4 DFCD RCALL _wcom
00A5 9508 RET
_disp_string:
data --> R20
00A6 940E0101 CALL push_gset1
00A8 01A8 MOVW R20,R16
(0107) }
(0108)
(0109) /*-----------------------------------------------------------------
(0110) disp_string :顯示一字符串函數
(0111) 輸入參數 data :字符串指針
(0112) 輸出參數 :無
(0113) ------------------------------------------------------------------*/
(0114) void disp_string( unsigned char *data )
(0115) {
00A9 C005 RJMP 0x00AF
(0116) while(*data!=0) {wdat(*data);data++;}
00AA 01FA MOVW R30,R20
00AB 8100 LDD R16,Z+0
00AC DFD0 RCALL _wdat
00AD 5F4F SUBI R20,0xFF
00AE 4F5F SBCI R21,0xFF
00AF 01FA MOVW R30,R20
00B0 8020 LDD R2,Z+0
00B1 2022 TST R2
00B2 F7B9 BNE 0x00AA
00B3 940E0104 CALL pop_gset1
00B5 9508 RET
(0117) }
(0118)
(0119) //設置顯示坐標:X 0~39,Y:0~1
(0120) #define setxy(x,y) wcom(((x)|((y)<<6))|0x80)
(0121)
(0122) /*--------------------------------------------------------------
(0123) main :主函數
(0124) 輸入參數 :無
(0125) 輸出參數 :無
(0126) --------------------------------------------------------------*/
(0127) void main()
(0128) {
(0129) DDRD=0xff;
_main:
00B6 EF8F LDI R24,0xFF
00B7 BB81 OUT 0x11,R24
(0130) DDRB=0xff;
00B8 BB87 OUT 0x17,R24
(0131) LCM1602Reset();
00B9 DFCE RCALL _LCM1602Reset
(0132) lcdinit();
00BA DFE2 RCALL _lcdinit
(0133) setxy(0,0);
00BB E800 LDI R16,0x80
00BC DFB5 RCALL _wcom
(0134) disp_string("Easy Learning..");
00BD E60D LDI R16,0x6D
00BE E010 LDI R17,0
00BF DFE6 RCALL _disp_string
(0135) setxy(2,1);
00C0 EC02 LDI R16,0xC2
00C1 DFB0 RCALL _wcom
(0136) disp_string("Avr Studio! ");
00C2 E600 LDI R16,0x60
00C3 E010 LDI R17,0
00C4 DFE1 RCALL _disp_string
00C5 C031 RJMP 0x00F7
(0137)
(0138) while(1)
(0139) {
(0140) wcom(0x08); //顯示關
00C6 E008 LDI R16,0x8
00C7 DFAA RCALL _wcom
(0141) delay(65000);
00C8 EE08 LDI R16,0xE8
00C9 EF1D LDI R17,0xFD
00CA DF8F RCALL _delay
(0142) delay(65000);
00CB EE08 LDI R16,0xE8
00CC EF1D LDI R17,0xFD
00CD DF8C RCALL _delay
(0143) delay(65000);
00CE EE08 LDI R16,0xE8
00CF EF1D LDI R17,0xFD
00D0 DF89 RCALL _delay
(0144) delay(65000);
00D1 EE08 LDI R16,0xE8
00D2 EF1D LDI R17,0xFD
00D3 DF86 RCALL _delay
(0145) delay(65000);
00D4 EE08 LDI R16,0xE8
00D5 EF1D LDI R17,0xFD
00D6 DF83 RCALL _delay
(0146) delay(65000);
00D7 EE08 LDI R16,0xE8
00D8 EF1D LDI R17,0xFD
00D9 DF80 RCALL _delay
(0147) delay(65000);
00DA EE08 LDI R16,0xE8
00DB EF1D LDI R17,0xFD
00DC DF7D RCALL _delay
(0148) delay(65000);
00DD EE08 LDI R16,0xE8
00DE EF1D LDI R17,0xFD
00DF DF7A RCALL _delay
(0149)
(0150) wcom(0x0c); //顯示開
00E0 E00C LDI R16,0xC
00E1 DF90 RCALL _wcom
(0151) delay(65000);
00E2 EE08 LDI R16,0xE8
00E3 EF1D LDI R17,0xFD
00E4 DF75 RCALL _delay
(0152) delay(65000);
00E5 EE08 LDI R16,0xE8
00E6 EF1D LDI R17,0xFD
00E7 DF72 RCALL _delay
(0153) delay(65000);
00E8 EE08 LDI R16,0xE8
00E9 EF1D LDI R17,0xFD
00EA DF6F RCALL _delay
(0154) delay(65000);
00EB EE08 LDI R16,0xE8
00EC EF1D LDI R17,0xFD
00ED DF6C RCALL _delay
(0155) delay(65000);
00EE EE08 LDI R16,0xE8
00EF EF1D LDI R17,0xFD
00F0 DF69 RCALL _delay
(0156) delay(65000);
00F1 EE08 LDI R16,0xE8
00F2 EF1D LDI R17,0xFD
00F3 DF66 RCALL _delay
(0157) delay(65000);
FILE: <library>
00F4 EE08 LDI R16,0xE8
00F5 EF1D LDI R17,0xFD
00F6 DF63 RCALL _delay
00F7 CFCE RJMP 0x00C6
00F8 9508 RET
push_gset5:
00F9 92FA ST R15,-Y
00FA 92EA ST R14,-Y
push_gset4:
00FB 92DA ST R13,-Y
00FC 92CA ST R12,-Y
push_gset3:
00FD 92BA ST R11,-Y
00FE 92AA ST R10,-Y
push_gset2:
00FF 937A ST R23,-Y
0100 936A ST R22,-Y
push_gset1:
0101 935A ST R21,-Y
0102 934A ST R20,-Y
0103 9508 RET
pop_gset1:
0104 E0E1 LDI R30,1
pop:
0105 9149 LD R20,Y+
0106 9159 LD R21,Y+
0107 FDE0 SBRC R30,0
0108 9508 RET
0109 9169 LD R22,Y+
010A 9179 LD R23,Y+
010B FDE1 SBRC R30,1
010C 9508 RET
010D 90A9 LD R10,Y+
010E 90B9 LD R11,Y+
010F FDE2 SBRC R30,2
0110 9508 RET
0111 90C9 LD R12,Y+
0112 90D9 LD R13,Y+
0113 FDE3 SBRC R30,3
0114 9508 RET
0115 90E9 LD R14,Y+
0116 90F9 LD R15,Y+
0117 9508 RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -