📄 lcd.lst
字号:
__start:
__text_start:
004A E5CF LDI R28,0x5F
004B E0D4 LDI R29,4
004C BFCD OUT 0x3D,R28
004D BFDE OUT 0x3E,R29
004E 51C0 SUBI R28,0x10
004F 40D0 SBCI R29,0
0050 EA0A LDI R16,0xAA
0051 8308 STD Y+0,R16
0052 2400 CLR R0
0053 E6EC LDI R30,0x6C
0054 E0F0 LDI R31,0
0055 E010 LDI R17,0
0056 36EC CPI R30,0x6C
0057 07F1 CPC R31,R17
0058 F011 BEQ 0x005B
0059 9201 ST R0,Z+
005A CFFB RJMP 0x0056
005B 8300 STD Z+0,R16
005C E8E7 LDI R30,0x87
005D E0F0 LDI R31,0
005E E6A0 LDI R26,0x60
005F E0B0 LDI R27,0
0060 E010 LDI R17,0
0061 39E3 CPI R30,0x93
0062 07F1 CPC R31,R17
0063 F021 BEQ 0x0068
0064 95C8 LPM
0065 9631 ADIW R30,1
0066 920D ST R0,X+
0067 CFF9 RJMP 0x0061
0068 940E0176 CALL _main
_exit:
006A CFFF RJMP _exit
FILE: E:\AVR程序\12864串口\lcd.h
(0001) #include <iom16v.h>
(0002) #include "macros.h"
(0003)
(0004) #define uchar unsigned char
(0005) #define uint unsigned int
(0006)
(0007) void write(unsigned char start, unsigned char ddata);
(0008) void sendbyte(unsigned char bbyte);
(0009) void delaynms(unsigned int di);
(0010) void lcdinit(void);
(0011) void lcdtest(void);
(0012) void lcdcls(void);
(0013)
(0014) /*-----------------------------------------------------------------------
(0015) 延时函数
(0016) 系统时钟:8M
(0017) -----------------------------------------------------------------------*/
(0018) void delay_1us(void) //1us延时函数
(0019) {
(0020) asm("nop");
_delay_1us:
006B 0000 NOP
006C 9508 RET
_delay_nus:
i --> R20
n --> R22
006D 940E01E0 CALL push_gset2
006F 01B8 MOVW R22,R16
(0021) }
(0022)
(0023) void delay_nus(unsigned int n) //N us延时函数
(0024) {
(0025) unsigned int i=0;
0070 2744 CLR R20
0071 2755 CLR R21
(0026) for (i=0;i<n;i++)
0072 C003 RJMP 0x0076
(0027) delay_1us();
0073 DFF7 RCALL _delay_1us
0074 5F4F SUBI R20,0xFF
0075 4F5F SBCI R21,0xFF
0076 1746 CP R20,R22
0077 0757 CPC R21,R23
0078 F3D0 BCS 0x0073
0079 940E01D4 CALL pop_gset2
007B 9508 RET
(0028) }
(0029)
(0030) void delay_1ms(void) //1ms延时函数
(0031) {
(0032) unsigned int i;
(0033) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
007C 2700 CLR R16
007D 2711 CLR R17
007E C002 RJMP 0x0081
007F 5F0F SUBI R16,0xFF
0080 4F1F SBCI R17,0xFF
0081 3704 CPI R16,0x74
0082 E0E4 LDI R30,4
0083 071E CPC R17,R30
0084 F3D0 BCS 0x007F
0085 9508 RET
_delay_nms:
i --> R20
n --> R22
0086 940E01E0 CALL push_gset2
0088 01B8 MOVW R22,R16
(0034) }
(0035)
(0036) void delay_nms(unsigned int n) //N ms延时函数
(0037) {
(0038) unsigned int i=0;
0089 2744 CLR R20
008A 2755 CLR R21
(0039) for (i=0;i<n;i++)
008B C003 RJMP 0x008F
(0040) delay_1ms();
008C DFEF RCALL _delay_1ms
008D 5F4F SUBI R20,0xFF
008E 4F5F SBCI R21,0xFF
008F 1746 CP R20,R22
0090 0757 CPC R21,R23
0091 F3D0 BCS 0x008C
0092 940E01D4 CALL pop_gset2
0094 9508 RET
FILE: E:\AVR程序\12864串口\lcd.c
(0001) #include "lcd.h"
(0002)
(0003) #define CS BIT(5)
(0004) #define SID BIT(6)
(0005) #define SCLK BIT(7)
(0006)
(0007) #define LCD_ON PORTD &=~ BIT(7)
(0008) #define LCD_OFF PORTD &=~ BIT(7)
(0009)
(0010)
(0011) #define EN_CS PORTA |= CS
(0012) #define DIS_CS PORTA &=~ CS
(0013)
(0014) #define ST_SID PORTA |= SID
(0015) #define CLS_SID PORTA &=~ SID
(0016)
(0017) #define ST_SCLK PORTA |= SCLK
(0018) #define CLS_SCLK PORTA &=~ SCLK
(0019)
(0020)
(0021) unsigned char ma[] ={"汉字显示LCD"};
(0022) unsigned char flash ma2[]={"自带字库图文混排"};
(0023) unsigned char flash ma3[]={"控制IC:ST7920 "};
(0024) unsigned char flash ma4[]={"功能强大使用方便"};
(0025)
(0026) void portini(void)
(0027) {
(0028) DDRD=0xff;
_portini:
0095 EF8F LDI R24,0xFF
0096 BB81 OUT 0x11,R24
(0029) PORTD = 0xff;
0097 BB82 OUT 0x12,R24
(0030) DDRB = 0xff;
0098 BB87 OUT 0x17,R24
(0031) PORTB = 0xff;
0099 BB88 OUT 0x18,R24
009A 9508 RET
_delaynms:
da --> R20
db --> R22
di --> R16
009B 940E01E0 CALL push_gset2
(0032) }
(0033)
(0034) void delaynms(uint di) //延时
(0035) {
(0036) uint da,db;
(0037) for(da=0;da<di;da++)
009D 2744 CLR R20
009E 2755 CLR R21
009F C00B RJMP 0x00AB
(0038) for(db=0;db<1000;db++);
00A0 2766 CLR R22
00A1 2777 CLR R23
00A2 C002 RJMP 0x00A5
00A3 5F6F SUBI R22,0xFF
00A4 4F7F SBCI R23,0xFF
00A5 3E68 CPI R22,0xE8
00A6 E0E3 LDI R30,3
00A7 077E CPC R23,R30
00A8 F3D0 BCS 0x00A3
00A9 5F4F SUBI R20,0xFF
00AA 4F5F SBCI R21,0xFF
00AB 1740 CP R20,R16
00AC 0751 CPC R21,R17
00AD F390 BCS 0x00A0
00AE 940E01D4 CALL pop_gset2
00B0 9508 RET
(0039) }
(0040)
(0041)
(0042) void lcdinit(void)//初始化LCD
(0043) {
(0044) delaynms(10);
_lcdinit:
00B1 E00A LDI R16,0xA
00B2 E010 LDI R17,0
00B3 DFE7 RCALL _delaynms
(0045) EN_CS;
00B4 9ADD SBI 0x1B,5
(0046) write(0,0x30); //8位界面,基本指令集
00B5 E320 LDI R18,0x30
00B6 2700 CLR R16
00B7 D019 RCALL _write
(0047) delaynms(10);
00B8 E00A LDI R16,0xA
00B9 E010 LDI R17,0
00BA DFE0 RCALL _delaynms
(0048) write(0,0x30); //显示打开,光标关,反白关
00BB E320 LDI R18,0x30
00BC 2700 CLR R16
00BD D013 RCALL _write
(0049) delaynms(10);
00BE E00A LDI R16,0xA
00BF E010 LDI R17,0
00C0 DFDA RCALL _delaynms
(0050) write(0,0x0c); //显示打开,光标关,反白关
00C1 E02C LDI R18,0xC
00C2 2700 CLR R16
00C3 D00D RCALL _write
(0051) delaynms(10);
00C4 E00A LDI R16,0xA
00C5 E010 LDI R17,0
00C6 DFD4 RCALL _delaynms
(0052) write(0,0x01); //清屏
00C7 E021 LDI R18,1
00C8 2700 CLR R16
00C9 D007 RCALL _write
(0053) delaynms(10);
00CA E00A LDI R16,0xA
00CB E010 LDI R17,0
00CC DFCE RCALL _delaynms
(0054) write(0,0x60);
00CD E620 LDI R18,0x60
00CE 2700 CLR R16
00CF D001 RCALL _write
00D0 9508 RET
_write:
Ldata --> R20
Hdata --> R22
start_data --> R10
ddata --> R20
start --> R22
00D1 940E01DE CALL push_gset3
00D3 2F42 MOV R20,R18
00D4 2F60 MOV R22,R16
(0055) }
(0056)
(0057) void write(uchar start,uchar ddata) //写指令或数据
(0058) {
(0059) uchar start_data,Hdata,Ldata;
(0060) if(start==0)
00D5 2366 TST R22
00D6 F419 BNE 0x00DA
(0061) start_data = 0xf8; //写指令
00D7 EF88 LDI R24,0xF8
00D8 2EA8 MOV R10,R24
00D9 C002 RJMP 0x00DC
(0062) else
(0063) start_data = 0xfa; //写数据
00DA EF8A LDI R24,0xFA
00DB 2EA8 MOV R10,R24
(0064) Hdata = ddata&0xf0; //取高4位
00DC 2F64 MOV R22,R20
00DD 7F60 ANDI R22,0xF0
(0065) Ldata = (ddata<<4)&0xf0; //取低4位
00DE 2F84 MOV R24,R20
00DF 708F ANDI R24,0xF
00E0 9582 SWAP R24
00E1 7F80 ANDI R24,0xF0
00E2 2F48 MOV R20,R24
(0066) sendbyte(start_data); //发送起始信号
00E3 2D0A MOV R16,R10
00E4 D010 RCALL _sendbyte
(0067) delaynms(100);
00E5 E604 LDI R16,0x64
00E6 E010 LDI R17,0
00E7 DFB3 RCALL _delaynms
(0068) sendbyte(Hdata); //发送高四位
00E8 2F06 MOV R16,R22
00E9 D00B RCALL _sendbyte
(0069) delaynms(50);
00EA E302 LDI R16,0x32
00EB E010 LDI R17,0
00EC DFAE RCALL _delaynms
(0070) sendbyte(Ldata); //发送低四位
00ED 2F04 MOV R16,R20
00EE D006 RCALL _sendbyte
(0071) delaynms(50);
00EF E302 LDI R16,0x32
00F0 E010 LDI R17,0
00F1 DFA9 RCALL _delaynms
00F2 940E01D7 CALL pop_gset3
00F4 9508 RET
_sendbyte:
i --> R20
bbyte --> R22
00F5 940E01E0 CALL push_gset2
00F7 2F60 MOV R22,R16
(0072) }
(0073)
(0074) void sendbyte(uchar bbyte) //发送一个字节
(0075) {
(0076) unsigned char i;
(0077) for(i=0;i<8;i++)
00F8 2744 CLR R20
00F9 C011 RJMP 0x010B
(0078) {
(0079)
(0080) if((bbyte&0x80)==1) //取出最高位
00FA 2F86 MOV R24,R22
00FB 7880 ANDI R24,0x80
00FC 3081 CPI R24,1
00FD F411 BNE 0x0100
(0081) {ST_SID;}
00FE 9ADE SBI 0x1B,6
00FF C001 RJMP 0x0101
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -