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 + -
显示快捷键?