📄 lcd.lis
字号:
00A8 _WR_control::
00A8 0E940000 xcall push_xgsetF000
00AC 602F mov R22,R16
00AE .dbline -1
00AE .dbline 51
00AE ; }
00AE ; //**************************************************************************
00AE ; void WR_control(unsigned char dat)
00AE ; {
00AE .dbline 53
00AE ; unsigned char s;
00AE ; s=dat&0xf0;
00AE 462F mov R20,R22
00B0 407F andi R20,240
00B2 .dbline 54
00B2 ; lcd_out(0xf8);
00B2 08EF ldi R16,248
00B4 D2DF xcall _lcd_out
00B6 .dbline 55
00B6 ; lcd_out(s);
00B6 042F mov R16,R20
00B8 D0DF xcall _lcd_out
00BA .dbline 56
00BA ; s=dat&0x0f;
00BA 462F mov R20,R22
00BC 4F70 andi R20,15
00BE .dbline 57
00BE ; s<<=4;
00BE 842F mov R24,R20
00C0 8F70 andi R24,#0x0F
00C2 8295 swap R24
00C4 482F mov R20,R24
00C6 .dbline 58
00C6 ; lcd_out(s);
00C6 082F mov R16,R24
00C8 C8DF xcall _lcd_out
00CA .dbline -2
00CA L26:
00CA .dbline 0 ; func end
00CA 0C940000 xjmp pop_xgsetF000
00CE .dbsym r s 20 c
00CE .dbsym r dat 22 c
00CE .dbend
00CE .dbfunc e lcd_control _lcd_control fV
.even
00CE _lcd_control::
00CE .dbline -1
00CE .dbline 62
00CE ; }
00CE ; //**************************************************************************
00CE ; void lcd_control()
00CE ; {
00CE .dbline 63
00CE ; WR_control(0x30);
00CE 00E3 ldi R16,48
00D0 EBDF xcall _WR_control
00D2 .dbline 64
00D2 ; WR_control(0x0c);
00D2 0CE0 ldi R16,12
00D4 E9DF xcall _WR_control
00D6 .dbline -2
00D6 L27:
00D6 .dbline 0 ; func end
00D6 0895 ret
00D8 .dbend
00D8 .dbfunc e lcd_clear _lcd_clear fV
00D8 ; i -> R20,R21
.even
00D8 _lcd_clear::
00D8 4A93 st -y,R20
00DA 5A93 st -y,R21
00DC .dbline -1
00DC .dbline 68
00DC ; }
00DC ; //**************************************************************************
00DC ; void lcd_clear()
00DC ; {
00DC .dbline 70
00DC ; int i;
00DC ; WR_control(0x01);
00DC 01E0 ldi R16,1
00DE E4DF xcall _WR_control
00E0 .dbline 71
00E0 ; for(i=0;i<5000;i++) // 延时5ms
00E0 4427 clr R20
00E2 5527 clr R21
00E4 L29:
00E4 .dbline 72
00E4 ; {
00E4 .dbline 73
00E4 ; asm("nop");
00E4 0000 nop
00E6 .dbline 74
00E6 ; asm("nop");
00E6 0000 nop
00E8 .dbline 76
00E8 ;
00E8 ; }
00E8 L30:
00E8 .dbline 71
00E8 4F5F subi R20,255 ; offset = 1
00EA 5F4F sbci R21,255
00EC .dbline 71
00EC 4838 cpi R20,136
00EE E3E1 ldi R30,19
00F0 5E07 cpc R21,R30
00F2 C4F3 brlt L29
00F4 X6:
00F4 .dbline -2
00F4 L28:
00F4 .dbline 0 ; func end
00F4 5991 ld R21,y+
00F6 4991 ld R20,y+
00F8 0895 ret
00FA .dbsym r i 20 I
00FA .dbend
00FA .dbfunc e LCD_address _LCD_address fV
00FA ; address -> R20
00FA ; y -> R22
00FA ; x -> R10
.even
00FA _LCD_address::
00FA 0E940000 xcall push_xgsetF00C
00FE 622F mov R22,R18
0100 A02E mov R10,R16
0102 .dbline -1
0102 .dbline 85
0102 ; }
0102 ; /*******************************************************/
0102 ; /****** 函数名称: LCD_set_xy() ******/
0102 ; /****** 功 能: 设置LCD显示坐标 ******/
0102 ; /****** 参 数: 显示字符串的位置,X:0-15,Y:0-1*****/
0102 ; /****** 返回值 : 无 ******/
0102 ; /*******************************************************/
0102 ; void LCD_address( unsigned char x, unsigned char y )
0102 ; {
0102 .dbline 87
0102 ; unsigned char address;
0102 ; switch(x)
0102 4A2D mov R20,R10
0104 5527 clr R21
0106 4030 cpi R20,0
0108 4507 cpc R20,R21
010A 69F0 breq L37
010C X7:
010C 4130 cpi R20,1
010E E0E0 ldi R30,0
0110 5E07 cpc R21,R30
0112 61F0 breq L38
0114 X8:
0114 4230 cpi R20,2
0116 E0E0 ldi R30,0
0118 5E07 cpc R21,R30
011A 59F0 breq L39
011C X9:
011C 4330 cpi R20,3
011E E0E0 ldi R30,0
0120 5E07 cpc R21,R30
0122 51F0 breq L40
0124 X10:
0124 0CC0 xjmp L34
0126 L37:
0126 .dbline 90
0126 ; {
0126 ; case 0:
0126 ; address = 0x80 + y; //计算显示地址
0126 462F mov R20,R22
0128 4058 subi R20,128 ; addi 128
012A .dbline 91
012A ; break;
012A 0BC0 xjmp L35
012C L38:
012C .dbline 93
012C ; case 1:
012C ; address = 0x90 + y; //计算显示地址
012C 462F mov R20,R22
012E 4057 subi R20,112 ; addi 144
0130 .dbline 94
0130 ; break;
0130 08C0 xjmp L35
0132 L39:
0132 .dbline 96
0132 ; case 2:
0132 ; address = 0x88 + y; //计算显示地址
0132 462F mov R20,R22
0134 4857 subi R20,120 ; addi 136
0136 .dbline 97
0136 ; break;
0136 05C0 xjmp L35
0138 L40:
0138 .dbline 99
0138 ; case 3:
0138 ; address = 0x98 + y; //计算显示地址
0138 462F mov R20,R22
013A 4856 subi R20,104 ; addi 152
013C .dbline 100
013C ; break;
013C 02C0 xjmp L35
013E L34:
013E .dbline 101
013E ; default:address = 0x80 + y;
013E 462F mov R20,R22
0140 4058 subi R20,128 ; addi 128
0142 .dbline 102
0142 ; }
0142 L35:
0142 .dbline 103
0142 ; WR_control( address); //写地址命令
0142 042F mov R16,R20
0144 B1DF xcall _WR_control
0146 .dbline -2
0146 L33:
0146 .dbline 0 ; func end
0146 0C940000 xjmp pop_xgsetF00C
014A .dbsym r address 20 c
014A .dbsym r y 22 c
014A .dbsym r x 10 c
014A .dbend
014A .dbfunc e LCD_Write_string _LCD_Write_string fV
014A ; s -> R20,R21
014A ; Y -> R12
014A ; X -> R10
.even
014A _LCD_Write_string::
014A 0E940000 xcall push_xgset303C
014E C22E mov R12,R18
0150 A02E mov R10,R16
0152 4E81 ldd R20,y+6
0154 5F81 ldd R21,y+7
0156 .dbline -1
0156 .dbline 114
0156 ; }
0156 ; //**************************************************************************
0156 ; /*******************************************************/
0156 ; /****** 函数名称: LCD_write_string() ******/
0156 ; /****** 功 能: 中英文字符串显示函数 ******/
0156 ; /****** 参 数: *s--英文字符串指针 ******/
0156 ; /****** X、Y--显示字符串的位置 ******/
0156 ; /****** 返回值 : 无 ******/
0156 ; /*******************************************************/
0156 ; void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
0156 ; {
0156 .dbline 116
0156 ;
0156 ; LCD_address( X, Y ); //写显示地址
0156 2C2D mov R18,R12
0158 0A2D mov R16,R10
015A CFDF xcall _LCD_address
015C 05C0 xjmp L43
015E L42:
015E .dbline 118
015E ; while (*s) //是否到字符串尾
015E ; {
015E .dbline 119
015E ; WR_dat (*s ); //写显示数据
015E FA01 movw R30,R20
0160 0081 ldd R16,z+0
0162 8FDF xcall _WR_dat
0164 .dbline 120
0164 ; s ++; //字符串地址加1
0164 4F5F subi R20,255 ; offset = 1
0166 5F4F sbci R21,255
0168 .dbline 121
0168 ; }
0168 L43:
0168 .dbline 117
0168 FA01 movw R30,R20
016A 2080 ldd R2,z+0
016C 2220 tst R2
016E B9F7 brne L42
0170 X11:
0170 .dbline -2
0170 L41:
0170 .dbline 0 ; func end
0170 0C940000 xjmp pop_xgset303C
0174 .dbsym r s 20 pc
0174 .dbsym r Y 12 c
0174 .dbsym r X 10 c
0174 .dbend
0174 .dbfunc e BCD_ASCII _BCD_ASCII fc
0174 ; bcd -> R16
.even
0174 _BCD_ASCII::
0174 .dbline -1
0174 .dbline 133
0174 ; }
0174 ;
0174 ;
0174 ; /******************************************************************************/
0174 ; //函数功能:将BCD码转换为ASCII码函数
0174 ; //输入数据:BCD
0174 ; //输出:ASCII
0174 ; //作者:韩红瑞
0174 ; //修改时间:2006-08-31
0174 ; /******************************************************************************/
0174 ; unsigned char BCD_ASCII(unsigned char bcd)
0174 ; {
0174 .dbline 134
0174 ; bcd &= 0x0F;
0174 0F70 andi R16,15
0176 .dbline 135
0176 ; if(bcd > 9)
0176 89E0 ldi R24,9
0178 8017 cp R24,R16
017A 10F4 brsh L46
017C X12:
017C .dbline 136
017C ; bcd +=('7'); // 将A~F转换为ASCII
017C 095C subi R16,201 ; addi 55
017E 01C0 xjmp L47
0180 L46:
0180 .dbline 138
0180 ; else
0180 ; bcd += '0'; // 将0~9转换为ASCII 0~9
0180 005D subi R16,208 ; addi 48
0182 L47:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -