📄 bi2.lst
字号:
__text_start:
__start:
00BA E5CF LDI R28,0x5F
00BB E0D4 LDI R29,4
00BC BFCD OUT 0x3D,R28
00BD BFDE OUT 0x3E,R29
00BE 51C0 SUBI R28,0x10
00BF 40D0 SBCI R29,0
00C0 EA0A LDI R16,0xAA
00C1 8308 STD Y+0,R16
00C2 2400 CLR R0
00C3 E2E6 LDI R30,0x26
00C4 E0F1 LDI R31,1
00C5 E011 LDI R17,1
00C6 33E0 CPI R30,0x30
00C7 07F1 CPC R31,R17
00C8 F011 BEQ 0x00CB
00C9 9201 ST R0,Z+
00CA CFFB RJMP 0x00C6
00CB 8300 STD Z+0,R16
00CC EAEE LDI R30,0xAE
00CD E0F0 LDI R31,0
00CE E6A0 LDI R26,0x60
00CF E0B0 LDI R27,0
00D0 E011 LDI R17,1
00D1 37E4 CPI R30,0x74
00D2 07F1 CPC R31,R17
00D3 F021 BEQ 0x00D8
00D4 95C8 LPM
00D5 9631 ADIW R30,1
00D6 920D ST R0,X+
00D7 CFF9 RJMP 0x00D1
00D8 940E0616 CALL _main
_exit:
00DA CFFF RJMP _exit
FILE: E:\temp\avr\bi2\bi2.c
(0001) /**********************
(0002) 编写者:赖行
(0003) 创建时间:2006年1月
(0004) 最后修改:2006年1月
(0005) 用途:1602液晶在MEGEA8上的显示
(0006) 接法:见图
(0007) **************************/
(0008) #include <iom16v.h>
(0009) #include <macros.h>
(0010) #inclede <eeprom.h>
(0011)
(0012) #define LCD_EN_PORT PORTD
(0013) #define LCD_RS_PORT PORTD
(0014) #define LCD_DATA_PORT PORTD
(0015) #define LCD_DATA_DDR DDRD
(0016) #define LCD_DATA_PIN PIND
(0017) #define LCD_EN 0x10 //portB2 out
(0018) #define LCD_RS 0x40 //portB0 out
(0019) #define LCD_DATA 0x0F //portB4/5/6/7 out
(0020) /*--------------------------------------------------------------------------------------------------
(0021) Public function prototypes
(0022) --------------------------------------------------------------------------------------------------*/
(0023) void LCD_init (void);
(0024) void LCD_en_write (void);
(0025) void LCD_write_char (unsigned command,unsigned data);
(0026) void LCD_set_xy (unsigned char x, unsigned char y);
(0027) void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);
(0028) void delay_nus (unsigned int n);
(0029) void delay_nms (unsigned int n);
(0030) /*unsigned char time[0][0]=10;
(0031) unsigned char time[0][1]=55;
(0032) unsigned char time[0][2]=23;*/
(0033) unsigned char alarmfalg=1;
(0034) unsigned char mo=0;
(0035) unsigned char time[10][3]={9,5,8,0,56,10,0,0,13,0,0,12,0,0,10,0,0,11};
(0036) unsigned char change=10;
(0037)
(0038) #define DS1302_CE 4 //PB4 SS 必须设为输出 ----DS1302 pin5
(0039)
(0040) //宏定义
(0041) #define EnDS1302 PORTB|= (1<<DS1302_CE) // 置CE为高电平,使能SPI接口
(0042) #define DiDS1302 PORTB&=~(1<<DS1302_CE) // 置CE为低电平,关闭SPI接口
(0043)
(0044) //函数声明+
(0045) void init_SPI(void); //初始化SPI接口
(0046) //unsigned char check_RTC(void); //检测DS1302
(0047) //void init_RTC(void); //初始化DS1302
(0048) void read_date(void); //读取当前时间并解释
(0049) extern unsigned char date_init[8]={0x50, //59秒
(0050) 0x27, //59分
(0051) 0x3, //23时 24小时制
(0052) 0x15, //06日
(0053) 0x04, //10月
(0054) 0x06, //星期四
(0055) 0x06, //2005年
(0056) 0x80 //写保护,
(0057) };
(0058) extern unsigned char CURDATE[7];
(0059) unsigned char sCURDATE[]=" ";
(0060) extern unsigned char sWEEK[];
(0061) unsigned char date;
(0062) unsigned char temp_1302[7];
(0063) //全局变量声明
(0064)
(0065)
(0066) /*-----------------------------------------------------------------------
(0067) 延时函数
(0068) 系统时钟:8M
(0069) -----------------------------------------------------------------------*/
(0070) void delay_1us(void) //1us延时函数
(0071) {
(0072) asm("nop");
_delay_1us:
00DB 0000 NOP
(0073) asm("nop");
00DC 0000 NOP
(0074) asm("nop");
00DD 0000 NOP
(0075) asm("nop");
00DE 0000 NOP
00DF 9508 RET
_delay_nus:
i --> R20
n --> R22
00E0 940E072D CALL push_gset2
00E2 01B8 MOVW R22,R16
(0076) }
(0077)
(0078) void delay_nus(unsigned int n) //N us延时函数
(0079) {
(0080) unsigned int i=0;
00E3 2744 CLR R20
00E4 2755 CLR R21
(0081) for (i=0;i<n;i++)
00E5 C003 RJMP 0x00E9
(0082) delay_1us();
00E6 DFF4 RCALL _delay_1us
00E7 5F4F SUBI R20,0xFF
00E8 4F5F SBCI R21,0xFF
00E9 1746 CP R20,R22
00EA 0757 CPC R21,R23
00EB F3D0 BCS 0x00E6
00EC 940E071B CALL pop_gset2
00EE 9508 RET
(0083) }
(0084)
(0085) void delay_1ms(void) //1ms延时函数
(0086) {
(0087) unsigned int i;
(0088) for (i=0;i<1142;i++);
_delay_1ms:
i --> R16
00EF 2700 CLR R16
00F0 2711 CLR R17
00F1 C002 RJMP 0x00F4
00F2 5F0F SUBI R16,0xFF
00F3 4F1F SBCI R17,0xFF
00F4 3706 CPI R16,0x76
00F5 E0E4 LDI R30,4
00F6 071E CPC R17,R30
00F7 F3D0 BCS 0x00F2
00F8 9508 RET
_delay_nms:
i --> R20
n --> R22
00F9 940E072D CALL push_gset2
00FB 01B8 MOVW R22,R16
(0089) }
(0090)
(0091) void delay_nms(unsigned int n) //N ms延时函数
(0092) {
(0093) unsigned int i=0;
00FC 2744 CLR R20
00FD 2755 CLR R21
(0094) for (i=0;i<n;i++)
00FE C003 RJMP 0x0102
(0095) delay_1ms();
00FF DFEF RCALL _delay_1ms
0100 5F4F SUBI R20,0xFF
0101 4F5F SBCI R21,0xFF
0102 1746 CP R20,R22
0103 0757 CPC R21,R23
0104 F3D0 BCS 0x00FF
0105 940E071B CALL pop_gset2
0107 9508 RET
_delay:
i --> R20
n --> R22
0108 940E072D CALL push_gset2
010A 01B8 MOVW R22,R16
(0096) }
(0097)
(0098) void delay(unsigned int n)//延时n毫秒
(0099) {
(0100) unsigned int i;
(0101) for (i=0;i<n;i++)//执行n次1毫秒延时
010B 2744 CLR R20
010C 2755 CLR R21
010D C003 RJMP 0x0111
(0102) delay_1ms();
010E DFE0 RCALL _delay_1ms
010F 5F4F SUBI R20,0xFF
0110 4F5F SBCI R21,0xFF
0111 1746 CP R20,R22
0112 0757 CPC R21,R23
0113 F3D0 BCS 0x010E
0114 940E071B CALL pop_gset2
0116 9508 RET
_change_1302:
j --> R20
i --> R22
p --> R16
0117 940E072D CALL push_gset2
(0103) }
(0104) char change_1302(char*p)
(0105) {
(0106) unsigned char i,j;
(0107) j=*p&0x0F;
0119 01F8 MOVW R30,R16
011A 8140 LDD R20,Z+0
011B 704F ANDI R20,0xF
(0108) i=(*p>>4)&0x0f;
011C 8160 LDD R22,Z+0
011D 9562 SWAP R22
011E 706F ANDI R22,0xF
011F 706F ANDI R22,0xF
(0109) *p=i*10+j;
0120 E08A LDI R24,0xA
0121 9F86 MUL R24,R22
0122 2C20 MOV R2,R0
0123 0E24 ADD R2,R20
0124 8220 STD Z+0,R2
(0110) return *p;
0125 8100 LDD R16,Z+0
0126 940E071B CALL pop_gset2
0128 9508 RET
(0111)
(0112) }
(0113)
(0114)
(0115) //初始化SPI接口
(0116) void init_SPI(void)
(0117) {
(0118) SPCR = (1<<SPE)|(1<<MSTR)|(1<<DORD)|(1<<SPR0)|(1<<SPR1);
_init_SPI:
0129 E783 LDI R24,0x73
012A B98D OUT 0x0D,R24
012B 9508 RET
_Single_SPI:
rdata --> Y+0
wdata --> R20
command --> R22
012C 940E072D CALL push_gset2
012E 2F42 MOV R20,R18
012F 2F60 MOV R22,R16
0130 9721 SBIW R28,1
(0119) // 使能SPI接口,主机模式,LSB低位在先,模式0,16分频,SPI时钟约460KHz
(0120)
(0121) }
(0122) /*-----------------------------------------------------------------------
(0123) Single_SPI : 使用SPI接口读写数据到DS1302
(0124)
(0125) 输入参数: command: 命令选择;
(0126) wdata: 写入的数据;
(0127) 返回值 rdata: 读回的数据;
(0128) (SPI的收发是同时进行的)
(0129) -----------------------------------------------------------------------*/
(0130) unsigned char Single_SPI(unsigned char command,unsigned char wdata)
(0131) {
(0132) char rdata;
(0133) EnDS1302; // 使能LCD
0131 9AC4 SBI 0x18,4
(0134) delay_nus(10);
0132 E00A LDI R16,0xA
0133 E010 LDI R17,0
0134 DFAB RCALL _delay_nus
(0135) SPDR = command; // 传送命令到SPI寄存器
0135 B96F OUT 0x0F,R22
(0136) while(!(SPSR&(1<<SPIF)))
0136 9B77 SBIS 0x0E,7
0137 CFFE RJMP 0x0136
(0137) ;
(0138)
(0139) delay_nus(10);
0138 E00A LDI R16,0xA
0139 E010 LDI R17,0
013A DFA5 RCALL _delay_nus
(0140) SPDR = wdata;
013B B94F OUT 0x0F,R20
(0141) delay_nus(10); // 传送数据到SPI寄存器
013C E00A LDI R16,0xA
013D E010 LDI R17,0
013E DFA1 RCALL _delay_nus
(0142) while(!(SPSR&(1<<SPIF)))
013F 9B77 SBIS 0x0E,7
0140 CFFE RJMP 0x013F
(0143) ;
(0144)
(0145) rdata=SPDR; // 读取数据
0141 B02F IN R2,0x0F
0142 8228 STD Y+0,R2
(0146) delay_nus(10);
0143 E00A LDI R16,0xA
0144 E010 LDI R17,0
0145 DF9A RCALL _delay_nus
(0147) DiDS1302; // 关断LCD SPI通讯
0146 98C4 CBI 0x18,4
(0148) delay_nus(10);
0147 E00A LDI R16,0xA
0148 E010 LDI R17,0
0149 DF96 RCALL _delay_nus
(0149) change_1302(& rdata);
014A 018E MOVW R16,R28
014B DFCB RCALL _change_1302
(0150) return rdata;
014C 8108 LDD R16,Y+0
014D 9621 ADIW R28,1
014E 940E071B CALL pop_gset2
0150 9508 RET
_Burst_SPI:
prdata --> R20
pwdata --> R22
len --> R10
CMD --> R12
0151 940E0729 CALL push_gset4
0153 2EA2 MOV R10,R18
0154 2EC0 MOV R12,R16
0155 8568 LDD R22,Y+8
0156 8579 LDD R23,Y+9
0157 854A LDD R20,Y+10
0158 855B LDD R21,Y+11
(0151) }
(0152)
(0153) /*-----------------------------------------------------------------------
(0154) Burst_SPI : 使用SPI接口读写一批数据到DS1302
(0155)
(0156) 输入参数: CMD: 选择Clock/RAM,选择读写
(0157) lenth: 数据长度
(0158) pwdata: 写入数据的缓冲区;
(0159) prdata: 读回数据的缓冲区;
(0160) (SPI的收发是同时进行的)
(0161) 读CLOCK的数据从SECOND寄存器开始,到CONTROL寄存器,最大8字节
(0162) 写CLOCK的数据必须一次写完8个字节
(0163) 读写RAM的数据从 RAM0地址开始,到RAM30地址,最大31字节
(0164) -----------------------------------------------------------------------*/
(0165) void Burst_SPI(unsigned char CMD,unsigned char len,
(0166) unsigned char *pwdata,unsigned char *prdata)
(0167) {
(0168) //unsigned char *prdata;
(0169) //*prdata=*temp[0];
(0170) EnDS1302; // 使能SPI通讯
0159 9AC4 SBI 0x18,4
(0171) delay_nus(10);
015A E00A LDI R16,0xA
015B E010 LDI R17,0
015C DF83 RCALL _delay_nus
(0172) SPDR=CMD; // 传送命令到SPI寄存器
015D B8CF OUT 0x0F,R12
(0173) while(!(SPSR&(1<<SPIF)))
015E 9B77 SBIS 0x0E,7
015F CFFE RJMP 0x015E
(0174) ;
(0175) delay_nus(10);
0160 E00A LDI R16,0xA
0161 E010 LDI R17,0
0162 DF7D RCALL _delay_nus
0163 C00A RJMP 0x016E
(0176) while (len--)
(0177) {
(0178) SPDR = *pwdata++; // 传送数据到SPI寄存器
0164 01FB MOVW R30,R22
0165 9021 LD R2,Z+
0166 01BF MOVW R22,R30
0167 B82F OUT 0x0F,R2
(0179) while(!(SPSR&(1<<SPIF)))
0168 9B77 SBIS 0x0E,7
0169 CFFE RJMP 0x0168
(0180) ;
(0181) *prdata++=SPDR; // 读取数据
016A B02F IN R2,0x0F
016B 01FA MOVW R30,R20
016C 9221 ST R2,Z+
016D 01AF MOVW R20,R30
016E 2C2A MOV R2,R10
016F 2433 CLR R3
0170 2D82 MOV R24,R2
0171 5081 SUBI R24,1
0172 2EA8 MOV R10,R24
0173 2022 TST R2
0174 F779 BNE 0x0164
(0182) };
(0183) DiDS1302; // 关断SPI通讯
0175 98C4 CBI 0x18,4
(0184) sCURDATE[0]=change_1302(&temp_1302[0]);
0176 E208 LDI R16,0x28
0177 E011 LDI R17,1
0178 DF9E RCALL _change_1302
0179 93000089 STS sCURDATE,R16
(0185) sCURDATE[1]=change_1302(&temp_1302[1]);
017B E209 LDI R16,0x29
017C E011 LDI R17,1
017D DF99 RCALL _change_1302
017E 9300008A STS sCURDATE+1,R16
(0186) sCURDATE[2]=change_1302(&temp_1302[2]);
0180 E20A LDI R16,0x2A
0181 E011 LDI R17,1
0182 DF94 RCALL _change_1302
0183 9300008B STS sCURDATE+2,R16
(0187) sCURDATE[3]=change_1302(&temp_1302[3]);
0185 E20B LDI R16,0x2B
0186 E011 LDI R17,1
0187 DF8F RCALL _change_1302
0188 9300008C STS sCURDATE+3,R16
(0188) sCURDATE[4]=change_1302(&temp_1302[4]);
018A E20C LDI R16,0x2C
018B E011 LDI R17,1
018C DF8A RCALL _change_1302
018D 9300008D STS 0x8D,R16
(0189) sCURDATE[5]=change_1302(&temp_1302[5]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -