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

📄 ¿-

📁 atmega128串行操作lcd12864
💻
📖 第 1 页 / 共 3 页
字号:
(0154) {
(0155) switch(x)
    00172 2D6C      MOV	R22,R12
    00173 2777      CLR	R23
    00174 3060      CPI	R22,0
    00175 0767      CPC	R22,R23
    00176 F069      BEQ	0x0184
    00177 3061      CPI	R22,1
    00178 E0E0      LDI	R30,0
    00179 077E      CPC	R23,R30
    0017A F079      BEQ	0x018A
    0017B 3062      CPI	R22,2
    0017C E0E0      LDI	R30,0
    0017D 077E      CPC	R23,R30
    0017E F089      BEQ	0x0190
    0017F 3063      CPI	R22,3
    00180 E0E0      LDI	R30,0
    00181 077E      CPC	R23,R30
    00182 F099      BEQ	0x0196
    00183 C017      RJMP	0x019B
(0156)     {
(0157) 	case 0:
(0158) 	   Write_Command(0x80);
    00184 E800      LDI	R16,0x80
    00185 DF29      RCALL	_Write_Command
(0159) 	   Write_Command(0x80+y);
    00186 2F04      MOV	R16,R20
    00187 5800      SUBI	R16,0x80
    00188 DF26      RCALL	_Write_Command
(0160) 	   break;
    00189 C011      RJMP	0x019B
(0161) 	case 1:
(0162) 	   Write_Command(0x90);
    0018A E900      LDI	R16,0x90
    0018B DF23      RCALL	_Write_Command
(0163) 	   Write_Command(0x90+y);
    0018C 2F04      MOV	R16,R20
    0018D 5700      SUBI	R16,0x70
    0018E DF20      RCALL	_Write_Command
(0164) 	   break;
    0018F C00B      RJMP	0x019B
(0165) 	case 2:
(0166) 	   Write_Command(0x88);
    00190 E808      LDI	R16,0x88
    00191 DF1D      RCALL	_Write_Command
(0167) 	   Write_Command(0x88+y);
    00192 2F04      MOV	R16,R20
    00193 5708      SUBI	R16,0x78
    00194 DF1A      RCALL	_Write_Command
(0168) 	   break;
    00195 C005      RJMP	0x019B
(0169) 	case 3:
(0170) 	   Write_Command(0x98);
    00196 E908      LDI	R16,0x98
    00197 DF17      RCALL	_Write_Command
(0171) 	   Write_Command(0x98+y);
    00198 2F04      MOV	R16,R20
    00199 5608      SUBI	R16,0x68
    0019A DF14      RCALL	_Write_Command
(0172) 	   break;
(0173) 	 }
(0174) Write_one_char(dat);//写数据
    0019B 2D0A      MOV	R16,R10
    0019C DF71      RCALL	_Write_one_char
    0019D 940C 0336 JMP	pop_xgsetF03C
_Lcd_puts_any:
  i                    --> R10
  p                    --> R12
  y                    --> R20
  x                    --> R14
    0019F 940E 030A CALL	push_xgsetF0FC
    001A1 2F42      MOV	R20,R18
    001A2 2EE0      MOV	R14,R16
    001A3 84CA      LDD	R12,Y+10
    001A4 84DB      LDD	R13,Y+11
(0175) }
(0176) //从指定的位置开始显示汉字或字符
(0177) void Lcd_puts_any(unsigned char x,unsigned char y,unsigned char *p)
(0178) {
(0179) unsigned char i=0;
    001A5 24AA      CLR	R10
(0180) switch(x)
    001A6 2D6E      MOV	R22,R14
    001A7 2777      CLR	R23
    001A8 3060      CPI	R22,0
    001A9 0767      CPC	R22,R23
    001AA F069      BEQ	0x01B8
    001AB 3061      CPI	R22,1
    001AC E0E0      LDI	R30,0
    001AD 077E      CPC	R23,R30
    001AE F079      BEQ	0x01BE
    001AF 3062      CPI	R22,2
    001B0 E0E0      LDI	R30,0
    001B1 077E      CPC	R23,R30
    001B2 F089      BEQ	0x01C4
    001B3 3063      CPI	R22,3
    001B4 E0E0      LDI	R30,0
    001B5 077E      CPC	R23,R30
    001B6 F099      BEQ	0x01CA
    001B7 C017      RJMP	0x01CF
(0181)     {
(0182) 	case 0:
(0183) 	   Write_Command(0x80);
    001B8 E800      LDI	R16,0x80
    001B9 DEF5      RCALL	_Write_Command
(0184) 	   Write_Command(0x80+y);
    001BA 2F04      MOV	R16,R20
    001BB 5800      SUBI	R16,0x80
    001BC DEF2      RCALL	_Write_Command
(0185) 	   break;
    001BD C011      RJMP	0x01CF
(0186) 	case 1:
(0187) 	   Write_Command(0x90);
    001BE E900      LDI	R16,0x90
    001BF DEEF      RCALL	_Write_Command
(0188) 	   Write_Command(0x90+y);
    001C0 2F04      MOV	R16,R20
    001C1 5700      SUBI	R16,0x70
    001C2 DEEC      RCALL	_Write_Command
(0189) 	   break;
    001C3 C00B      RJMP	0x01CF
(0190) 	case 2:
(0191) 	   Write_Command(0x88);
    001C4 E808      LDI	R16,0x88
    001C5 DEE9      RCALL	_Write_Command
(0192) 	   Write_Command(0x88+y);
    001C6 2F04      MOV	R16,R20
    001C7 5708      SUBI	R16,0x78
    001C8 DEE6      RCALL	_Write_Command
(0193) 	   break;
    001C9 C005      RJMP	0x01CF
(0194) 	case 3:
(0195) 	   Write_Command(0x98);
    001CA E908      LDI	R16,0x98
    001CB DEE3      RCALL	_Write_Command
(0196) 	   Write_Command(0x98+y);
    001CC 2F04      MOV	R16,R20
    001CD 5608      SUBI	R16,0x68
    001CE DEE0      RCALL	_Write_Command
(0197) 	   break;
(0198) 	 }
(0199) for(i=0;p[i]!='\0';i++)
    001CF 24AA      CLR	R10
    001D0 C007      RJMP	0x01D8
(0200) 	{
(0201) 		Write_one_char(p[i]);
    001D1 2DEA      MOV	R30,R10
    001D2 27FF      CLR	R31
    001D3 0DEC      ADD	R30,R12
    001D4 1DFD      ADC	R31,R13
    001D5 8100      LD	R16,Z
    001D6 DF37      RCALL	_Write_one_char
    001D7 94A3      INC	R10
    001D8 2DEA      MOV	R30,R10
    001D9 27FF      CLR	R31
    001DA 0DEC      ADD	R30,R12
    001DB 1DFD      ADC	R31,R13
    001DC 8020      LD	R2,Z
    001DD 2022      TST	R2
    001DE F791      BNE	0x01D1
    001DF 940C 02FF JMP	pop_xgsetF0FC
FILE: E:\课件\128最小系统板\AVR程序\定时器\adc.c
(0001) #include"adc.h"
(0002) #include "12864.h"		//包含头文件
(0003) 
(0004) void mega128_adc(void)
(0005) {
(0006) DDRF=0X00;
_mega128_adc:
    001E1 2422      CLR	R2
    001E2 9220 0061 STS	0x61,R2
(0007) PORTF=0X00;
    001E4 9220 0062 STS	0x62,R2
(0008) DDRA=0X00;
    001E6 BA2A      OUT	0x1A,R2
(0009) PORTA=0X00;
    001E7 BA2B      OUT	0x1B,R2
(0010) ADMUX=0xd0;//F 差分 ADC0 ADC1  内部2.56V基准电压
    001E8 ED80      LDI	R24,0xD0
    001E9 B987      OUT	0x07,R24
(0011) ADCSRA=0x86;//64分频  转换使能
    001EA E886      LDI	R24,0x86
    001EB B986      OUT	0x06,R24
    001EC 9508      RET
_adc_ready:
  addate               --> R10
    001ED 92AA      ST	-Y,R10
    001EE 92BA      ST	-Y,R11
(0012) }
(0013) uint adc_ready(void)
(0014) {
(0015) uint addate=0;
    001EF 24AA      CLR	R10
    001F0 24BB      CLR	R11
(0016) ADCSRA|=(1<<ADSC);//启动第一次转换
    001F1 9A36      SBI	0x06,6
(0017) while(!(ADCSRA&(1<<ADIF)));//等待转换结束
    001F2 9B34      SBIS	0x06,4
    001F3 CFFE      RJMP	0x01F2
(0018) ADCSRA&=~(1<<ADIF);//结束清零
    001F4 9834      CBI	0x06,4
(0019) addate=ADCL;
    001F5 B0A4      IN	R10,0x04
    001F6 24BB      CLR	R11
(0020) addate=addate+ADCH*256;
    001F7 B125      IN	R18,0x05
    001F8 2733      CLR	R19
    001F9 E000      LDI	R16,0
    001FA E011      LDI	R17,1
    001FB 940E 02EF CALL	empy16s
    001FD 0EA0      ADD	R10,R16
    001FE 1EB1      ADC	R11,R17
(0021) addate=addate*0.474;//数据恢复
    001FF E80C      LDI	R16,0x8C
    00200 E010      LDI	R17,0
    00201 940E 02DB CALL	elpm32
    00203 0118      MOVW	R2,R16
    00204 0129      MOVW	R4,R18
    00205 0185      MOVW	R16,R10
    00206 940E 037A CALL	uint2fp
    00208 933A      ST	-Y,R19
    00209 932A      ST	-Y,R18
    0020A 931A      ST	-Y,R17
    0020B 930A      ST	-Y,R16
    0020C 0181      MOVW	R16,R2
    0020D 0192      MOVW	R18,R4
    0020E 940E 047D CALL	fpmule2
    00210 940E 0348 CALL	fpint
    00212 0158      MOVW	R10,R16
(0022) return addate;
    00213 90B9      LD	R11,Y+
    00214 90A9      LD	R10,Y+
    00215 9508      RET
_display:
  ge                   --> R20
  shi                  --> R22
  bai                  --> R10
  num                  --> R12
  i                    --> R14
    00216 940E 030A CALL	push_xgsetF0FC
(0023) }
(0024) void display(void)//测电压
(0025) {
(0026) uint num=0;
    00218 24CC      CLR	R12
    00219 24DD      CLR	R13
(0027) uchar bai=0,shi=0,ge=0,i=0;
    0021A 24AA      CLR	R10
    0021B 2766      CLR	R22
    0021C 2744      CLR	R20
(0028) mega128_adc();//放入定时器中完成
    0021D DFC3      RCALL	_mega128_adc
(0029) for(i=100;i>0;i--)//测100次
    0021E E684      LDI	R24,0x64
    0021F 2EE8      MOV	R14,R24
    00220 C004      RJMP	0x0225
(0030) {
(0031)     num+=adc_ready();
    00221 DFCB      RCALL	_adc_ready
    00222 0EC0      ADD	R12,R16
    00223 1ED1      ADC	R13,R17
    00224 94EA      DEC	R14
    00225 E080      LDI	R24,0
    00226 158E      CP	R24,R14
    00227 F3C8      BCS	0x0221
(0032) }
(0033)     num=num/100; 
    00228 E624      LDI	R18,0x64
    00229 E030      LDI	R19,0
    0022A 0186      MOVW	R16,R12
    0022B 940E 02C1 CALL	div16u
    0022D 0168      MOVW	R12,R16
(0034) 	bai=num/100;
    0022E E624      LDI	R18,0x64
    0022F E030      LDI	R19,0
    00230 940E 02C1 CALL	div16u
    00232 2EA0      MOV	R10,R16
(0035) 	shi=num%100/10;
    00233 E624      LDI	R18,0x64
    00234 E030      LDI	R19,0
    00235 0186      MOVW	R16,R12
    00236 940E 02BF CALL	mod16u
    00238 E02A      LDI	R18,0xA
    00239 E030      LDI	R19,0
    0023A 940E 02C1 CALL	div16u
    0023C 2F60      MOV	R22,R16
(0036) 	ge=num%10;
    0023D E02A      LDI	R18,0xA
    0023E E030      LDI	R19,0
    0023F 0186      MOVW	R16,R12
    00240 940E 02BF CALL	mod16u
    00242 2F40      MOV	R20,R16
(0037) 	Write_Command(0x90);
    00243 E900      LDI	R16,0x90
    00244 940E 00AF CALL	_Write_Command
(0038) 	Write_Command(0x90+3);
    00246 E903      LDI	R16,0x93
    00247 940E 00AF CALL	_Write_Command
(0039) 	Write_one_char(bai+0x30);
    00249 2D0A      MOV	R16,R10
    0024A 5D00      SUBI	R16,0xD0
    0024B 940E 010E CALL	_Write_one_char
(0040) 	Write_one_char('.');
    0024D E20E      LDI	R16,0x2E
    0024E 940E 010E CALL	_Write_one_char
(0041) 	Write_Command(0x90+4);
    00250 E904      LDI	R16,0x94
    00251 940E 00AF CALL	_Write_Command
(0042) 	Write_one_char(shi+0x30);
    00253 2F06      MOV	R16,R22
    00254 5D00      SUBI	R16,0xD0
    00255 940E 010E CALL	_Write_one_char
(0043) 	Write_one_char(ge+0x30);
    00257 2F04      MOV	R16,R20
    00258 5D00      SUBI	R16,0xD0
    00259 940E 010E CALL	_Write_one_char
(0044) 	Write_Command(0x90+5);
    0025B E905      LDI	R16,0x95
    0025C 940E 00AF CALL	_Write_Command
(0045) 	Write_one_char('V');
    0025E E506      LDI	R16,0x56
    0025F 940E 010E CALL	_Write_one_char
    00261 940C 02FF JMP	pop_xgsetF0FC
FILE: E:\课件\128最小系统板\AVR程序\定时器\main.c
(0001) #include <iom128v.h>
(0002) #include <macros.h>
(0003) #include"adc.h"
(0004) #include "12864.h"		//包含头文件
(0005) 
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) uchar count=0;
(0009)  
(0010) void init_timer0(void)
(0011) {
(0012) CLI();
_init_timer0:
    00263 94F8      BCLR	7
(0013) TCCR0=0X00;//32分频 定时溢出 关
    00264 2422      CLR	R2
    00265 BE23      OUT	0x33,R2
(0014) ASSR&=~(1<<AS0);
    00266 B780      IN	R24,0x30
    00267 7F87      ANDI	R24,0xF7
    00268 BF80      OUT	0x30,R24
(0015) TCNT0=0X02;
    00269 E082      LDI	R24,2
    0026A BF82      OUT	0x32,R24
(0016) TCCR0=0X07;//256分频 定时溢出 1024
    0026B E087      LDI	R24,7
    0026C BF83      OUT	0x33,R24
(0017) TIMSK|=(1<<TOIE0);
    0026D B787      IN	R24,0x37
    0026E 6081      ORI	R24,1
    0026F BF87      OUT	0x37,R24
(0018) TIFR|=(1<<TOV0);
    00270 B786      IN	R24,0x36
    00271 6081      ORI	R24,1
    00272 BF86      OUT	0x36,R24
(0019) SEI();
    00273 9478      BSET	7
    00274 9508      RET
_main:
    00275 9722      SBIW	R28,2
(0020) } 
(0021) void main(void)
(0022) {
(0023)  init_timer0();
    00276 DFEC      RCALL	_init_timer0
(0024)  LCD_init();
    00277 940E 0099 CALL	_LCD_init
(0025)  Lcd_puts_any(0,0,"我骂我");
    00279 E081      LDI	R24,1
    0027A E091      LDI	R25,1
    0027B 8399      STD	Y+1,R25
    0027C 8388      ST	Y,R24
    0027D 2722      CLR	R18
    0027E 2700      CLR	R16
    0027F 940E 019F CALL	_Lcd_puts_any
(0026)  while(1);
    00281 CFFF      RJMP	0x0281
    00282 9622      ADIW	R28,2
    00283 9508      RET
_timer0_ovf_isr:
    00284 920A      ST	-Y,R0
    00285 921A      ST	-Y,R1
    00286 922A      ST	-Y,R2
    00287 923A      ST	-Y,R3
    00288 924A      ST	-Y,R4
    00289 925A      ST	-Y,R5
    0028A 926A      ST	-Y,R6
    0028B 927A      ST	-Y,R7
    0028C 928A      ST	-Y,R8
    0028D 929A      ST	-Y,R9
    0028E 930A      ST	-Y,R16
    0028F 931A      ST	-Y,R17
    00290 932A      ST	-Y,R18
    00291 933A      ST	-Y,R19
    00292 938A      ST	-Y,R24
    00293 939A      ST	-Y,R25
    00294 93AA      ST	-Y,R26
    00295 93BA      ST	-Y,R27
    00296 93EA      ST	-Y,R30
    00297 93FA      ST	-Y,R31
    00298 B60F      IN	R0,0x3F
    00299 920A      ST	-Y,R0
(0027) }
(0028)  
(0029) #pragma interrupt_handler timer0_ovf_isr:17
(0030) void timer0_ovf_isr(void)
(0031) {
(0032) TCNT0=0X10;
    0029A E180      LDI	R24,0x10
    0029B BF82      OUT	0x32,R24
(0033) count++;
    0029C 9180 0100 LDS	R24,count
    0029E 5F8F      SUBI	R24,0xFF
    0029F 9380 0100 STS	count,R24
(0034) if(count==10)
    002A1 308A      CPI	R24,0xA
    002A2 F429      BNE	0x02A8
(0035) {
(0036) count=0;
    002A3 2422      CLR	R2
    002A4 9220 0100 STS	count,R2
(0037) display();//测电压
    002A6 940E 0216 CALL	_display
(0038) }
FILE: <library>
    002A8 9009      LD	R0,Y+
    002A9 BE0F      OUT	0x3F,R0
    002AA 91F9      LD	R31,Y+
    002AB 91E9      LD	R30,Y+
    002AC 91B9      LD	R27,Y+
    002AD 91A9      LD	R26,Y+
    002AE 9199      LD	R25,Y+
    002AF 9189      LD	R24,Y+
    002B0 9139      LD	R19,Y+
    002B1 9129      LD	R18,Y+
    002B2 9119      LD	R17,Y+
    002B3 9109      LD	R16,Y+
    002B4 9099      LD	R9,Y+
    002B5 9089      LD	R8,Y+
    002B6 9079      LD	R7,Y+
    002B7 9069      LD	R6,Y+
    002B8 9059      LD	R5,Y+
    002B9 9049      LD	R4,Y+
    002BA 9039      LD	R3,Y+
    002BB 9029      LD	R2,Y+
    002BC 9019      LD	R1,Y+
    002BD 9009      LD	R0,Y+
    002BE 9518      RETI
mod16u:
    002BF 9468      BSET	6
    002C0 C001      RJMP	xdiv16u
div16u:
    002C1 94E8      BCLR	6
xdiv16u:
    002C2 92EA      ST	-Y,R14
    002C3 92FA      ST	-Y,R15
    002C4 938A      ST	-Y,R24
    002C5 24EE      CLR	R14
    002C6 24FF      CLR	R15
    002C7 E180      LDI	R24,0x10
    002C8 0F00      LSL	R16
    002C9 1F11      ROL	R17

⌨️ 快捷键说明

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