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