📄 ¿-
字号:
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 + -