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

📄 8563.lis

📁 基于ATMEGA16的时钟芯片原代码
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .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 + -