⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 time_8515.lst

📁 AVR开发板例子源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
__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 + -