📄 lcd.lis
字号:
.module lcd.c
.area text(rom, con, rel)
0000 .dbfile F:\programme\RF905\lcd.c
0000 .dbfunc e delay _delay fV
0000 ; i -> R20,R21
0000 ; times -> R16,R17
.even
0000 _delay::
0000 00D0 rcall push_gset1
0002 .dbline -1
0002 .dbline 21
0002 ; ///****************************************************************//
0002 ; //液晶显示模块,采用ATmega8单片机和OCM4*8液晶,串行方式
0002 ; //采用PORTD的高三位
0002 ; //pd5---lcd_cs
0002 ; //pd7---lcd_sdat
0002 ; //pd6---lcd_sclk
0002 ; //周金广2006年7月20日整理
0002 ; ///****************************************************************//
0002 ; ///////////////////////////////////////////////////
0002 ; //lcd初始化程序
0002 ; //////////////////////////////////////////////////
0002 ; #include <stdio.h>
0002 ; #include <iom8v.h>
0002 ; #include <macros.h>
0002 ;
0002 ;
0002 ; ///////////////////////////////////////////////
0002 ; //
0002 ; //////////////////////////////////////////////
0002 ; void delay(unsigned int times)
0002 ; {unsigned int i;
0002 .dbline 22
0002 ; for(i=0;i<times;i++)
0002 4427 clr R20
0004 5527 clr R21
0006 02C0 rjmp L5
0008 L2:
0008 .dbline 23
0008 L3:
0008 .dbline 22
0008 4F5F subi R20,255 ; offset = 1
000A 5F4F sbci R21,255
000C L5:
000C .dbline 22
000C 4017 cp R20,R16
000E 5107 cpc R21,R17
0010 D8F3 brlo L2
0012 .dbline -2
0012 L1:
0012 00D0 rcall pop_gset1
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbsym r i 20 i
0016 .dbsym r times 16 i
0016 .dbend
0016 .dbfunc e lcd_send_byte _lcd_send_byte fV
0016 ; data1 -> R20,R21
0016 ; i -> R22,R23
0016 ; data -> R10
.even
0016 _lcd_send_byte::
0016 00D0 rcall push_gset3
0018 A02E mov R10,R16
001A .dbline -1
001A .dbline 27
001A ; ;
001A ; }
001A ;
001A ; void lcd_send_byte(char data)
001A ; {unsigned int i,data1;
001A .dbline 28
001A ; for(i=0;i<8;i++)
001A 6627 clr R22
001C 7727 clr R23
001E 15C0 rjmp L10
0020 L7:
0020 .dbline 29
0020 ; {data1=data&0x80; //test data bit7 为零则放送零,为一则放送一
0020 .dbline 29
0020 4A2D mov R20,R10
0022 5527 clr R21
0024 4078 andi R20,128
0026 5070 andi R21,0
0028 .dbline 30
0028 ; if(data1!=0)
0028 4030 cpi R20,0
002A 4507 cpc R20,R21
002C 29F0 breq L11
002E X0:
002E .dbline 31
002E ; { PORTD|=BIT(PD7);
002E .dbline 31
002E 979A sbi 0x12,7
0030 .dbline 32
0030 ; delay(20);
0030 04E1 ldi R16,20
0032 10E0 ldi R17,0
0034 E5DF rcall _delay
0036 .dbline 33
0036 ; }
0036 04C0 rjmp L12
0038 L11:
0038 .dbline 34
0038 ; else {PORTD&=~BIT(PD7); ///当单片机速度太快时,加延时
0038 .dbline 34
0038 9798 cbi 0x12,7
003A .dbline 35
003A ; delay(20); }
003A 04E1 ldi R16,20
003C 10E0 ldi R17,0
003E E0DF rcall _delay
0040 .dbline 35
0040 L12:
0040 .dbline 38
0040 969A sbi 0x12,6
0042 .dbline 40
0042 9698 cbi 0x12,6
0044 .dbline 41
0044 AA0C lsl R10
0046 .dbline 42
0046 L8:
0046 .dbline 28
0046 6F5F subi R22,255 ; offset = 1
0048 7F4F sbci R23,255
004A L10:
004A .dbline 28
004A 6830 cpi R22,8
004C E0E0 ldi R30,0
004E 7E07 cpc R23,R30
0050 38F3 brlo L7
0052 .dbline -2
0052 L6:
0052 00D0 rcall pop_gset3
0054 .dbline 0 ; func end
0054 0895 ret
0056 .dbsym r data1 20 i
0056 .dbsym r i 22 i
0056 .dbsym r data 10 c
0056 .dbend
0056 .dbfunc e lcd_write_data _lcd_write_data fV
0056 ; data2 -> R22
0056 ; data1 -> R10
0056 ; data3 -> R20
0056 ; data -> R20
.even
0056 _lcd_write_data::
0056 00D0 rcall push_gset3
0058 402F mov R20,R16
005A .dbline -1
005A .dbline 48
005A ;
005A ; //PORTD=PORTD&data;
005A ; PORTD|=BIT(PD6); // set sclk high
005A ;
005A ; PORTD&=~BIT(PD6); // set sclk low
005A ; data=data<<1;
005A ; }
005A ; }
005A ; /////////////////////////////////////////////////////////////
005A ; ////
005A ; ////////////////////////////////////////////////////////////
005A ; void lcd_write_data(char data)
005A ; {char data1=0xfa,data2,data3;
005A .dbline 48
005A 8AEF ldi R24,250
005C A82E mov R10,R24
005E .dbline 50
005E ;
005E ; PORTD|=BIT(PD5); //set cs high
005E 959A sbi 0x12,5
0060 .dbline 52
0060 ;
0060 ; data2=data&0xf0;
0060 642F mov R22,R20
0062 607F andi R22,240
0064 .dbline 53
0064 ; data3=data&0x0f;
0064 4F70 andi R20,15
0066 .dbline 54
0066 ; data3=data3<<4;
0066 842F mov R24,R20
0068 8F70 andi R24,#0x0F
006A 8295 swap R24
006C 482F mov R20,R24
006E .dbline 56
006E ;
006E ; lcd_send_byte(data1);
006E 0A2D mov R16,R10
0070 D2DF rcall _lcd_send_byte
0072 .dbline 57
0072 ; lcd_send_byte(data2);
0072 062F mov R16,R22
0074 D0DF rcall _lcd_send_byte
0076 .dbline 58
0076 ; lcd_send_byte(data3);
0076 042F mov R16,R20
0078 CEDF rcall _lcd_send_byte
007A .dbline 60
007A ;
007A ; PORTD&=~BIT(PD5); //set cs low
007A 9598 cbi 0x12,5
007C .dbline -2
007C L13:
007C 00D0 rcall pop_gset3
007E .dbline 0 ; func end
007E 0895 ret
0080 .dbsym r data2 22 c
0080 .dbsym r data1 10 c
0080 .dbsym r data3 20 c
0080 .dbsym r data 20 c
0080 .dbend
0080 .dbfunc e lcd_write_comm _lcd_write_comm fV
0080 ; data2 -> R22
0080 ; data1 -> R10
0080 ; data3 -> R20
0080 ; data -> R20
.even
0080 _lcd_write_comm::
0080 00D0 rcall push_gset3
0082 402F mov R20,R16
0084 .dbline -1
0084 .dbline 68
0084 ;
0084 ; }
0084 ; /////////////////////////////////////////////////////////////
0084 ; ////
0084 ; ////////////////////////////////////////////////////////////
0084 ; void lcd_write_comm(char data)
0084 ; //int data;
0084 ; {char data1=0xf8,data2,data3;
0084 .dbline 68
0084 88EF ldi R24,248
0086 A82E mov R10,R24
0088 .dbline 69
0088 ; PORTD|=BIT(PD5); //set cs high
0088 959A sbi 0x12,5
008A .dbline 71
008A ;
008A ; data2=data&0xf0;
008A 642F mov R22,R20
008C 607F andi R22,240
008E .dbline 72
008E ; data3=data&0x0f;
008E 4F70 andi R20,15
0090 .dbline 73
0090 ; data3=data3<<4;
0090 842F mov R24,R20
0092 8F70 andi R24,#0x0F
0094 8295 swap R24
0096 482F mov R20,R24
0098 .dbline 75
0098 ;
0098 ; lcd_send_byte(data1);
0098 0A2D mov R16,R10
009A BDDF rcall _lcd_send_byte
009C .dbline 76
009C ; lcd_send_byte(data2);
009C 062F mov R16,R22
009E BBDF rcall _lcd_send_byte
00A0 .dbline 77
00A0 ; lcd_send_byte(data3);
00A0 042F mov R16,R20
00A2 B9DF rcall _lcd_send_byte
00A4 .dbline 79
00A4 ;
00A4 ; PORTD&=~BIT(PD5); //set cs low
00A4 9598 cbi 0x12,5
00A6 .dbline -2
00A6 L14:
00A6 00D0 rcall pop_gset3
00A8 .dbline 0 ; func end
00A8 0895 ret
00AA .dbsym r data2 22 c
00AA .dbsym r data1 10 c
00AA .dbsym r data3 20 c
00AA .dbsym r data 20 c
00AA .dbend
00AA .dbfunc e lcd_initial _lcd_initial fV
.even
00AA _lcd_initial::
00AA .dbline -1
00AA .dbline 83
00AA ;
00AA ; }
00AA ; void lcd_initial(void)
00AA ; {
00AA .dbline 85
00AA ;
00AA ; lcd_write_comm(0x30); //基本指令集
00AA 00E3 ldi R16,48
00AC E9DF rcall _lcd_write_comm
00AE .dbline 86
00AE ; lcd_write_comm(0x01); //清除显示屏幕,把DDRAM位址计数器调整为"00H"
00AE 01E0 ldi R16,1
00B0 E7DF rcall _lcd_write_comm
00B2 .dbline 87
00B2 ; lcd_write_comm(0x03); //把DDRAM位址计数器调整为"00H",游标回原点,该功能不影响显示DDRAM
00B2 03E0 ldi R16,3
00B4 E5DF rcall _lcd_write_comm
00B6 .dbline 88
00B6 ; lcd_write_comm(0x06); //光标右移
00B6 06E0 ldi R16,6
00B8 E3DF rcall _lcd_write_comm
00BA .dbline 89
00BA ; lcd_write_comm(0x0c); //显示屏打开
00BA 0CE0 ldi R16,12
00BC E1DF rcall _lcd_write_comm
00BE .dbline -2
00BE L15:
00BE .dbline 0 ; func end
00BE 0895 ret
00C0 .dbend
00C0 .dbfunc e screen _screen fV
00C0 ; j -> <dead>
00C0 ; i -> R20,R21
00C0 ; data -> R22,R23
.even
00C0 _screen::
00C0 00D0 rcall push_gset2
00C2 B801 movw R22,R16
00C4 .dbline -1
00C4 .dbline 98
00C4 ; }
00C4 ; /////////////////////////////////////////////////////
00C4 ; ////
00C4 ; /////////////////////////////////////////////////////
00C4 ;
00C4 ; void screen(data)
00C4 ; char data[65];
00C4 ;
00C4 ; {
00C4 .dbline 100
00C4 ; unsigned int i,j;
00C4 ; lcd_write_comm(0x08);
00C4 08E0 ldi R16,8
00C6 DCDF rcall _lcd_write_comm
00C8 .dbline 101
00C8 ; for (i=0;i<64;i++)
00C8 4427 clr R20
00CA 5527 clr R21
00CC 1FC0 rjmp L20
00CE L17:
00CE .dbline 102
00CE ; {lcd_write_data(data[i]);
00CE .dbline 102
00CE FA01 movw R30,R20
00D0 E60F add R30,R22
00D2 F71F adc R31,R23
00D4 0081 ldd R16,z+0
00D6 BFDF rcall _lcd_write_data
00D8 .dbline 103
00D8 ; if (i==15)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -