lcd12864.lst
来自「atmega128串行操作lcd12864」· LST 代码 · 共 771 行 · 第 1/2 页
LST
771 行
Interrupt Vectors
00000 940C 004A JMP __start|__text_start
Program Code (text area)
__start|__text_start:
0004A EFCF LDI R28,0xFF
0004B E1D0 LDI R29,0x10
0004C BFCD OUT 0x3D,R28
0004D BFDE OUT 0x3E,R29
0004E 51CE SUBI R28,0x1E
0004F 40D0 SBCI R29,0
00050 EA0A LDI R16,0xAA
00051 8308 ST Y,R16
00052 2400 CLR R0
00053 E0E7 LDI R30,7
00054 E0F1 LDI R31,1
00055 E011 LDI R17,1
00056 30E7 CPI R30,7
00057 07F1 CPC R31,R17
00058 F011 BEQ 0x005B
00059 9201 ST Z+,R0
0005A CFFB RJMP 0x0056
0005B 8300 ST Z,R16
0005C E8EC LDI R30,0x8C
0005D E0F0 LDI R31,0
0005E E0A0 LDI R26,0
0005F E0B1 LDI R27,1
00060 E010 LDI R17,0
00061 E000 LDI R16,0
00062 BF0B OUT 0x3B,R16
00063 39E3 CPI R30,0x93
00064 07F1 CPC R31,R17
00065 F021 BEQ 0x006A
00066 95C8 LPM
00067 9631 ADIW R30,1
00068 920D ST X+,R0
00069 CFF9 RJMP 0x0063
0006A 940E 006D CALL _main
_exit:
0006C CFFF RJMP _exit
_main:
0006D 9722 SBIW R28,2
FILE: E:\课件\128最小系统板\AVR程序\lcd12864\main.c
(0001) #include<iom128v.h>
(0002) #include<macros.h>
(0003) #include <string.h>
(0004) #include <ctype.h>
(0005) #include"12864.h"
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) //接口说明,SCLK--PE5;SID--PE4;CS--PE3
(0009) void main()
(0010) {
(0011) DDRA=0xFF;
0006E EF8F LDI R24,0xFF
0006F BB8A OUT 0x1A,R24
(0012) PORTA=0XFE;
00070 EF8E LDI R24,0xFE
00071 BB8B OUT 0x1B,R24
(0013) LCD_init();
00072 940E 00BC CALL _LCD_init
(0014) Lcd_puts_any(0,0,"坏小孩");
00074 E080 LDI R24,0
00075 E091 LDI R25,1
00076 8399 STD Y+1,R25
00077 8388 ST Y,R24
00078 2722 CLR R18
00079 2700 CLR R16
0007A 940E 01CD CALL _Lcd_puts_any
0007C C012 RJMP 0x008F
(0015) while(1)
(0016) {
(0017) PORTA=0XFD;
0007D EF8D LDI R24,0xFD
0007E BB8B OUT 0x1B,R24
(0018) delay_ms(40);
0007F E208 LDI R16,0x28
00080 E010 LDI R17,0
00081 940E 0092 CALL _delay_ms
(0019) PORTA=0XFB;
00083 EF8B LDI R24,0xFB
00084 BB8B OUT 0x1B,R24
(0020) delay_ms(40);
00085 E208 LDI R16,0x28
00086 E010 LDI R17,0
00087 940E 0092 CALL _delay_ms
(0021) PORTA=0XF7;
00089 EF87 LDI R24,0xF7
0008A BB8B OUT 0x1B,R24
(0022) delay_ms(40);
0008B E208 LDI R16,0x28
0008C E010 LDI R17,0
0008D 940E 0092 CALL _delay_ms
0008F CFED RJMP 0x007D
00090 9622 ADIW R28,2
00091 9508 RET
_delay_ms:
j --> R20
i --> R22
x --> R16
00092 940E 0225 CALL push_xgsetF000
FILE: E:\课件\128最小系统板\AVR程序\lcd12864\12864.c
(0001) /*****************************************
(0002) *文件名:lcd12864.c
(0003) *功能:LCD12864串行方式AVR驱动程序
(0004) *日期:2010年7月10日
(0005) ****************************************/
(0006) #include "12864.h" //包含头文件
(0007)
(0008) /*****************************************
(0009) *函数名:delay_12864
(0010) *功能:利用寄存器操作实现延时效果
(0011) *参数:延时变量x
(0012) *返回值:无
(0013) ****************************************/
(0014)
(0015) void delay_ms(uint x)
(0016) {
(0017) uint i,j;
(0018) for(j=0;j<x;j++)
00094 2744 CLR R20
00095 2755 CLR R21
00096 C00B RJMP 0x00A2
(0019) for(i=0;i<1141;i++);
00097 2766 CLR R22
00098 2777 CLR R23
00099 C002 RJMP 0x009C
0009A 5F6F SUBI R22,0xFF
0009B 4F7F SBCI R23,0xFF
0009C 3765 CPI R22,0x75
0009D E0E4 LDI R30,4
0009E 077E CPC R23,R30
0009F F3D0 BCS 0x009A
000A0 5F4F SUBI R20,0xFF
000A1 4F5F SBCI R21,0xFF
000A2 1740 CP R20,R16
000A3 0751 CPC R21,R17
000A4 F390 BCS 0x0097
000A5 940C 022A JMP pop_xgsetF000
_delay_us:
j --> R20
i --> R22
x --> R16
000A7 940E 0225 CALL push_xgsetF000
(0020) }
(0021)
(0022) void delay_us(uint x)
(0023) {
(0024) uint i,j;
(0025) for(j=0;j<x;j++)
000A9 2744 CLR R20
000AA 2755 CLR R21
000AB C00B RJMP 0x00B7
(0026) for(i=0;i<40;i++);
000AC 2766 CLR R22
000AD 2777 CLR R23
000AE C002 RJMP 0x00B1
000AF 5F6F SUBI R22,0xFF
000B0 4F7F SBCI R23,0xFF
000B1 3268 CPI R22,0x28
000B2 E0E0 LDI R30,0
000B3 077E CPC R23,R30
000B4 F3D0 BCS 0x00AF
000B5 5F4F SUBI R20,0xFF
000B6 4F5F SBCI R21,0xFF
000B7 1740 CP R20,R16
000B8 0751 CPC R21,R17
000B9 F390 BCS 0x00AC
000BA 940C 022A JMP pop_xgsetF000
(0027) }
(0028)
(0029)
(0030)
(0031) /*****************************************
(0032) *函数名:send_command
(0033) *功能:向LCD控制器的寄存器写指令
(0034) *参数:指令command_data
(0035) *返回值:无
(0036) ****************************************/
(0037) void LCD_init(void)
(0038) {
(0039) delay_ms(20);
_LCD_init:
000BC E104 LDI R16,0x14
000BD E010 LDI R17,0
000BE DFD3 RCALL _delay_ms
(0040) Write_Command(0x30);//显示地址归位0x02
000BF E300 LDI R16,0x30
000C0 D00E RCALL _Write_Command
(0041) Write_Command(0x02);//选择基本指令集0x30
000C1 E002 LDI R16,2
000C2 D00C RCALL _Write_Command
(0042) Write_Command(0x01);//光标关
000C3 E001 LDI R16,1
000C4 D00A RCALL _Write_Command
(0043) Write_Command(0x08);
000C5 E008 LDI R16,0x8
000C6 D008 RCALL _Write_Command
(0044) Write_Command(0x10);
000C7 E100 LDI R16,0x10
000C8 D006 RCALL _Write_Command
(0045) Write_Command(0x38);
000C9 E308 LDI R16,0x38
000CA D004 RCALL _Write_Command
(0046) Write_Command(0x80);
000CB E800 LDI R16,0x80
000CC D002 RCALL _Write_Command
(0047) Write_Command(0x0c);//开显示0x0c
000CD E00C LDI R16,0xC
000CE C000 RJMP _Write_Command
_Write_Command:
i --> R22
command --> R20
CMD --> R10
000CF 940E 022F CALL push_xgsetF00C
000D1 2EA0 MOV R10,R16
(0048) }
(0049)
(0050) //发送命令
(0051) void Write_Command(unsigned char CMD)
(0052) {
(0053) uchar command,i;
(0054) CS_SET;
000D2 9A13 SBI 0x02,3
000D3 9A1B SBI 0x03,3
(0055) command=0xf8;
000D4 EF48 LDI R20,0xF8
(0056) for(i=0;i<8;i++)//把数据送到线上去
000D5 2766 CLR R22
000D6 C018 RJMP 0x00EF
(0057) { SCLK_CLE;
000D7 9A15 SBI 0x02,5
000D8 981D CBI 0x03,5
(0058) if(command&0x80)
000D9 FF47 SBRS R20,7
000DA C003 RJMP 0x00DE
(0059) {SID_SET;}
000DB 9A14 SBI 0x02,4
000DC 9A1C SBI 0x03,4
000DD C002 RJMP 0x00E0
(0060) else
(0061) {SID_CLE;}
000DE 9A14 SBI 0x02,4
000DF 981C CBI 0x03,4
(0062) delay_us(1);
000E0 E001 LDI R16,1
000E1 E010 LDI R17,0
000E2 DFC4 RCALL _delay_us
(0063) SCLK_SET;//时钟总线拉高,数据传送给显示屏
000E3 9A15 SBI 0x02,5
000E4 9A1D SBI 0x03,5
(0064) delay_us(10);
000E5 E00A LDI R16,0xA
000E6 E010 LDI R17,0
000E7 DFBF RCALL _delay_us
(0065) SCLK_CLE;
000E8 9A15 SBI 0x02,5
000E9 981D CBI 0x03,5
(0066) delay_us(3);
000EA E003 LDI R16,3
000EB E010 LDI R17,0
000EC DFBA RCALL _delay_us
(0067) command=command<<1;//高位先发
000ED 0F44 LSL R20
000EE 9563 INC R22
000EF 3068 CPI R22,0x8
000F0 F330 BCS 0x00D7
(0068) }
(0069) command=CMD&0xf0;
000F1 2D4A MOV R20,R10
000F2 7F40 ANDI R20,0xF0
(0070) for(i=0;i<8;i++)//把数据送到线上去
000F3 2766 CLR R22
000F4 C018 RJMP 0x010D
(0071) { SCLK_CLE;
000F5 9A15 SBI 0x02,5
000F6 981D CBI 0x03,5
(0072) if(command&0x80)
000F7 FF47 SBRS R20,7
000F8 C003 RJMP 0x00FC
(0073) {SID_SET;}
000F9 9A14 SBI 0x02,4
000FA 9A1C SBI 0x03,4
000FB C002 RJMP 0x00FE
(0074) else
(0075) {SID_CLE;}
000FC 9A14 SBI 0x02,4
000FD 981C CBI 0x03,4
(0076) delay_us(1);
000FE E001 LDI R16,1
000FF E010 LDI R17,0
00100 DFA6 RCALL _delay_us
(0077) SCLK_SET;//时钟总线拉高,数据传送给显示屏
00101 9A15 SBI 0x02,5
00102 9A1D SBI 0x03,5
(0078) delay_us(10);
00103 E00A LDI R16,0xA
00104 E010 LDI R17,0
00105 DFA1 RCALL _delay_us
(0079) SCLK_CLE;
00106 9A15 SBI 0x02,5
00107 981D CBI 0x03,5
(0080) delay_us(3);
00108 E003 LDI R16,3
00109 E010 LDI R17,0
0010A DF9C RCALL _delay_us
(0081) command=command<<1;//高位先发
0010B 0F44 LSL R20
0010C 9563 INC R22
0010D 3068 CPI R22,0x8
0010E F330 BCS 0x00F5
(0082) }
(0083) command=CMD<<4;
0010F 2D4A MOV R20,R10
00110 704F ANDI R20,0xF
00111 9542 SWAP R20
(0084) for(i=0;i<8;i++)//把数据送到线上去
00112 2766 CLR R22
00113 C018 RJMP 0x012C
(0085) { SCLK_CLE;
00114 9A15 SBI 0x02,5
00115 981D CBI 0x03,5
(0086) if(command&0x80)
00116 FF47 SBRS R20,7
00117 C003 RJMP 0x011B
(0087) {SID_SET;}
00118 9A14 SBI 0x02,4
00119 9A1C SBI 0x03,4
0011A C002 RJMP 0x011D
(0088) else
(0089) {SID_CLE;}
0011B 9A14 SBI 0x02,4
0011C 981C CBI 0x03,4
(0090) delay_us(1);
0011D E001 LDI R16,1
0011E E010 LDI R17,0
0011F DF87 RCALL _delay_us
(0091) SCLK_SET;//时钟总线拉高,数据传送给显示屏
00120 9A15 SBI 0x02,5
00121 9A1D SBI 0x03,5
(0092) delay_us(1);
00122 E001 LDI R16,1
00123 E010 LDI R17,0
00124 DF82 RCALL _delay_us
(0093) SCLK_CLE;
00125 9A15 SBI 0x02,5
00126 981D CBI 0x03,5
(0094) delay_us(3);
00127 E003 LDI R16,3
00128 E010 LDI R17,0
00129 DF7D RCALL _delay_us
(0095) command=command<<1;//高位先发
0012A 0F44 LSL R20
0012B 9563 INC R22
0012C 3068 CPI R22,0x8
0012D F330 BCS 0x0114
(0096) }
(0097) CS_CLE;
0012E 9A13 SBI 0x02,3
0012F 981B CBI 0x03,3
(0098) delay_us(15);
00130 E00F LDI R16,0xF
00131 E010 LDI R17,0
00132 DF74 RCALL _delay_us
00133 940C 0236 JMP pop_xgsetF00C
_Write_one_char:
i --> R22
date --> R20
dat --> R10
00135 940E 022F CALL push_xgsetF00C
00137 2EA0 MOV R10,R16
(0099) }
(0100)
(0101) //发送一个字符
(0102) void Write_one_char(unsigned char dat)
(0103) {
(0104) uchar date,i;
(0105) CS_SET;
00138 9A13 SBI 0x02,3
00139 9A1B SBI 0x03,3
(0106) date=0xfa;
0013A EF4A LDI R20,0xFA
(0107) for(i=0;i<8;i++)//把数据送到线上去
0013B 2766 CLR R22
0013C C018 RJMP 0x0155
(0108) { SCLK_CLE;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?