📄 avrstudy.lst
字号:
0231 2433 CLR R3
0232 0DE2 ADD R30,R2
0233 1DF3 ADC R31,R3
0234 E680 LDI R24,0x60
0235 E090 LDI R25,0
0236 0FE8 ADD R30,R24
0237 1FF9 ADC R31,R25
0238 8100 LDD R16,Z+0
0239 DF93 RCALL _WriteCommand
023A C020 RJMP 0x025B
(0148) while(*puts != '\0')
(0149) {
(0150) if(col==8)
023B 3068 CPI R22,0x8
023C F411 BNE 0x023F
(0151) {
(0152) col=0;
023D 2766 CLR R22
(0153) row++;
023E 94A3 INC R10
(0154) }
(0155) if(row==4) row=0;
023F 2D8A MOV R24,R10
0240 3084 CPI R24,4
0241 F409 BNE 0x0243
0242 24AA CLR R10
(0156) WriteCommand(AC_TABLE[8*row+col]);
0243 E088 LDI R24,0x8
0244 9D8A MUL R24,R10
0245 01F0 MOVW R30,R0
0246 2E26 MOV R2,R22
0247 2433 CLR R3
0248 0DE2 ADD R30,R2
0249 1DF3 ADC R31,R3
024A E680 LDI R24,0x60
024B E090 LDI R25,0
024C 0FE8 ADD R30,R24
024D 1FF9 ADC R31,R25
024E 8100 LDD R16,Z+0
024F DF7D RCALL _WriteCommand
(0157) WriteData(*puts); //一个汉字的ASC码是一个16位的,所以要写入两个字节
0250 01FA MOVW R30,R20
0251 8100 LDD R16,Z+0
0252 DF89 RCALL _WriteData
(0158) puts++;
0253 5F4F SUBI R20,0xFF
0254 4F5F SBCI R21,0xFF
(0159) WriteData(*puts);
0255 01FA MOVW R30,R20
0256 8100 LDD R16,Z+0
0257 DF84 RCALL _WriteData
(0160) puts++;
0258 5F4F SUBI R20,0xFF
0259 4F5F SBCI R21,0xFF
(0161) col++;
025A 9563 INC R22
025B 01FA MOVW R30,R20
025C 8020 LDD R2,Z+0
025D 2022 TST R2
025E F6E1 BNE 0x023B
025F D8A3 RCALL pop_gset3
0260 9508 RET
_PutBMP:
k --> R20
x --> R22
j --> R14
y --> R12
i --> R10
puts --> Y+10
0261 931A ST R17,-Y
0262 930A ST R16,-Y
0263 D8A5 RCALL push_gset5
(0162) }
(0163) }
(0164) //========写入一屏图片128*64=======
(0165) void PutBMP(unsigned char *puts)
(0166) {
(0167) unsigned char x,y,i,j,k;
(0168) x=0x80;
0264 E860 LDI R22,0x80
(0169) WriteCommand(0x34); //关图显
0265 E304 LDI R16,0x34
0266 DF66 RCALL _WriteCommand
(0170) for(k=0;k<2;k++)
0267 2744 CLR R20
0268 C01B RJMP 0x0284
(0171) {
(0172) y=0x80;
0269 E880 LDI R24,0x80
026A 2EC8 MOV R12,R24
(0173) for(j=0;j<32;j++)
026B 24EE CLR R14
026C C012 RJMP 0x027F
(0174) {
(0175) WriteCommand(y); //写入列地址
026D 2D0C MOV R16,R12
026E DF5E RCALL _WriteCommand
(0176) WriteCommand(x); //写入行地址
026F 2F06 MOV R16,R22
0270 DF5C RCALL _WriteCommand
(0177) for(i=0;i<16;i++)
0271 24AA CLR R10
0272 C007 RJMP 0x027A
(0178) {
(0179) WriteData(*(puts++));
0273 85EA LDD R30,Y+10
0274 85FB LDD R31,Y+11
0275 9101 LD R16,Z+
0276 87FB STD Y+11,R31
0277 87EA STD Y+10,R30
0278 DF63 RCALL _WriteData
0279 94A3 INC R10
027A 2D8A MOV R24,R10
027B 3180 CPI R24,0x10
027C F3B0 BCS 0x0273
(0180) }
(0181) y++;
027D 94C3 INC R12
027E 94E3 INC R14
027F 2D8E MOV R24,R14
0280 3280 CPI R24,0x20
0281 F358 BCS 0x026D
(0182) }
(0183) x=0x88;
0282 E868 LDI R22,0x88
0283 9543 INC R20
0284 3042 CPI R20,2
0285 F318 BCS 0x0269
(0184) }
(0185) WriteCommand(0x36); //开图显
0286 E306 LDI R16,0x36
0287 DF45 RCALL _WriteCommand
0288 D87E RCALL pop_gset5
0289 9622 ADIW R28,2
028A 9508 RET
_Delayus:
i --> R20
US --> R22
028B D883 RCALL push_gset2
028C 01B8 MOVW R22,R16
FILE: E:\AVR学习专区\AVR学习板\ds1302.c
(0001) /****************************************************************************************
(0002) DS1302的mega8控制程序
(0003)
(0004) 程序功能:该程序是用AVR来控制对ds1302
(0005) 读写信号等的操作.
(0006) 硬件连接:分配PC1=SCLK,PC2=I/O,PC3=RST
(0007) 三个I/O口分别作为时钟、数据、复位
(0008) 的控制。
(0009) 显示部分用12864液晶来显示时时时间
(0010) 作者:张国旗
(0011) 2008年12月31号
(0012) ****************************************************************************************/
(0013) #define uchar unsigned char
(0014) #define uint unsigned int
(0015) #define TRUE 1
(0016) #define FALSE 0
(0017) //=========RTC常量=================
(0018) #define RTC_DDR DDRC
(0019) #define RTC_PORT PORTC
(0020) #define RTC_CLK PC1 //时钟
(0021) #define RTC_DATA PC2 //数据
(0022) #define RTC_CS PC3 //复位
(0023) //============命令=================
(0024) #define RD 0x01
(0025) #define WR 0x00
(0026) #define C_SEC 0x80 //秒
(0027) #define C_MIN 0x82 //分
(0028) #define C_HR 0x84 //时
(0029) #define C_DAY 0x86 //日
(0030) #define C_MTH 0x88 //月
(0031) #define C_WK 0x8A //星期 DATE
(0032) #define C_YR 0x8C //年
(0033) #define C_WP 0x8E //控制(写保护)
(0034) #define C_CHARGE 0x90 //涓流充电
(0035) #define C_BURST 0xBE //时钟多字节
(0036) //===========配置================
(0037) #define CLK_HALT 0x80 //停止时钟控制位 SECOND bit7
(0038) #define CLK_START 0x00 //启动时钟
(0039) #define M12_24 0x80 //12/24小时值选择位 HOUR bit7
(0040) #define PROTECT 0x80 //写保护控制位 CONTROL bit7
(0041) #define UPROTECT 0x00 //写保护控制位 CONTROL bit7
(0042) //=========涓流充电控制常量======
(0043) #define TC_D1R2 0xA5 //high 1 Diode +2K Resistors
(0044) #define TC_D2R8 0xAB //low 2 Diodes+8K Resistors
(0045) #define TC_DISABLED 0x00 //Disabled(TCS<>1010 or DS=00 or RS=00)
(0046) //=========RAM 命令=============
(0047) #define C_RAMBASE 0xC0 //RAM0~RAM30<<1 地址需左移一位
(0048) //===================延时函数========================
(0049) //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
(0050) //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
(0051) //==================================================
(0052) void Delayus(uint US)
(0053) {
(0054) uint i;
(0055) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
028D E005 LDI R16,5
028E E010 LDI R17,0
028F 019B MOVW R18,R22
0290 D860 RCALL empy16s
0291 01B8 MOVW R22,R16
0292 9576 LSR R23
0293 9567 ROR R22
0294 9576 LSR R23
0295 9567 ROR R22
(0056) for( i=0;i<US;i++);
0296 2744 CLR R20
0297 2755 CLR R21
0298 C002 RJMP 0x029B
0299 5F4F SUBI R20,0xFF
029A 4F5F SBCI R21,0xFF
029B 1746 CP R20,R22
029C 0757 CPC R21,R23
029D F3D8 BCS 0x0299
029E D862 RCALL pop_gset2
029F 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
02A0 D86E RCALL push_gset2
(0057) }
(0058) void Delayms(uint MS)
(0059) {
(0060) uint i,j;
(0061) for( i=0;i<MS;i++)
02A1 2744 CLR R20
02A2 2755 CLR R21
02A3 C00B RJMP 0x02AF
(0062) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
02A4 2766 CLR R22
02A5 2777 CLR R23
02A6 C002 RJMP 0x02A9
02A7 5F6F SUBI R22,0xFF
02A8 4F7F SBCI R23,0xFF
02A9 3765 CPI R22,0x75
02AA E0E4 LDI R30,4
02AB 077E CPC R23,R30
02AC F3D0 BCS 0x02A7
02AD 5F4F SUBI R20,0xFF
02AE 4F5F SBCI R21,0xFF
02AF 1740 CP R20,R16
02B0 0751 CPC R21,R17
02B1 F390 BCS 0x02A4
02B2 D84E RCALL pop_gset2
02B3 9508 RET
(0063) }
(0064) /*******************************************
(0065) 函数名称: DS1302_init
(0066) 功 能: 初始化DS1302的数据接口
(0067) 参 数: 无
(0068) 返回值 : 无
(0069) /********************************************/
(0070) void DS1302_portinit(void)
(0071) {
(0072) RTC_DDR|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);
_DS1302_portinit:
02B4 B384 IN R24,0x14
02B5 608E ORI R24,0xE
02B6 BB84 OUT 0x14,R24
02B7 9508 RET
_DS1302_writeB:
i --> R20
byte --> R22
02B8 D856 RCALL push_gset2
02B9 2F60 MOV R22,R16
(0073) //将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
(0074) }
(0075) /*******************************************
(0076) 函数名称: DS1302_writeB
(0077) 功 能: 向DS1302写入一个字节数据(没有RST操作)
(0078) 参 数: byte--要写入的数据
(0079) 返回值 : 无
(0080) ********************************************/
(0081) void DS1302_writeB(uchar byte)
(0082) {
(0083) uchar i;
(0084) for(i=0;i<8;i++) //8位数据计数
02BA 2744 CLR R20
02BB C00C RJMP 0x02C8
(0085) {
(0086) RTC_PORT&=~BIT(RTC_CLK); //拉低时钟端
02BC 98A9 CBI 0x15,1
(0087) if(byte&0x01) //当前位是否是1
02BD FF60 SBRS R22,0
02BE C002 RJMP 0x02C1
(0088) {
(0089) RTC_PORT|=BIT(RTC_DATA); //当前位是1,拉高数据端
02BF 9AAA SBI 0x15,2
(0090) }
02C0 C001 RJMP 0x02C2
(0091) else
(0092) {
(0093) RTC_PORT&=~BIT(RTC_DATA); //当前位是0,拉低数据端
02C1 98AA CBI 0x15,2
(0094) }
(0095) Delayus(10); //调整时钟和脉冲宽度
02C2 E00A LDI R16,0xA
02C3 E010 LDI R17,0
02C4 DFC6 RCALL _Delayus
(0096) RTC_PORT|=BIT(RTC_CLK); //时钟上升沿(DS1302采样数据)
02C5 9AA9 SBI 0x15,1
(0097) byte>>=1; //数据右移1位,为送出新数据位做准备
02C6 9566 LSR R22
02C7 9543 INC R20
02C8 3048 CPI R20,0x8
02C9 F390 BCS 0x02BC
02CA D836 RCALL pop_gset2
02CB 9508 RET
_DS1302_readB:
i --> R20
byte --> R22
02CC D842 RCALL push_gset2
(0098) }
(0099) }
(0100) /*******************************************
(0101) 函数名称: DS1302_readB
(0102) 功 能: 从DS1302读出一个字节数据(没有RST操作)
(0103) 参 数: 无
(0104) 返回值 : byte--读出的数据
(0105) ********************************************/
(0106) uchar DS1302_readB(void)
(0107) {
(0108) uchar i,byte=0;
02CD 2766 CLR R22
(0109) RTC_DDR&=~BIT(RTC_DATA); //将数据端口设置为输入
02CE 98A2 CBI 0x14,2
(0110) RTC_PORT&=~BIT(RTC_DATA); //无上拉电阻
02CF 98AA CBI 0x15,2
(0111) for(i=0;i<8;i++) //8位数据计数
02D0 2744 CLR R20
02D1 C00F RJMP 0x02E1
(0112) {
(0113) byte>>=1; //保存读入的数据位
02D2 9566 LSR R22
(0114) RTC_PORT|=BIT(RTC_CLK); //时钟上升沿
02D3 9AA9 SBI 0x15,1
(0115) Delayus(10); //延时,调整时钟脉冲宽度
02D4 E00A LDI R16,0xA
02D5 E010 LDI R17,0
02D6 DFB4 RCALL _Delayus
(0116) RTC_PORT&=~BIT(RTC_CLK); //时钟下降沿,DS1302输出数据位
02D7 98A9 CBI 0x15,1
(0117) Delayus(10); //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
02D8 E00A LDI R16,0xA
02D9 E010 LDI R17,0
02DA DFB0 RCALL _Delayus
(0118) if(PINC&BIT(RTC_DATA)) //当前位是否是高电平
02DB 9B9A SBIS 0x13,2
02DC C002 RJMP 0x02DF
(0119) {
(0120) byte|=BIT(PB7); //是高电平就将返回数据的当前位置1
02DD 6860 ORI R22,0x80
(0121) }
02DE C001 RJMP 0x02E0
(0122) else
(0123) {
(0124) byte&=~BIT(PB7); //是低电平就将返回数据的当前位置0
02DF 776F ANDI R22,0x7F
02E0 9543 INC R20
02E1 3048 CPI R20,0x8
02E2 F378 BCS 0x02D2
(0125) }
(0126) }
(0127) RTC_DDR|=BIT(RTC_DATA); //最后将数据端口设置为输出
02E3 9AA2 SBI 0x14,2
(0128) return byte; //返回读出的数据
02E4 2F06 MOV R16,R22
02E5 D81B RCALL pop_gset2
02E6 9508 RET
_DS1302_writeD:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -