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

📄 ds12887.lst

📁 高精度时钟芯片。avr驱动
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    0049 E5CF      LDI	R28,0x5F
    004A E0D4      LDI	R29,4
    004B BFCD      OUT	P3D,R28
    004C BFDE      OUT	P3E,R29
    004D 51C0      SUBI	R28,0x10
    004E 40D0      SBCI	R29,0
    004F EA0A      LDI	R16,0xAA
    0050 8308      STD	R16,0+Y
    0051 2400      CLR	R0
    0052 E9E2      LDI	R30,0x92
    0053 E0F0      LDI	R31,0
    0054 E010      LDI	R17,0
    0055 39E2      CPI	R30,0x92
    0056 07F1      CPC	R31,R17
    0057 F011      BEQ	0x005A
    0058 9201      ST	R0,Z+
    0059 CFFB      RJMP	0x0055
    005A 8300      STD	R16,0+Z
    005B E6E0      LDI	R30,0x60
    005C E0F0      LDI	R31,0
    005D E6A0      LDI	R26,0x60
    005E E0B0      LDI	R27,0
    005F E010      LDI	R17,0
    0060 39E2      CPI	R30,0x92
    0061 07F1      CPC	R31,R17
    0062 F021      BEQ	0x0067
    0063 95C8      LPM
    0064 9631      ADIW	R30,1
    0065 920D      ST	R0,X+
    0066 CFF9      RJMP	0x0060
    0067 940E025F  CALL	_main
_exit:
    0069 CFFF      RJMP	_exit
_Delayus:
  i                    --> R20
  US                   --> R22
    006A 940E02E6  CALL	push_gset2
    006C 01B8      MOVW	R22,R16
FILE: D:\开发板\OK400C\程序\avr程序\OK400C.H
(0001) /*******************************************
(0002)   文件:OK400C.H
(0003)   功能:定义一些OK400C开发板上应用程序用到的常量
(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 PC5	//LED锁存器控制端
(0015) #define SEGLK PC6	//数码管段选锁存器控制端
(0016) #define BITLK PC7	//数码管位选锁存器控制端
(0017) 
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /******************LED点阵对应io口******************/
(0022) #define SDATA_595  PC5   //串行数据输入
(0023) #define SCLK_595   PC6   //移位时钟脉冲
(0024) #define RCK_595    PC7   //输出锁存器控制脉冲
(0025) 
(0026) #define sdat1_595  PC0
(0027) #define sclk1_595  PC1
(0028) #define rck1_595   PC2
(0029) /*******************************************
(0030) 函数名称: Delayus
(0031) 功    能: 延时指定微秒(8M晶振)
(0032) 参    数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0033) 返回值  : 无
(0034) /********************************************/
(0035) void Delayus(uint US)		  
(0036) {
(0037)  uint i;
(0038)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
    006D E005      LDI	R16,5
    006E E010      LDI	R17,0
    006F 019B      MOVW	R18,R22
    0070 940E02BF  CALL	empy16s
    0072 01B8      MOVW	R22,R16
    0073 9576      LSR	R23
    0074 9567      ROR	R22
    0075 9576      LSR	R23
    0076 9567      ROR	R22
(0039)  for( i=0;i<US;i++); 
    0077 2744      CLR	R20
    0078 2755      CLR	R21
    0079 C002      RJMP	0x007C
    007A 5F4F      SUBI	R20,0xFF
    007B 4F5F      SBCI	R21,0xFF
    007C 1746      CP	R20,R22
    007D 0757      CPC	R21,R23
    007E F3D8      BCS	0x007A
(0040) }
    007F 940E02EA  CALL	pop_gset2
    0081 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    0082 940E02E6  CALL	push_gset2
(0041) /*******************************************
(0042) 函数名称: Delayms
(0043) 功    能: 延时指定毫秒(8M晶振)
(0044) 参    数: MS--延时的毫秒数
(0045) 返回值  : 无
(0046) /********************************************/
(0047) void Delayms(uint MS)		  
(0048) {
(0049)  uint i,j;
(0050)  for( i=0;i<MS;i++)
    0084 2744      CLR	R20
    0085 2755      CLR	R21
    0086 C00B      RJMP	0x0092
(0051)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    0087 2766      CLR	R22
    0088 2777      CLR	R23
    0089 C002      RJMP	0x008C
    008A 5F6F      SUBI	R22,0xFF
    008B 4F7F      SBCI	R23,0xFF
    008C 3765      CPI	R22,0x75
    008D E0E4      LDI	R30,4
    008E 077E      CPC	R23,R30
    008F F3D0      BCS	0x008A
    0090 5F4F      SUBI	R20,0xFF
    0091 4F5F      SBCI	R21,0xFF
    0092 1740      CP	R20,R16
    0093 0751      CPC	R21,R17
    0094 F390      BCS	0x0087
(0052) }
    0095 940E02EA  CALL	pop_gset2
    0097 9508      RET
(0053) /*******************************************
(0054) 函数名称: Board_init
(0055) 功    能: 初始化实验板,关闭全部功能
(0056) 参    数: 无
(0057) 返回值  : 无
(0058) /********************************************/
(0059) void Board_init(void)
(0060) {
(0061) 	DDRA=0xFF;	//将四个IO口全部配置为输出
_Board_init:
    0098 EF8F      LDI	R24,0xFF
    0099 BB8A      OUT	P1A,R24
(0062) 	DDRB=0xFF;
    009A BB87      OUT	P17,R24
(0063) 	DDRC=0xFF;
    009B BB84      OUT	P14,R24
(0064) 	DDRD=0xFF;
    009C BB81      OUT	P11,R24
(0065) 
(0066) 	SPCR=0x00;	//还原SPI口,使其为正常端口	
    009D 2422      CLR	R2
    009E B82D      OUT	P0D,R2
(0067) 
(0068) 	PORTC|=BIT(PC3);//(BEEP)关闭蜂鸣器
    009F 9AAB      SBI	P15,3
(0069) 	PORTC&=~BIT(PC1);	  //(RELAY)初始化继电器为常闭连接状态	
    00A0 98A9      CBI	P15,1
(0070) 	PORTA&=~BIT(PA1);	//关闭SPI总线DA
    00A1 98D9      CBI	P1B,1
(0071) 	PORTB=0xFF;	//关闭LED
    00A2 BB88      OUT	P18,R24
(0072) 	PORTA|=BIT(LEDLK);	//锁存数据,使LED熄灭
    00A3 9ADD      SBI	P1B,5
(0073)  	Delayus(5);		
    00A4 E005      LDI	R16,5
    00A5 E010      LDI	R17,0
    00A6 DFC3      RCALL	_Delayus
(0074)  	PORTA&=~BIT(LEDLK);
    00A7 98DD      CBI	P1B,5
(0075) 	
(0076) 	PORTB=0x00;	   //输出段选
    00A8 2422      CLR	R2
    00A9 BA28      OUT	P18,R2
(0077)  	PORTA|=BIT(SEGLK);		  
    00AA 9ADE      SBI	P1B,6
(0078)  	Delayus(50);			  
    00AB E302      LDI	R16,0x32
    00AC E010      LDI	R17,0
    00AD DFBC      RCALL	_Delayus
(0079)  	PORTA&=~BIT(SEGLK);	    
    00AE 98DE      CBI	P1B,6
(0080)  	
(0081)  	PORTB=0xFF;	   //输出位选
    00AF EF8F      LDI	R24,0xFF
    00B0 BB88      OUT	P18,R24
(0082)  	PORTA|=BIT(BITLK);		   
    00B1 9ADF      SBI	P1B,7
(0083)  	Delayus(50);				   
    00B2 E302      LDI	R16,0x32
    00B3 E010      LDI	R17,0
    00B4 DFB5      RCALL	_Delayus
(0084)  	PORTA&=~BIT(BITLK);	   
    00B5 98DF      CBI	P1B,7
(0085) 	
(0086) 	PORTD=0xFF;
    00B6 EF8F      LDI	R24,0xFF
    00B7 BB82      OUT	P12,R24
(0087) 	PORTA|=BIT(PA7);
    00B8 9ADF      SBI	P1B,7
(0088) 	Delayus(50);
    00B9 E302      LDI	R16,0x32
    00BA E010      LDI	R17,0
    00BB DFAE      RCALL	_Delayus
(0089) 	PORTA&=~BIT(PA7);
    00BC 98DF      CBI	P1B,7
(0090) 
(0091) 	
(0092) }
    00BD 9508      RET
FILE: D:\开发板\OK400C\程序\avr程序\26.ds12c887实时时钟LCD1602显示\DS12887.C
(0001) /*******************************************
(0002)   文件:hongwai.C
(0003)   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
(0004)   硬件:ATMEGA16芯片
(0005)   日期:2008年12月10日 
(0006)   功能:红外遥控器数码管键值显示
(0007)   备注:
(0008) /******************************************/
(0009) #include <D:\开发板\OK400C\程序\avr程序\OK400C.H>
(0010) #include <stdio.h>			//标准输入输出头文件
(0011) 
(0012) /* 命令常量定义 */
(0013) #define CMD_START_DS12C887     0x20   
(0014) /* 开启时钟芯片 */
(0015) #define CMD_START_OSCILLATOR 0x70     
(0016) /* 开启振荡器,处于抑制状态 */
(0017) #define CMD_CLOSE_DS12C887     0x30   
(0018) /* 关掉时钟芯片 */
(0019) /* 所有的置位使用或操作,清除使用与操作 */
(0020) #define MASK_SETB_SET         0x80            
(0021) /* 禁止刷新 */
(0022) #define MASK_CLR_SET         0x7f            
(0023) /* 使能刷新 */
(0024) #define MASK_SETB_DM         0x04            
(0025) /* 使用HEX格式 */
(0026) #define MASK_CLR_DM             0xfb            
(0027) /* 使用BCD码格式 */
(0028) #define MASK_SETB_2412         0x02            
(0029) /* 使用24小时模式 */
(0030) #define MASK_CLR_2412         0xfd            
(0031) /* 使用12小时模式 */
(0032) #define MASK_SETB_DSE         0x01            
(0033) /* 使用夏令时 */
(0034) #define MASK_CLR_DSE         0xfe            
(0035) /* 不使用夏令时 */
(0036) 
(0037) // 寄存器地址通道定义 
(0038) #define  chSecondsChannel  0X00
(0039) #define  chMinutesChannel  0X02
(0040) #define  chHoursChannel    0X04
(0041) #define  chDofWChannel     0X06
(0042) #define  chDateChannel     0X07
(0043) #define  chMonthChannel    0X08
(0044) #define  chYearChannel     0X09
(0045) #define  chCenturyChannel  0X32
(0046) #define  chRegA     0X0a
(0047) #define  chRegB     0X0b
(0048) #define  chRegC     0X0c
(0049) #define  chRegD     0X0d
(0050) 
(0051) uchar  temp_data1[3] = {0x00,0x00,0x00};
(0052) uchar  temp_data2[3] = {0x00,0x00,0x00};
(0053) uchar  display[6] =   {0x00,0x00,0x00,0x00,0x00,0x00}; 
(0054) /*******************************************
(0055) 函数名称: LCD1602_portini
(0056) 功    能: 初始化1602液晶用到的IO口
(0057) 参    数: 无
(0058) 返回值  : 无
(0059) /********************************************/
(0060) void LCD1602_portini(void)
(0061) {
(0062) 	LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
_LCD1602_portini:
    00BE B381      IN	R24,P11
    00BF 6780      ORI	R24,0x70
    00C0 BB81      OUT	P11,R24
(0063) 	LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
    00C1 B38A      IN	R24,P1A
    00C2 6F8F      ORI	R24,0xFF
    00C3 BB8A      OUT	P1A,R24
(0064) }
    00C4 9508      RET
_LCD1602_readbyte:
  dByte                --> R20
  DatCmd               --> R20
    00C5 940E02CF  CALL	push_gset1
    00C7 2F40      MOV	R20,R16
(0065) /*******************************************
(0066) 函数名称: LCD1602_readbyte
(0067) 功    能: 从1602液晶读出一个字节数据或者指令
(0068) 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
(0069) 返回值  : dByte--读回的数据或者指令
(0070) /********************************************/
(0071) uchar LCD1602_readbyte(uchar DatCmd)
(0072) {
(0073)  	uchar dByte;
(0074) 	if (DatCmd == iCmd)		 //指令操作
    00C8 2344      TST	R20
    00C9 F411      BNE	0x00CC
(0075) 		LCDa_CLR_RS;
    00CA 9895      CBI	P12,5
    00CB C001      RJMP	0x00CD
(0076) 	else
(0077) 		LCDa_SET_RS;
    00CC 9A95      SBI	P12,5
(0078) 		
(0079) 	LCDa_SET_RW;	   	  	 //读操作
    00CD 9A96      SBI	P12,6
(0080) 	LCDa_SET_E;
    00CE 9A94      SBI	P12,4
(0081) 	LCDa_DATA_DDR=0x00;	 	 //数据总线定义为输入
    00CF 2422      CLR	R2
    00D0 BA2A      OUT	P1A,R2
(0082) 	dByte=LCDa_DI;			 //读数据或者指令
    00D1 B349      IN	R20,P19
(0083) 	Delayms(1);				 //时序调整
    00D2 E001      LDI	R16,1
    00D3 E010      LDI	R17,0
    00D4 DFAD      RCALL	_Delayms
(0084) 	LCDa_CLR_E;	
    00D5 9894      CBI	P12,4
(0085) 	LCDa_DATA_DDR|=0xff;	 //数据总线还原为输出
    00D6 B38A      IN	R24,P1A
    00D7 6F8F      ORI	R24,0xFF
    00D8 BB8A      OUT	P1A,R24
(0086) 	return dByte;
    00D9 2F04      MOV	R16,R20
    00DA 940E02D2  CALL	pop_gset1
    00DC 9508      RET
_LCD1602_sendbyte:
  dByte                --> R20
  DatCmd               --> R22
    00DD 940E02E6  CALL	push_gset2
    00DF 2F42      MOV	R20,R18
    00E0 2F60      MOV	R22,R16
(0087) }
(0088) /*******************************************
(0089) 函数名称: LCD1602_sendbyte
(0090) 功    能: 向1602液晶写入一个字节数据或者指令
(0091) 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
(0092) 	  	  dByte--为写入1602的数据或者指令
(0093) 返回值  : 无
(0094) /********************************************/
(0095) void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
(0096) {
(0097) 	if (DatCmd == iCmd)		//指令操作
    00E1 2366      TST	R22
    00E2 F411      BNE	0x00E5
(0098) 		LCDa_CLR_RS;
    00E3 9895      CBI	P12,5
    00E4 C001      RJMP	0x00E6
(0099) 	else
(0100) 		LCDa_SET_RS;		//数据操作
    00E5 9A95      SBI	P12,5
(0101) 		
(0102) 	LCDa_CLR_RW;			//写操作操作
    00E6 9896      CBI	P12,6
(0103) 	LCDa_SET_E;
    00E7 9A94      SBI	P12,4
(0104) 	LCDa_DO = dByte;		//写入数据
    00E8 BB4B      OUT	P1B,R20
(0105) 	Delayms(1);
    00E9 E001      LDI	R16,1
    00EA E010      LDI	R17,0
    00EB DF96      RCALL	_Delayms
(0106) 	LCDa_CLR_E;	
    00EC 9894      CBI	P12,4
(0107) }
    00ED 940E02EA  CALL	pop_gset2
    00EF 9508      RET
_LCD1602_sendstr:
  ptString             --> R20
    00F0 940E02CF  CALL	push_gset1
    00F2 01A8      MOVW	R20,R16
(0108) /*******************************************
(0109) 函数名称: LCD1602_sendstr
(0110) 功    能: 向1602液晶写入一个字符串
(0111) 参    数: ptString--字符串指针
(0112) 返回值  : 无
(0113) /********************************************/
(0114) void LCD1602_sendstr(uchar *ptString)
(0115) {
    00F3 C005      RJMP	0x00F9
(0116) 	while((*ptString)!='\0')		 //字符串未结束就一直写
(0117) 	{
(0118) 		LCD1602_sendbyte(iDat, *ptString++);
    00F4 01FA      MOVW	R30,R20
    00F5 9121      LD	R18,Z+
    00F6 01AF      MOVW	R20,R30
    00F7 E001      LDI	R16,1
    00F8 DFE4      RCALL	_LCD1602_sendbyte
    00F9 01FA      MOVW	R30,R20
    00FA 8020      LDD	R2,0+Z
    00FB 2022      TST	R2
    00FC F7B9      BNE	0x00F4
(0119) 	}
(0120) }
    00FD 940E02D2  CALL	pop_gset1
    00FF 9508      RET
(0121) /*******************************************
(0122) 函数名称: LCD1602_clear
(0123) 功    能: 1602液晶清屏
(0124) 参    数: 无
(0125) 返回值  : 无
(0126) /********************************************/
(0127) void LCD1602_clear(void)
(0128) {
(0129) 	LCD1602_sendbyte(iCmd,LCDa_CLS);//写入清屏指令
_LCD1602_clear:
    0100 E021      LDI	R18,1
    0101 2700      CLR	R16
    0102 DFDA      RCALL	_LCD1602_sendbyte
(0130) 	Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
    0103 E002      LDI	R16,2
    0104 E010      LDI	R17,0
(0131) }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -