📄 18b20.lst
字号:
__text_start:
__start:
32 E5CF LDI R28,0x5F
33 E0D4 LDI R29,4
34 BFCD OUT 0x3D,R28
35 BFDE OUT 0x3E,R29
36 51CE SUBI R28,0x1E
37 40D0 SBCI R29,0
38 EA0A LDI R16,0xAA
39 8308 STD Y+0,R16
3A 2400 CLR R0
3B E7E0 LDI R30,0x70
3C E0F0 LDI R31,0
3D E010 LDI R17,0
3E 37E0 CPI R30,0x70
3F 07F1 CPC R31,R17
40 F011 BEQ 0x0043
41 9201 ST R0,Z+
42 CFFB RJMP 0x003E
43 8300 STD Z+0,R16
44 E5E4 LDI R30,0x54
45 E0F0 LDI R31,0
46 E6A0 LDI R26,0x60
47 E0B0 LDI R27,0
48 E010 LDI R17,0
49 E000 LDI R16,0
4A BF0B OUT 0x3B,R16
4B 36E4 CPI R30,0x64
4C 07F1 CPC R31,R17
4D F021 BEQ 0x0052
4E 95C8 LPM
4F 9631 ADIW R30,1
50 920D ST R0,X+
51 CFF9 RJMP 0x004B
52 D1AA RCALL _main
_exit:
53 CFFF RJMP _exit
FILE: D:\mega16_32实验板资料\ICCAVR源程序\18b20\delay.h
(0001) /**********延时函数*****************/
(0002) /*-----------------------------------------------
(0003) delay_us :1us延时函数
(0004) ------------------------------------------------*/
(0005) void delay_1us(void)
(0006) {
(0007) asm("nop");
_delay_1us:
54 0000 NOP
55 9508 RET
_delay_us:
t --> R20
56 934A ST R20,-Y
57 935A ST R21,-Y
58 01A8 MOVW R20,R16
(0008) }
(0009) /*-----------------------------------------------
(0010) delay_nus :长延时函数
(0011) 输入参数: t :延时时间 us
(0012) ------------------------------------------------*/
(0013) void delay_us(unsigned int t)
(0014) {
59 C001 RJMP 0x005B
(0015) while(t--)
(0016) delay_1us();
5A DFF9 RCALL _delay_1us
5B 011A MOVW R2,R20
5C 5041 SUBI R20,1
5D 4050 SBCI R21,0
5E 2022 TST R2
5F F7D1 BNE 0x005A
60 2033 TST R3
61 F7C1 BNE 0x005A
62 9159 LD R21,Y+
63 9149 LD R20,Y+
64 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
65 2700 CLR R16
66 2711 CLR R17
67 C002 RJMP 0x006A
68 5F0F SUBI R16,0xFF
69 4F1F SBCI R17,0xFF
6A 3704 CPI R16,0x74
6B E0E4 LDI R30,4
6C 071E CPC R17,R30
6D F3D0 BCS 0x0068
6E 9508 RET
_delay_ms:
t --> R20
6F 934A ST R20,-Y
70 935A ST R21,-Y
71 01A8 MOVW R20,R16
(0025) }
(0026) /*----------------------------------------------
(0027) delay_nms :长延时函数
(0028) 输入参数: t :延时时间 ms
(0029) -----------------------------------------------*/
(0030) void delay_ms(unsigned int t)
(0031) {
72 C001 RJMP 0x0074
(0032) while(t--)
(0033) delay_1ms();
73 DFF1 RCALL _delay_1ms
74 011A MOVW R2,R20
75 5041 SUBI R20,1
76 4050 SBCI R21,0
77 2022 TST R2
78 F7D1 BNE 0x0073
79 2033 TST R3
7A F7C1 BNE 0x0073
7B 9159 LD R21,Y+
7C 9149 LD R20,Y+
7D 9508 RET
_lcd_write:
j --> R22
a --> R20
i --> R10
content --> R10
dat_comm --> R12
7E D1D7 RCALL push_xgsetF03C
7F 2EA2 MOV R10,R18
80 2EC0 MOV R12,R16
FILE: D:\mega16_32实验板资料\ICCAVR源程序\18b20\lcd12232.h
(0001) //定义LCD口线
(0002) #define lcd_cs PA4
(0003) #define lcd_std PA3
(0004) #define lcd_sclk PA2
(0005) #define lcd_port PORTA
(0006) #define lcd_ddr DDRA
(0007)
(0008) //LCD显示坐标定义
(0009) #define x1 0x80 //lcd初始坐标1
(0010) #define x2 0x90 //lcd初始坐标2
(0011)
(0012) //LCD数据/命令格式定义
(0013) #define command 0 //lcd命令
(0014) #define data 1 //lcd数据
(0015)
(0016) //传送单个字节到LCD
(0017) void lcd_write(unsigned char dat_comm,unsigned char content)
(0018) {
(0019) unsigned char a,i,j;
(0020) delay_1ms();//延时时间要根据实际使用的芯片采用不同的延时时间
81 DFE3 RCALL _delay_1ms
(0021) a=content; //数据记录
82 2D4A MOV R20,R10
(0022) //delay_ms();//这个延时要根据实际需要看是否需要增加//如8515就要加
(0023) lcd_port|=BIT(lcd_cs);//cs=1
83 9ADC SBI 0x1B,4
(0024) lcd_port&=~BIT(lcd_sclk);//sclk=0;
84 98DA CBI 0x1B,2
(0025) lcd_port|=(1<<lcd_std);//PORTC|=BIT(lcd_std);//std=1;
85 9ADB SBI 0x1B,3
(0026) for(i=0;i<5;i++) //启动命令
86 24AA CLR R10
87 C003 RJMP 0x008B
(0027) {
(0028) lcd_port|=BIT(lcd_sclk);//sclk=1;
88 9ADA SBI 0x1B,2
(0029) lcd_port&=~BIT(lcd_sclk);//sclk=0;
89 98DA CBI 0x1B,2
8A 94A3 INC R10
8B 2D8A MOV R24,R10
8C 3085 CPI R24,5
8D F3D0 BCS 0x0088
(0030) }
(0031) lcd_port&=~(1<<lcd_std);//PORTC&=~BIT(lcd_std);//std=0;
8E 98DB CBI 0x1B,3
(0032) lcd_port|=BIT(lcd_sclk);//sclk=1;
8F 9ADA SBI 0x1B,2
(0033) lcd_port&=~BIT(lcd_sclk);//sclk=0;
90 98DA CBI 0x1B,2
(0034) if(dat_comm)
91 20CC TST R12
92 F011 BEQ 0x0095
(0035) lcd_port|=(1<<lcd_std);//PORTC|=BIT(lcd_std);//std=1; //数据
93 9ADB SBI 0x1B,3
94 C001 RJMP 0x0096
(0036) else
(0037) lcd_port&=~(1<<lcd_std);//PORTC&=~BIT(lcd_std);//std=0; //命令
95 98DB CBI 0x1B,3
(0038) lcd_port|=BIT(lcd_sclk);//sclk=1;
96 9ADA SBI 0x1B,2
(0039) lcd_port&=~BIT(lcd_sclk);//sclk=0;
97 98DA CBI 0x1B,2
(0040) lcd_port&=~(1<<lcd_std);//PORTC&=~BIT(lcd_std);//std=0;
98 98DB CBI 0x1B,3
(0041) lcd_port|=BIT(lcd_sclk);//sclk=1;
99 9ADA SBI 0x1B,2
(0042) lcd_port&=~BIT(lcd_sclk);//sclk=0;
9A 98DA CBI 0x1B,2
(0043) for(j=0;j<2;j++) //循环发送8个位数据
9B 2766 CLR R22
9C C01A RJMP 0x00B7
(0044) {
(0045) for(i=0;i<4;i++)
9D 24AA CLR R10
9E C00B RJMP 0x00AA
(0046) {
(0047) if ((a&0x80)==0x80)
9F 2F84 MOV R24,R20
A0 7880 ANDI R24,0x80
A1 3880 CPI R24,0x80
A2 F411 BNE 0x00A5
(0048) lcd_port|=(1<<lcd_std);//PORTC|=BIT(lcd_std);//单字节传送
A3 9ADB SBI 0x1B,3
A4 C001 RJMP 0x00A6
(0049) else
(0050) lcd_port&=~(1<<lcd_std);//PORTC&=~BIT(lcd_std);
A5 98DB CBI 0x1B,3
(0051) a=a<<1;
A6 0F44 LSL R20
(0052) lcd_port|=BIT(lcd_sclk);//sclk=1;
A7 9ADA SBI 0x1B,2
(0053) lcd_port&=~BIT(lcd_sclk);//sclk=0;
A8 98DA CBI 0x1B,2
A9 94A3 INC R10
AA 2D8A MOV R24,R10
AB 3084 CPI R24,4
AC F390 BCS 0x009F
(0054) }
(0055) lcd_port&=~(1<<lcd_std);//PORTC&=~BIT(lcd_std);//std=0;
AD 98DB CBI 0x1B,3
(0056) for(i=0;i<4;i++) //发送4个空数据
AE 24AA CLR R10
AF C003 RJMP 0x00B3
(0057) {
(0058) lcd_port|=BIT(lcd_sclk);//sclk=1;
B0 9ADA SBI 0x1B,2
(0059) lcd_port&=~BIT(lcd_sclk);//sclk=0;
B1 98DA CBI 0x1B,2
B2 94A3 INC R10
B3 2D8A MOV R24,R10
B4 3084 CPI R24,4
B5 F3D0 BCS 0x00B0
B6 9563 INC R22
B7 3062 CPI R22,2
B8 F320 BCS 0x009D
(0060) }
(0061) }
(0062) lcd_port|=BIT(lcd_cs);
B9 9ADC SBI 0x1B,4
BA C1A4 RJMP pop_xgsetF03C
(0063) }
(0064)
(0065) //LCD初始化
(0066) void LCD_init(void)
(0067) {
(0068) /**********LCD12232串口口线设置************/
(0069) lcd_port|=BIT(lcd_cs)|BIT(lcd_sclk)|BIT(lcd_std);
_LCD_init:
BB B38B IN R24,0x1B
BC 618C ORI R24,0x1C
BD BB8B OUT 0x1B,R24
(0070) lcd_ddr|=BIT(lcd_cs)|BIT(lcd_sclk)|BIT(lcd_std);
BE B38A IN R24,0x1A
BF 618C ORI R24,0x1C
C0 BB8A OUT 0x1A,R24
(0071)
(0072) lcd_write(command,0x30); //30---基本指令动作
C1 E320 LDI R18,0x30
C2 2700 CLR R16
C3 DFBA RCALL _lcd_write
(0073) //lcd_write(command,0x04); //点设定:显示字符/光标从左到右移位,DDRAM地址加1
(0074) lcd_write(command,0x01); //清屏,地址指针指向00H
C4 E021 LDI R18,1
C5 2700 CLR R16
C6 DFB7 RCALL _lcd_write
(0075) lcd_write(command,0x06); //光标的移动方向
C7 E026 LDI R18,6
C8 2700 CLR R16
C9 DFB4 RCALL _lcd_write
(0076) lcd_write(command,0x0c); //开显示,关游标
CA E02C LDI R18,0xC
CB 2700 CLR R16
CC DFB1 RCALL _lcd_write
(0077) delay_1ms(); //液晶初始化后延时
CD CF97 RJMP _delay_1ms
_lcd_display:
i --> R20
chn --> R10
CE D173 RCALL push_xgset300C
CF 0158 MOVW R10,R16
(0078) }
(0079)
(0080) //LCD全屏显示字符
(0081) void lcd_display(unsigned char chn[30])
(0082) {
(0083) unsigned char i;
(0084) lcd_write(command,0x30);
D0 E320 LDI R18,0x30
D1 2700 CLR R16
D2 DFAB RCALL _lcd_write
(0085) lcd_write(command,x1);
D3 E820 LDI R18,0x80
D4 2700 CLR R16
D5 DFA8 RCALL _lcd_write
(0086) for(i=0;i<15;i++)
D6 2744 CLR R20
D7 C004 RJMP 0x00DC
(0087) lcd_write(data,chn[i]);
D8 940E 0264 CALL <created procedures>
DA DFA3 RCALL _lcd_write
DB 9543 INC R20
DC 304F CPI R20,0xF
DD F3D0 BCS 0x00D8
(0088) lcd_write(command,x2);
DE E920 LDI R18,0x90
DF 2700 CLR R16
E0 DF9D RCALL _lcd_write
(0089) for(i=0;i<15;i++)
E1 2744 CLR R20
E2 C008 RJMP 0x00EB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -