📄 serial_lcd.s
字号:
.module serial_lcd.c
.area text(rom, con, rel)
.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\ST7920\source\lib\serial_lcd.c
.dbfunc e delay_lcd _delay_lcd fV
; j -> R16
; i -> R18
.even
_delay_lcd::
.dbline -1
.dbline 21
; /************************************************
; 文件:serial_lcd.c
; 用途:ST7920驱动程序
; 注意:
; 创建:2008.1.26
; 修改:2008.1.26
; Copy Right (c) www.avrvi.com AVR与虚拟仪器
; ************************************************/
; #include "..\config.h"
;
; /******************************************************************
; ** 函数名称: void delay_lcd(void)
; ** 功能描述: lcd初始化后的延时
; ** 输 入: 无
; ** 全局变量: 无
; ** 调用模块: 无
; ** 说明:
; ** 注意:
; *******************************************************************/
; void delay_lcd(void)
; {
.dbline 22
; unsigned char i=200;
ldi R18,200
.dbline 23
; unsigned char j=0;
clr R16
.dbline 24
; for(j=0;j<6;j++)
xjmp L5
X0:
.dbline 25
; {
L6:
.dbline 26
L7:
.dbline 26
mov R2,R18
clr R3
subi R18,1
tst R2
brne L6
.dbline 27
L3:
.dbline 24
inc R16
L5:
.dbline 24
cpi R16,6
brlo L7
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r j 16 c
.dbsym r i 18 c
.dbend
.dbfunc e wr_lcd _wr_lcd fV
; j -> R20
; k -> R22
; i -> R10
; flag -> R18
; data -> R16
.even
_wr_lcd::
xcall push_gset3
.dbline -1
.dbline 42
; while(i--);
; }
; }
;
;
; /******************************************************************
; ** 函数名称: void wr_lcd(unsigned char data,unsigned char flag)
; ** 功能描述: 向lcd写入1B的数据或者命令
; ** 输 入: unsigned char data,unsigned char flag data为要写入的数据或者命令,flag=1为命令传送,flag=0为数据传送
; ** 全局变量: 无
; ** 调用模块: 无
; ** 说明:首先要传送5个bit的1,起始位,flag=1为命令传送,5个bit的1起始位后面接着为000
; flag=0为数据传送,5个bit的1起始位后面接着为010
; ** 注意:
; *******************************************************************/
; void wr_lcd(unsigned char data,unsigned char flag)
; {
.dbline 45
; unsigned char i,j,k;
;
; CLR_LCD_SCLK; //clock清零
cbi 0x15,2
.dbline 46
; SET_LCD_STD; //data置1
sbi 0x15,1
.dbline 48
;
; for(i=0;i<5;i++) //首先要传送5个bit的1,起始位
clr R10
xjmp L13
L10:
.dbline 49
.dbline 50
sbi 0x15,2
.dbline 51
cbi 0x15,2
.dbline 52
L11:
.dbline 48
inc R10
L13:
.dbline 48
mov R24,R10
cpi R24,5
brlo L10
.dbline 54
; {
; SET_LCD_SCLK;
; CLR_LCD_SCLK;
; }
;
; if(flag) //flag=1为命令传送,5个bit的1起始位后面接着为000
tst R18
breq L14
.dbline 55
; {
.dbline 56
; CLR_LCD_STD; //清零数据线,传送3个bit的0
cbi 0x15,1
.dbline 57
; for(i=0;i<3;i++)
clr R10
xjmp L19
L16:
.dbline 58
.dbline 59
sbi 0x15,2
.dbline 60
cbi 0x15,2
.dbline 61
L17:
.dbline 57
inc R10
L19:
.dbline 57
mov R24,R10
cpi R24,3
brlo L16
.dbline 62
; {
; SET_LCD_SCLK;
; CLR_LCD_SCLK;
; }
; }
xjmp L15
L14:
.dbline 65
;
; else //flag=0为数据传送,5个bit的1起始位后面接着为010
; {
.dbline 66
; CLR_LCD_STD; //传送一位0
cbi 0x15,1
.dbline 67
; SET_LCD_SCLK;
sbi 0x15,2
.dbline 68
; CLR_LCD_SCLK;
cbi 0x15,2
.dbline 70
;
; SET_LCD_STD; //传送一位1
sbi 0x15,1
.dbline 71
; SET_LCD_SCLK;
sbi 0x15,2
.dbline 72
; CLR_LCD_SCLK;
cbi 0x15,2
.dbline 74
;
; CLR_LCD_STD; //传送一位0
cbi 0x15,1
.dbline 75
; SET_LCD_SCLK;
sbi 0x15,2
.dbline 76
; CLR_LCD_SCLK;
cbi 0x15,2
.dbline 77
; }
L15:
.dbline 79
;
; k=0x80; //后面传送信息的时候用来取得特定的位
ldi R22,128
.dbline 81
;
; for(j=0;j<2;j++)//每一个八位的指令将被分为两个字节接收到:
clr R20
xjmp L23
L20:
.dbline 85
; //较高4位的指令资料将会被放在第一个字节的MSB部分
; //而较低4位(DB3~DB0)的指令资料则会被放在第二个字节的MSB部分
; //至于相关的另四位则都为0。
; {
.dbline 86
; for(i=0;i<4;i++)
clr R10
xjmp L27
L24:
.dbline 87
; {
.dbline 88
; if(data&k) //如果相应的位为高
mov R2,R16
and R2,R22
breq L28
.dbline 89
; {
.dbline 90
; SET_LCD_STD; //传送一位1
sbi 0x15,1
.dbline 91
; }
xjmp L29
L28:
.dbline 93
; else //如果相应的位为低
; {
.dbline 94
; CLR_LCD_STD; //传送一位0
cbi 0x15,1
.dbline 95
; }
L29:
.dbline 96
lsr R22
.dbline 97
sbi 0x15,2
.dbline 98
cbi 0x15,2
.dbline 99
L25:
.dbline 86
inc R10
L27:
.dbline 86
mov R24,R10
cpi R24,4
brlo L24
.dbline 101
; k>>=1;
; SET_LCD_SCLK;
; CLR_LCD_SCLK;
; }
;
; CLR_LCD_STD; //传送4位0
cbi 0x15,1
.dbline 103
;
; for(i=0;i<4;i++)
clr R10
xjmp L33
L30:
.dbline 104
.dbline 105
sbi 0x15,2
.dbline 106
cbi 0x15,2
.dbline 107
L31:
.dbline 103
inc R10
L33:
.dbline 103
mov R24,R10
cpi R24,4
brlo L30
.dbline 108
L21:
.dbline 81
inc R20
L23:
.dbline 81
cpi R20,2
brlo L20
.dbline 110
; {
; SET_LCD_SCLK;
; CLR_LCD_SCLK;
; }
; }
; //CLR_LCD_SCLK;
; CLR_LCD_STD;
cbi 0x15,1
.dbline -2
L9:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r k 22 c
.dbsym r i 10 c
.dbsym r flag 18 c
.dbsym r data 16 c
.dbend
.dbfunc e initial_lcd _initial_lcd fV
.even
_initial_lcd::
.dbline -1
.dbline 124
; }
;
;
; /******************************************************************
; ** 函数名称: void initial_lcd(void)
; ** 功能描述: lcd初始化
; ** 输 入: 无
; ** 全局变量: 无
; ** 调用模块: wr_lcd();
; ** 说明:
; ** 注意:
; *******************************************************************/
; void initial_lcd(void)
; {
.dbline 125
; LCD_DDR |= (1<<LCD_STD)|(1<<LCD_SCLK);
in R24,0x14
ori R24,6
out 0x14,R24
.dbline 126
; wr_lcd(Lcd_Set_Function_Basic,1); //指令集设定
ldi R18,1
ldi R16,48
xcall _wr_lcd
.dbline 127
; wr_lcd(Lcd_Set_Entrance_Point+2,1); //光标右移
ldi R18,1
ldi R16,6
xcall _wr_lcd
.dbline 128
; wr_lcd(Lcd_Display_Status+4,1); //整屏显示
ldi R18,1
ldi R16,12
xcall _wr_lcd
.dbline 129
; wr_lcd(Lcd_Clear,1); //clear the screen
ldi R18,1
ldi R16,1
xcall _wr_lcd
.dbline 131
;
; delay_lcd();
xcall _delay_lcd
.dbline -2
L34:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Lcd_drawbmp _Lcd_drawbmp fV
; i -> R20
; j -> R22
; bmp -> R10,R11
.even
_Lcd_drawbmp::
xcall push_gset3
movw R10,R16
.dbline -1
.dbline 150
; }
;
;
; /*********************************************************************************************************
; ** 函数名称: Lcd_drawbmp(unsigned char col,unsigned char row,unsigned char col1,unsigned char row1,const unsigned char *bmp)
; ** 功能描述: 绘制bmp图片
; ** 输 入: col 起始行 col1 图片行数
; ** row 起始列 row1 图片列数
; ** *bmp:图片字型码指针
; ** 输 出:
; **
; ** 全局变量: 无
; ** 调用模块: wr_lcd();
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
;
; void Lcd_drawbmp(const unsigned char *bmp)
; {
.dbline 152
; unsigned char i,j;
; Lcd_clrbmp();
xcall _Lcd_clrbmp
.dbline 153
; wr_lcd(Lcd_Set_Function_Basic+2,1);
ldi R18,1
ldi R16,50
xcall _wr_lcd
.dbline 154
; wr_lcd(Lcd_Set_Function_Extend,1);
ldi R18,1
ldi R16,52
xcall _wr_lcd
.dbline 155
; for(i=0;i<32;i++)
clr R20
xjmp L39
L36:
.dbline 156
; {
.dbline 157
; for(j=0;j<8;j++)
clr R22
xjmp L43
L40:
.dbline 158
.dbline 159
ldi R18,1
ldi R16,50
xcall _wr_lcd
.dbline 160
ldi R18,1
ldi R16,54
xcall _wr_lcd
.dbline 162
ldi R18,1
mov R16,R20
subi R16,128 ; addi 128
xcall _wr_lcd
.dbline 163
ldi R18,1
mov R16,R22
subi R16,128 ; addi 128
xcall _wr_lcd
.dbline 165
ldi R18,1
ldi R16,50
xcall _wr_lcd
.dbline 166
clr R18
movw R2,R10
movw R24,R2
adiw R24,1
movw R10,R24
movw R30,R2
lpm R16,Z
xcall _wr_lcd
.dbline 167
clr R18
movw R2,R10
movw R24,R2
adiw R24,1
movw R10,R24
movw R30,R2
lpm R16,Z
xcall _wr_lcd
.dbline 168
L41:
.dbline 157
inc R22
L43:
.dbline 157
cpi R22,8
brlo L40
.dbline 169
L37:
.dbline 155
inc R20
L39:
.dbline 155
cpi R20,32
brsh X1
xjmp L36
X1:
.dbline 170
; {
; wr_lcd(Lcd_Set_Function_Basic+2,1);
; wr_lcd(Lcd_Set_Function_Extend+2,1);
;
; wr_lcd(0x80+i,1);
; wr_lcd(0x80+j,1);
;
; wr_lcd(Lcd_Set_Function_Basic+2,1);
; wr_lcd(*bmp++,0);
; wr_lcd(*bmp++,0);
; }
; }
; for(i=0;i<32;i++)
clr R20
xjmp L47
L44:
.dbline 171
; {
.dbline 172
; for(j=8;j<16;j++)
ldi R22,8
xjmp L51
L48:
.dbline 173
.dbline 174
ldi R18,1
ldi R16,50
xcall _wr_lcd
.dbline 175
ldi R18,1
ldi R16,54
xcall _wr_lcd
.dbline 177
ldi R18,1
mov R16,R20
subi R16,128 ; addi 128
xcall _wr_lcd
.dbline 178
ldi R18,1
mov R16,R22
subi R16,128 ; addi 128
xcall _wr_lcd
.dbline 180
ldi R18,1
ldi R16,50
xcall _wr_lcd
.dbline 181
clr R18
movw R2,R10
movw R24,R2
adiw R24,1
movw R10,R24
movw R30,R2
lpm R16,Z
xcall _wr_lcd
.dbline 182
clr R18
movw R2,R10
movw R24,R2
adiw R24,1
movw R10,R24
movw R30,R2
lpm R16,Z
xcall _wr_lcd
.dbline 183
L49:
.dbline 172
inc R22
L51:
.dbline 172
cpi R22,16
brlo L48
.dbline 184
L45:
.dbline 170
inc R20
L47:
.dbline 170
cpi R20,32
brsh X2
xjmp L44
X2:
.dbline 185
; {
; wr_lcd(Lcd_Set_Function_Basic+2,1);
; wr_lcd(Lcd_Set_Function_Extend+2,1);
;
; wr_lcd(0x80+i,1);
; wr_lcd(0x80+j,1);
;
; wr_lcd(Lcd_Set_Function_Basic+2,1);
; wr_lcd(*bmp++,0);
; wr_lcd(*bmp++,0);
; }
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -