📄 test.lst
字号:
__text_start:
__start:
2A E5CF LDI R28,0x5F
2B E0D4 LDI R29,4
2C BFCD OUT 0x3D,R28
2D BFDE OUT 0x3E,R29
2E 51CE SUBI R28,0x1E
2F 40D0 SBCI R29,0
30 EA0A LDI R16,0xAA
31 8308 STD Y+0,R16
32 2400 CLR R0
33 E6E0 LDI R30,0x60
34 E0F0 LDI R31,0
35 E010 LDI R17,0
36 36E8 CPI R30,0x68
37 07F1 CPC R31,R17
38 F011 BEQ 0x003B
39 9201 ST R0,Z+
3A CFFB RJMP 0x0036
3B 8300 STD Z+0,R16
3C E5E4 LDI R30,0x54
3D E0F0 LDI R31,0
3E E6A0 LDI R26,0x60
3F E0B0 LDI R27,0
40 E010 LDI R17,0
41 E000 LDI R16,0
42 BF0B OUT 0x3B,R16
43 35E4 CPI R30,0x54
44 07F1 CPC R31,R17
45 F021 BEQ 0x004A
46 95C8 LPM
47 9631 ADIW R30,1
48 920D ST R0,X+
49 CFF9 RJMP 0x0043
4A D274 RCALL _main
_exit:
4B CFFF RJMP _exit
FILE: D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\delay.h
(0001) /**********延时函数*****************/
(0002) /*-----------------------------------------------
(0003) delay_us :1us延时函数
(0004) ------------------------------------------------*/
(0005) void delay_1us(void)
(0006) {
(0007) asm("nop");
_delay_1us:
4C 0000 NOP
4D 9508 RET
_delay_us:
t --> R20
4E 934A ST R20,-Y
4F 935A ST R21,-Y
50 01A8 MOVW R20,R16
(0008) }
(0009) /*-----------------------------------------------
(0010) delay_nus :长延时函数
(0011) 输入参数: t :延时时间 us
(0012) ------------------------------------------------*/
(0013) void delay_us(unsigned int t)
(0014) {
51 C001 RJMP 0x0053
(0015) while(t--)
(0016) delay_1us();
52 DFF9 RCALL _delay_1us
53 011A MOVW R2,R20
54 5041 SUBI R20,1
55 4050 SBCI R21,0
56 2022 TST R2
57 F7D1 BNE 0x0052
58 2033 TST R3
59 F7C1 BNE 0x0052
5A 9159 LD R21,Y+
5B 9149 LD R20,Y+
5C 9508 RET
(0017) }
(0018) /*----------------------------------------------
(0019) delay_ms :1ms延时函数
(0020) -----------------------------------------------*/
(0021) void delay_1ms(void)
(0022) {
(0023) unsigned int i;
(0024) for(i=0;i<1140;i++);
_delay_1ms:
i --> R16
5D 2700 CLR R16
5E 2711 CLR R17
5F C002 RJMP 0x0062
60 5F0F SUBI R16,0xFF
61 4F1F SBCI R17,0xFF
62 3704 CPI R16,0x74
63 E0E4 LDI R30,4
64 071E CPC R17,R30
65 F3D0 BCS 0x0060
66 9508 RET
_delay_ms:
t --> R20
67 934A ST R20,-Y
68 935A ST R21,-Y
69 01A8 MOVW R20,R16
(0025) }
(0026) /*----------------------------------------------
(0027) delay_nms :长延时函数
(0028) 输入参数: t :延时时间 ms
(0029) -----------------------------------------------*/
(0030) void delay_ms(unsigned int t)
(0031) {
6A C001 RJMP 0x006C
(0032) while(t--)
(0033) delay_1ms();
6B DFF1 RCALL _delay_1ms
6C 011A MOVW R2,R20
6D 5041 SUBI R20,1
6E 4050 SBCI R21,0
6F 2022 TST R2
70 F7D1 BNE 0x006B
71 2033 TST R3
72 F7C1 BNE 0x006B
73 9159 LD R21,Y+
74 9149 LD R20,Y+
75 9508 RET
FILE: D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\twi.h
(0001) /*******************************************
(0002) * I2C(TWI)操作函数 *
(0003) * 文 件 名:TWI.h *
(0004) * 函数功能:利用CPU的硬件TWI接口操作 *
(0005) * 设 计:张子凤 *
(0006) * 修改日期:2008年11月11日 *
(0007) * 版 本:V1.0 *
(0008) * 主控芯片:Mega16 *
(0009) *******************************************/
(0010) //宏定义
(0011) //状态寄存器TWSR各种状态定义
(0012) //主模式启动状态
(0013) #define START 0x08 //启动总线
(0014) #define RESTART 0x10 //重新启动总线
(0015)
(0016) //主发送模式各种状态
(0017) #define MT_SLA_ACK 0x18 //SLA_W写地址已发送,收到应答位
(0018) #define MT_SLA_NACK 0x20 //SLA_W写地址已发送,收到非应答位
(0019) #define MT_DATA_ACK 0x28 //写入数据已发送,收到应答位
(0020) #define MT_DATA_NACK 0x30 //写入数据已发送,收到应答位
(0021) #define MT_ARB_LOST 0x38 //SLA_W或数据仲裁失败
(0022)
(0023) //主接收模式各种状态
(0024) #define MR_ARB_LOST 0x38 //
(0025) #define MR_SLA_ACK 0x40 //SLA_R已发送,收到应答位
(0026) #define MR_SLA_NACK 0x48 //SLA_R已发送,收到非应答位
(0027) #define MR_DATA_ACK 0x50 //接收到数据,应答位已返回
(0028) #define MR_DATA_NACK 0x58 //接收到数据,非应答位已返回
(0029)
(0030) #define PCF8563_SLA_W 0xA2 //PCF8563写从地址
(0031) #define PCF8563_SLA_R 0xA3 //PCF8563读从地址
(0032)
(0033) #define start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0034) #define stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0035) #define waitack() {while(!(TWCR&(1<<TWINT)));}
(0036) #define chkack() (TWSR&0xf8) //check ack
(0037) #define sendack() (TWCR|=(1<<TWEA))
(0038) #define sendnack() (TWCR&=~(1<<TWEA))
(0039) #define sendbyte(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
(0040) #define rcvnckbyte()(TWCR=(1<<TWINT)|(1<<TWEN))
(0041) #define rcvackbyte()(TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA))
(0042)
(0043) /* I2C Config */
(0044) #define I2C_ERR 0
(0045) #define I2C_CRR 1
(0046)
(0047) //TWI初始化
(0048) void Twi_Init(void)
(0049) {
(0050) TWBR=14;
_Twi_Init:
76 E08E LDI R24,0xE
77 B980 OUT 0x00,R24
(0051) TWSR=0;
78 2422 CLR R2
79 B821 OUT 0x01,R2
7A 9508 RET
FILE: D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\lcd1602.h
(0001) /*-------------------------------------------
(0002) RS----------PC2
(0003) RW----------GND
(0004) EN----------PC3
(0005) D4-D7-------PC4-PC7
(0006) ---------------------------------------------*/
(0007) //定义MCU与LCD的接口
(0008) #define LCD_EN_PORT PORTC
(0009) #define LCD_EN_DDR DDRC
(0010) #define LCD_RS_PORT PORTC
(0011) #define LCD_RS_DDR DDRC
(0012) #define LCD_DATA_PORT PORTC
(0013) #define LCD_DATA_DDR DDRC
(0014) #define LCD_DATA_PIN PINC
(0015) #define LCD_EN 0x08 //portc3 out
(0016) #define LCD_RS 0x04 //portc2 out
(0017) #define LCD_DATA 0xf0 //portc4/5/6/7 out
(0018)
(0019) /*----------------------------------------------------------
(0020) Public function prototypes
(0021) ----------------------------------------------------------*/
(0022) void LCD_init(void);
(0023) void LCD_en_write(void);
(0024) void clear(void);
(0025) void LCD_write_char(unsigned command,unsigned data);
(0026) void LCD_set_xy(unsigned char x, unsigned char y);
(0027) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
(0028) void LCD_write_data(unsigned char X,unsigned char Y,int dat);
(0029)
(0030) /*------------------------------------------------------------
(0031) 函数: lcd1602口线初始化和液晶初始化
(0032) -------------------------------------------------------------*/
(0033) void LCD_init(void) //液晶初始化
(0034) {
(0035) LCD_DATA_DDR|=LCD_DATA;
_LCD_init:
7B B384 IN R24,0x14
7C 6F80 ORI R24,0xF0
7D BB84 OUT 0x14,R24
(0036) LCD_EN_DDR|=LCD_EN;
7E 9AA3 SBI 0x14,3
(0037) LCD_RS_DDR|=LCD_RS;
7F 9AA2 SBI 0x14,2
(0038) delay_ms(15);
80 E00F LDI R16,0xF
81 E010 LDI R17,0
82 DFE4 RCALL _delay_ms
(0039) LCD_write_char(0x28,0); //4位显示
83 2722 CLR R18
84 2733 CLR R19
85 E208 LDI R16,0x28
86 E010 LDI R17,0
87 D028 RCALL _LCD_write_char
(0040) delay_ms(15);
88 E00F LDI R16,0xF
89 E010 LDI R17,0
8A DFDC RCALL _delay_ms
(0041) LCD_write_char(0x0c,0); //显示开
8B 2722 CLR R18
8C 2733 CLR R19
8D E00C LDI R16,0xC
8E E010 LDI R17,0
8F D020 RCALL _LCD_write_char
(0042) delay_ms(15);
90 E00F LDI R16,0xF
91 E010 LDI R17,0
92 DFD4 RCALL _delay_ms
(0043) LCD_write_char(0x01,0); //清屏
93 2722 CLR R18
94 2733 CLR R19
95 E001 LDI R16,1
96 E010 LDI R17,0
97 D018 RCALL _LCD_write_char
(0044) clear();
98 D052 RCALL _clear
99 9508 RET
_LCD_set_xy:
address --> R20
y --> R10
x --> R22
9A D27E RCALL push_xgsetF00C
9B 2EA2 MOV R10,R18
9C 2F60 MOV R22,R16
(0045) }
(0046)
(0047) /*------------------------------------------------------------
(0048) 函数: 设置显示地址
(0049) para: x---the display address of a line limit: 0---15
(0050) y---the display line limit 0 or 1
(0051) --------------------------------------------------------------*/
(0052) void LCD_set_xy(unsigned char x, unsigned char y) //写地址函数
(0053) {
(0054) unsigned char address;
(0055) if(y ==0)
9D 20AA TST R10
9E F419 BNE 0x00A2
(0056) address=0x80+x; //the first line
9F 2F46 MOV R20,R22
A0 5840 SUBI R20,0x80
A1 C002 RJMP 0x00A4
(0057) else
(0058) address=0xc0+x; //the second line
A2 2F46 MOV R20,R22
A3 5440 SUBI R20,0x40
(0059) LCD_write_char(address,0);
A4 2722 CLR R18
A5 2733 CLR R19
A6 2F04 MOV R16,R20
A7 2711 CLR R17
A8 D007 RCALL _LCD_write_char
A9 C274 RJMP pop_xgsetF00C
(0060) }
(0061) /*-------------------------------------------------------------
(0062) 函数: lcd1602使能
(0063) *--------------------------------------------------------------*/
(0064) void LCD_en_write(void) //液晶使能
(0065) {
(0066) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
AA 9AAB SBI 0x15,3
(0067) delay_us(5);
AB E005 LDI R16,5
AC E010 LDI R17,0
AD DFA0 RCALL _delay_us
(0068) LCD_EN_PORT&=~LCD_EN;
AE 98AB CBI 0x15,3
AF 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
B0 D280 RCALL push_xgsetF03C
B1 0169 MOVW R12,R18
B2 0158 MOVW R10,R16
(0069) }
(0070) /*------------------------------------------------------------
(0071) 函数: 写命令或数据到lcd1602
(0072) 参数:command: 0---写数据, 1---写命令
(0073) data: 所要写的命令或数据
(0074) *-------------------------------------------------------------*/
(0075) void LCD_write_char(unsigned command,unsigned data)
(0076) {
(0077) unsigned command_temp,data_temp;
(0078) command_temp=command;
B3 01A5 MOVW R20,R10
(0079) data_temp=data;
B4 01B6 MOVW R22,R12
(0080) delay_us(25);
B5 E109 LDI R16,0x19
B6 E010 LDI R17,0
B7 DF96 RCALL _delay_us
(0081) if(command==0)
B8 3040 CPI R20,0
B9 0745 CPC R20,R21
BA F4C1 BNE 0x00D3
(0082) {
(0083) LCD_RS_PORT|=LCD_RS; //RS=1
BB 9AAA SBI 0x15,2
(0084) LCD_DATA_PORT&=0X0f;
BC B385 IN R24,0x15
BD 708F ANDI R24,0xF
BE BB85 OUT 0x15,R24
(0085) LCD_DATA_PORT|=data_temp&0xf0; //写高四位
BF 01CB MOVW R24,R22
C0 940E 0359 CALL 0x0359
(0086) LCD_en_write();
C2 DFE7 RCALL _LCD_en_write
(0087) data_temp=data_temp<<4;
C3 0F66 LSL R22
C4 1F77 ROL R23
C5 0F66 LSL R22
C6 1F77 ROL R23
C7 0F66 LSL R22
C8 1F77 ROL R23
C9 0F66 LSL R22
CA 1F77 ROL R23
(0088) LCD_DATA_PORT&=0X0f;
CB B385 IN R24,0x15
CC 708F ANDI R24,0xF
CD BB85 OUT 0x15,R24
(0089) LCD_DATA_PORT|=data_temp&0xf0; //写低四位
CE 01CB MOVW R24,R22
CF 940E 0359 CALL 0x0359
(0090) LCD_en_write();
D1 DFD8 RCALL _LCD_en_write
(0091) }
D2 C017 RJMP 0x00EA
(0092) else
(0093) {
(0094) LCD_RS_PORT&=~LCD_RS; //RS=0
D3 98AA CBI 0x15,2
(0095) LCD_DATA_PORT&=0X0f;
D4 B385 IN R24,0x15
D5 708F ANDI R24,0xF
D6 BB85 OUT 0x15,R24
(0096) LCD_DATA_PORT|=command_temp&0xf0; //写高四位
D7 01CA MOVW R24,R20
D8 940E 0359 CALL 0x0359
(0097) LCD_en_write();
DA DFCF RCALL _LCD_en_write
(0098) command_temp=command_temp<<4;
DB 0F44 LSL R20
DC 1F55 ROL R21
DD 0F44 LSL R20
DE 1F55 ROL R21
DF 0F44 LSL R20
E0 1F55 ROL R21
E1 0F44 LSL R20
E2 1F55 ROL R21
(0099) LCD_DATA_PORT&=0x0f;
E3 B385 IN R24,0x15
E4 708F ANDI R24,0xF
E5 BB85 OUT 0x15,R24
(0100) LCD_DATA_PORT|=command_temp&0xf0; //写低四位
E6 01CA MOVW R24,R20
E7 940E 0359 CALL 0x0359
(0101) LCD_en_write();
E9 DFC0 RCALL _LCD_en_write
(0102) }
EA C24D RJMP pop_xgsetF03C
_clear:
i --> R20
EB 934A ST R20,-Y
(0103) }
(0104) /*-------------------------------------------------------------
(0105) 函数: 清屏lcd1602
(0106) ---------------------------------------------------------------*/
(0107) void clear(void)
(0108) {
(0109) unsigned char i;
(0110) LCD_set_xy(0,0);
EC 2722 CLR R18
ED 2700 CLR R16
EE DFAB RCALL _LCD_set_xy
(0111) for(i=0;i<16;i++)
EF 2744 CLR R20
F0 C004 RJMP 0x00F5
(0112) LCD_write_char(0,' ');
F1 940E 0366 CALL 0x0366
F3 DFBC RCALL _LCD_write_char
F4 9543 INC R20
F5 3140 CPI R20,0x10
F6 F3D0 BCS 0x00F1
(0113) LCD_set_xy(0,1);
F7 E021 LDI R18,1
F8 2700 CLR R16
F9 DFA0 RCALL _LCD_set_xy
(0114) for(i=0;i<16;i++)
FA 2744 CLR R20
FB C004 RJMP 0x0100
(0115) LCD_write_char(0,' ');
FC 940E 0366 CALL 0x0366
FE DFB1 RCALL _LCD_write_char
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -