📄 st7920.lst
字号:
ARM COMPILER V2.40a, ST7920 19/07/07 01:23:00 PAGE 1
ARM COMPILER V2.40a, COMPILATION OF MODULE ST7920
OBJECT MODULE PLACED IN ST7920.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\ARM\BIN\CA.exe ST7920.c THUMB DEBUG TABS(4)
stmt level source
1 /*本程序为液晶模块ST7920的驱动程序*/
2 #include "config.h"
3 //全局变量声明
4 const uint8 RowNum[4]={0x80,0x90,0x88,0x98}; //定义每一行在LCM中的RAM首地址
5 //**************************************************
6 void Delay(uint16 n)
7 {
8 1 int i;
9 1 for (i=n;i>0x00;i--);
10 1 }
11
12 /*********串行传送一字节数据************************/
13 void SendByte(uint8 dat)
14 {
15 1 int i;
16 1 for (i=0;i<8;i++)
17 1 {
18 2 IO1CLR=ST7920_Clk; //SCK=0
19 2 if((dat & 0x80)!=0)
20 2 IO1SET=ST7920_Sda; //SID=1
21 2 else
22 2 IO1CLR=ST7920_Sda; //SID=0
23 2 Delay(5);
24 2 IO1SET=ST7920_Clk; //SCK=1;
25 2 dat = (dat<<1);
26 2 }
27 1 }
28
29 /****************写控制指令****************************/
30 void SendCmd(uint8 dat)
31 {
32 1 SendByte(0xf8);
33 1 SendByte(dat & 0xf0);
34 1 SendByte((dat<<4)&0xf0);
35 1 }
36
37 /************写显示数据;也可以写一个单字节字符********/
38 void SendDat(uint8 dat)
39 {
40 1 SendByte(0xfa);
41 1 SendByte(dat & 0xf0);
42 1 SendByte((dat<<4)&0xf0);
43 1 }
44 /********显示单字符***
45 x_addr 显示RAM地址
46 data 字符值
47 *******************************************/
48 void DispChar(uint8 x_addr, uint8 data)
49 {
50 1 SendCmd(x_addr);
51 1 SendDat(data);
52 1
53 1 }
54
55
56 /********显示字符口串,多余位置以空格填补***
57 x_addr 显示RAM地址
58 p 指向字符串的指针
59 *******************************************/
ARM COMPILER V2.40a, ST7920 19/07/07 01:23:00 PAGE 2
60 void DispChars(uint8 Addr,uint8 *p,uint8 Num)
61 {
62 1 uint8 i;
63 1 SendCmd(Addr);
64 1 for(i=0;i<Num;i++)
65 1 SendDat(*(p+i));
66 1 }
67
68 void Disp(uint8 x_addr, uint8 *p)
69 {
70 1
71 1 uint8 i,flag=0;
72 1 SendCmd(x_addr);
73 1 for(i=0;i<14;i++)
74 1 {
75 2 if(*(p+i)=='\0')
76 2 flag=1;
77 2 if(flag==0)
78 2 SendDat((uint8)*(p+i));
79 2 else
80 2 SendDat(' ');
81 2 }
82 1
83 1
84 1 }
85
86 /***************写一个汉字到 LCD 屏指定位置*************
87 x_add 显示 RAM 地址
88 high/low 为显示汉字的编码
89 ****************************************************/
90 void Display(uint8 x_add,uint8 high,uint8 low)
91 {
92 1 SendCmd(x_add);
93 1 SendDat(high);
94 1 SendDat(low);
95 1 }
96
97 /****************************************************************************
98 * 名称:PreDisp()
99 * 功能:显示预处理
100 * 入口参数:data 输入输出的数据
101 *p 对应的字符串指针
102 * 出口参数:无
103 ****************************************************************************/
104 void PreDispIndoorCall(uint8 *data,uint8 *p)
105 {
106 1 uint8 i;
107 1 for(i=0; i<16; i++)
108 1 {
109 2 if((0x40&(*(data+i)))!=0)
110 2 *(p+i)=0x08;
111 2 else
112 2 *(p+i)=0x2d;
113 2 }
114 1 }
115 /****************************************************************************
116 * 名称:PreDisp()
117 * 功能:显示预处理
118 * 入口参数:data 输入输出的数据
119 *p 对应的字符串指针
120 * 出口参数:无
121 ****************************************************************************/
122 void PreDispOutdoorCallUp(uint8 *data,uint8 *p)
123 {
124 1 uint8 i;
125 1 for(i=0; i<16; i++)
ARM COMPILER V2.40a, ST7920 19/07/07 01:23:00 PAGE 3
126 1 {
127 2 if((0x20&(*(data+i)))!=0)
128 2 *(p+i)=0x08;
129 2 else
130 2 *(p+i)=0x2d;
131 2 }
132 1 }
133 /****************************************************************************
134 * 名称:PreDisp()
135 * 功能:显示预处理
136 * 入口参数:data 输入输出的数据
137 *p 对应的字符串指针
138 * 出口参数:无
139 ****************************************************************************/
140 void PreDispOutdoorCallDown(uint8 *data,uint8 *p)
141 {
142 1 uint8 i;
143 1 for(i=0; i<16; i++)
144 1 {
145 2 if((0x10&(*(data+i)))!=0)
146 2 *(p+i)=0x08;
147 2 else
148 2 *(p+i)=0x2d;
149 2 }
150 1 }
151 void lcdclr(void)
152 { uint8 lcdlow,lcdlie;
153 1 //清屏
154 1 for(lcdlow=0;lcdlow<4;lcdlow++)
155 1 for(lcdlie=0;lcdlie<8;lcdlie++)
156 1 Display(RowNum[lcdlow]+lcdlie,0xA1,0xA0); //0xA1A0为空格
157 1
158 1 }
159 //*****************************************************
160 void InitLcm(void) //初始化 LCM
161 {
162 1 IO1DIR|=(ST7920_Cs|ST7920_Clk|ST7920_Sda|ST7920_Rst);
163 1 IO1SET=ST7920_Cs; // 高电平使能
164 1 IO1CLR=ST7920_Rst;
165 1 Delay(0xff);
166 1 IO1SET=ST7920_Rst;
167 1 Delay(0xff);
168 1 SendCmd(0x30); //功能设置:一次送 8 位数据,基本指令集
169 1 SendCmd(0x04); //点设定 :显示字符/ 光标从左到右移位,DDRAM 地址加一
170 1 SendCmd(0x0f); //显示设定:开显示 ,显示光标,当前显示位反白闪动
171 1 SendCmd(0x01); //清DDRAM
172 1 SendCmd(0x02); //*DDRAM 地址归位
173 1 SendCmd(DDRAM_0); //DDRAM
174 1 SendCmd(off_cursor); //关光标
175 1 }
176
177
178
179
180
181
182
ARM COMPILER V2.40a, ST7920 19/07/07 01:23:00 PAGE 4
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** PUBLICS:
PUBLIC Delay?T
PUBLIC SendCmd?T
PUBLIC SendDat?T
PUBLIC DispChars?T
PUBLIC Display?T
PUBLIC InitLcm?T
PUBLIC DispChar?T
PUBLIC PreDispOutdoorCallUp?T
PUBLIC PreDispOutdoorCallDown?T
PUBLIC PreDispIndoorCall?T
PUBLIC lcdclr?T
PUBLIC Disp?T
PUBLIC SendByte?T
PUBLIC RowNum
*** DATA SEGMENT '?CON?ST7920':
00000000 RowNum:
00000000 BEGIN_INIT
00000000 80 DB 0x80
00000001 90 DB 0x90
00000002 88 DB 0x88
00000003 98 DB 0x98
00000004 END_INIT
*** CODE SEGMENT '?PR?Delay?T?ST7920':
6: void Delay(uint16 n)
00000000 1C01 MOV R1,R0 ; n
00000002 ---- Variable 'n' assigned to Register 'R1' ----
7: {
00000002 ; SCOPE-START
9: for (i=n;i>0x00;i--);
00000002 1C08 MOV R0,R1 ; n
00000004 0400 LSL R0,R0,#0x10 ; n
00000006 0C00 LSR R0,R0,#0x10
00000008 ---- Variable 'i' assigned to Register 'R0' ----
00000008 E000 B L_3 ; T=0x0000000C
0000000A L_1:
0000000A 3801 SUB R0,#0x1
0000000C L_3:
0000000C 1C01 MOV R1,R0 ; i
0000000E 2900 CMP R1,#0x0 ; i
00000010 DCFB BGT L_1 ; T=0x0000000A
00000012 ; SCOPE-END
10: }
00000012 4770 BX R14
00000014 ENDP ; 'Delay?T'
*** CODE SEGMENT '?PR?SendByte?T?ST7920':
13: void SendByte(uint8 dat)
00000000 B500 PUSH {LR}
00000002 1C03 MOV R3,R0 ; dat
00000004 ---- Variable 'dat' assigned to Register 'R3' ----
14: {
00000004 ; SCOPE-START
16: for (i=0;i<8;i++)
00000004 2200 MOV R2,#0x0
00000006 ---- Variable 'i' assigned to Register 'R2' ----
00000006 L_9:
18: IO1CLR=ST7920_Clk; //SCK=0
00000006 4800 LDR R1,=0x40000
00000008 4800 LDR R0,=0xE002801C
0000000A 6001 STR R1,[R0,#0x0]
19: if((dat & 0x80)!=0)
ARM COMPILER V2.40a, ST7920 19/07/07 01:23:00 PAGE 5
0000000C 1C18 MOV R0,R3 ; dat
0000000E 0600 LSL R0,R0,#0x18 ; dat
00000010 0E00 LSR R0,R0,#0x18
00000012 2180 MOV R1,#0x80
00000014 4208 TST R0,R1
00000016 D003 BEQ L_11 ; T=0x00000020
20: IO1SET=ST7920_Sda; //SID=1
00000018 4800 LDR R1,=0x20000
0000001A 4800 LDR R0,=0xE0028014
0000001C 6001 STR R1,[R0,#0x0]
0000001E E002 B L_12 ; T=0x00000026
00000020 L_11:
22: IO1CLR=ST7920_Sda; //SID=0
00000020 4800 LDR R1,=0x20000
00000022 4800 LDR R0,=0xE002801C
00000024 6001 STR R1,[R0,#0x0]
00000026 L_12:
23: Delay(5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -