📄 rtc.lst
字号:
__text_start:
__start:
005A E5CF LDI R28,0x5F
005B E0D4 LDI R29,4
005C BFCD OUT P3D,R28
005D BFDE OUT P3E,R29
005E 51C0 SUBI R28,0x10
005F 40D0 SBCI R29,0
0060 EA0A LDI R16,0xAA
0061 8308 STD R16,0+Y
0062 2400 CLR R0
0063 E7E7 LDI R30,0x77
0064 E0F0 LDI R31,0
0065 E010 LDI R17,0
0066 37E7 CPI R30,0x77
0067 07F1 CPC R31,R17
0068 F011 BEQ 0x006B
0069 9201 ST R0,Z+
006A CFFB RJMP 0x0066
006B 8300 STD R16,0+Z
006C E9EC LDI R30,0x9C
006D E0F0 LDI R31,0
006E E6A0 LDI R26,0x60
006F E0B0 LDI R27,0
0070 E010 LDI R17,0
0071 3BE3 CPI R30,0xB3
0072 07F1 CPC R31,R17
0073 F021 BEQ 0x0078
0074 95C8 LPM
0075 9631 ADIW R30,1
0076 920D ST R0,X+
0077 CFF9 RJMP 0x0071
0078 940E0353 CALL _main
_exit:
007A CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
007B 940E06FF CALL push_gset2
007D 01B8 MOVW R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002) 文件:AVR_PQ1A.H
(0003) 功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005)
(0006) #include <iom16v.h> //包含型号头文件
(0007) #include <macros.h> //包含"位"操作头文件
(0008)
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2 //LED锁存器控制端
(0015) #define SEGLK PA3 //数码管段选锁存器控制端
(0016) #define BITLK PA4 //数码管位选锁存器控制端
(0017)
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功 能: 延时指定微秒(8M晶振)
(0024) 参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值 : 无
(0026) /********************************************/
(0027) void Delayus(uint US)
(0028) {
(0029) uint i;
(0030) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
007E E005 LDI R16,5
007F E010 LDI R17,0
0080 019B MOVW R18,R22
0081 940E06D8 CALL empy16s
0083 01B8 MOVW R22,R16
0084 9576 LSR R23
0085 9567 ROR R22
0086 9576 LSR R23
0087 9567 ROR R22
(0031) for( i=0;i<US;i++);
0088 2744 CLR R20
0089 2755 CLR R21
008A C002 RJMP 0x008D
008B 5F4F SUBI R20,0xFF
008C 4F5F SBCI R21,0xFF
008D 1746 CP R20,R22
008E 0757 CPC R21,R23
008F F3D8 BCS 0x008B
(0032) }
0090 940E0707 CALL pop_gset2
0092 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
0093 940E06FF CALL push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功 能: 延时指定毫秒(8M晶振)
(0036) 参 数: MS--延时的毫秒数
(0037) 返回值 : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)
(0040) {
(0041) uint i,j;
(0042) for( i=0;i<MS;i++)
0095 2744 CLR R20
0096 2755 CLR R21
0097 C00B RJMP 0x00A3
(0043) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
0098 2766 CLR R22
0099 2777 CLR R23
009A C002 RJMP 0x009D
009B 5F6F SUBI R22,0xFF
009C 4F7F SBCI R23,0xFF
009D 3765 CPI R22,0x75
009E E0E4 LDI R30,4
009F 077E CPC R23,R30
00A0 F3D0 BCS 0x009B
00A1 5F4F SUBI R20,0xFF
00A2 4F5F SBCI R21,0xFF
00A3 1740 CP R20,R16
00A4 0751 CPC R21,R17
00A5 F390 BCS 0x0098
(0044) }
00A6 940E0707 CALL pop_gset2
00A8 9508 RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功 能: 初始化实验板,关闭全部功能
(0048) 参 数: 无
(0049) 返回值 : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) DDRA=0xFF; //将四个IO口全部配置为输出
_Board_init:
00A9 EF8F LDI R24,0xFF
00AA BB8A OUT P1A,R24
(0054) DDRB=0xFF;
00AB BB87 OUT P17,R24
(0055) DDRC=0xFF;
00AC BB84 OUT P14,R24
(0056) DDRD=0xFF;
00AD BB81 OUT P11,R24
(0057)
(0058) SPCR=0x00; //还原SPI口,使其为正常端口
00AE 2422 CLR R2
00AF B82D OUT P0D,R2
(0059)
(0060) PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
00B0 9ADE SBI P1B,6
(0061) PORTC&=~BIT(PC6); //(RELAY)初始化继电器为常闭连接状态
00B1 98AE CBI P15,6
(0062) PORTA&=~BIT(PA1); //关闭SPI总线DA
00B2 98D9 CBI P1B,1
(0063) PORTB=0xFF; //关闭LED
00B3 BB88 OUT P18,R24
(0064) PORTA|=BIT(LEDLK); //锁存数据,使LED熄灭
00B4 9ADA SBI P1B,2
(0065) Delayus(5);
00B5 E005 LDI R16,5
00B6 E010 LDI R17,0
00B7 DFC3 RCALL _Delayus
(0066) PORTA&=~BIT(LEDLK);
00B8 98DA CBI P1B,2
(0067)
(0068) PORTB=0x00; //输出段选
00B9 2422 CLR R2
00BA BA28 OUT P18,R2
(0069) PORTA|=BIT(SEGLK);
00BB 9ADB SBI P1B,3
(0070) Delayus(50);
00BC E302 LDI R16,0x32
00BD E010 LDI R17,0
00BE DFBC RCALL _Delayus
(0071) PORTA&=~BIT(SEGLK);
00BF 98DB CBI P1B,3
(0072)
(0073) PORTB=0xFF; //输出位选
00C0 EF8F LDI R24,0xFF
00C1 BB88 OUT P18,R24
(0074) PORTA|=BIT(BITLK);
00C2 9ADC SBI P1B,4
(0075) Delayus(50);
00C3 E302 LDI R16,0x32
00C4 E010 LDI R17,0
00C5 DFB5 RCALL _Delayus
(0076) PORTA&=~BIT(BITLK);
00C6 98DC CBI P1B,4
(0077)
(0078) PORTD=0xFF;
00C7 EF8F LDI R24,0xFF
00C8 BB82 OUT P12,R24
(0079) PORTA|=BIT(PA7);
00C9 9ADF SBI P1B,7
(0080) Delayus(50);
00CA E302 LDI R16,0x32
00CB E010 LDI R17,0
00CC DFAE RCALL _Delayus
(0081) PORTA&=~BIT(PA7);
00CD 98DF CBI P1B,7
(0082)
(0083)
(0084) }
00CE 9508 RET
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC\YJ1602.C
(0001) /*******************************************
(0002) 文件:YJ1602.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:驱动开发板上的1602液晶
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h> //包含型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include <stdio.h> //标准输入输出头文件
(0012)
(0013) /*******************************************
(0014) 函数名称: LCD1602_portini
(0015) 功 能: 初始化1602液晶用到的IO口
(0016) 参 数: 无
(0017) 返回值 : 无
(0018) /********************************************/
(0019) void LCD1602_portini(void)
(0020) {
(0021) LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
_LCD1602_portini:
00CF B381 IN R24,P11
00D0 6780 ORI R24,0x70
00D1 BB81 OUT P11,R24
(0022) LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
00D2 B387 IN R24,P17
00D3 6F8F ORI R24,0xFF
00D4 BB87 OUT P17,R24
(0023) }
00D5 9508 RET
_LCD1602_readbyte:
dByte --> R20
DatCmd --> R20
00D6 940E06E8 CALL push_gset1
00D8 2F40 MOV R20,R16
(0024) /*******************************************
(0025) 函数名称: LCD1602_readbyte
(0026) 功 能: 从1602液晶读出一个字节数据或者指令
(0027) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0028) 返回值 : dByte--读回的数据或者指令
(0029) /********************************************/
(0030) uchar LCD1602_readbyte(uchar DatCmd)
(0031) {
(0032) uchar dByte;
(0033) if (DatCmd == iCmd) //指令操作
00D9 2344 TST R20
00DA F411 BNE 0x00DD
(0034) LCDa_CLR_RS;
00DB 9894 CBI P12,4
00DC C001 RJMP 0x00DE
(0035) else
(0036) LCDa_SET_RS;
00DD 9A94 SBI P12,4
(0037)
(0038) LCDa_SET_RW; //读操作
00DE 9A95 SBI P12,5
(0039) LCDa_SET_E;
00DF 9A96 SBI P12,6
(0040) LCDa_DATA_DDR=0x00; //数据总线定义为输入
00E0 2422 CLR R2
00E1 BA27 OUT P17,R2
(0041) dByte=LCDa_DI; //读数据或者指令
00E2 B346 IN R20,P16
(0042) Delayms(1); //时序调整
00E3 E001 LDI R16,1
00E4 E010 LDI R17,0
00E5 DFAD RCALL _Delayms
(0043) LCDa_CLR_E;
00E6 9896 CBI P12,6
(0044) LCDa_DATA_DDR|=0xff; //数据总线还原为输出
00E7 B387 IN R24,P17
00E8 6F8F ORI R24,0xFF
00E9 BB87 OUT P17,R24
(0045) return dByte;
00EA 2F04 MOV R16,R20
00EB 940E06EB CALL pop_gset1
00ED 9508 RET
_LCD1602_sendbyte:
dByte --> R20
DatCmd --> R22
00EE 940E06FF CALL push_gset2
00F0 2F42 MOV R20,R18
00F1 2F60 MOV R22,R16
(0046) }
(0047) /*******************************************
(0048) 函数名称: LCD1602_sendbyte
(0049) 功 能: 向1602液晶写入一个字节数据或者指令
(0050) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0051) dByte--为写入1602的数据或者指令
(0052) 返回值 : 无
(0053) /********************************************/
(0054) void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
(0055) {
(0056) if (DatCmd == iCmd) //指令操作
00F2 2366 TST R22
00F3 F411 BNE 0x00F6
(0057) LCDa_CLR_RS;
00F4 9894 CBI P12,4
00F5 C001 RJMP 0x00F7
(0058) else
(0059) LCDa_SET_RS;
00F6 9A94 SBI P12,4
(0060)
(0061) LCDa_CLR_RW; //写操作
00F7 9895 CBI P12,5
(0062) LCDa_SET_E;
00F8 9A96 SBI P12,6
(0063) LCDa_DO = dByte; //写入数据
00F9 BB48 OUT P18,R20
(0064) Delayms(1);
00FA E001 LDI R16,1
00FB E010 LDI R17,0
00FC DF96 RCALL _Delayms
(0065) LCDa_CLR_E;
00FD 9896 CBI P12,6
(0066) }
00FE 940E0707 CALL pop_gset2
0100 9508 RET
_LCD1602_sendstr:
ptString --> R20
0101 940E06E8 CALL push_gset1
0103 01A8 MOVW R20,R16
(0067) /*******************************************
(0068) 函数名称: LCD1602_sendstr
(0069) 功 能: 向1602液晶写入一个字符串
(0070) 参 数: ptString--字符串指针
(0071) 返回值 : 无
(0072) /********************************************/
(0073) void LCD1602_sendstr(uchar *ptString)
(0074) {
0104 C005 RJMP 0x010A
(0075) while((*ptString)!='\0') //字符串未结束
(0076) {
(0077) LCD1602_sendbyte(iDat, *ptString++);
0105 01FA MOVW R30,R20
0106 9121 LD R18,Z+
0107 01AF MOVW R20,R30
0108 E001 LDI R16,1
0109 DFE4 RCALL _LCD1602_sendbyte
010A 01FA MOVW R30,R20
010B 8020 LDD R2,0+Z
010C 2022 TST R2
010D F7B9 BNE 0x0105
(0078) }
(0079) }
010E 940E06EB CALL pop_gset1
0110 9508 RET
(0080) /*******************************************
(0081) 函数名称: LCD1602_clear
(0082) 功 能: 1602液晶清屏
(0083) 参 数: 无
(0084) 返回值 : 无
(0085) /********************************************/
(0086) void LCD1602_clear(void)
(0087) {
(0088) LCD1602_sendbyte(iCmd,LCDa_CLS);
_LCD1602_clear:
0111 E021 LDI R18,1
0112 2700 CLR R16
0113 DFDA RCALL _LCD1602_sendbyte
(0089) Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
0114 E002 LDI R16,2
0115 E010 LDI R17,0
(0090) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -