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

📄 ds12887.s

📁 高精度时钟芯片。avr驱动
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module DS12887.C
	.area text(rom, con, rel)
	.dbfile D:\开发板\OK400C\程序\avr程序\OK400C.H
	.dbfunc e Delayus _Delayus fV
;              i -> R20,R21
;             US -> R22,R23
	.even
_Delayus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 36
; /*******************************************
;   文件:hongwai.C
;   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
;   硬件:ATMEGA16芯片
;   日期:2008年12月10日 
;   功能:红外遥控器数码管键值显示
;   备注:
; /******************************************/
; #include <D:\开发板\OK400C\程序\avr程序\OK400C.H>
; #include <stdio.h>			//标准输入输出头文件
; 
; /* 命令常量定义 */
; #define CMD_START_DS12C887     0x20   
; /* 开启时钟芯片 */
; #define CMD_START_OSCILLATOR 0x70     
; /* 开启振荡器,处于抑制状态 */
; #define CMD_CLOSE_DS12C887     0x30   
; /* 关掉时钟芯片 */
; /* 所有的置位使用或操作,清除使用与操作 */
; #define MASK_SETB_SET         0x80            
; /* 禁止刷新 */
; #define MASK_CLR_SET         0x7f            
; /* 使能刷新 */
; #define MASK_SETB_DM         0x04            
; /* 使用HEX格式 */
; #define MASK_CLR_DM             0xfb            
; /* 使用BCD码格式 */
; #define MASK_SETB_2412         0x02            
; /* 使用24小时模式 */
; #define MASK_CLR_2412         0xfd            
; /* 使用12小时模式 */
; #define MASK_SETB_DSE         0x01            
; /* 使用夏令时 */
; #define MASK_CLR_DSE         0xfe            
; /* 不使用夏令时 */
; 
	.dbline 38
; // 寄存器地址通道定义 
; #define  chSecondsChannel  0X00
	ldi R16,5
	ldi R17,0
	movw R18,R22
	xcall empy16s
	movw R22,R16
	lsr R23
	ror R22
	lsr R23
	ror R22
	.dbline 39
	clr R20
	clr R21
	xjmp L5
L2:
	.dbline 39
L3:
	.dbline 39
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 39
; #define  chMinutesChannel  0X02
	cp R20,R22
	cpc R21,R23
	brlo L2
	.dbline -2
	.dbline 40
; #define  chHoursChannel    0X04
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r US 22 i
	.dbend
	.dbfunc e Delayms _Delayms fV
;              i -> R20,R21
;              j -> R22,R23
;             MS -> R16,R17
	.even
_Delayms::
	xcall push_gset2
	.dbline -1
	.dbline 48
; #define  chDofWChannel     0X06
; #define  chDateChannel     0X07
; #define  chMonthChannel    0X08
; #define  chYearChannel     0X09
; #define  chCenturyChannel  0X32
; #define  chRegA     0X0a
; #define  chRegB     0X0b
; #define  chRegC     0X0c
	.dbline 50
; #define  chRegD     0X0d
; 
	clr R20
	clr R21
	xjmp L10
L7:
	.dbline 51
	clr R22
	clr R23
	xjmp L14
L11:
	.dbline 51
L12:
	.dbline 51
	subi R22,255  ; offset = 1
	sbci R23,255
L14:
	.dbline 51
	cpi R22,117
	ldi R30,4
	cpc R23,R30
	brlo L11
L8:
	.dbline 50
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 50
	cp R20,R16
	cpc R21,R17
	brlo L7
	.dbline -2
	.dbline 52
; uchar  temp_data1[3] = {0x00,0x00,0x00};
; uchar  temp_data2[3] = {0x00,0x00,0x00};
L6:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r MS 16 i
	.dbend
	.dbfunc e Board_init _Board_init fV
	.even
_Board_init::
	.dbline -1
	.dbline 60
; uchar  display[6] =   {0x00,0x00,0x00,0x00,0x00,0x00}; 
; /*******************************************
; 函数名称: LCD1602_portini
; 功    能: 初始化1602液晶用到的IO口
; 参    数: 无
; 返回值  : 无
; /********************************************/
; void LCD1602_portini(void)
	.dbline 61
; {
	ldi R24,255
	out 0x1a,R24
	.dbline 62
; 	LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
	out 0x17,R24
	.dbline 63
; 	LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
	out 0x14,R24
	.dbline 64
; }
	out 0x11,R24
	.dbline 66
; /*******************************************
; 函数名称: LCD1602_readbyte
	clr R2
	out 0xd,R2
	.dbline 68
; 功    能: 从1602液晶读出一个字节数据或者指令
; 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
	sbi 0x15,3
	.dbline 69
; 返回值  : dByte--读回的数据或者指令
	cbi 0x15,1
	.dbline 70
; /********************************************/
	cbi 0x1b,1
	.dbline 71
; uchar LCD1602_readbyte(uchar DatCmd)
	out 0x18,R24
	.dbline 72
; {
	sbi 0x1b,5
	.dbline 73
;  	uchar dByte;
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 74
; 	if (DatCmd == iCmd)		 //指令操作
	cbi 0x1b,5
	.dbline 76
; 		LCDa_CLR_RS;
; 	else
	clr R2
	out 0x18,R2
	.dbline 77
; 		LCDa_SET_RS;
	sbi 0x1b,6
	.dbline 78
; 		
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 79
; 	LCDa_SET_RW;	   	  	 //读操作
	cbi 0x1b,6
	.dbline 81
; 	LCDa_SET_E;
; 	LCDa_DATA_DDR=0x00;	 	 //数据总线定义为输入
	ldi R24,255
	out 0x18,R24
	.dbline 82
; 	dByte=LCDa_DI;			 //读数据或者指令
	sbi 0x1b,7
	.dbline 83
; 	Delayms(1);				 //时序调整
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 84
; 	LCDa_CLR_E;	
	cbi 0x1b,7
	.dbline 86
; 	LCDa_DATA_DDR|=0xff;	 //数据总线还原为输出
; 	return dByte;
	ldi R24,255
	out 0x12,R24
	.dbline 87
; }
	sbi 0x1b,7
	.dbline 88
; /*******************************************
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 89
; 函数名称: LCD1602_sendbyte
	cbi 0x1b,7
	.dbline -2
	.dbline 92
; 功    能: 向1602液晶写入一个字节数据或者指令
; 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
; 	  	  dByte--为写入1602的数据或者指令
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.area data(ram, con, rel)
	.dbfile D:\开发板\OK400C\程序\avr程序\OK400C.H
_temp_data1::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\开发板\OK400C\程序\avr程序\OK400C.H
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\开发板\OK400C\程序\avr程序\OK400C.H
	.dbfile D:\开发板\OK400C\程序\avr程序\26.ds12c887实时时钟LCD1602显示\DS12887.C
	.dbsym e temp_data1 _temp_data1 A[3:3]c
_temp_data2::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\开发板\OK400C\程序\avr程序\26.ds12c887实时时钟LCD1602显示\DS12887.C
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\开发板\OK400C\程序\avr程序\26.ds12c887实时时钟LCD1602显示\DS12887.C
	.dbsym e temp_data2 _temp_data2 A[3:3]c
_display::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\开发板\OK400C\程序\avr程序\26.ds12c887实时时钟LCD1602显示\DS12887.C
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\开发板\OK400C\程序\avr程序\26.ds12c887实时时钟LCD1602显示\DS12887.C
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\开发板\OK400C\程序\avr程序\26.ds12c887实时时钟LCD1602显示\DS12887.C
	.dbsym e display _display A[6:6]c
	.area text(rom, con, rel)
	.dbfile D:\开发板\OK400C\程序\avr程序\26.ds12c887实时时钟LCD1602显示\DS12887.C
	.dbfunc e LCD1602_portini _LCD1602_portini fV
	.even
_LCD1602_portini::
	.dbline -1
	.dbline 61
	.dbline 62
	in R24,0x11
	ori R24,112
	out 0x11,R24
	.dbline 63
	in R24,0x1a
	ori R24,255
	out 0x1a,R24
	.dbline -2
	.dbline 64
L16:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD1602_readbyte _LCD1602_readbyte fc
;          dByte -> R20
;         DatCmd -> R20
	.even
_LCD1602_readbyte::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 72
	.dbline 74
	tst R20
	brne L18
	.dbline 75
	cbi 0x12,5
	xjmp L19
L18:
	.dbline 77
	sbi 0x12,5
L19:
	.dbline 79
	sbi 0x12,6
	.dbline 80
	sbi 0x12,4
	.dbline 81
	clr R2
	out 0x1a,R2
	.dbline 82
	in R20,0x19
	.dbline 83
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 84
	cbi 0x12,4
	.dbline 85
	in R24,0x1a
	ori R24,255
	out 0x1a,R24
	.dbline 86
	mov R16,R20
	.dbline -2
L17:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r dByte 20 c
	.dbsym r DatCmd 20 c
	.dbend
	.dbfunc e LCD1602_sendbyte _LCD1602_sendbyte fV
;          dByte -> R20
;         DatCmd -> R22
	.even
_LCD1602_sendbyte::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 96
; 返回值  : 无
; /********************************************/
; void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
; {
	.dbline 97
; 	if (DatCmd == iCmd)		//指令操作
	tst R22
	brne L21
	.dbline 98
; 		LCDa_CLR_RS;
	cbi 0x12,5
	xjmp L22
L21:
	.dbline 100
; 	else
; 		LCDa_SET_RS;		//数据操作
	sbi 0x12,5
L22:
	.dbline 102
; 		
; 	LCDa_CLR_RW;			//写操作操作
	cbi 0x12,6
	.dbline 103
; 	LCDa_SET_E;
	sbi 0x12,4
	.dbline 104
; 	LCDa_DO = dByte;		//写入数据
	out 0x1b,R20
	.dbline 105
; 	Delayms(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 106
; 	LCDa_CLR_E;	
	cbi 0x12,4
	.dbline -2
	.dbline 107
; }
L20:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r dByte 20 c
	.dbsym r DatCmd 22 c
	.dbend
	.dbfunc e LCD1602_sendstr _LCD1602_sendstr fV
;       ptString -> R20,R21
	.even
_LCD1602_sendstr::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 115
; /*******************************************
; 函数名称: LCD1602_sendstr
; 功    能: 向1602液晶写入一个字符串
; 参    数: ptString--字符串指针
; 返回值  : 无
; /********************************************/
; void LCD1602_sendstr(uchar *ptString)
; {
	xjmp L25
L24:
	.dbline 117
	.dbline 118
	movw R30,R20
	ld R18,Z+
	movw R20,R30
	ldi R16,1
	xcall _LCD1602_sendbyte
	.dbline 119
L25:
	.dbline 116
; 	while((*ptString)!='\0')		 //字符串未结束就一直写
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L24
	.dbline -2
	.dbline 120
; 	{
; 		LCD1602_sendbyte(iDat, *ptString++);
; 	}
; }
L23:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r ptString 20 pc
	.dbend
	.dbfunc e LCD1602_clear _LCD1602_clear fV
	.even
_LCD1602_clear::
	.dbline -1
	.dbline 128
; /*******************************************
; 函数名称: LCD1602_clear
; 功    能: 1602液晶清屏
; 参    数: 无
; 返回值  : 无
; /********************************************/
; void LCD1602_clear(void)
; {
	.dbline 129
; 	LCD1602_sendbyte(iCmd,LCDa_CLS);//写入清屏指令
	ldi R18,1
	clr R16
	xcall _LCD1602_sendbyte
	.dbline 130
; 	Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
	ldi R16,2
	ldi R17,0
	.dbline -2
	.dbline 131
; }
L27:
	.dbline 0 ; func end
	xjmp _Delayms
	.dbend
	.dbfunc e LCD1602_readBF _LCD1602_readBF fc
;           busy -> R20
	.even
_LCD1602_readBF::
	xcall push_gset1
	.dbline -1
	.dbline 139
; /*******************************************
; 函数名称: LCD1602_readBF
; 功    能: 1602液晶清屏
; 参    数: 无
; 返回值  : busy--为1时是忙状态,为0时可以接收指令
; /********************************************/
; uchar LCD1602_readBF(void)
; {	  
	.dbline 141
; 	uchar busy;
; 	busy=LCD1602_readbyte(iCmd);		//读回BF标志(忙标志)和地址
	clr R16
	xcall _LCD1602_readbyte
	mov R20,R16
	.dbline 142
; 	if(busy&0x80)						//如果忙返回正在忙的状态
	sbrs R16,7
	rjmp L29
	.dbline 143
; 		busy=1;
	ldi R20,1
	xjmp L30
L29:
	.dbline 145
; 	else	   							//如果不忙,可以写入
; 		busy=0;
	clr R20
L30:
	.dbline 146
; 	return busy;
	mov R16,R20
	.dbline -2
L28:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r busy 20 c
	.dbend
	.dbfunc e LCD1602_gotoXY _LCD1602_gotoXY fV
;            Col -> R20
;            Row -> R22
	.even
_LCD1602_gotoXY::
	xcall push_gset2
	mov R20,R18

⌨️ 快捷键说明

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