📄 lcddrive.s
字号:
.module LCDDrive.C
.area text(rom, con, rel)
.dbfile D:\学习\AVRpro\Mega8程序\TestADC\LCDDrive.C
.area lit(rom, con, rel)
_CharMap::
.byte 128,129
.byte 130,131
.byte 132,133
.byte 134,135
.byte 144,145
.byte 146,147
.byte 148,149
.byte 150,151
.byte 136,137
.byte 138,139
.byte 140,141
.byte 142,143
.byte 152,153
.byte 154,155
.byte 156,157
.byte 158,159
.dbfile D:\学习\AVRpro\Mega8程序\TestADC\FontModel.h
.dbsym e CharMap _CharMap A[32:4:8]kc
.area text(rom, con, rel)
.dbfile D:\学习\AVRpro\Mega8程序\TestADC\FontModel.h
.dbfile D:\学习\AVRpro\Mega8程序\TestADC\LCDDrive.C
.dbfunc e Delay_1ms _Delay_1ms fV
; j -> R16,R17
.even
_Delay_1ms::
.dbline -1
.dbline 22
; //*********************************************
; //MCU:ATMEL AVR MEGA8 ,晶振频率:8MHz,频率越高,播放Mp3越流畅
; //LCD:128*64
; //LCD型号:FYD12864-0402B
; //制作人:平顶山工学院计算机系,郭猛
; //*********************************************
; # include "iom8v.h"
; # include "macros.h"
; #include <math.h>
; #include "FontModel.h"
; #include "LCDFun.h"
;
; //LCD驱动用到的变量:
; uchar LCD_COM; //LCD控制命令字
; uchar LCD_DAT; //LCD数据
; //绘图方式下的坐标:
; uchar AC_X; //X坐标
; uchar AC_Y; //Y坐标
;
; //延时1ms
; void Delay_1ms(void)
; {
.dbline 24
; unsigned int j;
; for(j=1;j<(unsigned int)(XTAL*143-2);j++) NOP();
ldi R16,1
ldi R17,0
rjmp L5
L2:
.dbline 24
nop
L3:
.dbline 24
subi R16,255 ; offset = 1
sbci R17,255
L5:
.dbline 24
ldi R24,1142
ldi R25,4
cp R16,R24
cpc R17,R25
brlo L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r j 16 i
.dbend
.dbfunc e Delay _Delay fV
; i -> R10
; j -> R20
; n -> R12,R13
.even
_Delay::
rcall push_xgset303C
movw R12,R16
.dbline -1
.dbline 29
; }
; /*******************************************延时子程序**********************************************/
; ///////////////////n的取值最好不要超过500!!!
; void Delay(unsigned int n)
; {
.dbline 31
; uchar i,j;
; for(i=0;i<(uchar)(n/100);i++)
clr R10
rjmp L10
L7:
.dbline 32
; for(j=0;j<100;j++) Delay_1ms(); //100mS
clr R20
rjmp L14
L11:
.dbline 32
rcall _Delay_1ms
L12:
.dbline 32
inc R20
L14:
.dbline 32
cpi R20,100
brlo L11
X1:
L8:
.dbline 31
inc R10
L10:
.dbline 31
ldi R18,100
ldi R19,0
movw R16,R12
rcall div16u
cp R10,R16
brlo L7
X2:
.dbline -2
L6:
.dbline 0 ; func end
rjmp pop_xgset303C
.dbsym r i 10 c
.dbsym r j 20 c
.dbsym r n 12 i
.dbend
.dbfunc e LCD_AK_Control _LCD_AK_Control fV
; OnOff -> R16
.even
_LCD_AK_Control::
.dbline -1
.dbline 37
; }
;
; //*************************************LCD背光控制***************************************
; void LCD_AK_Control(uchar OnOff) //On0FF=1,背光显示开;
; {
.dbline 38
; if(OnOff) CLRPORT(LCD_AK); else SETPORT(LCD_AK);
tst R16
breq L16
X3:
.dbline 38
cbi 0x12,3
rjmp L17
L16:
.dbline 38
sbi 0x12,3
L17:
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbsym r OnOff 16 c
.dbend
.dbfunc e SendToSID _SendToSID fV
; bitcode -> R20
; i -> R10
; dat -> R18
; bitNum -> R16
.even
_SendToSID::
st -y,R10
st -y,R20
.dbline -1
.dbline 42
; }
;
; void SendToSID(unsigned char bitNum, unsigned char dat)//向串行数据线发送指定位数一个数据
; {
.dbline 44
; unsigned char i,bitcode;
; for(i=0;i<bitNum;i++)
clr R10
rjmp L22
L19:
.dbline 45
; {
.dbline 46
; bitcode=dat & 0x80;
mov R20,R18
andi R20,128
.dbline 47
; if(bitcode!=0) SETPORT(SID); else CLRPORT(SID); //SID = dat & 0x80;
breq L23
X4:
.dbline 47
sbi 0x12,6
rjmp L24
L23:
.dbline 47
cbi 0x12,6
L24:
.dbline 48
; dat = dat << 1;
lsl R18
.dbline 49
; CLRPORT(SCLK); //SCLK = 0;
cbi 0x12,7
.dbline 50
; SETPORT(SCLK); //SCLK = 1;
sbi 0x12,7
.dbline 51
; CLRPORT(SCLK); //SCLK = 0;
cbi 0x12,7
.dbline 52
; }
L20:
.dbline 44
inc R10
L22:
.dbline 44
cp R10,R16
brlo L19
X5:
.dbline -2
L18:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r bitcode 20 c
.dbsym r i 10 c
.dbsym r dat 18 c
.dbsym r bitNum 16 c
.dbend
.dbfunc e Write_LCD_Com _Write_LCD_Com fV
; SynCode -> R20
.even
_Write_LCD_Com::
st -y,R20
.dbline -1
.dbline 57
; }
;
; //*************************************写入LCD控制字******************************
; void Write_LCD_Com(void) //对LCD写入控制命令
; {
.dbline 60
; // SynCode为同步码
; unsigned char SynCode;
; CLRPORT(CS); //CS=0;
cbi 0x12,5
.dbline 61
; SETPORT(CS); //CS=1;
sbi 0x12,5
.dbline 63
;
; SynCode = 0xFF; //同步码
ldi R20,255
.dbline 64
; SendToSID(5,SynCode);
mov R18,R20
ldi R16,5
rcall _SendToSID
.dbline 66
;
; SynCode = 0x00; //写入代码RW,RS,0,3位代码
clr R20
.dbline 67
; SendToSID(3,SynCode);
mov R18,R20
ldi R16,3
rcall _SendToSID
.dbline 69
;
; SynCode = LCD_COM & 0xF0; //写入代码COM数据的高四位 要发送的数据格式是XXXX0000
lds R20,_LCD_COM
andi R20,240
.dbline 70
; SendToSID(8,SynCode);
mov R18,R20
ldi R16,8
rcall _SendToSID
.dbline 72
;
; SynCode = LCD_COM & 0x0F; //写入代码COM数据的低四位 0000XXXX
lds R20,_LCD_COM
andi R20,15
.dbline 73
; SynCode = SynCode<<4; //要发送的数据格式是XXXX0000
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 74
; SendToSID(8,SynCode);
mov R18,R24
ldi R16,8
rcall _SendToSID
.dbline 75
; Delay_1ms() ; //必要的延时
rcall _Delay_1ms
.dbline -2
L25:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r SynCode 20 c
.dbend
.dbfunc e Write_LCD_Data _Write_LCD_Data fV
; bitcode -> R10
; iSynCode -> R22
; SynCode -> R20
.even
_Write_LCD_Data::
rcall push_xgsetF00C
.dbline -1
.dbline 80
; }
;
; //*************************************写入LCD数据**********************************
; void Write_LCD_Data(void) //对LCD写入8位数据
; {
.dbline 84
; // iSynCode为同步码计数器,同步码为5位, SynCode为同步码
; unsigned char iSynCode,SynCode;
; uchar bitcode;
; CLRPORT(CS); //CS=0;
cbi 0x12,5
.dbline 85
; SETPORT(CS); //CS=1;
sbi 0x12,5
.dbline 87
;
; SynCode = 0xFF; //同步码
ldi R20,255
.dbline 88
; SendToSID(5,SynCode);
mov R18,R20
ldi R16,5
rcall _SendToSID
.dbline 89
; SynCode = 0x40; //写入代码RW,RS,0,3位代码
ldi R20,64
.dbline 90
; SendToSID(3,SynCode);
mov R18,R20
ldi R16,3
rcall _SendToSID
.dbline 92
;
; SynCode = LCD_DAT & 0xF0; //写入代码COM数据的高四位 要发送的数据格式是XXXX0000
lds R20,_LCD_DAT
andi R20,240
.dbline 93
; for(iSynCode=0;iSynCode<8;iSynCode++)
clr R22
rjmp L30
L27:
.dbline 94
; {
.dbline 95
; bitcode = SynCode & 0x80;
mov R24,R20
andi R24,128
mov R10,R24
.dbline 96
; if(bitcode!=0) SETPORT(SID); else CLRPORT(SID);//SID = bitcode;
tst R24
breq L31
X6:
.dbline 96
sbi 0x12,6
rjmp L32
L31:
.dbline 96
cbi 0x12,6
L32:
.dbline 97
; SynCode = SynCode << 1;
lsl R20
.dbline 98
; CLRPORT(SCLK); //SCLK = 0;
cbi 0x12,7
.dbline 99
; SETPORT(SCLK); //SCLK = 1;
sbi 0x12,7
.dbline 100
; CLRPORT(SCLK); //SCLK = 0;
cbi 0x12,7
.dbline 102
;
; }
L28:
.dbline 93
inc R22
L30:
.dbline 93
cpi R22,8
brlo L27
X7:
.dbline 103
; SynCode = LCD_DAT & 0x0F; //写入代码COM数据的低四位 0000XXXX
lds R20,_LCD_DAT
andi R20,15
.dbline 104
; SynCode = SynCode<<4; //要发送的数据格式是XXXX0000
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 105
; for(iSynCode=0;iSynCode<8;iSynCode++)
clr R22
rjmp L36
L33:
.dbline 106
; {
.dbline 107
; bitcode = SynCode & 0x80;
mov R24,R20
andi R24,128
mov R10,R24
.dbline 108
; if(bitcode!=0) SETPORT(SID); else CLRPORT(SID);//SID = bitcode;
tst R24
breq L37
X8:
.dbline 108
sbi 0x12,6
rjmp L38
L37:
.dbline 108
cbi 0x12,6
L38:
.dbline 109
; SynCode = SynCode << 1;
lsl R20
.dbline 110
; CLRPORT(SCLK); //SCLK = 0;
cbi 0x12,7
.dbline 111
; SETPORT(SCLK); //SCLK = 1;
sbi 0x12,7
.dbline 112
; CLRPORT(SCLK); //SCLK = 0;
cbi 0x12,7
.dbline 113
; }
L34:
.dbline 105
inc R22
L36:
.dbline 105
cpi R22,8
brlo L33
X9:
.dbline 114
; Delay_1ms();
rcall _Delay_1ms
.dbline -2
L26:
.dbline 0 ; func end
rjmp pop_xgsetF00C
.dbsym r bitcode 10 c
.dbsym r iSynCode 22 c
.dbsym r SynCode 20 c
.dbend
.dbfunc e LCD_Ini _LCD_Ini fV
.even
_LCD_Ini::
.dbline -1
.dbline 124
; }
;
; //*************************************LCD屏幕初始化**************************************
; //LCD接口:
; //CS <==>PD5;
; //SID <==>PD6;
; //SCLK <==>PD7;
; //LCD_AK<==>PD3; //背光控制,=0时打开背光
; void LCD_Ini(void) //初始化,并进入文本模式
; {
.dbline 126
; //LCD端口初始化,将PD7~PD5端口设置为输出方式
; DDRD|=0xE0;
in R24,0x11
ori R24,224
out 0x11,R24
.dbline 127
; _NOP();
nop
.dbline 129
;
; LCD_COM =0x30;//功能设置为8BIT控制界面,基本指令集
ldi R24,48
sts _LCD_COM,R24
.dbline 130
; Write_LCD_Com();//调用写指令子程序
rcall _Write_LCD_Com
.dbline 131
; Delay(5);//39uS
ldi R16,5
ldi R17,0
rcall _Delay
.dbline 133
;
; LCD_COM =0x0C;//显示打开,光标关,反白不显示
ldi R24,12
sts _LCD_COM,R24
.dbline 134
; Write_LCD_Com();//调用写指令子程序
rcall _Write_LCD_Com
.dbline 135
; Delay(5);//39uS
ldi R16,5
ldi R17,0
rcall _Delay
.dbline 137
;
; LCD_COM =0x01;//清除屏幕显示,将DDRAM的地址计数器归零
ldi R24,1
sts _LCD_COM,R24
.dbline 138
; Write_LCD_Com();//调用写指令子程序
rcall _Write_LCD_Com
.dbline 139
; Delay(5);//39uS
ldi R16,5
ldi R17,0
rcall _Delay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -