📄 12864.lst
字号:
__start:
__text_start:
00C2 E5CF LDI R28,0x5F
00C3 E0D4 LDI R29,4
00C4 BFCD OUT 0x3D,R28
00C5 BFDE OUT 0x3E,R29
00C6 51C0 SUBI R28,0x10
00C7 40D0 SBCI R29,0
00C8 EA0A LDI R16,0xAA
00C9 8308 STD Y+0,R16
00CA 2400 CLR R0
00CB E6E0 LDI R30,0x60
00CC E0F0 LDI R31,0
00CD E010 LDI R17,0
00CE 36E0 CPI R30,0x60
00CF 07F1 CPC R31,R17
00D0 F011 BEQ 0x00D3
00D1 9201 ST R0,Z+
00D2 CFFB RJMP 0x00CE
00D3 8300 STD Z+0,R16
00D4 E8E4 LDI R30,0x84
00D5 E0F1 LDI R31,1
00D6 E6A0 LDI R26,0x60
00D7 E0B0 LDI R27,0
00D8 E011 LDI R17,1
00D9 38E4 CPI R30,0x84
00DA 07F1 CPC R31,R17
00DB F021 BEQ 0x00E0
00DC 95C8 LPM
00DD 9631 ADIW R30,1
00DE 920D ST R0,X+
00DF CFF9 RJMP 0x00D9
00E0 940E0198 CALL _main
_exit:
00E2 CFFF RJMP _exit
_delay:
i --> R20
j --> R22
t --> R16
00E3 940E01E8 CALL push_gset2
FILE: D:\mega16学习板资料\例程\m16\12864\12864.H
(0001) #include "font.h"
(0002)
(0003) #define LCD_DI (1 <<6) // PA6----DI
(0004) #define LCD_RW (1 <<5) // PA5----RW
(0005) #define LCD_E (1 <<4) // PA4----E
(0006) #define LCD_PSB (1 << 3) // PA3----CS1
(0007) #define LCD_RST (1 << 1) // PA1----RST
(0008)
(0009) #define LCD_PORT PORTA //PA口连接到了5个控制脚,具体定义如上
(0010) #define LCD_SET_PSB() (LCD_PORT |= LCD_PSB) // 位置位,输出1
(0011) #define LCD_SET_RST() (LCD_PORT |= LCD_RST)
(0012) #define LCD_SET_DI() (LCD_PORT |= LCD_DI)
(0013) #define LCD_SET_RW() (LCD_PORT |= LCD_RW)
(0014) #define LCD_SET_E() (LCD_PORT |= LCD_E)
(0015)
(0016) #define LCD_CLEAR_PSB() (LCD_PORT &= ~LCD_PSB) // 位清零,输出0
(0017) #define LCD_CLEAR_RST() (LCD_PORT &= ~LCD_RST)
(0018) #define LCD_CLEAR_DI() (LCD_PORT &= ~LCD_DI)
(0019) #define LCD_CLEAR_RW() (LCD_PORT &= ~LCD_RW)
(0020) #define LCD_CLEAR_E() (LCD_PORT &= ~LCD_E)
(0021) #define LCD_DATA_OUT PORTB //LCD数据输出口
(0022) #define LCD_DATA_IN PINB //LCD数据输出口
(0023) #define LCD_DDR DDRB //LCD数据口方向
(0024) /* Define the register command code */
(0025) #define Disp_On 0x3f
(0026) #define Disp_Off 0x30
(0027) #define Col_Add 0x40
(0028) #define Page_Add 0xb8
(0029) #define Start_Line 0xc0
(0030)
(0031)
(0032) void delay(unsigned int t);
(0033) void write_com(unsigned char cmdcode);
(0034) void write_data(unsigned char Dispdata);
(0035) void init_lcd(void);
(0036) unsigned char read_data(void);
(0037) void DisplayWord(unsigned int Add,unsigned char xAdd,unsigned char yAdd,
(0038) unsigned char SelscP,unsigned char num,unsigned char flag);
(0039) void DisplayLine(unsigned int Add,unsigned char com,unsigned char line,unsigned char flag);
(0040) void ClearDisplay(void);
(0041) void Test(unsigned int lcd_data);
(0042) void Testlcd2(unsigned char lcd_datah,unsigned char lcd_datal);
(0043) /*------------------延时子程序-----------------------------*/
(0044) void delay(unsigned int t)
(0045) {
(0046) unsigned int i,j;
(0047) for(i=0;i<t;i++)
00E5 2744 CLR R20
00E6 2755 CLR R21
00E7 C00B RJMP 0x00F3
(0048) for(j=0;j<10;j++)
00E8 2766 CLR R22
00E9 2777 CLR R23
00EA C002 RJMP 0x00ED
00EB 5F6F SUBI R22,0xFF
00EC 4F7F SBCI R23,0xFF
00ED 306A CPI R22,0xA
00EE E0E0 LDI R30,0
00EF 077E CPC R23,R30
00F0 F3D0 BCS 0x00EB
00F1 5F4F SUBI R20,0xFF
00F2 4F5F SBCI R21,0xFF
00F3 1740 CP R20,R16
00F4 0751 CPC R21,R17
00F5 F390 BCS 0x00E8
(0049) ;
(0050) }
00F6 940E01CE CALL pop_gset2
00F8 9508 RET
_write_com:
cmdcode --> R20
00F9 940E01D1 CALL push_gset1
00FB 2F40 MOV R20,R16
(0051)
(0052) /*------------------写命令到LCD------------------------------*/
(0053) void write_com(unsigned char cmdcode)
(0054) {
(0055)
(0056) LCD_CLEAR_DI();
00FC 98DE CBI 0x1B,6
(0057) LCD_CLEAR_RW();
00FD 98DD CBI 0x1B,5
(0058) LCD_DDR=0xff;
00FE EF8F LDI R24,0xFF
00FF BB87 OUT 0x17,R24
(0059)
(0060) LCD_DATA_OUT=cmdcode;
0100 BB48 OUT 0x18,R20
(0061) LCD_SET_E();
0101 9ADC SBI 0x1B,4
(0062) delay(100);
0102 E604 LDI R16,0x64
0103 E010 LDI R17,0
0104 DFDE RCALL _delay
(0063) LCD_CLEAR_E();
0105 98DC CBI 0x1B,4
(0064) }
0106 940E01D4 CALL pop_gset1
0108 9508 RET
_write_data:
Dispdata --> R20
0109 940E01D1 CALL push_gset1
010B 2F40 MOV R20,R16
(0065)
(0066) /*-------------------写数据到LCD----------------------------*/
(0067)
(0068) void write_data(unsigned char Dispdata)
(0069) {
(0070)
(0071) LCD_SET_DI();
010C 9ADE SBI 0x1B,6
(0072) LCD_CLEAR_RW();
010D 98DD CBI 0x1B,5
(0073) LCD_DDR=0xff;
010E EF8F LDI R24,0xFF
010F BB87 OUT 0x17,R24
(0074)
(0075) LCD_DATA_OUT=Dispdata;
0110 BB48 OUT 0x18,R20
(0076) LCD_SET_E();
0111 9ADC SBI 0x1B,4
(0077) delay(100);
0112 E604 LDI R16,0x64
0113 E010 LDI R17,0
0114 DFCE RCALL _delay
(0078) LCD_CLEAR_E();
0115 98DC CBI 0x1B,4
(0079) }
0116 940E01D4 CALL pop_gset1
0118 9508 RET
_read_data:
tmpin --> R20
0119 940E01D1 CALL push_gset1
(0080)
(0081) /*-------------------读LCD数据----------------------------*/
(0082)
(0083) unsigned char read_data(void)
(0084) {
(0085) unsigned char tmpin;
(0086) LCD_DDR=0x0;
011B 2422 CLR R2
011C BA27 OUT 0x17,R2
(0087) LCD_SET_DI();
011D 9ADE SBI 0x1B,6
(0088) LCD_SET_RW();
011E 9ADD SBI 0x1B,5
(0089) delay(0);
011F 2700 CLR R16
0120 2711 CLR R17
0121 DFC1 RCALL _delay
(0090) LCD_SET_E();
0122 9ADC SBI 0x1B,4
(0091) delay(0);
0123 2700 CLR R16
0124 2711 CLR R17
0125 DFBD RCALL _delay
(0092) LCD_CLEAR_E();
0126 98DC CBI 0x1B,4
(0093)
(0094) tmpin=LCD_DATA_IN;
0127 B346 IN R20,0x16
(0095)
(0096) return tmpin;
0128 2F04 MOV R16,R20
0129 940E01D4 CALL pop_gset1
012B 9508 RET
(0097) }
(0098) /*------------------初始化LCD屏--------------------------*/
(0099) void init_lcd(void)
(0100) {
(0101) LCD_SET_PSB();
_init_lcd:
012C 9ADB SBI 0x1B,3
(0102) delay(100);
012D E604 LDI R16,0x64
012E E010 LDI R17,0
012F DFB3 RCALL _delay
(0103) LCD_SET_RST();
0130 9AD9 SBI 0x1B,1
(0104) delay(100);
0131 E604 LDI R16,0x64
0132 E010 LDI R17,0
0133 DFAF RCALL _delay
(0105)
(0106) write_com(0X30);
0134 E300 LDI R16,0x30
0135 DFC3 RCALL _write_com
(0107) delay(100);
0136 E604 LDI R16,0x64
0137 E010 LDI R17,0
0138 DFAA RCALL _delay
(0108) write_com(0X30);
0139 E300 LDI R16,0x30
013A DFBE RCALL _write_com
(0109) delay(100);
013B E604 LDI R16,0x64
013C E010 LDI R17,0
013D DFA5 RCALL _delay
(0110) write_com(0x0C);
013E E00C LDI R16,0xC
013F DFB9 RCALL _write_com
(0111) delay(100);
0140 E604 LDI R16,0x64
0141 E010 LDI R17,0
0142 DFA0 RCALL _delay
(0112) write_com(0X01);
0143 E001 LDI R16,1
0144 DFB4 RCALL _write_com
(0113) delay(100);
0145 E604 LDI R16,0x64
0146 E010 LDI R17,0
0147 DF9B RCALL _delay
(0114) write_com(0X06);
0148 E006 LDI R16,6
0149 DFAF RCALL _write_com
(0115) delay(100);
014A E604 LDI R16,0x64
014B E010 LDI R17,0
(0116) }
014C CF96 RJMP _delay
_ClearDisplay:
i --> R20
j --> R22
014D 940E01E8 CALL push_gset2
(0117)
(0118) /*void DisplayWord(unsigned int Add,unsigned char xAdd,unsigned char yAdd,
(0119) unsigned char SelscP,unsigned char num,unsigned char flag)//Add:显示数据的起始地址
(0120) { unsigned char i,m=0,dat; //xAdd,yAdd:显示位置
(0121) switch (SelscP)
(0122) {case 0:LCD_SET_CS1();
(0123) LCD_SET_CS2();
(0124) break;
(0125) case 1:LCD_SET_CS1();
(0126) LCD_CLEAR_CS2();
(0127) break;
(0128) case 2:LCD_CLEAR_CS1();
(0129) LCD_SET_CS2();
(0130) break;
(0131) } //SelscP:选择屏1,2,3
(0132) write_com(xAdd++); //x首地址 //mun显示宽度,一般为16
(0133) write_com(yAdd); //y首地址 //flag:是否清字位1不清
(0134) while(m<num+2)
(0135) { for(i=0;i<num;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -