?? dm12864m串行.s
字號:
.module dm12864m串行.c
.area text(rom, con, rel)
.dbfile E:\學習專區\AVR專區\個人創作區\AVR單片機開發平臺\EEPROM讀寫演示程序\dm12864m串行.c
.dbfunc e dm12864_inputbyte _dm12864_inputbyte fV
; mid -> R20
; i -> R22
; comm -> R16
.even
_dm12864_inputbyte::
xcall push_gset2
.dbline -1
.dbline 33
; /****************************************************************************************
; LCM(DM12864M-帶字庫,ST7920控制芯片)顯示程序
;
; 程序功能:該程序是用AVR來控制對DM12864M
; 讀寫信號等的操作.
; 硬件連接:采用串行方式顯示,分配PA.0,PA.1,PA.2
; 三個I/O口分別作為LCM片選CS,數據SID,時鐘信
; 號CLK的控制。PA3置為低電平,用來串行選擇信號。
; PA4置位時開啟背光。
;
; ****************************************************************************************/
;
; #include <iom16v.h>
; #include <macros.h>
; #include <stdio.h>
; #define LCDDDR DDRA
; #define LCDDDR_IN LCDDDR&=~BIT(PA1);
; #define LCDDDR_OUT LCDDDR|=BIT(PA0)|BIT(PA1)|BIT(PA2)|BIT(PA3)|BIT(PA4);
; /*===============================================================*/
; #define LCDCTL PORTA
; #define LCD_RS_H LCDCTL |= BIT(PA0) //片選
; #define LCD_RS_L LCDCTL &= ~BIT(PA0)
; #define LCD_RW_H LCDCTL |= BIT(PA1) //數據
; #define LCD_RW_L LCDCTL &= ~BIT(PA1)
; #define LCD_EN_H LCDCTL |= BIT(PA2) //時鐘
; #define LCD_EN_L LCDCTL &= ~BIT(PA2)
; #define LCD_PSB LCDCTL &= ~BIT(PA3) //串行選擇
; #define LCD_AK LCDCTL |= BIT(PA4) //開啟背光
; #define uchar unsigned char
; /***********************函數體部分*********************************/
;
; void dm12864_inputbyte(uchar comm) // 寫入一字節數據
; {
.dbline 36
; uchar i;
; uchar mid;
; for (i=0;i<8;i++)
clr R22
xjmp L5
L2:
.dbline 37
; {
.dbline 38
; mid=comm&0x80;
mov R20,R16
andi R20,128
.dbline 39
; if (mid==0)
brne L6
.dbline 40
; LCD_RW_L ;
cbi 0x1b,1
xjmp L7
L6:
.dbline 42
; else
; LCD_RW_H ;
sbi 0x1b,1
L7:
.dbline 43
sbi 0x1b,2
.dbline 45
cbi 0x1b,2
.dbline 46
lsl R16
.dbline 47
L3:
.dbline 36
inc R22
L5:
.dbline 36
cpi R22,8
brlo L2
.dbline -2
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r mid 20 c
.dbsym r i 22 c
.dbsym r comm 16 c
.dbend
.dbfunc e dm12864_outputbyte _dm12864_outputbyte fc
; i -> R16
; mid -> R18
.even
_dm12864_outputbyte::
.dbline -1
.dbline 50
; LCD_EN_H ;
; //delay(15);
; LCD_EN_L;
; comm=comm<<1;
; }
; }
; uchar dm12864_outputbyte(void) //讀取一字節數據
; {
.dbline 51
; uchar i,mid=0;
clr R18
.dbline 52
; for (i=0;i<8;i++)
clr R16
xjmp L12
L9:
.dbline 53
; {
.dbline 55
; //delay(15);
; LCDDDR_IN;
cbi 0x1a,1
.dbline 55
.dbline 56
; LCD_RS_H ;
sbi 0x1b,0
.dbline 57
; mid=mid<<1;
lsl R18
.dbline 58
; if ((PINA&0x02)==0)
sbic 0x19,1
rjmp L13
.dbline 59
; mid&=~BIT(PD0);
andi R18,254
xjmp L14
L13:
.dbline 61
; else
; mid|=BIT(PD0);
ori R18,1
L14:
.dbline 62
in R24,0x1a
ori R24,31
out 0x1a,R24
.dbline 62
.dbline 63
sbi 0x1b,2
.dbline 65
cbi 0x1b,2
.dbline 66
L10:
.dbline 52
inc R16
L12:
.dbline 52
cpi R16,8
brlo L9
.dbline 67
; LCDDDR_OUT;
; LCD_EN_H ;
; //delay(15);
; LCD_EN_L;
; }
; return(mid);
mov R16,R18
.dbline -2
L8:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbsym r mid 18 c
.dbend
.dbfunc e DetectLCMBusyState _DetectLCMBusyState fV
; BF -> R20
.even
_DetectLCMBusyState::
xcall push_gset1
.dbline -1
.dbline 72
; }
;
; /*-----------------讀取標志位,判斷控制器是否為忙狀態--------------*/
; void DetectLCMBusyState()
; {
.dbline 73
; char BF = 0x00;
clr R20
.dbline 74
; LCDDDR_OUT;
in R24,0x1a
ori R24,31
out 0x1a,R24
.dbline 74
.dbline 75
; LCD_RS_H ;
sbi 0x1b,0
.dbline 76
; LCD_EN_L ;
cbi 0x1b,2
L16:
.dbline 78
; do
; {
.dbline 79
; dm12864_inputbyte(0xfc);
ldi R16,252
xcall _dm12864_inputbyte
.dbline 80
; BF=dm12864_outputbyte();
xcall _dm12864_outputbyte
mov R20,R16
.dbline 81
L17:
.dbline 81
; } while(BF==0x80);
cpi R20,128
breq L16
.dbline 82
; LCD_RS_L ;
cbi 0x1b,0
.dbline 83
; LCD_EN_H ;
sbi 0x1b,2
.dbline -2
L15:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r BF 20 c
.dbend
.dbfunc e LCMWriteCommand _LCMWriteCommand fV
; b -> R20
; a -> R22
; DisplayCmd -> R20
.even
_LCMWriteCommand::
xcall push_gset2
mov R20,R16
.dbline -1
.dbline 89
; //delay(15);
; }
;
; /*----------------------------寫入命令-----------------------------*/
; void LCMWriteCommand(char DisplayCmd)
; {
.dbline 91
; uchar a,b;
; a=DisplayCmd&0xf0;
mov R22,R20
andi R22,240
.dbline 92
; b=(DisplayCmd<<4)&0xf0;
mov R24,R20
andi R24,#0x0F
swap R24
andi R24,240
mov R20,R24
.dbline 93
; LCDDDR_OUT;
in R24,0x1a
ori R24,31
out 0x1a,R24
.dbline 93
.dbline 94
; LCD_RS_H ;
sbi 0x1b,0
.dbline 95
; LCD_EN_L ;
cbi 0x1b,2
.dbline 96
; dm12864_inputbyte(0xf8);
ldi R16,248
xcall _dm12864_inputbyte
.dbline 97
; dm12864_inputbyte(a);
mov R16,R22
xcall _dm12864_inputbyte
.dbline 98
; dm12864_inputbyte(b);
mov R16,R20
xcall _dm12864_inputbyte
.dbline 99
; LCD_EN_H ;
sbi 0x1b,2
.dbline 100
; LCD_RS_L ;
cbi 0x1b,0
.dbline -2
L19:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r b 20 c
.dbsym r a 22 c
.dbsym r DisplayCmd 20 c
.dbend
.dbfunc e LCMWriteData _LCMWriteData fV
; b -> R20
; a -> R22
; DisplayData -> R20
.even
_LCMWriteData::
xcall push_gset2
mov R20,R16
.dbline -1
.dbline 106
; //delay(15);
; }
;
; /*-----------------------寫入一字節數據--------------------------*/
; void LCMWriteData(char DisplayData)
; {
.dbline 108
; uchar a,b;
; a=DisplayData&0xf0;
mov R22,R20
andi R22,240
.dbline 109
; b=(DisplayData<<4)&0xf0;
mov R24,R20
andi R24,#0x0F
swap R24
andi R24,240
mov R20,R24
.dbline 110
; LCDDDR_OUT;
in R24,0x1a
ori R24,31
out 0x1a,R24
.dbline 110
.dbline 111
; LCD_RS_H ;
sbi 0x1b,0
.dbline 112
; LCD_EN_L ;
cbi 0x1b,2
.dbline 113
; dm12864_inputbyte(0xfa);
ldi R16,250
xcall _dm12864_inputbyte
.dbline 114
; dm12864_inputbyte(a);
mov R16,R22
xcall _dm12864_inputbyte
.dbline 115
; dm12864_inputbyte(b);
mov R16,R20
xcall _dm12864_inputbyte
.dbline 116
; LCD_EN_H ;
sbi 0x1b,2
.dbline 117
; LCD_RS_L ;
cbi 0x1b,0
.dbline -2
L20:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r b 20 c
.dbsym r a 22 c
.dbsym r DisplayData 20 c
.dbend
.dbfunc e LCMSetXYAddress _LCMSetXYAddress fV
; DisplayRow -> R22
; DisplayCol -> R20
.even
_LCMSetXYAddress::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 123
; //delay(15);
; }
;
; /*------------設置顯示位置DisplayCol(1~8),DisplayRow(1~4)---------*/
; void LCMSetXYAddress(char DisplayCol,char DisplayRow)
; {
.dbline 124
; switch(DisplayRow)
clr R23
cpi R22,1
ldi R30,0
cpc R23,R30
breq L25
cpi R22,2
ldi R30,0
cpc R23,R30
breq L26
cpi R22,3
ldi R30,0
cpc R23,R30
breq L27
cpi R22,4
ldi R30,0
cpc R23,R30
breq L28
xjmp L22
X0:
.dbline 125
; {
L25:
.dbline 126
; case 1:LCMWriteCommand(0x7f + DisplayCol);
mov R16,R20
subi R16,129 ; addi 127
xcall _LCMWriteCommand
.dbline 127
; break;
xjmp L23
L26:
.dbline 128
; case 2:LCMWriteCommand(0x8f + DisplayCol);
mov R16,R20
subi R16,113 ; addi 143
xcall _LCMWriteCommand
.dbline 129
; break;
xjmp L23
L27:
.dbline 130
; case 3:LCMWriteCommand(0x87 + DisplayCol);
mov R16,R20
subi R16,121 ; addi 135
xcall _LCMWriteCommand
.dbline 131
; break;
xjmp L23
L28:
.dbline 132
; case 4:LCMWriteCommand(0x97 + DisplayCol);
mov R16,R20
subi R16,105 ; addi 151
xcall _LCMWriteCommand
.dbline 133
; break;
L22:
L23:
.dbline -2
L21:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r DisplayRow 22 c
.dbsym r DisplayCol 20 c
.dbend
.dbfunc e LCMDisplayASC _LCMDisplayASC fV
; ASCCharacter -> y+4
; DisplayRow -> R22
; DisplayCol -> R20
.even
_LCMDisplayASC::
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -