📄 avr_gy-29.lis
字号:
00A8 27FE sbrs R2,7
00AA FDCF rjmp L33
00AC X9:
00AC .dbline 58
00AC .dbline 58
00AC .dbline 59
00AC ; if(TestAck()!=MT_DATA_ACK)
00AC 81B1 in R24,0x1
00AE 887F andi R24,248
00B0 8832 cpi R24,40
00B2 11F0 breq L36
00B4 X10:
00B4 .dbline 60
00B4 ; return 1; //ACK
00B4 01E0 ldi R16,1
00B6 03C0 xjmp L17
00B8 L36:
00B8 .dbline 61
00B8 ; Stop(); //I2C停止
00B8 84E9 ldi R24,148
00BA 86BF out 0x36,R24
00BC .dbline 63
00BC ; //delay_nms(10); //延时
00BC ; return 0;
00BC 0027 clr R16
00BE .dbline -2
00BE L17:
00BE .dbline 0 ; func end
00BE 0895 ret
00C0 .dbsym r Wdata 18 c
00C0 .dbsym r RegAddress 16 c
00C0 .dbend
00C0 .dbfunc e I2C_Read _I2C_Read fc
00C0 ; temp -> R10
00C0 ; RegAddress -> R16,R17
.even
00C0 _I2C_Read::
00C0 AA92 st -y,R10
00C2 .dbline -1
00C2 .dbline 74
00C2 ; }
00C2 ;
00C2 ; /*********************************************
00C2 ; I2C总线读一个字节
00C2 ; 返回0:读成功
00C2 ; 返回1:读失败
00C2 ; **********************************************/
00C2 ;
00C2 ; unsigned char I2C_Read(unsigned RegAddress)
00C2 ;
00C2 ; {
00C2 .dbline 76
00C2 ; unsigned char temp;
00C2 ; Start();//I2C启动
00C2 84EA ldi R24,164
00C4 86BF out 0x36,R24
00C6 .dbline 77
00C6 ; Wait();
00C6 L39:
00C6 .dbline 77
00C6 L40:
00C6 .dbline 77
00C6 26B6 in R2,0x36
00C8 27FE sbrs R2,7
00CA FDCF rjmp L39
00CC X11:
00CC .dbline 77
00CC .dbline 77
00CC .dbline 78
00CC ; if (TestAck()!=START)
00CC 81B1 in R24,0x1
00CE 887F andi R24,248
00D0 8830 cpi R24,8
00D2 11F0 breq L42
00D4 X12:
00D4 .dbline 79
00D4 ; return 1; //ACK
00D4 01E0 ldi R16,1
00D6 40C0 xjmp L38
00D8 L42:
00D8 .dbline 81
00D8 ;
00D8 ; Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
00D8 .dbline 81
00D8 86EA ldi R24,166
00DA 83B9 out 0x3,R24
00DC .dbline 81
00DC 84E8 ldi R24,132
00DE 86BF out 0x36,R24
00E0 .dbline 81
00E0 .dbline 81
00E0 .dbline 82
00E0 ; Wait();
00E0 L44:
00E0 .dbline 82
00E0 L45:
00E0 .dbline 82
00E0 26B6 in R2,0x36
00E2 27FE sbrs R2,7
00E4 FDCF rjmp L44
00E6 X13:
00E6 .dbline 82
00E6 .dbline 82
00E6 .dbline 83
00E6 ; if (TestAck()!=MT_SLA_ACK)
00E6 81B1 in R24,0x1
00E8 887F andi R24,248
00EA 8831 cpi R24,24
00EC 11F0 breq L47
00EE X14:
00EE .dbline 84
00EE ; return 1; //ACK
00EE 01E0 ldi R16,1
00F0 33C0 xjmp L38
00F2 L47:
00F2 .dbline 86
00F2 ;
00F2 ; Write8Bit(RegAddress); //写器件相应寄存器地址
00F2 .dbline 86
00F2 03B9 out 0x3,R16
00F4 .dbline 86
00F4 84E8 ldi R24,132
00F6 86BF out 0x36,R24
00F8 .dbline 86
00F8 .dbline 86
00F8 .dbline 87
00F8 ; Wait();
00F8 L49:
00F8 .dbline 87
00F8 L50:
00F8 .dbline 87
00F8 26B6 in R2,0x36
00FA 27FE sbrs R2,7
00FC FDCF rjmp L49
00FE X15:
00FE .dbline 87
00FE .dbline 87
00FE .dbline 88
00FE ; if (TestAck()!=MT_DATA_ACK)
00FE 81B1 in R24,0x1
0100 887F andi R24,248
0102 8832 cpi R24,40
0104 11F0 breq L52
0106 X16:
0106 .dbline 89
0106 ; return 1;
0106 01E0 ldi R16,1
0108 27C0 xjmp L38
010A L52:
010A .dbline 91
010A ;
010A ; Start(); //I2C重新启动
010A 84EA ldi R24,164
010C 86BF out 0x36,R24
010E .dbline 92
010E ; Wait();
010E L54:
010E .dbline 92
010E L55:
010E .dbline 92
010E 26B6 in R2,0x36
0110 27FE sbrs R2,7
0112 FDCF rjmp L54
0114 X17:
0114 .dbline 92
0114 .dbline 92
0114 .dbline 93
0114 ; if (TestAck()!=RE_START)
0114 81B1 in R24,0x1
0116 887F andi R24,248
0118 8031 cpi R24,16
011A 11F0 breq L57
011C X18:
011C .dbline 94
011C ; return 1;
011C 01E0 ldi R16,1
011E 1CC0 xjmp L38
0120 L57:
0120 .dbline 96
0120 ;
0120 ; Write8Bit(RD_DEVICE_ADDR); //写I2C从器件地址和读方式
0120 .dbline 96
0120 87EA ldi R24,167
0122 83B9 out 0x3,R24
0124 .dbline 96
0124 84E8 ldi R24,132
0126 86BF out 0x36,R24
0128 .dbline 96
0128 .dbline 96
0128 .dbline 97
0128 ; Wait();
0128 L59:
0128 .dbline 97
0128 L60:
0128 .dbline 97
0128 26B6 in R2,0x36
012A 27FE sbrs R2,7
012C FDCF rjmp L59
012E X19:
012E .dbline 97
012E .dbline 97
012E .dbline 98
012E ; if(TestAck()!=MR_SLA_ACK)
012E 81B1 in R24,0x1
0130 887F andi R24,248
0132 8034 cpi R24,64
0134 11F0 breq L62
0136 X20:
0136 .dbline 99
0136 ; return 1; //ACK
0136 01E0 ldi R16,1
0138 0FC0 xjmp L38
013A L62:
013A .dbline 101
013A ;
013A ; Twi(); //启动主I2C读方式
013A 84E8 ldi R24,132
013C 86BF out 0x36,R24
013E .dbline 102
013E ; Wait();
013E L64:
013E .dbline 102
013E L65:
013E .dbline 102
013E 26B6 in R2,0x36
0140 27FE sbrs R2,7
0142 FDCF rjmp L64
0144 X21:
0144 .dbline 102
0144 .dbline 102
0144 .dbline 103
0144 ; if(TestAck()!=MR_DATA_NOACK)
0144 81B1 in R24,0x1
0146 887F andi R24,248
0148 8835 cpi R24,88
014A 11F0 breq L67
014C X22:
014C .dbline 104
014C ; return 1; //ACK
014C 01E0 ldi R16,1
014E 04C0 xjmp L38
0150 L67:
0150 .dbline 106
0150 ;
0150 ; temp=TWDR;//读取I2C接收数据
0150 A3B0 in R10,0x3
0152 .dbline 107
0152 ; Stop();//I2C停止
0152 84E9 ldi R24,148
0154 86BF out 0x36,R24
0156 .dbline 108
0156 ; return temp;
0156 0A2D mov R16,R10
0158 .dbline -2
0158 L38:
0158 .dbline 0 ; func end
0158 A990 ld R10,y+
015A 0895 ret
015C .dbsym r temp 10 c
015C .dbsym r RegAddress 16 i
015C .dbend
015C .dbfile D:\MCU_Project\MCU_AVR\AVR_GY-29\1602.h
015C .dbfunc e LCD_init _LCD_init fV
.even
015C _LCD_init::
015C .dbline -1
015C .dbline 44
015C ; /* 用法:
015C ; LCD_init();
015C ; LCD_write_string(列,行,"字符串");
015C ; LCD_write_char(列,行,'字符');
015C ; ---------------------------------------------------------------
015C ; 下面是AVR与LCD连接信息
015C ; PC6 ->RS
015C ; PC7 ->EN
015C ; 地 ->RW
015C ; PA4 ->D4
015C ; PA5 ->D5
015C ; PA6 ->D6
015C ; PA7 ->D7
015C ; 使用端口:1602:PC6,PC7,PA4~PA7
015C ; 要使用本驱动,改变下面配置信息即可
015C ; -----------------------------------------------------------------*/
015C ; #define LCD_EN_PORT PORTC //以下2个要设为同一个口
015C ; #define LCD_EN_DDR DDRC
015C ; #define LCD_RS_PORT PORTC //以下2个要设为同一个口
015C ; #define LCD_RS_DDR DDRC
015C ; #define LCD_DATA_PORT PORTA //以下3个要设为同一个口
015C ; #define LCD_DATA_DDR DDRA //默认情况下连线必须使用高四位端口,如果不是请注意修改
015C ; #define LCD_DATA_PIN PINA
015C ; #define LCD_RS (1<<PC6) //0x20 portC6 out
015C ; #define LCD_EN (1<<PC7) //0x40 portC7 out
015C ; #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA 4/5/6/7 out
015C ; /*--------------------------------------------------------------------------------------------------
015C ; 函数说明
015C ; --------------------------------------------------------------------------------------------------*/
015C ; void LCD_init(void);
015C ; void LCD_en_write(void);
015C ; void LCD_write_command(unsigned char command) ;
015C ; void LCD_write_data(unsigned char data);
015C ; void LCD_set_xy (unsigned char x, unsigned char y);
015C ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
015C ; void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
015C ;
015C ; //-----------------------------------------------------------------------------------------
015C ;
015C ; #include <macros.h>
015C ; #include "delay.h"
015C ;
015C ; void LCD_init(void) //液晶初始化
015C ; {
015C .dbline 45
015C ; LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
015C 8AB3 in R24,0x1a
015E 806F ori R24,240
0160 8ABB out 0x1a,R24
0162 .dbline 46
0162 ; LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0162 A79A sbi 0x14,7
0164 .dbline 47
0164 ; LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0164 A69A sbi 0x14,6
0166 .dbline 48
0166 ; LCD_write_command(0x28);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -