📄 avrstudy.lst
字号:
(0288) vstr[4] = time[4]%16+0x30;
03A4 E120 LDI R18,0x10
03A5 E030 LDI R19,0
03A6 01F5 MOVW R30,R10
03A7 8104 LDD R16,Z+4
03A8 2711 CLR R17
03A9 D69D RCALL mod16s
03AA 01C8 MOVW R24,R16
03AB 96C0 ADIW R24,0x30
03AC 8799 STD Y+9,R25
03AD 8788 STD Y+8,R24
(0289) vstr[5] = '/';
03AE E28F LDI R24,0x2F
03AF E090 LDI R25,0
03B0 879B STD Y+11,R25
03B1 878A STD Y+10,R24
(0290) vstr[6] = time[6]/16+0x30;
03B2 E120 LDI R18,0x10
03B3 E030 LDI R19,0
03B4 01F5 MOVW R30,R10
03B5 8106 LDD R16,Z+6
03B6 2711 CLR R17
03B7 D693 RCALL div16s
03B8 01C8 MOVW R24,R16
03B9 96C0 ADIW R24,0x30
03BA 879D STD Y+13,R25
03BB 878C STD Y+12,R24
(0291) vstr[7] = time[6]%16+0x30;
03BC E120 LDI R18,0x10
03BD E030 LDI R19,0
03BE 01F5 MOVW R30,R10
03BF 8106 LDD R16,Z+6
03C0 2711 CLR R17
03C1 D685 RCALL mod16s
03C2 01C8 MOVW R24,R16
03C3 96C0 ADIW R24,0x30
03C4 879F STD Y+15,R25
03C5 878E STD Y+14,R24
(0292) WriteCommand(0x30); //时间显示起始坐标
03C6 E300 LDI R16,0x30
03C7 DE05 RCALL _WriteCommand
(0293) WriteCommand(0x92);
03C8 E902 LDI R16,0x92
03C9 DE03 RCALL _WriteCommand
(0294) for(i=0;i<8;i++)
03CA 2766 CLR R22
03CB 2777 CLR R23
03CC C00E RJMP 0x03DB
(0295) {
(0296) vstrtemp=vstr[i];
03CD E002 LDI R16,2
03CE E010 LDI R17,0
03CF 019B MOVW R18,R22
03D0 D720 RCALL empy16s
03D1 01F8 MOVW R30,R16
03D2 01CE MOVW R24,R28
03D3 0FE8 ADD R30,R24
03D4 1FF9 ADC R31,R25
03D5 8140 LDD R20,Z+0
03D6 8151 LDD R21,Z+1
(0297) WriteData(vstrtemp);
03D7 2F04 MOV R16,R20
03D8 DE03 RCALL _WriteData
03D9 5F6F SUBI R22,0xFF
03DA 4F7F SBCI R23,0xFF
03DB 3068 CPI R22,0x8
03DC E0E0 LDI R30,0
03DD 077E CPC R23,R30
03DE F370 BCS 0x03CD
(0298) }
(0299) vstr[0] = time[2]/16+0x30;
03DF E120 LDI R18,0x10
03E0 E030 LDI R19,0
03E1 01F5 MOVW R30,R10
03E2 8102 LDD R16,Z+2
03E3 2711 CLR R17
03E4 D666 RCALL div16s
03E5 01C8 MOVW R24,R16
03E6 96C0 ADIW R24,0x30
03E7 8399 STD Y+1,R25
03E8 8388 STD Y+0,R24
(0300) vstr[1] = time[2]%16+0x30;
03E9 E120 LDI R18,0x10
03EA E030 LDI R19,0
03EB 01F5 MOVW R30,R10
03EC 8102 LDD R16,Z+2
03ED 2711 CLR R17
03EE D658 RCALL mod16s
03EF 01C8 MOVW R24,R16
03F0 96C0 ADIW R24,0x30
03F1 839B STD Y+3,R25
03F2 838A STD Y+2,R24
(0301) vstr[2] = ':';
03F3 E38A LDI R24,0x3A
03F4 E090 LDI R25,0
03F5 839D STD Y+5,R25
03F6 838C STD Y+4,R24
(0302) vstr[3] = time[1]/16+0x30;
03F7 E120 LDI R18,0x10
03F8 E030 LDI R19,0
03F9 01F5 MOVW R30,R10
03FA 8101 LDD R16,Z+1
03FB 2711 CLR R17
03FC D64E RCALL div16s
03FD 01C8 MOVW R24,R16
03FE 96C0 ADIW R24,0x30
03FF 839F STD Y+7,R25
0400 838E STD Y+6,R24
(0303) vstr[4] = time[1]%16+0x30;
0401 E120 LDI R18,0x10
0402 E030 LDI R19,0
0403 01F5 MOVW R30,R10
0404 8101 LDD R16,Z+1
0405 2711 CLR R17
0406 D640 RCALL mod16s
0407 01C8 MOVW R24,R16
0408 96C0 ADIW R24,0x30
0409 8799 STD Y+9,R25
040A 8788 STD Y+8,R24
(0304) vstr[5] = ':';
040B E38A LDI R24,0x3A
040C E090 LDI R25,0
040D 879B STD Y+11,R25
040E 878A STD Y+10,R24
(0305) vstr[6] = time[0]/16+0x30;
040F E120 LDI R18,0x10
0410 E030 LDI R19,0
0411 01F5 MOVW R30,R10
0412 8100 LDD R16,Z+0
0413 2711 CLR R17
0414 D636 RCALL div16s
0415 01C8 MOVW R24,R16
0416 96C0 ADIW R24,0x30
0417 879D STD Y+13,R25
0418 878C STD Y+12,R24
(0306) vstr[7] = time[0]%16+0x30;
0419 E120 LDI R18,0x10
041A E030 LDI R19,0
041B 01F5 MOVW R30,R10
041C 8100 LDD R16,Z+0
041D 2711 CLR R17
041E D628 RCALL mod16s
041F 01C8 MOVW R24,R16
0420 96C0 ADIW R24,0x30
0421 879F STD Y+15,R25
0422 878E STD Y+14,R24
(0307) WriteCommand(0x30); //时间显示起始坐标
0423 E300 LDI R16,0x30
0424 DDA8 RCALL _WriteCommand
(0308) WriteCommand(0x8a);
0425 E80A LDI R16,0x8A
0426 DDA6 RCALL _WriteCommand
(0309) for(i=0;i<8;i++)
0427 2766 CLR R22
0428 2777 CLR R23
0429 C00E RJMP 0x0438
(0310) {
(0311) vstrtemp=vstr[i];
042A E002 LDI R16,2
042B E010 LDI R17,0
042C 019B MOVW R18,R22
042D D6C3 RCALL empy16s
042E 01F8 MOVW R30,R16
042F 01CE MOVW R24,R28
0430 0FE8 ADD R30,R24
0431 1FF9 ADC R31,R25
0432 8140 LDD R20,Z+0
0433 8151 LDD R21,Z+1
(0312) WriteData(vstrtemp);
0434 2F04 MOV R16,R20
0435 DDA6 RCALL _WriteData
0436 5F6F SUBI R22,0xFF
0437 4F7F SBCI R23,0xFF
0438 3068 CPI R22,0x8
0439 E0E0 LDI R30,0
043A 077E CPC R23,R30
043B F370 BCS 0x042A
043C 9660 ADIW R28,0x10
043D D6C5 RCALL pop_gset3
043E 9508 RET
_delay_us:
i --> R20
us --> R22
043F D6CF RCALL push_gset2
0440 01B8 MOVW R22,R16
FILE: E:\AVR学习专区\AVR学习板\delay.h
(0001) //===================延时函数========================
(0002) //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
(0003) //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
(0004) //==================================================
(0005) void delay_us(unsigned int us)
(0006) {
(0007) unsigned int i;
(0008) us=us*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
0441 E005 LDI R16,5
0442 E010 LDI R17,0
0443 019B MOVW R18,R22
0444 D6AC RCALL empy16s
0445 01B8 MOVW R22,R16
0446 9576 LSR R23
0447 9567 ROR R22
0448 9576 LSR R23
0449 9567 ROR R22
(0009) for( i=0;i<us;i++);
044A 2744 CLR R20
044B 2755 CLR R21
044C C002 RJMP 0x044F
044D 5F4F SUBI R20,0xFF
044E 4F5F SBCI R21,0xFF
044F 1746 CP R20,R22
0450 0757 CPC R21,R23
0451 F3D8 BCS 0x044D
0452 D6AE RCALL pop_gset2
0453 9508 RET
_delay_ms:
i --> R20
j --> R22
ms --> R16
0454 D6BA RCALL push_gset2
(0010) }
(0011) void delay_ms(unsigned int ms)
(0012) {
(0013) unsigned int i,j;
(0014) for( i=0;i<ms;i++)
0455 2744 CLR R20
0456 2755 CLR R21
0457 C00B RJMP 0x0463
(0015) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
0458 2766 CLR R22
0459 2777 CLR R23
045A C002 RJMP 0x045D
045B 5F6F SUBI R22,0xFF
045C 4F7F SBCI R23,0xFF
045D 3765 CPI R22,0x75
045E E0E4 LDI R30,4
045F 077E CPC R23,R30
0460 F3D0 BCS 0x045B
0461 5F4F SUBI R20,0xFF
0462 4F5F SBCI R21,0xFF
0463 1740 CP R20,R16
0464 0751 CPC R21,R17
0465 F390 BCS 0x0458
0466 D69A RCALL pop_gset2
0467 9508 RET
FILE: E:\AVR学习专区\AVR学习板\mega8_spi.c
(0001) /****************************************************************************************
(0002) mega8的SPI功能实验
(0003)
(0004) 程序功能:使用MEGA8的SPI口控制74HC595,
(0005) 循环发送0-255到74hc595,
(0006) 使LED循环点亮
(0007) 硬件连接:SCK--SHCP,MOSI--DS,PB1--STCP
(0008) 位时钟 , 数据 , 桢时钟
(0009) 作者:张国旗
(0010) 2008年12月29号
(0011) ****************************************************************************************/
(0012) //============================
(0013) // SPI 口初始化
(0014) //主机、高位在前、SCK在闲置时
(0015) //为低电平,SPI时钟为fosc/128
(0016) //============================
(0017) void spi_init()
(0018) {
(0019) DDRB|=0x2f; //设置SCK、MOSI、SS、使能为输出
_spi_init:
0468 B387 IN R24,0x17
0469 628F ORI R24,0x2F
046A BB87 OUT 0x17,R24
(0020) SPCR=0X53; //设置SPI控制寄存器SPE、MSTR、SPR1、SPR0为1
046B E583 LDI R24,0x53
046C B98D OUT 0x0D,R24
046D 9508 RET
_senddat:
status --> Y+1
spi_data --> R20
046E D6A2 RCALL push_gset1
046F 2F40 MOV R20,R16
(0021) }
(0022) //============================
(0023) // 数据发送子函数
(0024) //入口参数:spi_data
(0025) //============================
(0026) void senddat(uchar spi_data)
(0027) {
(0028) uchar status;
(0029) SPSR=0; //清中断标志
0470 2422 CLR R2
0471 B82E OUT 0x0E,R2
(0030) PORTB&=~BIT(PB0); //桢时钟
0472 98C0 CBI 0x18,0
(0031) SPDR=~spi_data;
0473 2E24 MOV R2,R20
0474 9420 COM R2
0475 B82F OUT 0x0F,R2
(0032) while(!(SPSR&=0x80));//等待操作完成
0476 B18E IN R24,0x0E
0477 7880 ANDI R24,0x80
0478 B98E OUT 0x0E,R24
0479 2388 TST R24
047A F3D9 BEQ 0x0476
(0033) SPSR=0; //清中断标志
047B 2422 CLR R2
047C B82E OUT 0x0E,R2
(0034) delay(10);
047D E00A LDI R16,0xA
047E E010 LDI R17,0
047F D410 RCALL _delay
(0035) PORTB|=BIT(PB0); //桢时钟
0480 9AC0 SBI 0x18,0
0481 D692 RCALL pop_gset1
0482 9508 RET
FILE: E:\AVR学习专区\AVR学习板\24cxx12864.c
(0001) /****************************************************************************************
(0002) AT24CXX的mega8控制程序
(0003)
(0004) 程序功能:该程序是用AVR来控制对AT24C256
(0005) 读写信号等的操作.
(0006) 硬件连接:
(0007) 显示部分用12864液晶来显示从24c256中读取的图片
(0008) 作者:张国旗
(0009) 2009年1月3号
(0010) ****************************************************************************************/
(0011) #define uchar unsigned char
(0012) #define uint unsigned int
(0013)
(0014) #define START 0X08 //START信号已发出
(0015) #define RESTART 0X10 //REPFEATED START信号已发出
(0016) #define MT_SLA_ACK 0X18 //SLA+W已发出并收到ACK
(0017) #define MT_DATA_ACK 0X28 //DATA已发出并收到ACK
(0018) #define MT_RSLA_ACK 0X40 //SLA+R已发出并收到ACK
(0019) #define MT_RDATA_ACK 0X50 //DATA已收到ACK已发出
(0020) #define MT_RDATA_NACK 0X58 //DATA已收到NACK已发出
(0021) //==============各种时序操作信号函数================
(0022) #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //产生START信号
(0023) #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //产生STOP信号
(0024) #define Wait() while(!(TWCR&(1<<TWINT))) //等待当前操作完成
(0025) #define TestACK() (TWSR&0xF8) //取出状态码
(0026) #define SetACK() (TWCR|=(1<<TWEA)) //产生ACK
(0027) #define Twi_NoAcK() {TWCR=BIT(TWINT)|BIT(TWEN);} //非应答信号
(0028) #define Writebyte(twi_d) {TWDR=(twi_d);TWCR=(1<<TWINT)|(1<<TWEN);}//发送一个字节(twi_d为写入的数据)
(0029) //========在此设定芯片地址=============
(0030) #define W_ADD_COM 0xa0 //写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0
(0031) #define R_ADD_COM 0xa1 //读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1
(0032) //=======在此设定芯片型号, 1代表24C01; 16代表24C16; 512代表24C512
(0033) #define e2prom 256 // <---在此设定芯片型号, 1代表24C01; 16代表24C16; 512代表24C512
(0034) #if e2prom==1
(0035) #define PAGE_SIZE 8
(0036) #define SIZE 0x007f
(0037) #elif e2prom==2
(0038) #define PAGE_SIZE 8
(0039) #define SIZE 0x00ff
(0040) #elif e2prom==4
(0041) #define PAGE_SIZE 16
(0042) #define SIZE 0x01ff
(0043) #elif e2prom==8
(0044) #define PAGE_SIZE 16
(0045) #define SIZE 0x03ff
(0046) #elif e2prom==16
(0047) #define PAGE_SIZE 16
(0048) #define SIZE 0x07ff
(0049) #elif e2prom==32
(0050) #define PAGE_SIZE 32
(0051) #define SIZE 0x0fff
(0052) #elif e2prom==64
(0053) #define PAGE_SIZE 32
(0054) #define SIZE 0x1fff
(0055) #elif e2prom==128
(0056) #define PAGE_SIZE 64
(0057) #define SIZE 0x3fff
(0058) #elif e2prom==256
(0059) #define PAGE_SIZE 64
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -