📄 8563.s
字号:
.module _8563.c
.area text(rom, con, rel)
.dbfile H:\bbi项目源程序\8563时钟芯片/lcd.h
.dbfunc e delay _delay fV
; i -> R20
; n -> R16
.even
_delay::
xcall push_gset1
.dbline -1
.dbline 6
; /////////////////////////////////////////////////////////////
; // 文件:RT_PCF8563.C //
; // 环境:编译为ICC AVR6.31A,仿真为AVR Studio4.12sp4 //
; // 硬件:ATMEGA16芯片 //
; // 日期:2007年5月28日 //
; // 功能:在LCD12864液晶屏显示时间 //
.dbline 8
; // 备注: //
; /////////////////////////////////////////////////////////////
clr R20
xjmp L5
L2:
.dbline 9
.dbline 9
nop
.dbline 9
L3:
.dbline 8
inc R20
L5:
.dbline 8
cp R20,R16
brlo L2
.dbline -2
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r n 16 c
.dbend
.dbfunc e lcd_out _lcd_out fV
; i -> R20
; send_byte -> R22
.even
_lcd_out::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 15
; #include <iom16v.h> //包含单片机型号头文件
; #include <macros.h> //包含"位"操作头文件
; //#include "AVR_XQV12.h"
; #include "lcd.h"
; #include "delay.h" //包含延时头文件
;
; #define rd_device_add 0xa3 //定义器件读地址
.dbline 17
; #define wr_device_add 0xa2 //定义器件写地址
; #define START 0x08
clr R20
xjmp L10
L7:
.dbline 18
; #define MT_SLA_ACK 0x18
.dbline 19
; #define MT_DATA_ACK 0x28
sbrc R22,7
rjmp L11
.dbline 20
; #define RE_START 0x10
.dbline 21
; #define MR_SLA_ACK 0x40
cbi 0x1b,1
.dbline 22
; #define MR_DATA_NOACK 0x58
xjmp L12
L11:
.dbline 24
; #define MR_DATA_ACK 0x50
; #define START 0x08
.dbline 25
; #define MT_SLA_ACK 0x18
sbi 0x1b,1
.dbline 26
; #define MT_DATA_ACK 0x28
L12:
.dbline 27
cbi 0x1b,3
.dbline 28
sbi 0x1b,3
.dbline 29
lsl R22
.dbline 30
L8:
.dbline 17
inc R20
L10:
.dbline 17
cpi R20,8
brlo L7
.dbline 31
; #define RE_START 0x10
; #define MR_SLA_ACK 0x40
; #define MR_DATA_NOACK 0x58
;
; unsigned char read_shijian[7]={0x02,0x21,0x16,0x24,0x00,0x12,0x27};
ldi R16,0
xcall _delay
.dbline -2
L6:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r send_byte 22 c
.dbend
.dbfunc e WR_dat _WR_dat fV
; s -> R20
; dat -> R22
.even
_WR_dat::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 36
; unsigned char write_shijian[7]={0x00,0x48,0x10,0x10,0x00,0x06,0x07};
;
; unsigned char temp[3];
;
;
.dbline 38
; /*******************************************************/
; /****** TWI总线操作函数 ******/
mov R20,R22
andi R20,240
.dbline 39
; /****** Start(): 总线起始命令 ******/
ldi R16,250
xcall _lcd_out
.dbline 40
; /****** Wait(): 等待命令 ******/
mov R16,R20
xcall _lcd_out
.dbline 41
; /****** TestAck(): 测试应答 ******/
mov R20,R22
andi R20,15
.dbline 42
; /****** Write8Bit():写8位数据 ******/
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 43
; /****** Stop(): 总线结束命令 ******/
mov R16,R24
xcall _lcd_out
.dbline -2
L13:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r s 20 c
.dbsym r dat 22 c
.dbend
.dbfunc e WR_control _WR_control fV
; s -> R20
; dat -> R22
.even
_WR_control::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 47
; /****** Ack(): 应答信号 ******/
; /****** Twi(): 总线使能 ******/
; /*******************************************************/
; void Start(void)
.dbline 49
; {TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);}
; void Wait(void)
mov R20,R22
andi R20,240
.dbline 50
; {while((TWCR&0x80)!=0x80);}
ldi R16,248
xcall _lcd_out
.dbline 51
; unsigned char TestAck(void)
mov R16,R20
xcall _lcd_out
.dbline 52
; {unsigned char twsr;twsr=TWSR&0xf8;return twsr;}
mov R20,R22
andi R20,15
.dbline 53
; void Write8Bit(unsigned char data)
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 54
; {TWDR=data;TWCR=(1<<TWINT)|(1<<TWEN);}
mov R16,R24
xcall _lcd_out
.dbline -2
L14:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r s 20 c
.dbsym r dat 22 c
.dbend
.dbfunc e lcd_control _lcd_control fV
.even
_lcd_control::
.dbline -1
.dbline 58
; void Stop(void)
; {TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);}
; void Ack(void)
; {TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);}
.dbline 59
; void Twi(void)
ldi R16,48
xcall _WR_control
.dbline 60
; {TWCR=(1<<TWINT)|(1<<TWEN);}
ldi R16,12
xcall _WR_control
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbend
.dbfunc e lcd_clear _lcd_clear fV
; i -> R20,R21
.even
_lcd_clear::
xcall push_gset1
.dbline -1
.dbline 64
; /*#####################################################*/
; /*******************************************************/
; /****** 函数名称: i2c_Write() ******/
; /****** 功 能: 向I2C总线写数据 ******/
.dbline 66
; /****** 参 数: command--数据内容 ******/
; /****** RomAddress--目标地址 ******/
ldi R16,1
xcall _WR_control
.dbline 67
; /****** 返回值 : 无 ******/
clr R20
clr R21
L17:
.dbline 68
.dbline 69
nop
.dbline 70
nop
.dbline 72
L18:
.dbline 67
subi R20,255 ; offset = 1
sbci R21,255
.dbline 67
cpi R20,136
ldi R30,19
cpc R21,R30
brlt L17
.dbline -2
L16:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 I
.dbend
.dbfunc e LCD_address _LCD_address fV
; address -> R20
; y -> R22
; x -> R20
.even
_LCD_address::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 81
; /*******************************************************/
; unsigned char i2c_Write(unsigned char command,unsigned char RomAddress)
; {
; Start(); //发总线起始命令
; Wait(); //等待应答
; if(TestAck()!=START)return 1; //测试应答
; Write8Bit(wr_device_add); //写器件地址
; Wait(); //等待应答
; if(TestAck()!=MT_SLA_ACK)return 2; //测试应答
; Write8Bit(RomAddress); //写器件内的寄存器地址
; Wait(); //等待应答
; if(TestAck()!=MT_DATA_ACK)return 3; //测试应答
; Write8Bit(command); //写命令
; Wait(); //等待应答
.dbline 83
; if(TestAck()!=MT_DATA_ACK)return 4; //测试应答
; Stop(); //停止总线
clr R21
cpi R20,0
cpc R20,R21
breq L25
X0:
cpi R20,1
ldi R30,0
cpc R21,R30
breq L26
cpi R20,2
ldi R30,0
cpc R21,R30
breq L27
cpi R20,3
ldi R30,0
cpc R21,R30
breq L28
xjmp L22
X1:
.dbline 84
; delay_nms(10); //延时
L25:
.dbline 86
; return 0;
; }
mov R20,R22
subi R20,128 ; addi 128
.dbline 87
; /*******************************************************/
xjmp L23
L26:
.dbline 89
; /****** 函数名称: i2c_WriteData() ******/
; /****** 功 能: 向I2C总线连续写入7个数据 ******/
mov R20,R22
subi R20,112 ; addi 144
.dbline 90
; /****** 参 数: RomAddress--目标起始寄存器 ******/
xjmp L23
L27:
.dbline 92
; /****** 返回值 : 无 ******/
; /*******************************************************/
mov R20,R22
subi R20,120 ; addi 136
.dbline 93
; unsigned char i2c_WriteData(unsigned char RomAddress)
xjmp L23
L28:
.dbline 95
; {
; unsigned char i;
mov R20,R22
subi R20,104 ; addi 152
.dbline 96
; Start(); //发总线起始命令
xjmp L23
L22:
.dbline 97
; Wait(); //等待应答
mov R20,R22
subi R20,128 ; addi 128
.dbline 98
; if(TestAck()!=START)return 1; //测试应答
L23:
.dbline 99
; Write8Bit(wr_device_add); //写器件地址
mov R16,R20
xcall _WR_control
.dbline -2
L21:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r address 20 c
.dbsym r y 22 c
.dbsym r x 20 c
.dbend
.dbfunc e LCD_Write_string _LCD_Write_string fV
; s -> R20,R21
; Y -> R10
; X -> R22
.even
_LCD_Write_string::
xcall push_gset3
mov R10,R18
mov R22,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 110
; Wait(); //等待应答
; if(TestAck()!=MT_SLA_ACK)return 2; //测试应答
; Write8Bit(RomAddress); //写器件内的寄存器地址
; Wait(); //等待应答
; if(TestAck()!=MT_DATA_ACK)return 3; //测试应答
; for(i=0;i<7;i++) //循环7次
; {
; Write8Bit(write_shijian[i]); //写数据
; Wait(); //等待应答
; if(TestAck()!=MT_DATA_ACK)return 4; //测试应答
; }
.dbline 112
; Stop(); //停止总线
; delay_nms(10); //延时
mov R18,R10
mov R16,R22
xcall _LCD_address
xjmp L31
L30:
.dbline 114
.dbline 115
movw R30,R20
ldd R16,z+0
xcall _WR_dat
.dbline 116
subi R20,255 ; offset = 1
sbci R21,255
.dbline 117
L31:
.dbline 113
; return 0;
movw R30,R20
ldd R2,z+0
tst R2
brne L30
.dbline -2
L29:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r s 20 pc
.dbsym r Y 10 c
.dbsym r X 22 c
.dbend
.dbfunc e BCD_ASCII _BCD_ASCII fc
; bcd -> R16
.even
_BCD_ASCII::
.dbline -1
.dbline 129
; }
; /*******************************************************/
; /****** 函数名称: i2c_Read() ******/
; /****** 功 能: 连续读取I2C总线 ******/
; /****** 参 数: RomAddress--目标寄存器 ******/
; /****** 返回值 : 读出的数据 ******/
; /*******************************************************/
; unsigned char i2c_Read(unsigned char RomAddress)
; {
; unsigned char i;
; Start(); //发总线起始命令
; Wait(); //等待应答
; if(TestAck()!=START)return 1; //测试应答
; Write8Bit(wr_device_add); //写器件地址
; Wait(); //等待应答
; if(TestAck()!=MT_SLA_ACK)return 2; //测试应答
.dbline 130
; Write8Bit(RomAddress); //写器件内的寄存器地址
andi R16,15
.dbline 131
; Wait(); //等待应答
ldi R24,9
cp R24,R16
brsh L34
.dbline 132
; if(TestAck()!=MT_DATA_ACK)return 3; //测试应答
subi R16,201 ; addi 55
xjmp L35
L34:
.dbline 134
; Start(); //重新发总线起始命令
; Wait(); //等待应答
subi R16,208 ; addi 48
L35:
.dbline 135
; if(TestAck()!=RE_START)return 4; //测试应答
.dbline -2
L33:
.dbline 0 ; func end
ret
.dbsym r bcd 16 c
.dbend
.dbfunc e LCD_writeasc _LCD_writeasc fV
; data -> y+4
; y -> R22
; x -> R20
.even
_LCD_writeasc::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 140
; Write8Bit(rd_device_add); //写器件地址
; Wait(); //等待应答
; if(TestAck()!=MR_SLA_ACK)return 5; //测试应答
; for(i=0;i<7;i++)
; {
.dbline 141
; Ack(); //发送应答信号
mov R18,R22
mov R16,R20
xcall _LCD_address
.dbline 142
; Wait(); //等待应答
ldd R16,y+4
xcall _WR_dat
.dbline -2
L36:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l data 4 c
.dbsym r y 22 c
.dbsym r x 20 c
.dbend
.dbfunc e Lcd_INT _Lcd_INT fV
.even
_Lcd_INT::
.dbline -1
.dbline 146
; if(TestAck()!=MR_DATA_ACK)return 6; //测试应答
; read_shijian[i]=TWDR; //将读取的数据放入数组中
; }
; Stop(); //停止总线
.dbline 147
; return 0;
sbi 0x1a,1
.dbline 148
; }
sbi 0x1a,3
.dbline 149
; /*******************************************************/
xcall _lcd_control
.dbline -2
L37:
.dbline 0 ; func end
ret
.dbend
.dbfunc e lcd_writechar _lcd_writechar fV
; number -> y+4
; Y -> R22
; X -> R20
.even
_lcd_writechar::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 153
; /****** 函数名称: ToStr() ******/
; /****** 功 能: 整数转换成字符串 ******/
; /****** 参 数: c--要转换的数据 ******/
; /****** 返回值 : 无 ******/
.dbline 154
; /*******************************************************/
mov R18,R22
mov R16,R20
xcall _LCD_address
.dbline 155
; void ToStr(unsigned char c)
ldd R16,y+4
swap R16
andi R16,#0x0F
xcall _BCD_ASCII
xcall _WR_dat
.dbline 156
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -