?? 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 + -