📄 12864-7920.s
字号:
.module _12864-7920.c
.area text(rom, con, rel)
.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
.dbfunc e s_ms _s_ms fV
; ms -> R16,R17
.even
_s_ms::
.dbline -1
.dbline 20
; //12864液晶的试验程序,驱动芯片为ST7920
; //目标板为DDC-16A
; //驱动方式-并口
; //JP10短路块位于右侧,JP1两个短路块均插好
; //调节V0电位器调整对比度
; //注意:因为厂家不同液晶的19脚和20脚(背光)有时会不同,导致背光不亮,需要注意。
;
; #include <iom16v.h>
; #include <string.h>
;
; #define uchar unsigned char
; #define uint unsigned int
;
; #define RS (1<<5)
; #define RW (1<<6)
; #define EN (1<<7)
;
; //延时函数
; void s_ms(uint ms)
; {
.dbline 21
; for(;ms>1;ms--);
xjmp L5
L2:
.dbline 21
L3:
.dbline 21
subi R16,1
sbci R17,0
L5:
.dbline 21
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlo L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r ms 16 i
.dbend
.area data(ram, con, rel)
.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
_text_1::
.blkb 15
.area idata
.byte 177,177,190,169,182,171,191,216,191,170,183,162,176,229,0
.area data(ram, con, rel)
.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
.dbsym e text_1 _text_1 A[15:15]c
_text_2::
.blkb 14
.area idata
.byte 'W,'W,'W,46,'I,'S,'M,'C,'U,46,'C,'O,'M,0
.area data(ram, con, rel)
.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
.dbsym e text_2 _text_2 A[14:14]c
_text_3::
.blkb 15
.area idata
.byte 'W,'D,'D,95,'C,'N,64,49,50,54,46,'C,'O,'M,0
.area data(ram, con, rel)
.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
.dbsym e text_3 _text_3 A[15:15]c
_text_4::
.blkb 10
.area idata
.byte 'Q,'Q,58,54,50,49,53,50,48,0
.area data(ram, con, rel)
.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
.dbsym e text_4 _text_4 A[10:10]c
.area text(rom, con, rel)
.dbfile E:\产品\开发板\光盘\16实验程序\12864-7920液晶\12864-7920.c
.dbfunc e WriteDataLCM _WriteDataLCM fV
; WDLCM -> R10
.even
_WriteDataLCM::
st -y,R10
mov R10,R16
.dbline -1
.dbline 32
; }
;
; //此处定义字符串
; char text_1[]={"北京东控开发板"};
; char text_2[]={"WWW.ISMCU.COM"};
; char text_3[]={"WDD_CN@126.COM"};
; char text_4[]={"QQ:621520"};
;
; //写数据
; void WriteDataLCM(unsigned char WDLCM)
; {
.dbline 34
; //ReadStatusLCM(); //检测忙
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 35
; PORTA|=RS; //RS=1
sbi 0x1b,5
.dbline 36
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 37
; PORTA&=~RW; //RW=0
cbi 0x1b,6
.dbline 38
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 39
; PORTA|=EN; //EN=1
sbi 0x1b,7
.dbline 40
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 41
; PORTD=WDLCM; //输出数据
out 0x12,R10
.dbline 42
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 43
; PORTA&=~EN; //EN=0
cbi 0x1b,7
.dbline 44
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline -2
L6:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r WDLCM 10 c
.dbend
.dbfunc e WriteCommandLCM _WriteCommandLCM fV
; WCLCM -> R10
.even
_WriteCommandLCM::
st -y,R10
mov R10,R16
.dbline -1
.dbline 49
; }
;
; //写指令
; void WriteCommandLCM(unsigned char WCLCM)
; {
.dbline 51
; //ReadStatusLCM(); //根据需要检测忙
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 52
; PORTA&=~RS; //RS=0
cbi 0x1b,5
.dbline 53
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 54
; PORTA&=~RW; //RW=0
cbi 0x1b,6
.dbline 55
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 56
; PORTA|=EN; //EN=1
sbi 0x1b,7
.dbline 57
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 58
; PORTD=WCLCM; //输出指令
out 0x12,R10
.dbline 59
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 60
; PORTA&=~EN; //EN=0
cbi 0x1b,7
.dbline 61
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline -2
L7:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r WCLCM 10 c
.dbend
.dbfunc e ReadStatusLCM _ReadStatusLCM fV
; flag -> R20
; temp -> R10
.even
_ReadStatusLCM::
st -y,R10
st -y,R20
.dbline -1
.dbline 66
; }
;
; //读状态:检测忙
; void ReadStatusLCM(void)
; {
.dbline 68
; uchar temp;
; uchar flag = 1;
ldi R20,1
xjmp L10
L9:
.dbline 70
; while(flag==1)
; {
.dbline 71
; DDRD=0x00; //端口A改为输入
clr R2
out 0x11,R2
.dbline 72
; PORTD=0xff;
ldi R24,255
out 0x12,R24
.dbline 73
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 74
; PORTA&=~RS; //RS=0
cbi 0x1b,5
.dbline 75
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 76
; PORTA|=RW; //RW=1
sbi 0x1b,6
.dbline 77
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 78
; PORTA|=EN; //EN=1
sbi 0x1b,7
.dbline 79
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 80
; temp = PIND; //读端口A
in R10,0x10
.dbline 81
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 82
; DDRD=0xff; //端口A改为
ldi R24,255
out 0x11,R24
.dbline 83
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 84
; PORTA&=~EN; //EN=0
cbi 0x1b,7
.dbline 85
; s_ms(100);
ldi R16,100
ldi R17,0
xcall _s_ms
.dbline 86
; if(temp>>7==0)
mov R2,R10
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
brne L12
X1:
.dbline 87
; flag = 0;
clr R20
L12:
.dbline 88
; }
L10:
.dbline 69
cpi R20,1
breq L9
X2:
.dbline -2
L8:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r flag 20 c
.dbsym r temp 10 c
.dbend
.dbfunc e LCMInit _LCMInit fV
.even
_LCMInit::
.dbline -1
.dbline 93
; }
;
; //LCM初始化
; void LCMInit(void)
; {
.dbline 94
; WriteCommandLCM(0x38); //三次显示模式设置,不检测忙信号
ldi R16,56
xcall _WriteCommandLCM
.dbline 95
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 96
; WriteCommandLCM(0x38);
ldi R16,56
xcall _WriteCommandLCM
.dbline 97
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 98
; WriteCommandLCM(0x38);
ldi R16,56
xcall _WriteCommandLCM
.dbline 99
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 100
; WriteCommandLCM(0x38); //显示模式设置,开始要求每次检测忙信号
ldi R16,56
xcall _WriteCommandLCM
.dbline 101
; WriteCommandLCM(0x08); //关闭显示
ldi R16,8
xcall _WriteCommandLCM
.dbline 102
; WriteCommandLCM(0x01); //显示清屏
ldi R16,1
xcall _WriteCommandLCM
.dbline 103
; WriteCommandLCM(0x06); //显示光标移动设置
ldi R16,6
xcall _WriteCommandLCM
.dbline 104
; WriteCommandLCM(0x0C); //显示开及光标设置
ldi R16,12
xcall _WriteCommandLCM
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e DisplayList _DisplayList fV
; p -> R14,R15
; length -> R14
; i -> R10
; DData -> R12,R13
; X -> R20
.even
_DisplayList::
xcall push_xgset30FC
movw R12,R18
mov R20,R16
.dbline -1
.dbline 116
; }
;
; //按指定位置显示一串字符
; //液晶显示:汉字为16*16,字母及数字为8*16,此次显示的文本
; // 从第一行第一列开始,依次向左,如果想在不同的
; // 位置显示,只需修改相应的行值即可。液晶显示
; // 完毕后,转入语音文本发送。
; //DisplsyList(X,DData)函数:X为0x80在第一行显示;X为0x90在
; // 第二行显示;X为0x88在第三行显示;X为0x98在
; // 第四行显示;DData为显示数组。
; void DisplayList(unsigned char X,char *DData)
; {
.dbline 118
; unsigned char length;
; unsigned char i=0;
clr R10
.dbline 120
; char *p;
; p = DData;
movw R14,R12
.dbline 121
; length = strlen(p);
movw R16,R14
xcall _strlen
mov R14,R16
.dbline 122
; WriteCommandLCM(0x08);
ldi R16,8
xcall _WriteCommandLCM
.dbline 123
; WriteCommandLCM(X);
mov R16,R20
xcall _WriteCommandLCM
.dbline 124
; WriteCommandLCM(0x06);
ldi R16,6
xcall _WriteCommandLCM
.dbline 125
; WriteCommandLCM(0x0C);
ldi R16,12
xcall _WriteCommandLCM
.dbline 126
; WriteCommandLCM(X);
mov R16,R20
xcall _WriteCommandLCM
.dbline 127
; for(i=0;i<length;i++)
xjmp L19
L16:
.dbline 128
; {
.dbline 129
; WriteDataLCM(DData[i]);
mov R30,R10
clr R31
add R30,R12
adc R31,R13
ldd R16,z+0
xcall _WriteDataLCM
.dbline 130
; i++;
inc R10
.dbline 131
; WriteDataLCM(DData[i]);
mov R30,R10
clr R31
add R30,R12
adc R31,R13
ldd R16,z+0
xcall _WriteDataLCM
.dbline 132
; }
L17:
.dbline 127
inc R10
L19:
.dbline 127
cp R10,R14
brlo L16
X3:
.dbline -2
L15:
.dbline 0 ; func end
xjmp pop_xgset30FC
.dbsym r p 14 pc
.dbsym r length 14 c
.dbsym r i 10 c
.dbsym r DData 12 pc
.dbsym r X 20 c
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 137
; }
;
; //主函数
; void main(void)
; {
.dbline 139
; //端口初始化
; DDRA=0xff;
ldi R24,255
out 0x1a,R24
.dbline 140
; PORTA=0xff;
out 0x1b,R24
.dbline 141
; DDRB=0xff;
out 0x17,R24
.dbline 142
; PORTB=0xff;
out 0x18,R24
.dbline 143
; DDRD=0xff;
out 0x11,R24
.dbline 144
; PORTD=0x00;
clr R2
out 0x12,R2
.dbline 146
;
; s_ms(200);
ldi R16,200
ldi R17,0
xcall _s_ms
.dbline 147
; s_ms(200);
ldi R16,200
ldi R17,0
xcall _s_ms
.dbline 148
; LCMInit(); //LCM初始化 //液晶初始化
xcall _LCMInit
.dbline 150
;
; DisplayList(0x80,text_1); //显示第一行
ldi R18,<_text_1
ldi R19,>_text_1
ldi R16,128
xcall _DisplayList
.dbline 151
; DisplayList(0x90,text_2); //显示第二行
ldi R18,<_text_2
ldi R19,>_text_2
ldi R16,144
xcall _DisplayList
.dbline 152
; DisplayList(0x88,text_3); //显示第三行
ldi R18,<_text_3
ldi R19,>_text_3
ldi R16,136
xcall _DisplayList
.dbline 153
; DisplayList(0x98,text_4); //显示第四行
ldi R18,<_text_4
ldi R19,>_text_4
ldi R16,152
xcall _DisplayList
L21:
.dbline 154
; while(1);
L22:
.dbline 154
xjmp L21
X4:
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbend
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -