📄 1602xi.lst
字号:
(0063) lcd_control_port&=~lcd_EN;//重设E=0
00B8 98AA CBI 0x15,2
00B9 D062 RCALL pop_gset1
00BA 9508 RET
(0064) }
(0065)
(0066) //正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。
(0067) //检测忙信号,等待LCD空闲函数
(0068) void wait_enable(void)
(0069) {
(0070) lcd_busy_ddr&=~busy;//设置busy口为输入
_wait_enable:
00BB 98BF CBI 0x17,7
(0071) lcd_control_port&=~lcd_RS;//RS=0
00BC 98A8 CBI 0x15,0
(0072) lcd_control_port|=lcd_RW;//RW=1
00BD 9AA9 SBI 0x15,1
(0073) NOP();
00BE 0000 NOP
(0074) lcd_control_port|=lcd_EN;//E=1
00BF 9AAA SBI 0x15,2
(0075) while(lcd_busy_pin&busy);//等待LCD_DB7为0
00C0 99B7 SBIC 0x16,7
00C1 CFFE RJMP 0x00C0
(0076) lcd_control_port&=~lcd_EN;//重设E=0
00C2 98AA CBI 0x15,2
(0077) lcd_busy_ddr|=busy;//设置busy口为输出
00C3 9ABF SBI 0x17,7
00C4 9508 RET
_lcd_set_xy:
address --> R20
y --> R20
x --> R22
00C5 D051 RCALL push_gset2
00C6 2F42 MOV R20,R18
00C7 2F60 MOV R22,R16
(0078) }
(0079) /**LCD_set_xy:设置LCD显示的起始位置输入参数:x、y :
(0080) 显示字符串的位置,X:0-15,Y:0-1
(0081) LCD第一行显示寄存器地址:0X80-0X8F
(0082) LCD第一行显示寄存器地址:0XC0-0XCF ***/
(0083) void lcd_set_xy( unsigned char x, unsigned char y )
(0084) {
(0085) unsigned char address;
(0086) if (y == 0)
00C8 2344 TST R20
00C9 F419 BNE 0x00CD
(0087) address = 0x80 + x;
00CA 2F46 MOV R20,R22
00CB 5840 SUBI R20,0x80
00CC C002 RJMP 0x00CF
(0088) else
(0089) address = 0xc0 + x;
00CD 2F46 MOV R20,R22
00CE 5440 SUBI R20,0x40
(0090) lcd_write_command(address,1);//一定需要检查忙信号,所以为1
00CF E021 LDI R18,1
00D0 2F04 MOV R16,R20
00D1 DFCE RCALL _lcd_write_command
00D2 D03A RCALL pop_gset2
00D3 9508 RET
_display_a_char:
char_data --> Y+4
y --> R22
x --> R20
00D4 D042 RCALL push_gset2
00D5 2F62 MOV R22,R18
00D6 2F40 MOV R20,R16
(0091) }
(0092) //显示一个字符函数
(0093) void display_a_char(unsigned char x,unsigned char y,unsigned char char_data)//char_data为要显示的字符
(0094) {
(0095) lcd_set_xy(x,y);
00D7 2F26 MOV R18,R22
00D8 2F04 MOV R16,R20
00D9 DFEB RCALL _lcd_set_xy
(0096) lcd_write_data(char_data);
00DA 810C LDD R16,Y+4
00DB DFD3 RCALL _lcd_write_data
00DC D030 RCALL pop_gset2
00DD 9508 RET
_display_a_string:
ptr --> R20
y --> R10
x --> R22
00DE D036 RCALL push_gset3
00DF 2EA2 MOV R10,R18
00E0 2F60 MOV R22,R16
00E1 814E LDD R20,Y+6
00E2 815F LDD R21,Y+7
(0097) }
(0098)
(0099) //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符
(0100) //显示一行连续字符串函数
(0101)
(0102) void display_a_string(unsigned char x,unsigned char y,unsigned char *ptr)
(0103) {
(0104) //ptr:指向无符号字符型变量的指针变量,指针也就是地址,指字符串数组的首指针
(0105) lcd_set_xy(x,y);
00E3 2D2A MOV R18,R10
00E4 2F06 MOV R16,R22
00E5 DFDF RCALL _lcd_set_xy
00E6 C005 RJMP 0x00EC
(0106) while(*ptr)//当ptr='\0'(空指针null)跳出循环
(0107) {
(0108) lcd_write_data(*ptr);//*ptr,指向该地址的内容
00E7 01FA MOVW R30,R20
00E8 8100 LDD R16,Z+0
00E9 DFC5 RCALL _lcd_write_data
(0109) ptr++;
00EA 5F4F SUBI R20,0xFF
00EB 4F5F SBCI R21,0xFF
00EC 01FA MOVW R30,R20
00ED 8020 LDD R2,Z+0
00EE 2022 TST R2
00EF F7B9 BNE 0x00E7
00F0 D01E RCALL pop_gset3
00F1 9508 RET
_display_a_fluid:
ptr --> R20
y --> R10
x --> R22
00F2 D022 RCALL push_gset3
00F3 2EA2 MOV R10,R18
00F4 2F60 MOV R22,R16
00F5 814E LDD R20,Y+6
00F6 815F LDD R21,Y+7
(0110) }
(0111) }
(0112) /*********************流动字幕***********************/
(0113) void display_a_fluid(unsigned char x,unsigned char y,unsigned char *ptr)
(0114) { lcd_write_command(0x07,1);//流动字幕
00F7 E021 LDI R18,1
00F8 E007 LDI R16,7
00F9 DFA6 RCALL _lcd_write_command
(0115) lcd_set_xy(x,y);
00FA 2D2A MOV R18,R10
00FB 2F06 MOV R16,R22
00FC DFC8 RCALL _lcd_set_xy
00FD C008 RJMP 0x0106
(0116) while(*ptr)
(0117) {
(0118) lcd_write_data(*ptr);
00FE 01FA MOVW R30,R20
00FF 8100 LDD R16,Z+0
0100 DFAE RCALL _lcd_write_data
(0119) delay_nms(200);
0101 EC08 LDI R16,0xC8
0102 E010 LDI R17,0
0103 DF63 RCALL _delay_nms
(0120) ptr++;
0104 5F4F SUBI R20,0xFF
0105 4F5F SBCI R21,0xFF
0106 01FA MOVW R30,R20
0107 8020 LDD R2,Z+0
0108 2022 TST R2
0109 F7A1 BNE 0x00FE
010A D004 RCALL pop_gset3
010B 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\1602\main.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "LCD1602.h"
(0004) #define set 0x10
(0005) //PD^4
(0006) #define add 0x20
(0007) //PD^5
(0008) #define sub 0x40
(0009) //PD^6
(0010) #define enter 0x80
(0011) //PD^7
(0012)
(0013) //#pragma abs_address:0x1B00
(0014) //#pragma end_abs_address
(0015) unsigned char string[]="0123456789";
(0016) unsigned char welcome[]="Welcome";
(0017) unsigned char temperature[]="Temper: 0 C";
(0018) unsigned char temperset[] ="Temset: 0 C";
(0019) //unsigned char temper[]={0}; //设置温度缓冲区
(0020) //unsigned char wendu[]={0};
(0021) //unsigned char wenduset=0;
(0022)
(0023) /*void key(void)
(0024) {unsigned char testkey=0;
(0025) DDRD&=0X0F;
(0026) PORTD|=0xf0;
(0027) if(!(set&PIND)
(0028) {delay_nus(100);
(0029) if(!(set&PIND)
(0030) {lcd_write_command(0x0e,0);//光标开
(0031)
(0032) lcd_write_command(0x01,1);
(0033)
(0034)
(0035) }
(0036)
(0037)
(0038) }*/
(0039)
(0040) /*void BCD(unsigned int count)
(0041) {
(0042) unsigned i, temp;
(0043) for(i=0;i<3;i++)
(0044) {temp=count%10;
(0045) temper[3-i]=temp;
(0046) count=count/10;
(0047) }
(0048)
(0049) }
(0050) */
(0051) void main(void)
(0052) {
FILE: <library>
_main:
010C 9508 RET
pop_gset2:
010D E0E2 LDI R30,2
010E C00E RJMP pop
pop_gset3:
010F E0E4 LDI R30,4
0110 C00C RJMP pop
push_gset5:
0111 92FA ST R15,-Y
0112 92EA ST R14,-Y
push_gset4:
0113 92DA ST R13,-Y
0114 92CA ST R12,-Y
push_gset3:
0115 92BA ST R11,-Y
0116 92AA ST R10,-Y
push_gset2:
0117 937A ST R23,-Y
0118 936A ST R22,-Y
push_gset1:
0119 935A ST R21,-Y
011A 934A ST R20,-Y
011B 9508 RET
pop_gset1:
011C E0E1 LDI R30,1
pop:
011D 9149 LD R20,Y+
011E 9159 LD R21,Y+
011F FDE0 SBRC R30,0
0120 9508 RET
0121 9169 LD R22,Y+
0122 9179 LD R23,Y+
0123 FDE1 SBRC R30,1
0124 9508 RET
0125 90A9 LD R10,Y+
0126 90B9 LD R11,Y+
0127 FDE2 SBRC R30,2
0128 9508 RET
0129 90C9 LD R12,Y+
012A 90D9 LD R13,Y+
012B FDE3 SBRC R30,3
012C 9508 RET
012D 90E9 LD R14,Y+
012E 90F9 LD R15,Y+
012F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -