📄 8563.lis
字号:
.module _8563.c
.area text(rom, con, rel)
0000 .dbfile H:\bbi项目源程序\8563时钟芯片/lcd.h
0000 .dbfunc e delay _delay fV
0000 ; i -> R20
0000 ; n -> R16
.even
0000 _delay::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 6
0004 ; /////////////////////////////////////////////////////////////
0004 ; // 文件:RT_PCF8563.C //
0004 ; // 环境:编译为ICC AVR6.31A,仿真为AVR Studio4.12sp4 //
0004 ; // 硬件:ATMEGA16芯片 //
0004 ; // 日期:2007年5月28日 //
0004 ; // 功能:在LCD12864液晶屏显示时间 //
0004 .dbline 8
0004 ; // 备注: //
0004 ; /////////////////////////////////////////////////////////////
0004 4427 clr R20
0006 02C0 xjmp L5
0008 L2:
0008 .dbline 9
0008 .dbline 9
0008 0000 nop
000A .dbline 9
000A L3:
000A .dbline 8
000A 4395 inc R20
000C L5:
000C .dbline 8
000C 4017 cp R20,R16
000E E0F3 brlo L2
0010 .dbline -2
0010 L1:
0010 0E940000 xcall pop_gset1
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbsym r i 20 c
0016 .dbsym r n 16 c
0016 .dbend
0016 .dbfunc e lcd_out _lcd_out fV
0016 ; i -> R20
0016 ; send_byte -> R22
.even
0016 _lcd_out::
0016 0E940000 xcall push_gset2
001A 602F mov R22,R16
001C .dbline -1
001C .dbline 15
001C ; #include <iom16v.h> //包含单片机型号头文件
001C ; #include <macros.h> //包含"位"操作头文件
001C ; //#include "AVR_XQV12.h"
001C ; #include "lcd.h"
001C ; #include "delay.h" //包含延时头文件
001C ;
001C ; #define rd_device_add 0xa3 //定义器件读地址
001C .dbline 17
001C ; #define wr_device_add 0xa2 //定义器件写地址
001C ; #define START 0x08
001C 4427 clr R20
001E 09C0 xjmp L10
0020 L7:
0020 .dbline 18
0020 ; #define MT_SLA_ACK 0x18
0020 .dbline 19
0020 ; #define MT_DATA_ACK 0x28
0020 67FD sbrc R22,7
0022 02C0 rjmp L11
0024 .dbline 20
0024 ; #define RE_START 0x10
0024 .dbline 21
0024 ; #define MR_SLA_ACK 0x40
0024 D998 cbi 0x1b,1
0026 .dbline 22
0026 ; #define MR_DATA_NOACK 0x58
0026 01C0 xjmp L12
0028 L11:
0028 .dbline 24
0028 ; #define MR_DATA_ACK 0x50
0028 ; #define START 0x08
0028 .dbline 25
0028 ; #define MT_SLA_ACK 0x18
0028 D99A sbi 0x1b,1
002A .dbline 26
002A ; #define MT_DATA_ACK 0x28
002A L12:
002A .dbline 27
002A DB98 cbi 0x1b,3
002C .dbline 28
002C DB9A sbi 0x1b,3
002E .dbline 29
002E 660F lsl R22
0030 .dbline 30
0030 L8:
0030 .dbline 17
0030 4395 inc R20
0032 L10:
0032 .dbline 17
0032 4830 cpi R20,8
0034 A8F3 brlo L7
0036 .dbline 31
0036 ; #define RE_START 0x10
0036 ; #define MR_SLA_ACK 0x40
0036 ; #define MR_DATA_NOACK 0x58
0036 ;
0036 ; unsigned char read_shijian[7]={0x02,0x21,0x16,0x24,0x00,0x12,0x27};
0036 00E0 ldi R16,0
0038 E3DF xcall _delay
003A .dbline -2
003A L6:
003A 0E940000 xcall pop_gset2
003E .dbline 0 ; func end
003E 0895 ret
0040 .dbsym r i 20 c
0040 .dbsym r send_byte 22 c
0040 .dbend
0040 .dbfunc e WR_dat _WR_dat fV
0040 ; s -> R20
0040 ; dat -> R22
.even
0040 _WR_dat::
0040 0E940000 xcall push_gset2
0044 602F mov R22,R16
0046 .dbline -1
0046 .dbline 36
0046 ; unsigned char write_shijian[7]={0x00,0x48,0x10,0x10,0x00,0x06,0x07};
0046 ;
0046 ; unsigned char temp[3];
0046 ;
0046 ;
0046 .dbline 38
0046 ; /*******************************************************/
0046 ; /****** TWI总线操作函数 ******/
0046 462F mov R20,R22
0048 407F andi R20,240
004A .dbline 39
004A ; /****** Start(): 总线起始命令 ******/
004A 0AEF ldi R16,250
004C E4DF xcall _lcd_out
004E .dbline 40
004E ; /****** Wait(): 等待命令 ******/
004E 042F mov R16,R20
0050 E2DF xcall _lcd_out
0052 .dbline 41
0052 ; /****** TestAck(): 测试应答 ******/
0052 462F mov R20,R22
0054 4F70 andi R20,15
0056 .dbline 42
0056 ; /****** Write8Bit():写8位数据 ******/
0056 842F mov R24,R20
0058 8F70 andi R24,#0x0F
005A 8295 swap R24
005C 482F mov R20,R24
005E .dbline 43
005E ; /****** Stop(): 总线结束命令 ******/
005E 082F mov R16,R24
0060 DADF xcall _lcd_out
0062 .dbline -2
0062 L13:
0062 0E940000 xcall pop_gset2
0066 .dbline 0 ; func end
0066 0895 ret
0068 .dbsym r s 20 c
0068 .dbsym r dat 22 c
0068 .dbend
0068 .dbfunc e WR_control _WR_control fV
0068 ; s -> R20
0068 ; dat -> R22
.even
0068 _WR_control::
0068 0E940000 xcall push_gset2
006C 602F mov R22,R16
006E .dbline -1
006E .dbline 47
006E ; /****** Ack(): 应答信号 ******/
006E ; /****** Twi(): 总线使能 ******/
006E ; /*******************************************************/
006E ; void Start(void)
006E .dbline 49
006E ; {TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);}
006E ; void Wait(void)
006E 462F mov R20,R22
0070 407F andi R20,240
0072 .dbline 50
0072 ; {while((TWCR&0x80)!=0x80);}
0072 08EF ldi R16,248
0074 D0DF xcall _lcd_out
0076 .dbline 51
0076 ; unsigned char TestAck(void)
0076 042F mov R16,R20
0078 CEDF xcall _lcd_out
007A .dbline 52
007A ; {unsigned char twsr;twsr=TWSR&0xf8;return twsr;}
007A 462F mov R20,R22
007C 4F70 andi R20,15
007E .dbline 53
007E ; void Write8Bit(unsigned char data)
007E 842F mov R24,R20
0080 8F70 andi R24,#0x0F
0082 8295 swap R24
0084 482F mov R20,R24
0086 .dbline 54
0086 ; {TWDR=data;TWCR=(1<<TWINT)|(1<<TWEN);}
0086 082F mov R16,R24
0088 C6DF xcall _lcd_out
008A .dbline -2
008A L14:
008A 0E940000 xcall pop_gset2
008E .dbline 0 ; func end
008E 0895 ret
0090 .dbsym r s 20 c
0090 .dbsym r dat 22 c
0090 .dbend
0090 .dbfunc e lcd_control _lcd_control fV
.even
0090 _lcd_control::
0090 .dbline -1
0090 .dbline 58
0090 ; void Stop(void)
0090 ; {TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);}
0090 ; void Ack(void)
0090 ; {TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);}
0090 .dbline 59
0090 ; void Twi(void)
0090 00E3 ldi R16,48
0092 EADF xcall _WR_control
0094 .dbline 60
0094 ; {TWCR=(1<<TWINT)|(1<<TWEN);}
0094 0CE0 ldi R16,12
0096 E8DF xcall _WR_control
0098 .dbline -2
0098 L15:
0098 .dbline 0 ; func end
0098 0895 ret
009A .dbend
009A .dbfunc e lcd_clear _lcd_clear fV
009A ; i -> R20,R21
.even
009A _lcd_clear::
009A 0E940000 xcall push_gset1
009E .dbline -1
009E .dbline 64
009E ; /*#####################################################*/
009E ; /*******************************************************/
009E ; /****** 函数名称: i2c_Write() ******/
009E ; /****** 功 能: 向I2C总线写数据 ******/
009E .dbline 66
009E ; /****** 参 数: command--数据内容 ******/
009E ; /****** RomAddress--目标地址 ******/
009E 01E0 ldi R16,1
00A0 E3DF xcall _WR_control
00A2 .dbline 67
00A2 ; /****** 返回值 : 无 ******/
00A2 4427 clr R20
00A4 5527 clr R21
00A6 L17:
00A6 .dbline 68
00A6 .dbline 69
00A6 0000 nop
00A8 .dbline 70
00A8 0000 nop
00AA .dbline 72
00AA L18:
00AA .dbline 67
00AA 4F5F subi R20,255 ; offset = 1
00AC 5F4F sbci R21,255
00AE .dbline 67
00AE 4838 cpi R20,136
00B0 E3E1 ldi R30,19
00B2 5E07 cpc R21,R30
00B4 C4F3 brlt L17
00B6 .dbline -2
00B6 L16:
00B6 0E940000 xcall pop_gset1
00BA .dbline 0 ; func end
00BA 0895 ret
00BC .dbsym r i 20 I
00BC .dbend
00BC .dbfunc e LCD_address _LCD_address fV
00BC ; address -> R20
00BC ; y -> R22
00BC ; x -> R20
.even
00BC _LCD_address::
00BC 0E940000 xcall push_gset2
00C0 622F mov R22,R18
00C2 402F mov R20,R16
00C4 .dbline -1
00C4 .dbline 81
00C4 ; /*******************************************************/
00C4 ; unsigned char i2c_Write(unsigned char command,unsigned char RomAddress)
00C4 ; {
00C4 ; Start(); //发总线起始命令
00C4 ; Wait(); //等待应答
00C4 ; if(TestAck()!=START)return 1; //测试应答
00C4 ; Write8Bit(wr_device_add); //写器件地址
00C4 ; Wait(); //等待应答
00C4 ; if(TestAck()!=MT_SLA_ACK)return 2; //测试应答
00C4 ; Write8Bit(RomAddress); //写器件内的寄存器地址
00C4 ; Wait(); //等待应答
00C4 ; if(TestAck()!=MT_DATA_ACK)return 3; //测试应答
00C4 ; Write8Bit(command); //写命令
00C4 ; Wait(); //等待应答
00C4 .dbline 83
00C4 ; if(TestAck()!=MT_DATA_ACK)return 4; //测试应答
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -