📄 time_8515.lis
字号:
.module time_8515.c
.area data(ram, con, rel)
0000 _buf_time::
0000 .blkb 33
.area idata
0000 204461793A323030372D30312D313620 .byte 32,'D,'a,'y,58,50,48,48,55,45,48,49,45,49,54,32
0010 54696D653A2030303A30303A30302020 .byte 'T,'i,'m,'e,58,32,48,48,58,48,48,58,48,48,32,32
0020 00 .byte 0
.area data(ram, con, rel)
0021 .dbfile E:\iccavr代码\实验19_其他芯片使用_8515\time_8515.c
0021 .dbsym e buf_time _buf_time A[33:33]c
0021 _buf_write::
0021 .blkb 2
.area idata
0021 0120 .byte 1,32
.area data(ram, con, rel)
0023 .dbfile E:\iccavr代码\实验19_其他芯片使用_8515\time_8515.c
0023 .blkb 2
.area idata
0023 0116 .byte 1,22
.area data(ram, con, rel)
0025 .dbfile E:\iccavr代码\实验19_其他芯片使用_8515\time_8515.c
0025 .blkb 2
.area idata
0025 0102 .byte 1,2
.area data(ram, con, rel)
0027 .dbfile E:\iccavr代码\实验19_其他芯片使用_8515\time_8515.c
0027 .blkb 2
.area idata
0027 0700 .byte 7,0
.area data(ram, con, rel)
0029 .dbfile E:\iccavr代码\实验19_其他芯片使用_8515\time_8515.c
0029 .dbsym e buf_write _buf_write A[8:8]c
.area text(rom, con, rel)
0000 .dbfile E:\iccavr代码\实验19_其他芯片使用_8515\time_8515.c
0000 .dbfunc e DelaymS _DelaymS fV
0000 ; j -> R20,R21
0000 ; k -> R22,R23
0000 ; i -> R16,R17
.even
0000 _DelaymS::
0000 00D0 rcall push_gset2
0002 .dbline -1
0002 .dbline 47
0002 ; //******************************************************************************
0002 ; // *
0002 ; // FileName : 实验板time_1302.c ICCAVR V6.31A编译 *
0002 ; // Function : 实时时钟DS1302的读写操作应用 *
0002 ; // Date : 2007-01-16 *
0002 ; // Version : 1.0 *
0002 ; // *
0002 ; // Author : 开关电源 hongtusy@163.com *
0002 ; // Company : 电子信息技术咨询网 http://www.itsn.cn *
0002 ; // *
0002 ; //***************************描述与记事*****************************************
0002 ; //实验板的AVR程序,实时时钟DS1302应用,将实时时间通过串口打印到PC机上,并通过1602LCD
0002 ; //显示出来。只要不在主电源掉电下拆除电池,LCD将可以一直显示当前的实时时间。
0002 ; //接线定义:串口PD0(SW6-7)-RXD PD1(SW6-8)-TXD ,SW3-8为系统复位端。
0002 ; // SW5-1=PA3时钟CLK,SW5-2=PA4数据DAT,SW5-3=PA5复位RET。
0002 ; //PC(SW1-1~8)为LCD数据端,PD4(SW2-1),5(SW2-2),6(SW2-3) 为RS,R/W,EA脚 SW2-5为背光开关。
0002 ; //记事:本程序旨在对1302驱动的理解与演示,程序适合初学者使用.
0002 ; // 打开串口调试器(可能不能显示汉字)或windows自带的超级终端,调整波特率为9600bps,
0002 ; // 即可用PC观察到当前的时间和日期。
0002 ; //本例子使用片外8MHz晶体(注意熔丝位的设置)。
0002 ; //秒寄存器的最高位在开机时默认是1,代表时钟振荡器停止,必须将其改为0后方可启动时钟。
0002 ; //本实验是为演示实验板上的第二块主芯片ATmega8515而特意安排的。由于8515和主芯片8535的管脚
0002 ; //安排完全兼容,所以平拨开关位置和实验6的实时时钟是一样的。
0002 ; //ATmega8515是我们实验板上安排的第二块主芯片,其性能和8535类似,详见数据手册。
0002 ; //******************************************************************************
0002 ;
0002 ; #include <iom8515v.h> //头文件,ATmega8515单片机的寄存器定义
0002 ; #include <macros.h> //包含有SEI()、CLI()、NOP()、WDR()、等宏定义.
0002 ;
0002 ; typedef unsigned char uchar; //数据类型说明
0002 ; typedef unsigned int uint;
0002 ;
0002 ; uchar buf_time[]=" Day:2007-01-16 Time: 00:00:00 "; //LCD显示用的数组
0002 ;
0002 ; uchar buf_read[8]; //从DS1302读出的时间数据,数据格式为:秒 分 时 日 月 星期 年 写保护字节
0002 ; uchar buf_write[8]={0x01,0x20,0x01,0x16,0x01,0x02,0x07,0x00}; //往DS1302写入的时间数据
0002 ; // 数据格式为:01秒 20分 01时 16日 01月 02星期 07年 00写保护字节
0002 ;
0002 ; /************************************************
0002 ; 函 数 名: DelaymS()
0002 ; 功 能: 毫秒级延时函数
0002 ; 输入参数: 延迟时间/系统晶体
0002 ; 输出参数: 做相应的延迟处理
0002 ; 描 述: /
0002 ; ***********************************************/
0002 ; void DelaymS (uint i) //延时函数,参数i为延时时间
0002 ; {
0002 .dbline 49
0002 ; uint j,k; //双重延时
0002 ; for (j=0;j<i;j++)
0002 4427 clr R20
0004 5527 clr R21
0006 0CC0 rjmp L5
0008 L2:
0008 .dbline 50
0008 ; {
0008 .dbline 51
0008 6627 clr R22
000A 7727 clr R23
000C 02C0 rjmp L9
000E L6:
000E .dbline 51
000E L7:
000E .dbline 51
000E 6F5F subi R22,255 ; offset = 1
0010 7F4F sbci R23,255
0012 L9:
0012 .dbline 51
0012 84EF ldi R24,500
0014 91E0 ldi R25,1
0016 8617 cp R24,R22
0018 9707 cpc R25,R23
001A C8F7 brsh L6
001C .dbline 52
001C L3:
001C .dbline 49
001C 4F5F subi R20,255 ; offset = 1
001E 5F4F sbci R21,255
0020 L5:
0020 .dbline 49
0020 4017 cp R20,R16
0022 5107 cpc R21,R17
0024 88F3 brlo L2
0026 .dbline -2
0026 L1:
0026 00D0 rcall pop_gset2
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbsym r j 20 i
002A .dbsym r k 22 i
002A .dbsym r i 16 i
002A .dbend
002A .dbfunc e write_data _write_data fV
002A ; h -> R20
.even
002A _write_data::
002A 00D0 rcall push_gset1
002C 402F mov R20,R16
002E .dbline -1
002E .dbline 62
002E ; for (k=0;k<=500;k++);
002E ; }
002E ; }
002E ; /********************************************************
002E ; 子程序名: write_data()
002E ; 功 能: 写入一字节LCD数据
002E ; 输入参数: /
002E ; 输出参数: /
002E ; 描 述: /
002E ; ********************************************************/
002E ; void write_data(uchar h)
002E ; {
002E .dbline 63
002E ; PORTC = h; //先将数据送出
002E 45BB out 0x15,R20
0030 .dbline 64
0030 ; PORTD |= (1<<PD4); //RS=1,数据
0030 949A sbi 0x12,4
0032 .dbline 65
0032 ; PORTD &= ~(1<<PD5); //R/W=0,写
0032 9598 cbi 0x12,5
0034 .dbline 66
0034 ; PORTD &= ~(1<<PD6); //EN=0 ,使能,产生一个下降沿。
0034 9698 cbi 0x12,6
0036 .dbline 67
0036 ; DelaymS (1);
0036 01E0 ldi R16,1
0038 10E0 ldi R17,0
003A E2DF rcall _DelaymS
003C .dbline 68
003C ; PORTD |= (1<<PD6); //EN=1 ,除能
003C 969A sbi 0x12,6
003E .dbline -2
003E L10:
003E 00D0 rcall pop_gset1
0040 .dbline 0 ; func end
0040 0895 ret
0042 .dbsym r h 20 c
0042 .dbend
0042 .dbfunc e write_code _write_code fV
0042 ; h -> R20
.even
0042 _write_code::
0042 00D0 rcall push_gset1
0044 402F mov R20,R16
0046 .dbline -1
0046 .dbline 78
0046 ; }
0046 ; /********************************************************
0046 ; 子程序名: write_code()
0046 ; 功 能: 写入一字节LCD指令/地址
0046 ; 输入参数: /
0046 ; 输出参数: /
0046 ; 描 述: /
0046 ; ********************************************************/
0046 ; void write_code(uchar h)
0046 ; {
0046 .dbline 79
0046 ; PORTC = h; //先将地址送出
0046 45BB out 0x15,R20
0048 .dbline 80
0048 ; PORTD &= ~(1<<PD4); //RS=0,命令或数据
0048 9498 cbi 0x12,4
004A .dbline 81
004A ; PORTD &= ~(1<<PD5); //R/W=0,写
004A 9598 cbi 0x12,5
004C .dbline 82
004C ; PORTD &= ~(1<<PD6); //EN=0 ,使能,产生一个下降沿。
004C 9698 cbi 0x12,6
004E .dbline 83
004E ; DelaymS (1);
004E 01E0 ldi R16,1
0050 10E0 ldi R17,0
0052 D6DF rcall _DelaymS
0054 .dbline 84
0054 ; PORTD |= (1<<PD6); //EN=1 ,除能
0054 969A sbi 0x12,6
0056 .dbline -2
0056 L11:
0056 00D0 rcall pop_gset1
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbsym r h 20 c
005A .dbend
005A .dbfunc e init_lcd _init_lcd fV
.even
005A _init_lcd::
005A .dbline -1
005A .dbline 94
005A ; }
005A ; /********************************************************
005A ; 子程序名: init_lcd()
005A ; 功 能: 初始化LCD
005A ; 输入参数: /
005A ; 输出参数: /
005A ; 描 述: /
005A ; ********************************************************/
005A ; void init_lcd(void)
005A ; {
005A .dbline 95
005A ; write_code(0x01); //清除屏幕
005A 01E0 ldi R16,1
005C F2DF rcall _write_code
005E .dbline 96
005E ; write_code(0x38); //功能设定,8位数据口/2行/5*7的点阵
005E 08E3 ldi R16,56
0060 F0DF rcall _write_code
0062 .dbline 97
0062 ; write_code(0b00001111); //显示幕ON,光标ON,闪烁ON
0062 0FE0 ldi R16,15
0064 EEDF rcall _write_code
0066 .dbline 98
0066 ; write_code(0x06); //模式,加1,显示幕ON。
0066 06E0 ldi R16,6
0068 ECDF rcall _write_code
006A .dbline 99
006A ; write_code(0b00000011); //光标回到原点
006A 03E0 ldi R16,3
006C EADF rcall _write_code
006E .dbline -2
006E L12:
006E .dbline 0 ; func end
006E 0895 ret
0070 .dbend
0070 .dbfunc e display_lcd _display_lcd fV
0070 ; i -> R20
0070 ; p -> R22,R23
.even
0070 _display_lcd::
0070 00D0 rcall push_gset2
0072 B801 movw R22,R16
0074 .dbline -1
0074 .dbline 109
0074 ; }
0074 ; /********************************************************
0074 ; 子程序名: display_lcd()
0074 ; 功 能: 刷新显示一屏数据,独立的LCD显示程序,用户将显存内容更新后,只要调用此程序即可更新显示。
0074 ; 输入参数: /
0074 ; 输出参数: /
0074 ; 描 述: 在写一个字符前,先设定显示的位置地址,然后再写数据。系统可以自动地址加一。
0074 ; ********************************************************/
0074 ; void display_lcd(uchar *p)
0074 ; {
0074 .dbline 111
0074 ; uchar i;
0074 ; write_code(0x80); //第一行起始地址,0b10000000B=0x80.
0074 00E8 ldi R16,128
0076 E5DF rcall _write_code
0078 .dbline 112
0078 ; for(i=0;i<16;i++)
0078 4427 clr R20
007A 07C0 rjmp L17
007C L14:
007C .dbline 113
007C .dbline 114
007C E42F mov R30,R20
007E FF27 clr R31
0080 E60F add R30,R22
0082 F71F adc R31,R23
0084 0081 ldd R16,z+0
0086 D1DF rcall _write_data
0088 .dbline 115
0088 L15:
0088 .dbline 112
0088 4395 inc R20
008A L17:
008A .dbline 112
008A 4031 cpi R20,16
008C B8F3 brlo L14
008E .dbline 116
008E ; {
008E ; write_data(p[i]);
008E ; }
008E ; write_code(0xc0); //第二行起始地址,0b11000000B=0xc0.
008E 00EC ldi R16,192
0090 D8DF rcall _write_code
0092 .dbline 117
0092 ; for(i=16;i<32;i++)
0092 40E1 ldi R20,16
0094 07C0 rjmp L21
0096 L18:
0096 .dbline 118
0096 .dbline 119
0096 E42F mov R30,R20
0098 FF27 clr R31
009A E60F add R30,R22
009C F71F adc R31,R23
009E 0081 ldd R16,z+0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -