📄 time_8515.lst
字号:
__text_start:
__start:
0046 E5CF LDI R28,0x5F
0047 E0D2 LDI R29,2
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E8E9 LDI R30,0x89
0050 E0F0 LDI R31,0
0051 E010 LDI R17,0
0052 39E1 CPI R30,0x91
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E6E3 LDI R30,0x63
0059 E0F0 LDI R31,0
005A E6A0 LDI R26,0x60
005B E0B0 LDI R27,0
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 D19F RCALL _main
_exit:
0065 CFFF RJMP _exit
_DelaymS:
j --> R20
k --> R22
i --> R16
0066 D1EA RCALL push_gset2
FILE: E:\iccavr代码\实验19_其他芯片使用_8515\time_8515.c
(0001) //******************************************************************************
(0002) // *
(0003) // FileName : 实验板time_1302.c ICCAVR V6.31A编译 *
(0004) // Function : 实时时钟DS1302的读写操作应用 *
(0005) // Date : 2007-01-16 *
(0006) // Version : 1.0 *
(0007) // *
(0008) // Author : 开关电源 hongtusy@163.com *
(0009) // Company : 电子信息技术咨询网 http://www.itsn.cn *
(0010) // *
(0011) //***************************描述与记事*****************************************
(0012) //实验板的AVR程序,实时时钟DS1302应用,将实时时间通过串口打印到PC机上,并通过1602LCD
(0013) //显示出来。只要不在主电源掉电下拆除电池,LCD将可以一直显示当前的实时时间。
(0014) //接线定义:串口PD0(SW6-7)-RXD PD1(SW6-8)-TXD ,SW3-8为系统复位端。
(0015) // SW5-1=PA3时钟CLK,SW5-2=PA4数据DAT,SW5-3=PA5复位RET。
(0016) //PC(SW1-1~8)为LCD数据端,PD4(SW2-1),5(SW2-2),6(SW2-3) 为RS,R/W,EA脚 SW2-5为背光开关。
(0017) //记事:本程序旨在对1302驱动的理解与演示,程序适合初学者使用.
(0018) // 打开串口调试器(可能不能显示汉字)或windows自带的超级终端,调整波特率为9600bps,
(0019) // 即可用PC观察到当前的时间和日期。
(0020) //本例子使用片外8MHz晶体(注意熔丝位的设置)。
(0021) //秒寄存器的最高位在开机时默认是1,代表时钟振荡器停止,必须将其改为0后方可启动时钟。
(0022) //本实验是为演示实验板上的第二块主芯片ATmega8515而特意安排的。由于8515和主芯片8535的管脚
(0023) //安排完全兼容,所以平拨开关位置和实验6的实时时钟是一样的。
(0024) //ATmega8515是我们实验板上安排的第二块主芯片,其性能和8535类似,详见数据手册。
(0025) //******************************************************************************
(0026)
(0027) #include <iom8515v.h> //头文件,ATmega8515单片机的寄存器定义
(0028) #include <macros.h> //包含有SEI()、CLI()、NOP()、WDR()、等宏定义.
(0029)
(0030) typedef unsigned char uchar; //数据类型说明
(0031) typedef unsigned int uint;
(0032)
(0033) uchar buf_time[]=" Day:2007-01-16 Time: 00:00:00 "; //LCD显示用的数组
(0034)
(0035) uchar buf_read[8]; //从DS1302读出的时间数据,数据格式为:秒 分 时 日 月 星期 年 写保护字节
(0036) uchar buf_write[8]={0x01,0x20,0x01,0x16,0x01,0x02,0x07,0x00}; //往DS1302写入的时间数据
(0037) // 数据格式为:01秒 20分 01时 16日 01月 02星期 07年 00写保护字节
(0038)
(0039) /************************************************
(0040) 函 数 名: DelaymS()
(0041) 功 能: 毫秒级延时函数
(0042) 输入参数: 延迟时间/系统晶体
(0043) 输出参数: 做相应的延迟处理
(0044) 描 述: /
(0045) ***********************************************/
(0046) void DelaymS (uint i) //延时函数,参数i为延时时间
(0047) {
(0048) uint j,k; //双重延时
(0049) for (j=0;j<i;j++)
0067 2744 CLR R20
0068 2755 CLR R21
0069 C00C RJMP 0x0076
(0050) {
(0051) for (k=0;k<=500;k++);
006A 2766 CLR R22
006B 2777 CLR R23
006C C002 RJMP 0x006F
006D 5F6F SUBI R22,0xFF
006E 4F7F SBCI R23,0xFF
006F EF84 LDI R24,0xF4
0070 E091 LDI R25,1
0071 1786 CP R24,R22
0072 0797 CPC R25,R23
0073 F7C8 BCC 0x006D
0074 5F4F SUBI R20,0xFF
0075 4F5F SBCI R21,0xFF
0076 1740 CP R20,R16
0077 0751 CPC R21,R17
0078 F388 BCS 0x006A
0079 D1CF RCALL pop_gset2
007A 9508 RET
_write_data:
h --> R20
007B D1D7 RCALL push_gset1
007C 2F40 MOV R20,R16
(0052) }
(0053) }
(0054) /********************************************************
(0055) 子程序名: write_data()
(0056) 功 能: 写入一字节LCD数据
(0057) 输入参数: /
(0058) 输出参数: /
(0059) 描 述: /
(0060) ********************************************************/
(0061) void write_data(uchar h)
(0062) {
(0063) PORTC = h; //先将数据送出
007D BB45 OUT 0x15,R20
(0064) PORTD |= (1<<PD4); //RS=1,数据
007E 9A94 SBI 0x12,4
(0065) PORTD &= ~(1<<PD5); //R/W=0,写
007F 9895 CBI 0x12,5
(0066) PORTD &= ~(1<<PD6); //EN=0 ,使能,产生一个下降沿。
0080 9896 CBI 0x12,6
(0067) DelaymS (1);
0081 E001 LDI R16,1
0082 E010 LDI R17,0
0083 DFE2 RCALL _DelaymS
(0068) PORTD |= (1<<PD6); //EN=1 ,除能
0084 9A96 SBI 0x12,6
0085 D1D0 RCALL pop_gset1
0086 9508 RET
_write_code:
h --> R20
0087 D1CB RCALL push_gset1
0088 2F40 MOV R20,R16
(0069) }
(0070) /********************************************************
(0071) 子程序名: write_code()
(0072) 功 能: 写入一字节LCD指令/地址
(0073) 输入参数: /
(0074) 输出参数: /
(0075) 描 述: /
(0076) ********************************************************/
(0077) void write_code(uchar h)
(0078) {
(0079) PORTC = h; //先将地址送出
0089 BB45 OUT 0x15,R20
(0080) PORTD &= ~(1<<PD4); //RS=0,命令或数据
008A 9894 CBI 0x12,4
(0081) PORTD &= ~(1<<PD5); //R/W=0,写
008B 9895 CBI 0x12,5
(0082) PORTD &= ~(1<<PD6); //EN=0 ,使能,产生一个下降沿。
008C 9896 CBI 0x12,6
(0083) DelaymS (1);
008D E001 LDI R16,1
008E E010 LDI R17,0
008F DFD6 RCALL _DelaymS
(0084) PORTD |= (1<<PD6); //EN=1 ,除能
0090 9A96 SBI 0x12,6
0091 D1C4 RCALL pop_gset1
0092 9508 RET
(0085) }
(0086) /********************************************************
(0087) 子程序名: init_lcd()
(0088) 功 能: 初始化LCD
(0089) 输入参数: /
(0090) 输出参数: /
(0091) 描 述: /
(0092) ********************************************************/
(0093) void init_lcd(void)
(0094) {
(0095) write_code(0x01); //清除屏幕
_init_lcd:
0093 E001 LDI R16,1
0094 DFF2 RCALL _write_code
(0096) write_code(0x38); //功能设定,8位数据口/2行/5*7的点阵
0095 E308 LDI R16,0x38
0096 DFF0 RCALL _write_code
(0097) write_code(0b00001111); //显示幕ON,光标ON,闪烁ON
0097 E00F LDI R16,0xF
0098 DFEE RCALL _write_code
(0098) write_code(0x06); //模式,加1,显示幕ON。
0099 E006 LDI R16,6
009A DFEC RCALL _write_code
(0099) write_code(0b00000011); //光标回到原点
009B E003 LDI R16,3
009C DFEA RCALL _write_code
009D 9508 RET
_display_lcd:
i --> R20
p --> R22
009E D1B2 RCALL push_gset2
009F 01B8 MOVW R22,R16
(0100) }
(0101) /********************************************************
(0102) 子程序名: display_lcd()
(0103) 功 能: 刷新显示一屏数据,独立的LCD显示程序,用户将显存内容更新后,只要调用此程序即可更新显示。
(0104) 输入参数: /
(0105) 输出参数: /
(0106) 描 述: 在写一个字符前,先设定显示的位置地址,然后再写数据。系统可以自动地址加一。
(0107) ********************************************************/
(0108) void display_lcd(uchar *p)
(0109) {
(0110) uchar i;
(0111) write_code(0x80); //第一行起始地址,0b10000000B=0x80.
00A0 E800 LDI R16,0x80
00A1 DFE5 RCALL _write_code
(0112) for(i=0;i<16;i++)
00A2 2744 CLR R20
00A3 C007 RJMP 0x00AB
(0113) {
(0114) write_data(p[i]);
00A4 2FE4 MOV R30,R20
00A5 27FF CLR R31
00A6 0FE6 ADD R30,R22
00A7 1FF7 ADC R31,R23
00A8 8100 LDD R16,Z+0
00A9 DFD1 RCALL _write_data
00AA 9543 INC R20
00AB 3140 CPI R20,0x10
00AC F3B8 BCS 0x00A4
(0115) }
(0116) write_code(0xc0); //第二行起始地址,0b11000000B=0xc0.
00AD EC00 LDI R16,0xC0
00AE DFD8 RCALL _write_code
(0117) for(i=16;i<32;i++)
00AF E140 LDI R20,0x10
00B0 C007 RJMP 0x00B8
(0118) {
(0119) write_data(p[i]);
00B1 2FE4 MOV R30,R20
00B2 27FF CLR R31
00B3 0FE6 ADD R30,R22
00B4 1FF7 ADC R31,R23
00B5 8100 LDD R16,Z+0
00B6 DFC4 RCALL _write_data
00B7 9543 INC R20
00B8 3240 CPI R20,0x20
00B9 F3B8 BCS 0x00B1
00BA D18E RCALL pop_gset2
00BB 9508 RET
_InputByte:
i --> R20
CD --> R22
00BC D194 RCALL push_gset2
00BD 2F60 MOV R22,R16
(0120) }
(0121) }
(0122) /************************************************
(0123) 函 数 名: InputByte()
(0124) 功 能: 串行写入1字节的数据函数
(0125) 输入参数: /
(0126) 输出参数: /
(0127) 描 述: PA4为数据端,PA3为时钟端,bit0在先,时钟上升沿写入。
(0128) ***********************************************/
(0129) void InputByte (uchar CD)
(0130) {
(0131) uchar i;
(0132) for(i=0;i<8;i++)
00BE 2744 CLR R20
00BF C00C RJMP 0x00CC
(0133) {
(0134) if((CD & (1<<i))==0)
00C0 E001 LDI R16,1
00C1 2F14 MOV R17,R20
00C2 D1A7 RCALL lsl8
00C3 2E26 MOV R2,R22
00C4 2220 AND R2,R16
00C5 F411 BNE 0x00C8
(0135) PORTA &= ~(1<<PA4); //数据端输出0
00C6 98DC CBI 0x1B,4
00C7 C001 RJMP 0x00C9
(0136) else
(0137) PORTA |= (1<<PA4); //否则输出1
00C8 9ADC SBI 0x1B,4
(0138) PORTA |= (1<<PA3); //时钟置高,产生上升沿。
00C9 9ADB SBI 0x1B,3
(0139) PORTA &= ~(1<<PA3); //时钟置低
00CA 98DB CBI 0x1B,3
00CB 9543 INC R20
00CC 3048 CPI R20,0x8
00CD F390 BCS 0x00C0
00CE D17A RCALL pop_gset2
00CF 9508 RET
_OutputByte:
mid --> R20
i --> R22
00D0 D180 RCALL push_gset2
(0140) }
(0141) }
(0142) /************************************************
(0143) 函 数 名: OutputByte
(0144) 功 能: 从DS1302串行读出1字节的数据函数
(0145) 输入参数: /
(0146) 输出参数: /
(0147) 描 述: PA4为数据端,PA3为时钟端,bit0在先,时钟下降沿读出。
(0148) ***********************************************/
(0149) uchar OutputByte (void)
(0150) {
(0151) uchar i,mid=0;
00D1 2744 CLR R20
(0152) for(i=0;i<8;i++)
00D2 2766 CLR R22
00D3 C010 RJMP 0x00E4
(0153) {
(0154) if((PINA & 0x10)==0) //操作的是PA4
00D4 99CC SBIC 0x19,4
00D5 C007 RJMP 0x00DD
(0155) {
(0156) mid &= ~(1<<i); //读取0
00D6 E001 LDI R16,1
00D7 2F16 MOV R17,R22
00D8 D191 RCALL lsl8
00D9 2E20 MOV R2,R16
00DA 9420 COM R2
00DB 2142 AND R20,R2
(0157) }
00DC C004 RJMP 0x00E1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -