📄 serial_lcd.lis
字号:
.module serial_lcd.c
.area text(rom, con, rel)
0000 .dbfile D:\avrvi\AVRVi_m128_Starter_Kit\ST7920\source\lib\serial_lcd.c
0000 .dbfunc e delay_lcd _delay_lcd fV
0000 ; j -> R16
0000 ; i -> R18
.even
0000 _delay_lcd::
0000 .dbline -1
0000 .dbline 21
0000 ; /************************************************
0000 ; 文件:serial_lcd.c
0000 ; 用途:ST7920驱动程序
0000 ; 注意:
0000 ; 创建:2008.1.26
0000 ; 修改:2008.1.26
0000 ; Copy Right (c) www.avrvi.com AVR与虚拟仪器
0000 ; ************************************************/
0000 ; #include "..\config.h"
0000 ;
0000 ; /******************************************************************
0000 ; ** 函数名称: void delay_lcd(void)
0000 ; ** 功能描述: lcd初始化后的延时
0000 ; ** 输 入: 无
0000 ; ** 全局变量: 无
0000 ; ** 调用模块: 无
0000 ; ** 说明:
0000 ; ** 注意:
0000 ; *******************************************************************/
0000 ; void delay_lcd(void)
0000 ; {
0000 .dbline 22
0000 ; unsigned char i=200;
0000 28EC ldi R18,200
0002 .dbline 23
0002 ; unsigned char j=0;
0002 0027 clr R16
0004 .dbline 24
0004 ; for(j=0;j<6;j++)
0004 06C0 xjmp L5
0006 X0:
0006 .dbline 25
0006 ; {
0006 L6:
0006 .dbline 26
0006 L7:
0006 .dbline 26
0006 222E mov R2,R18
0008 3324 clr R3
000A 2150 subi R18,1
000C 2220 tst R2
000E D9F7 brne L6
0010 .dbline 27
0010 L3:
0010 .dbline 24
0010 0395 inc R16
0012 L5:
0012 .dbline 24
0012 0630 cpi R16,6
0014 C0F3 brlo L7
0016 .dbline -2
0016 L1:
0016 .dbline 0 ; func end
0016 0895 ret
0018 .dbsym r j 16 c
0018 .dbsym r i 18 c
0018 .dbend
0018 .dbfunc e wr_lcd _wr_lcd fV
0018 ; j -> R20
0018 ; k -> R22
0018 ; i -> R10
0018 ; flag -> R18
0018 ; data -> R16
.even
0018 _wr_lcd::
0018 0E940000 xcall push_gset3
001C .dbline -1
001C .dbline 42
001C ; while(i--);
001C ; }
001C ; }
001C ;
001C ;
001C ; /******************************************************************
001C ; ** 函数名称: void wr_lcd(unsigned char data,unsigned char flag)
001C ; ** 功能描述: 向lcd写入1B的数据或者命令
001C ; ** 输 入: unsigned char data,unsigned char flag data为要写入的数据或者命令,flag=1为命令传送,flag=0为数据传送
001C ; ** 全局变量: 无
001C ; ** 调用模块: 无
001C ; ** 说明:首先要传送5个bit的1,起始位,flag=1为命令传送,5个bit的1起始位后面接着为000
001C ; flag=0为数据传送,5个bit的1起始位后面接着为010
001C ; ** 注意:
001C ; *******************************************************************/
001C ; void wr_lcd(unsigned char data,unsigned char flag)
001C ; {
001C .dbline 45
001C ; unsigned char i,j,k;
001C ;
001C ; CLR_LCD_SCLK; //clock清零
001C AA98 cbi 0x15,2
001E .dbline 46
001E ; SET_LCD_STD; //data置1
001E A99A sbi 0x15,1
0020 .dbline 48
0020 ;
0020 ; for(i=0;i<5;i++) //首先要传送5个bit的1,起始位
0020 AA24 clr R10
0022 03C0 xjmp L13
0024 L10:
0024 .dbline 49
0024 .dbline 50
0024 AA9A sbi 0x15,2
0026 .dbline 51
0026 AA98 cbi 0x15,2
0028 .dbline 52
0028 L11:
0028 .dbline 48
0028 A394 inc R10
002A L13:
002A .dbline 48
002A 8A2D mov R24,R10
002C 8530 cpi R24,5
002E D0F3 brlo L10
0030 .dbline 54
0030 ; {
0030 ; SET_LCD_SCLK;
0030 ; CLR_LCD_SCLK;
0030 ; }
0030 ;
0030 ; if(flag) //flag=1为命令传送,5个bit的1起始位后面接着为000
0030 2223 tst R18
0032 51F0 breq L14
0034 .dbline 55
0034 ; {
0034 .dbline 56
0034 ; CLR_LCD_STD; //清零数据线,传送3个bit的0
0034 A998 cbi 0x15,1
0036 .dbline 57
0036 ; for(i=0;i<3;i++)
0036 AA24 clr R10
0038 03C0 xjmp L19
003A L16:
003A .dbline 58
003A .dbline 59
003A AA9A sbi 0x15,2
003C .dbline 60
003C AA98 cbi 0x15,2
003E .dbline 61
003E L17:
003E .dbline 57
003E A394 inc R10
0040 L19:
0040 .dbline 57
0040 8A2D mov R24,R10
0042 8330 cpi R24,3
0044 D0F3 brlo L16
0046 .dbline 62
0046 ; {
0046 ; SET_LCD_SCLK;
0046 ; CLR_LCD_SCLK;
0046 ; }
0046 ; }
0046 09C0 xjmp L15
0048 L14:
0048 .dbline 65
0048 ;
0048 ; else //flag=0为数据传送,5个bit的1起始位后面接着为010
0048 ; {
0048 .dbline 66
0048 ; CLR_LCD_STD; //传送一位0
0048 A998 cbi 0x15,1
004A .dbline 67
004A ; SET_LCD_SCLK;
004A AA9A sbi 0x15,2
004C .dbline 68
004C ; CLR_LCD_SCLK;
004C AA98 cbi 0x15,2
004E .dbline 70
004E ;
004E ; SET_LCD_STD; //传送一位1
004E A99A sbi 0x15,1
0050 .dbline 71
0050 ; SET_LCD_SCLK;
0050 AA9A sbi 0x15,2
0052 .dbline 72
0052 ; CLR_LCD_SCLK;
0052 AA98 cbi 0x15,2
0054 .dbline 74
0054 ;
0054 ; CLR_LCD_STD; //传送一位0
0054 A998 cbi 0x15,1
0056 .dbline 75
0056 ; SET_LCD_SCLK;
0056 AA9A sbi 0x15,2
0058 .dbline 76
0058 ; CLR_LCD_SCLK;
0058 AA98 cbi 0x15,2
005A .dbline 77
005A ; }
005A L15:
005A .dbline 79
005A ;
005A ; k=0x80; //后面传送信息的时候用来取得特定的位
005A 60E8 ldi R22,128
005C .dbline 81
005C ;
005C ; for(j=0;j<2;j++)//每一个八位的指令将被分为两个字节接收到:
005C 4427 clr R20
005E 19C0 xjmp L23
0060 L20:
0060 .dbline 85
0060 ; //较高4位的指令资料将会被放在第一个字节的MSB部分
0060 ; //而较低4位(DB3~DB0)的指令资料则会被放在第二个字节的MSB部分
0060 ; //至于相关的另四位则都为0。
0060 ; {
0060 .dbline 86
0060 ; for(i=0;i<4;i++)
0060 AA24 clr R10
0062 0AC0 xjmp L27
0064 L24:
0064 .dbline 87
0064 ; {
0064 .dbline 88
0064 ; if(data&k) //如果相应的位为高
0064 202E mov R2,R16
0066 2622 and R2,R22
0068 11F0 breq L28
006A .dbline 89
006A ; {
006A .dbline 90
006A ; SET_LCD_STD; //传送一位1
006A A99A sbi 0x15,1
006C .dbline 91
006C ; }
006C 01C0 xjmp L29
006E L28:
006E .dbline 93
006E ; else //如果相应的位为低
006E ; {
006E .dbline 94
006E ; CLR_LCD_STD; //传送一位0
006E A998 cbi 0x15,1
0070 .dbline 95
0070 ; }
0070 L29:
0070 .dbline 96
0070 6695 lsr R22
0072 .dbline 97
0072 AA9A sbi 0x15,2
0074 .dbline 98
0074 AA98 cbi 0x15,2
0076 .dbline 99
0076 L25:
0076 .dbline 86
0076 A394 inc R10
0078 L27:
0078 .dbline 86
0078 8A2D mov R24,R10
007A 8430 cpi R24,4
007C 98F3 brlo L24
007E .dbline 101
007E ; k>>=1;
007E ; SET_LCD_SCLK;
007E ; CLR_LCD_SCLK;
007E ; }
007E ;
007E ; CLR_LCD_STD; //传送4位0
007E A998 cbi 0x15,1
0080 .dbline 103
0080 ;
0080 ; for(i=0;i<4;i++)
0080 AA24 clr R10
0082 03C0 xjmp L33
0084 L30:
0084 .dbline 104
0084 .dbline 105
0084 AA9A sbi 0x15,2
0086 .dbline 106
0086 AA98 cbi 0x15,2
0088 .dbline 107
0088 L31:
0088 .dbline 103
0088 A394 inc R10
008A L33:
008A .dbline 103
008A 8A2D mov R24,R10
008C 8430 cpi R24,4
008E D0F3 brlo L30
0090 .dbline 108
0090 L21:
0090 .dbline 81
0090 4395 inc R20
0092 L23:
0092 .dbline 81
0092 4230 cpi R20,2
0094 28F3 brlo L20
0096 .dbline 110
0096 ; {
0096 ; SET_LCD_SCLK;
0096 ; CLR_LCD_SCLK;
0096 ; }
0096 ; }
0096 ; //CLR_LCD_SCLK;
0096 ; CLR_LCD_STD;
0096 A998 cbi 0x15,1
0098 .dbline -2
0098 L9:
0098 0E940000 xcall pop_gset3
009C .dbline 0 ; func end
009C 0895 ret
009E .dbsym r j 20 c
009E .dbsym r k 22 c
009E .dbsym r i 10 c
009E .dbsym r flag 18 c
009E .dbsym r data 16 c
009E .dbend
009E .dbfunc e initial_lcd _initial_lcd fV
.even
009E _initial_lcd::
009E .dbline -1
009E .dbline 124
009E ; }
009E ;
009E ;
009E ; /******************************************************************
009E ; ** 函数名称: void initial_lcd(void)
009E ; ** 功能描述: lcd初始化
009E ; ** 输 入: 无
009E ; ** 全局变量: 无
009E ; ** 调用模块: wr_lcd();
009E ; ** 说明:
009E ; ** 注意:
009E ; *******************************************************************/
009E ; void initial_lcd(void)
009E ; {
009E .dbline 125
009E ; LCD_DDR |= (1<<LCD_STD)|(1<<LCD_SCLK);
009E 84B3 in R24,0x14
00A0 8660 ori R24,6
00A2 84BB out 0x14,R24
00A4 .dbline 126
00A4 ; wr_lcd(Lcd_Set_Function_Basic,1); //指令集设定
00A4 21E0 ldi R18,1
00A6 00E3 ldi R16,48
00A8 B7DF xcall _wr_lcd
00AA .dbline 127
00AA ; wr_lcd(Lcd_Set_Entrance_Point+2,1); //光标右移
00AA 21E0 ldi R18,1
00AC 06E0 ldi R16,6
00AE B4DF xcall _wr_lcd
00B0 .dbline 128
00B0 ; wr_lcd(Lcd_Display_Status+4,1); //整屏显示
00B0 21E0 ldi R18,1
00B2 0CE0 ldi R16,12
00B4 B1DF xcall _wr_lcd
00B6 .dbline 129
00B6 ; wr_lcd(Lcd_Clear,1); //clear the screen
00B6 21E0 ldi R18,1
00B8 01E0 ldi R16,1
00BA AEDF xcall _wr_lcd
00BC .dbline 131
00BC ;
00BC ; delay_lcd();
00BC A1DF xcall _delay_lcd
00BE .dbline -2
00BE L34:
00BE .dbline 0 ; func end
00BE 0895 ret
00C0 .dbend
00C0 .dbfunc e Lcd_drawbmp _Lcd_drawbmp fV
00C0 ; i -> R20
00C0 ; j -> R22
00C0 ; bmp -> R10,R11
.even
00C0 _Lcd_drawbmp::
00C0 0E940000 xcall push_gset3
00C4 5801 movw R10,R16
00C6 .dbline -1
00C6 .dbline 150
00C6 ; }
00C6 ;
00C6 ;
00C6 ; /*********************************************************************************************************
00C6 ; ** 函数名称: Lcd_drawbmp(unsigned char col,unsigned char row,unsigned char col1,unsigned char row1,const unsigned char *bmp)
00C6 ; ** 功能描述: 绘制bmp图片
00C6 ; ** 输 入: col 起始行 col1 图片行数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -