⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ¿-

📁 atmega128串行操作lcd12864
💻
📖 第 1 页 / 共 3 页
字号:
Interrupt Vectors
    00000 940C 004C JMP	__text_start|__start
    00020 940C 0284 JMP	_timer0_ovf_isr

Program Code (text area)
__text_start|__start:
    0004C EFCF      LDI	R28,0xFF
    0004D E1D0      LDI	R29,0x10
    0004E BFCD      OUT	0x3D,R28
    0004F BFDE      OUT	0x3E,R29
    00050 51CE      SUBI	R28,0x1E
    00051 40D0      SBCI	R29,0
    00052 EA0A      LDI	R16,0xAA
    00053 8308      ST	Y,R16
    00054 2400      CLR	R0
    00055 E0E8      LDI	R30,0x8
    00056 E0F1      LDI	R31,1
    00057 E011      LDI	R17,1
    00058 30E8      CPI	R30,0x8
    00059 07F1      CPC	R31,R17
    0005A F011      BEQ	0x005D
    0005B 9201      ST	Z+,R0
    0005C CFFB      RJMP	0x0058
    0005D 8300      ST	Z,R16
    0005E E9E0      LDI	R30,0x90
    0005F E0F0      LDI	R31,0
    00060 E0A0      LDI	R26,0
    00061 E0B1      LDI	R27,1
    00062 E010      LDI	R17,0
    00063 E000      LDI	R16,0
    00064 BF0B      OUT	0x3B,R16
    00065 39E8      CPI	R30,0x98
    00066 07F1      CPC	R31,R17
    00067 F021      BEQ	0x006C
    00068 95C8      LPM
    00069 9631      ADIW	R30,1
    0006A 920D      ST	X+,R0
    0006B CFF9      RJMP	0x0065
    0006C 940E 0275 CALL	_main
_exit:
    0006E CFFF      RJMP	_exit
_delay_ms:
  j                    --> R20
  i                    --> R22
  x                    --> R16
    0006F 940E 0315 CALL	push_xgsetF000
FILE: E:\课件\128最小系统板\AVR程序\定时器\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++)  
    00071 2744      CLR	R20
    00072 2755      CLR	R21
    00073 C00B      RJMP	0x007F
(0019) 		for(i=0;i<1141;i++); 
    00074 2766      CLR	R22
    00075 2777      CLR	R23
    00076 C002      RJMP	0x0079
    00077 5F6F      SUBI	R22,0xFF
    00078 4F7F      SBCI	R23,0xFF
    00079 3765      CPI	R22,0x75
    0007A E0E4      LDI	R30,4
    0007B 077E      CPC	R23,R30
    0007C F3D0      BCS	0x0077
    0007D 5F4F      SUBI	R20,0xFF
    0007E 4F5F      SBCI	R21,0xFF
    0007F 1740      CP	R20,R16
    00080 0751      CPC	R21,R17
    00081 F390      BCS	0x0074
    00082 940C 031A JMP	pop_xgsetF000
_delay_us:
  j                    --> R20
  i                    --> R22
  x                    --> R16
    00084 940E 0315 CALL	push_xgsetF000
(0020) }
(0021) 
(0022) void delay_us(uint x) 
(0023) { 
(0024) 	uint i,j; 
(0025) 	for(j=0;j<x;j++)  
    00086 2744      CLR	R20
    00087 2755      CLR	R21
    00088 C00B      RJMP	0x0094
(0026) 		for(i=0;i<40;i++); 
    00089 2766      CLR	R22
    0008A 2777      CLR	R23
    0008B C002      RJMP	0x008E
    0008C 5F6F      SUBI	R22,0xFF
    0008D 4F7F      SBCI	R23,0xFF
    0008E 3268      CPI	R22,0x28
    0008F E0E0      LDI	R30,0
    00090 077E      CPC	R23,R30
    00091 F3D0      BCS	0x008C
    00092 5F4F      SUBI	R20,0xFF
    00093 4F5F      SBCI	R21,0xFF
    00094 1740      CP	R20,R16
    00095 0751      CPC	R21,R17
    00096 F390      BCS	0x0089
    00097 940C 031A 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:
    00099 E104      LDI	R16,0x14
    0009A E010      LDI	R17,0
    0009B DFD3      RCALL	_delay_ms
(0040) //DDRE|=(1<<5);
(0041) //DDRE|=(1<<3);
(0042) //DDRE|=(1<<1);
(0043) delay_ms(1);
    0009C E001      LDI	R16,1
    0009D E010      LDI	R17,0
    0009E DFD0      RCALL	_delay_ms
(0044) Write_Command(0x30);//显示地址归位0x02
    0009F E300      LDI	R16,0x30
    000A0 D00E      RCALL	_Write_Command
(0045) Write_Command(0x02);//选择基本指令集0x30
    000A1 E002      LDI	R16,2
    000A2 D00C      RCALL	_Write_Command
(0046) Write_Command(0x01);//光标关
    000A3 E001      LDI	R16,1
    000A4 D00A      RCALL	_Write_Command
(0047) Write_Command(0x08);
    000A5 E008      LDI	R16,0x8
    000A6 D008      RCALL	_Write_Command
(0048) Write_Command(0x10);
    000A7 E100      LDI	R16,0x10
    000A8 D006      RCALL	_Write_Command
(0049) Write_Command(0x38);
    000A9 E308      LDI	R16,0x38
    000AA D004      RCALL	_Write_Command
(0050) Write_Command(0x80);
    000AB E800      LDI	R16,0x80
    000AC D002      RCALL	_Write_Command
(0051) Write_Command(0x0c);//开显示0x0c
    000AD E00C      LDI	R16,0xC
    000AE C000      RJMP	_Write_Command
_Write_Command:
  i                    --> R22
  command              --> R20
  CMD                  --> R10
    000AF 940E 031F CALL	push_xgsetF00C
    000B1 2EA0      MOV	R10,R16
(0052) }
(0053)  
(0054) //发送命令
(0055) void Write_Command(unsigned char CMD)
(0056) {
(0057) uchar command,i;
(0058) command=0xf8;
    000B2 EF48      LDI	R20,0xF8
(0059) for(i=0;i<8;i++)//把数据送到线上去
    000B3 2766      CLR	R22
    000B4 C018      RJMP	0x00CD
(0060) { SCLK_CLE;
    000B5 9A15      SBI	0x02,5
    000B6 981D      CBI	0x03,5
(0061)   if(command&0x80)
    000B7 FF47      SBRS	R20,7
    000B8 C003      RJMP	0x00BC
(0062)     {SID_SET;}
    000B9 9A11      SBI	0x02,1
    000BA 9A19      SBI	0x03,1
    000BB C002      RJMP	0x00BE
(0063)   else
(0064)       {SID_CLE;}
    000BC 9A11      SBI	0x02,1
    000BD 9819      CBI	0x03,1
(0065) delay_us(1);
    000BE E001      LDI	R16,1
    000BF E010      LDI	R17,0
    000C0 DFC3      RCALL	_delay_us
(0066)  SCLK_SET;//时钟总线拉高,数据传送给显示屏
    000C1 9A15      SBI	0x02,5
    000C2 9A1D      SBI	0x03,5
(0067)  delay_us(3);
    000C3 E003      LDI	R16,3
    000C4 E010      LDI	R17,0
    000C5 DFBE      RCALL	_delay_us
(0068)  SCLK_CLE;
    000C6 9A15      SBI	0x02,5
    000C7 981D      CBI	0x03,5
(0069)  delay_us(3);
    000C8 E003      LDI	R16,3
    000C9 E010      LDI	R17,0
    000CA DFB9      RCALL	_delay_us
(0070)  command=command<<1;//高位先发
    000CB 0F44      LSL	R20
    000CC 9563      INC	R22
    000CD 3068      CPI	R22,0x8
    000CE F330      BCS	0x00B5
(0071) }
(0072) command=CMD&0xf0;
    000CF 2D4A      MOV	R20,R10
    000D0 7F40      ANDI	R20,0xF0
(0073) for(i=0;i<8;i++)//把数据送到线上去
    000D1 2766      CLR	R22
    000D2 C018      RJMP	0x00EB
(0074) { SCLK_CLE;
    000D3 9A15      SBI	0x02,5
    000D4 981D      CBI	0x03,5
(0075)   if(command&0x80)
    000D5 FF47      SBRS	R20,7
    000D6 C003      RJMP	0x00DA
(0076)     {SID_SET;}
    000D7 9A11      SBI	0x02,1
    000D8 9A19      SBI	0x03,1
    000D9 C002      RJMP	0x00DC
(0077)   else
(0078)       {SID_CLE;}
    000DA 9A11      SBI	0x02,1
    000DB 9819      CBI	0x03,1
(0079) delay_us(1);
    000DC E001      LDI	R16,1
    000DD E010      LDI	R17,0
    000DE DFA5      RCALL	_delay_us
(0080)  SCLK_SET;//时钟总线拉高,数据传送给显示屏
    000DF 9A15      SBI	0x02,5
    000E0 9A1D      SBI	0x03,5
(0081)  delay_us(3);
    000E1 E003      LDI	R16,3
    000E2 E010      LDI	R17,0
    000E3 DFA0      RCALL	_delay_us
(0082)  SCLK_CLE;
    000E4 9A15      SBI	0x02,5
    000E5 981D      CBI	0x03,5
(0083)  delay_us(3);
    000E6 E003      LDI	R16,3
    000E7 E010      LDI	R17,0
    000E8 DF9B      RCALL	_delay_us
(0084)  command=command<<1;//高位先发
    000E9 0F44      LSL	R20
    000EA 9563      INC	R22
    000EB 3068      CPI	R22,0x8
    000EC F330      BCS	0x00D3
(0085) }
(0086) command=CMD<<4;
    000ED 2D4A      MOV	R20,R10
    000EE 704F      ANDI	R20,0xF
    000EF 9542      SWAP	R20
(0087) for(i=0;i<8;i++)//把数据送到线上去
    000F0 2766      CLR	R22
    000F1 C018      RJMP	0x010A
(0088) { SCLK_CLE;
    000F2 9A15      SBI	0x02,5
    000F3 981D      CBI	0x03,5
(0089)   if(command&0x80)
    000F4 FF47      SBRS	R20,7
    000F5 C003      RJMP	0x00F9
(0090)     {SID_SET;}
    000F6 9A11      SBI	0x02,1
    000F7 9A19      SBI	0x03,1
    000F8 C002      RJMP	0x00FB
(0091)   else
(0092)       {SID_CLE;}
    000F9 9A11      SBI	0x02,1
    000FA 9819      CBI	0x03,1
(0093) delay_us(1);
    000FB E001      LDI	R16,1
    000FC E010      LDI	R17,0
    000FD DF86      RCALL	_delay_us
(0094)  SCLK_SET;//时钟总线拉高,数据传送给显示屏
    000FE 9A15      SBI	0x02,5
    000FF 9A1D      SBI	0x03,5
(0095)  delay_us(1);
    00100 E001      LDI	R16,1
    00101 E010      LDI	R17,0
    00102 DF81      RCALL	_delay_us
(0096)  SCLK_CLE;
    00103 9A15      SBI	0x02,5
    00104 981D      CBI	0x03,5
(0097)  delay_us(3);
    00105 E003      LDI	R16,3
    00106 E010      LDI	R17,0
    00107 DF7C      RCALL	_delay_us
(0098)  command=command<<1;//高位先发
    00108 0F44      LSL	R20
    00109 9563      INC	R22
    0010A 3068      CPI	R22,0x8
    0010B F330      BCS	0x00F2
    0010C 940C 0326 JMP	pop_xgsetF00C
_Write_one_char:
  i                    --> R22
  date                 --> R20
  dat                  --> R10
    0010E 940E 031F CALL	push_xgsetF00C
    00110 2EA0      MOV	R10,R16
(0099) }
(0100) }
(0101) 
(0102) //发送一个字符
(0103) void Write_one_char(unsigned char dat)
(0104) {
(0105) uchar date,i;
(0106) date=0xfa;
    00111 EF4A      LDI	R20,0xFA
(0107) 
(0108) for(i=0;i<8;i++)//把数据送到线上去
    00112 2766      CLR	R22
    00113 C018      RJMP	0x012C
(0109) { SCLK_CLE;
    00114 9A15      SBI	0x02,5
    00115 981D      CBI	0x03,5
(0110)   if(date&0x80)
    00116 FF47      SBRS	R20,7
    00117 C003      RJMP	0x011B
(0111)     {SID_SET;}
    00118 9A11      SBI	0x02,1
    00119 9A19      SBI	0x03,1
    0011A C002      RJMP	0x011D
(0112)   else
(0113)       {SID_CLE;}
    0011B 9A11      SBI	0x02,1
    0011C 9819      CBI	0x03,1
(0114) delay_us(1);
    0011D E001      LDI	R16,1
    0011E E010      LDI	R17,0
    0011F DF64      RCALL	_delay_us
(0115)  SCLK_SET;//时钟总线拉高,数据传送给显示屏
    00120 9A15      SBI	0x02,5
    00121 9A1D      SBI	0x03,5
(0116)  delay_us(3);
    00122 E003      LDI	R16,3
    00123 E010      LDI	R17,0
    00124 DF5F      RCALL	_delay_us
(0117)  SCLK_CLE;
    00125 9A15      SBI	0x02,5
    00126 981D      CBI	0x03,5
(0118)  delay_us(3);
    00127 E003      LDI	R16,3
    00128 E010      LDI	R17,0
    00129 DF5A      RCALL	_delay_us
(0119)  date=date<<1;//高位先发
    0012A 0F44      LSL	R20
    0012B 9563      INC	R22
    0012C 3068      CPI	R22,0x8
    0012D F330      BCS	0x0114
(0120) }
(0121) date=dat&0xf0;
    0012E 2D4A      MOV	R20,R10
    0012F 7F40      ANDI	R20,0xF0
(0122) for(i=0;i<8;i++)//把数据送到线上去
    00130 2766      CLR	R22
    00131 C018      RJMP	0x014A
(0123) {
(0124)   SCLK_CLE;
    00132 9A15      SBI	0x02,5
    00133 981D      CBI	0x03,5
(0125)   if(date&0x80)
    00134 FF47      SBRS	R20,7
    00135 C003      RJMP	0x0139
(0126)     {SID_SET;}
    00136 9A11      SBI	0x02,1
    00137 9A19      SBI	0x03,1
    00138 C002      RJMP	0x013B
(0127)   else
(0128)       {SID_CLE;}
    00139 9A11      SBI	0x02,1
    0013A 9819      CBI	0x03,1
(0129) delay_us(1);
    0013B E001      LDI	R16,1
    0013C E010      LDI	R17,0
    0013D DF46      RCALL	_delay_us
(0130)  SCLK_SET;//时钟总线拉高,数据传送给显示屏
    0013E 9A15      SBI	0x02,5
    0013F 9A1D      SBI	0x03,5
(0131)  delay_us(3);
    00140 E003      LDI	R16,3
    00141 E010      LDI	R17,0
    00142 DF41      RCALL	_delay_us
(0132)  SCLK_CLE;
    00143 9A15      SBI	0x02,5
    00144 981D      CBI	0x03,5
(0133)  delay_us(3);
    00145 E003      LDI	R16,3
    00146 E010      LDI	R17,0
    00147 DF3C      RCALL	_delay_us
(0134)  date=date<<1;//高位先发
    00148 0F44      LSL	R20
    00149 9563      INC	R22
    0014A 3068      CPI	R22,0x8
    0014B F330      BCS	0x0132
(0135) }
(0136) date=dat<<4;
    0014C 2D4A      MOV	R20,R10
    0014D 704F      ANDI	R20,0xF
    0014E 9542      SWAP	R20
(0137) for(i=0;i<8;i++)//把数据送到线上去
    0014F 2766      CLR	R22
    00150 C018      RJMP	0x0169
(0138) { SCLK_CLE;
    00151 9A15      SBI	0x02,5
    00152 981D      CBI	0x03,5
(0139)   if(date&0x80)
    00153 FF47      SBRS	R20,7
    00154 C003      RJMP	0x0158
(0140)     {SID_SET;}
    00155 9A11      SBI	0x02,1
    00156 9A19      SBI	0x03,1
    00157 C002      RJMP	0x015A
(0141)   else
(0142)       {SID_CLE;}
    00158 9A11      SBI	0x02,1
    00159 9819      CBI	0x03,1
(0143) delay_us(1);
    0015A E001      LDI	R16,1
    0015B E010      LDI	R17,0
    0015C DF27      RCALL	_delay_us
(0144)  SCLK_SET;//时钟总线拉高,数据传送给显示屏
    0015D 9A15      SBI	0x02,5
    0015E 9A1D      SBI	0x03,5
(0145)  delay_us(3);
    0015F E003      LDI	R16,3
    00160 E010      LDI	R17,0
    00161 DF22      RCALL	_delay_us
(0146)  SCLK_CLE;
    00162 9A15      SBI	0x02,5
    00163 981D      CBI	0x03,5
(0147)  delay_us(3);
    00164 E003      LDI	R16,3
    00165 E010      LDI	R17,0
    00166 DF1D      RCALL	_delay_us
(0148)  date=date<<1;//高位先发
    00167 0F44      LSL	R20
    00168 9563      INC	R22
    00169 3068      CPI	R22,0x8
    0016A F330      BCS	0x0151
    0016B 940C 0326 JMP	pop_xgsetF00C
_Lcd_putsachar:
  dat                  --> R10
  y                    --> R20
  x                    --> R12
    0016D 940E 032D CALL	push_xgsetF03C
    0016F 2F42      MOV	R20,R18
    00170 2EC0      MOV	R12,R16
    00171 84A8      LDD	R10,Y+8
(0149) }
(0150) }
(0151)  
(0152) //在指定的位置显示一个字母
(0153) void Lcd_putsachar(unsigned char x,unsigned char y,unsigned char dat)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -