📄 7920_16.s
字号:
.module _7920_16.c
.area lit(rom, con, rel)
_mynew1::
.byte 55,57,50,48,95,51,'w,'i,'r,'e,'s,95,'d,'e,'m,'o
.byte 0
.dbfile E:\YM200\DEMO\LCD12864R(7920)\7920_16.c
.dbsym e mynew1 _mynew1 A[17:17]kc
_mynew2::
.byte 'C,'r,'e,'a,'t,'e,32,'b,'y,58,'C,'A,'N,'Y,0
.dbsym e mynew2 _mynew2 A[15:15]kc
_mynew3::
.byte 'E,95,'m,'a,'i,'l,58,'C,'A,'N,'Y,95,57,57,57,64
.byte 0
.dbsym e mynew3 _mynew3 A[17:17]kc
_mynew4::
.byte 49,54,51,46,'c,'o,'m,0
.dbsym e mynew4 _mynew4 A[8:8]kc
.area text(rom, con, rel)
.dbfile E:\YM200\DEMO\LCD12864R(7920)\7920_16.c
.dbfunc e main _main fV
; i -> R20
.even
_main::
sbiw R28,1
.dbline -1
.dbline 40
; //12864液晶(ST7920驱动)的3线串行驱动 MCU=ATMega16(L)
;
; /***********************************************************************
; 工 程:ST7920驱动的12864液晶的3线串行驱动模式
; 引脚定义:
; RS(CS)=====>PB0
; RW(SID)====>PB1
; EN(SCLK)===>PB2
; PSB为硬件控制,接高电平为8位或4位的并行模式,接低电平为串行模式
; ************************************************************************/
; #include <iom16v.h>
; #include <macros.h>
;
; #define uchar unsigned char
; #define uint unsigned int
; #define nop() NOP()
; #define xtal 8
;
; #define Set_CS() DDRB |= (1<<0);PORTB |= (1<<0)
; #define Set_SID() DDRB |= (1<<1);PORTB |= (1<<1)
; #define Set_SCLK() DDRB |= (1<<2);PORTB |= (1<<2)
;
; #define Clr_CS() DDRB |= (1<<0);PORTB &=~(1<<0)
; #define Clr_SID() DDRB |= (1<<1);PORTB &=~(1<<1)
; #define Clr_SCLK() DDRB |= (1<<2);PORTB &=~(1<<2)
;
; //====================================================================
; //函数声明
; void Delay(uint ms); //延时子程序
; void W_1byte(uchar RW, uchar RS, uchar W_data);
; void Write_8bits(uint W_bits);
; void LCD_Init(void);
; /*********************************************************************/
; const uchar mynew1[]={"7920_3wires_demo"};
; const uchar mynew2[]={"Create by:CANY"};
; const uchar mynew3[]={"E_mail:CANY_999@"};
; const uchar mynew4[]={"163.com"};
; /*********************************************************************/
; void main()
; {
.dbline 41
; uchar i = 0;
clr R20
.dbline 42
; Clr_CS();
sbi 0x17,0
.dbline 42
cbi 0x18,0
.dbline 43
; Clr_SID();
sbi 0x17,1
.dbline 43
cbi 0x18,1
.dbline 44
; Clr_SCLK();
sbi 0x17,2
.dbline 44
cbi 0x18,2
.dbline 45
; LCD_Init();
xcall _LCD_Init
xjmp L3
L2:
.dbline 47
; while(1)
; {
.dbline 48
; nop();
nop
.dbline 49
; nop();
nop
.dbline 50
; W_1byte(0,0,0x80); //显示的地址0x80
ldi R24,128
std y+0,R24
clr R18
clr R16
xcall _W_1byte
.dbline 51
; nop();
nop
.dbline 52
; for(i=0;mynew1[i]!='\0';i++)
clr R20
xjmp L8
L5:
.dbline 53
.dbline 54
ldi R24,<_mynew1
ldi R25,>_mynew1
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
std y+0,R30
ldi R18,1
clr R16
xcall _W_1byte
.dbline 55
L6:
.dbline 52
inc R20
L8:
.dbline 52
ldi R24,<_mynew1
ldi R25,>_mynew1
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
tst R30
brne L5
.dbline 56
; {
; W_1byte(0,1,mynew1[i]);
; }
; W_1byte(0,0,0x90); //显示的地址0x90
ldi R24,144
std y+0,R24
clr R18
clr R16
xcall _W_1byte
.dbline 57
; for(i=0;mynew2[i]!='\0';i++)
clr R20
xjmp L12
L9:
.dbline 58
.dbline 59
ldi R24,<_mynew2
ldi R25,>_mynew2
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
std y+0,R30
ldi R18,1
clr R16
xcall _W_1byte
.dbline 60
L10:
.dbline 57
inc R20
L12:
.dbline 57
ldi R24,<_mynew2
ldi R25,>_mynew2
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
tst R30
brne L9
.dbline 61
; {
; W_1byte(0,1,mynew2[i]);
; }
; W_1byte(0,0,0x88); //显示的地址0x88
ldi R24,136
std y+0,R24
clr R18
clr R16
xcall _W_1byte
.dbline 62
; for(i=0;mynew3[i]!='\0';i++)
clr R20
xjmp L16
L13:
.dbline 63
.dbline 64
ldi R24,<_mynew3
ldi R25,>_mynew3
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
std y+0,R30
ldi R18,1
clr R16
xcall _W_1byte
.dbline 65
L14:
.dbline 62
inc R20
L16:
.dbline 62
ldi R24,<_mynew3
ldi R25,>_mynew3
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
tst R30
brne L13
.dbline 66
; {
; W_1byte(0,1,mynew3[i]);
; }
; W_1byte(0,0,0x98); //显示的地址0x98
ldi R24,152
std y+0,R24
clr R18
clr R16
xcall _W_1byte
.dbline 67
; for(i=0;mynew4[i]!='\0';i++)
clr R20
xjmp L20
L17:
.dbline 68
.dbline 69
ldi R24,<_mynew4
ldi R25,>_mynew4
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
std y+0,R30
ldi R18,1
clr R16
xcall _W_1byte
.dbline 70
L18:
.dbline 67
inc R20
L20:
.dbline 67
ldi R24,<_mynew4
ldi R25,>_mynew4
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
tst R30
brne L17
.dbline 71
; {
; W_1byte(0,1,mynew4[i]);
; }
; nop();
nop
.dbline 72
.dbline 73
.dbline 74
L22:
.dbline 72
.dbline 72
xjmp L22
L3:
.dbline 46
xjmp L2
X0:
.dbline -2
L1:
adiw R28,1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e LCD_Init _LCD_Init fV
; cmd -> R20
.even
_LCD_Init::
xcall push_gset1
sbiw R28,1
.dbline -1
.dbline 80
; for(;;)
; {
; continue;
; }
; }
; }
; /******************************************************************/
; void LCD_Init(void)
; {
.dbline 82
; uchar cmd;
; cmd=0x30; //功能设置 8位数据,基本指令
ldi R20,48
.dbline 83
; W_1byte(0,0,cmd);
std y+0,R20
clr R18
clr R16
xcall _W_1byte
.dbline 84
; Delay(2);
ldi R16,2
ldi R17,0
xcall _Delay
.dbline 85
; cmd=0x0C; //显示状态 ON,游标OFF,反白OFF
ldi R20,12
.dbline 86
; W_1byte(0,0,cmd); //写指令
std y+0,R20
clr R18
clr R16
xcall _W_1byte
.dbline 87
; Delay(2);
ldi R16,2
ldi R17,0
xcall _Delay
.dbline 88
; cmd=0x01; //清除显示
ldi R20,1
.dbline 89
; W_1byte(0,0,cmd); //写指令
std y+0,R20
clr R18
clr R16
xcall _W_1byte
.dbline 90
; Delay(2);
ldi R16,2
ldi R17,0
xcall _Delay
.dbline 91
; cmd=0x02; //地址归位
ldi R20,2
.dbline 92
; W_1byte(0,0,cmd); //写指令
std y+0,R20
clr R18
clr R16
xcall _W_1byte
.dbline 93
; Delay(2);
ldi R16,2
ldi R17,0
xcall _Delay
.dbline 94
; cmd=0x80; //设置DDRAM地址
ldi R20,128
.dbline 95
; W_1byte(0,0,cmd); //写指令
std y+0,R20
clr R18
clr R16
xcall _W_1byte
.dbline 96
; Delay(2); //延时
ldi R16,2
ldi R17,0
xcall _Delay
.dbline -2
L25:
adiw R28,1
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r cmd 20 c
.dbend
.dbfunc e W_1byte _W_1byte fV
; H_data -> R22,R23
; S_ID -> R10,R11
; L_data -> R20,R21
; W_data -> y+6
; RS -> R20
; RW -> R22
.even
_W_1byte::
xcall push_gset3
mov R20,R18
mov R22,R16
.dbline -1
.dbline 109
; }
; /*******************************************************************
; 函 数 名:W_1byte
; 入口参数:RW、RS、W_data
; 函数作用:写一个字节的数据到12864液晶,包括指令和数据
; 说 明:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶;
; (一般RW都设为0,即只向液晶写数据,不读数据)
; RS=1,写入的是数据;RS=0,写入的是指令;
; 一般模式:RW=0,RS=1;写数据
; RW=0,RS=0;写指令
; ********************************************************************/
; void W_1byte(uchar RW, uchar RS, uchar W_data)
; {
.dbline 110
; uint H_data,L_data,S_ID = 0xf8; //11111RWRS0
ldi R24,248
ldi R25,0
movw R10,R24
.dbline 111
; if(RW == 0)
tst R22
brne L27
.dbline 112
; {
.dbline 113
; S_ID &=~ 0x04;
andi R24,251
movw R10,R24
.dbline 114
; }
xjmp L28
L27:
.dbline 116
; else //if(RW==1)
; {
.dbline 117
; S_ID |= 0X04;
movw R24,R10
ori R24,4
movw R10,R24
.dbline 118
; }
L28:
.dbline 119
; if(RS == 0)
tst R20
brne L29
.dbline 120
; {
.dbline 121
; S_ID &=~ 0x02;
movw R24,R10
andi R24,253
movw R10,R24
.dbline 122
; }
xjmp L30
L29:
.dbline 124
; else //if(RS==1)
; {
.dbline 125
; S_ID |= 0X02;
movw R24,R10
ori R24,2
movw R10,R24
.dbline 126
; }
L30:
.dbline 127
; H_data = W_data;
ldd R22,y+6
clr R23
.dbline 128
; H_data &= 0xf0; //屏蔽低4位的数据
andi R22,240
andi R23,0
.dbline 129
; L_data = W_data; //xxxx0000格式
ldd R20,y+6
clr R21
.dbline 130
; L_data &= 0x0f; //屏蔽高4位的数据
andi R20,15
andi R21,0
.dbline 131
; L_data <<= 4; //xxxx0000格式
lsl R20
rol R21
lsl R20
rol R21
lsl R20
rol R21
lsl R20
rol R21
.dbline 132
; Set_CS();
sbi 0x17,0
.dbline 132
sbi 0x18,0
.dbline 133
; Write_8bits(S_ID); //发送S_ID
movw R16,R10
xcall _Write_8bits
.dbline 134
; Write_8bits(H_data); //发送H_data
movw R16,R22
xcall _Write_8bits
.dbline 135
; Write_8bits(L_data); //发送L_data
movw R16,R20
xcall _Write_8bits
.dbline 136
; Clr_CS();
sbi 0x17,0
.dbline 136
cbi 0x18,0
.dbline -2
L26:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r H_data 22 i
.dbsym r S_ID 10 i
.dbsym r L_data 20 i
.dbsym l W_data 6 c
.dbsym r RS 20 c
.dbsym r RW 22 c
.dbend
.dbfunc e Write_8bits _Write_8bits fV
; Temp_data -> R20,R21
; i -> R22,R23
; W_bits -> R10,R11
.even
_Write_8bits::
xcall push_gset3
movw R10,R16
.dbline -1
.dbline 144
; }
; /********************************************************************
; 函 数 名:Write_8bits
; 入口参数:W_bits
; 函数作用:负责串行输出8个bit位
; ********************************************************************/
; void Write_8bits(uint W_bits)
; {
.dbline 146
; uint i,Temp_data;
; for(i=0; i<8; i++)
clr R22
clr R23
xjmp L35
L32:
.dbline 147
; {
.dbline 148
; Temp_data = W_bits;
movw R20,R10
.dbline 149
; Temp_data <<= i;
movw R18,R22
movw R16,R20
xcall lsl16
movw R20,R16
.dbline 150
; if((Temp_data&0x80)==0) //bit7 is zero
sbrc R16,7
rjmp L36
.dbline 151
; {
.dbline 152
; Clr_SID();
sbi 0x17,1
.dbline 152
cbi 0x18,1
.dbline 153
; nop();
nop
.dbline 154
; Set_SCLK();
sbi 0x17,2
.dbline 154
sbi 0x18,2
.dbline 155
; nop();
nop
.dbline 156
; nop();
nop
.dbline 157
; Clr_SCLK();
sbi 0x17,2
.dbline 157
cbi 0x18,2
.dbline 158
; nop();
nop
.dbline 159
; Clr_SID();
sbi 0x17,1
.dbline 159
cbi 0x18,1
.dbline 160
; }
xjmp L37
L36:
.dbline 162
; else //bit7 is one
; {
.dbline 163
; Set_SID();
sbi 0x17,1
.dbline 163
sbi 0x18,1
.dbline 164
; nop();
nop
.dbline 165
; Set_SCLK();
sbi 0x17,2
.dbline 165
sbi 0x18,2
.dbline 166
; nop();
nop
.dbline 167
; nop();
nop
.dbline 168
; Clr_SCLK();
sbi 0x17,2
.dbline 168
cbi 0x18,2
.dbline 169
; nop();
nop
.dbline 170
; Clr_SID();
sbi 0x17,1
.dbline 170
cbi 0x18,1
.dbline 171
; }
L37:
.dbline 172
L33:
.dbline 146
subi R22,255 ; offset = 1
sbci R23,255
L35:
.dbline 146
cpi R22,8
ldi R30,0
cpc R23,R30
brlo L32
.dbline -2
L31:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r Temp_data 20 i
.dbsym r i 22 i
.dbsym r W_bits 10 i
.dbend
.dbfunc e Delay _Delay fV
; i -> R20,R21
; ms -> R16,R17
.even
_Delay::
xcall push_gset1
.dbline -1
.dbline 180
; }
; }
; /********************************************************************
; 函 数 名:Delay
; 入口参数:ms
; 函数作用:毫秒级的延时程序,当晶振为12Mhz时,xtal=12;
; ********************************************************************/
; void Delay(uint ms)
; {
xjmp L40
L39:
.dbline 183
; uint i;
; while(ms--)
; {
.dbline 184
; for(i=1;i<(uint)(xtal*143-2);i++)
ldi R20,1
ldi R21,0
xjmp L45
L42:
.dbline 185
L43:
.dbline 184
subi R20,255 ; offset = 1
sbci R21,255
L45:
.dbline 184
cpi R20,118
ldi R30,4
cpc R21,R30
brlo L42
.dbline 186
L40:
.dbline 182
movw R2,R16
subi R16,1
sbci R17,0
tst R2
brne L39
tst R3
brne L39
X1:
.dbline -2
L38:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r ms 16 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -