📄 disp160_128.lst
字号:
C51 COMPILER V7.50 DISP160_128 05/21/2009 07:54:16 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DISP160_128
OBJECT MODULE PLACED IN Disp160_128.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Disp160_128.c OPTIMIZE(0,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 #include"t6963.h"
2 #include"reg51.h"
3 #include"tab.h"
4 extern void Delay_500ms();
5 //引脚定义
6 sbit _CD=P1^5;
7 sbit _RD=P1^6;
8 sbit _WR=P1^7;
9 //读状态函数
10 unsigned char Read_State()
11 {
12 1 unsigned char a;
13 1 P2=0xff;//读状态之前先将数据线拉高
14 1 _CD=1; //1为指令通道,0为数据通道
15 1 _RD=0;
16 1 _RD=1;
17 1 a=P2;
18 1 return a;
19 1 }
20 //bit0指令写状态位,bit1数据读/写状态位,为1时候空闲
21 void Enable()
22 {
23 1 while(1)
24 1 if((Read_State()&3)==3)break;
25 1 }
26 //bit3数据自动写状态位,为1时候空闲
27 void Aut_Write()
28 {
29 1 while(1)
30 1 if((Read_State()&8)==8)break;
31 1 }
32 //写单参数函数,Data1为传入的参数,Com为传入的指令
33 //注意:写入顺序为先数据后写指令,不可颠倒
34 void Write_Data1(unsigned char Data1,unsigned char Com)
35 {
36 1 Enable();
37 1 _CD=0;
38 1 P2=Data1;
39 1 _WR=0;
40 1 _WR=1;
41 1 Enable();
42 1 _CD=1;
43 1 P2=Com;
44 1 _WR=0;
45 1 _WR=1;
46 1 }
47 //写双参数函数,Data1/Data2为传入的参数,Com为传入的指令
48 //注意:写入顺序为先数据Data1后写数据Data2,最后写指令,不可颠倒
49 void Write_Data2(unsigned char Data1,unsigned char Data2,unsigned char Com)
50 {
51 1 Enable();
52 1 _CD=0;
53 1 P2=Data1;
54 1 _WR=0;
55 1 _WR=1;
C51 COMPILER V7.50 DISP160_128 05/21/2009 07:54:16 PAGE 2
56 1 Enable();
57 1 _CD=0;
58 1 P2=Data2;
59 1 _WR=0;
60 1 _WR=1;
61 1 Enable();
62 1 _CD=1;
63 1 P2=Com;
64 1 _WR=0;
65 1 _WR=1;
66 1 }
67 //写指令函数
68 void Write_Com(unsigned char Com)
69 {
70 1 Enable();
71 1 _CD=1;
72 1 P2=Com;
73 1 _WR=0;
74 1 _WR=1;
75 1 }
76 //写8字节数据函数Addr表示数据首地址,Way表示写的方式
77 void Write_8_Data(unsigned char Addr,unsigned char Way)
78 {
79 1 Aut_Write();//判断是否能自动写
80 1 Write_Com(AUT_WR);//自动写开始
81 1 Write_Data1(Addr,Way);
82 1 Write_Com(AUT_WO);//自动写结束
83 1 }
84 //设置数据显示在屏幕上的坐标(以字节为单位)
85 //x表示显示的行(0~15),y表示显示的列(0~19)
86 void Set_xy(unsigned char x,unsigned char y)
87 {
88 1 unsigned int a;
89 1 a=x*20+y;
90 1 Write_Data2(a&0xff,a>>8,ADR_POS);
91 1 }
92 //设置数据存储起始地址
93 void Set_Addr(unsigned char Addr1,unsigned char Addr2)
94 {
95 1 Write_Data2(Addr1,Addr2,ADR_POS);
96 1 }
97 /*CGRAM偏置地址设置函数*/
98 void Set_CGRAM()
99 {
100 1 Write_Data2(1,0,CGR_POS);
101 1 }
102 //液晶初始化函数
103 //(文本区首地址D1,文本区首地址D2, 文本区宽度,
104 //图形区首地址D1, 图形区首地址D2, 图形区宽度,
105 //光标形状, 显示方式, 显示开关)
106 void LCD_Init(unsigned char Txt1,unsigned char Txt2,unsigned char Txt_Wide,
107 unsigned char Map1,unsigned char Map2,unsigned char Map_Wide,
108 unsigned char Guang_Biao,unsigned char Disp_Mode,unsigned char Kai_Guan)
109 {
110 1 Write_Data2(Txt1,Txt2,TXT_STP); //设置文本方式RAM起始地址
111 1 Write_Data2(Txt_Wide,0,TXT_WID); //设置文本模式宽度,宽度为N/6或N/8,N为宽度点数,比如N=160
112 1 Write_Data2(Map1,Map2,GRH_STP); //设置图形方式RAM起始地址
113 1 Write_Data2(Map_Wide,0,GRH_WID); //设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如160
114 1 Write_Com(CUR_SHP|Guang_Biao);
115 1 Write_Com(Disp_Mode);
116 1 Write_Com(DIS_SW|Kai_Guan);
117 1 }
C51 COMPILER V7.50 DISP160_128 05/21/2009 07:54:16 PAGE 3
118 //显示一个汉字子程序,
119 //x表示显示的行(0~15),y表示显示的列(0~19),n表示字在表格中的位置
120 void Han_Zi(unsigned char x,unsigned char y,unsigned char Addr)
121 {
122 1 Set_xy(x,y);
123 1 Write_8_Data(Addr,INC_WR);
124 1 Write_8_Data(Addr+2,INC_WR);
125 1 Set_xy(x+1,y);
126 1 Write_8_Data(Addr+1,INC_WR);
127 1 Write_8_Data(Addr+3,INC_WR);
128 1 }
129 //清屏程序
130 void Clear_LCD()
131 {
132 1 unsigned int a;
133 1 Set_xy(0,0);
134 1 for(a=0;a<320;a++)
135 1 Write_8_Data(0x80,INC_WR);
136 1 }
137 /*自定义字符写入CGROM函数*/
138 void Write_CGORM()
139 {
140 1 int a;
141 1 Set_CGRAM();
142 1 Set_Addr(0,0x0c);
143 1 for(a=0;a<2568;a++)
144 1 Write_8_Data(Tab[a],INC_WR);
145 1 }
146 //设置点显示在屏幕上的坐标(以位为单位)
147 //x表示显示的行(0~127),y表示显示的列(0~159),n=1表示打个点,n=0清除一个点
148 void Point(unsigned char x,unsigned char y,bit n)
149 {
150 1 unsigned char point;
151 1 unsigned int temp;
152 1 temp=x*20+y/8+320;
153 1 point=0xf7-y%8;
154 1 if(n)point|=0xf8;
155 1 else point&=0xf7;
156 1 Write_Data2(temp&0xff,temp>>8,0x24); //设置写地址
157 1 Write_Com(point);
158 1 }
159 //画线子程序,x1/y1/x2/y2,分别表示起点和终点的坐标、draw=1表示画直线为0表示清除直线
160 void Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,bit n)
161 {
162 1 unsigned char _x,_y;
163 1 unsigned char i,j=0,k=0;
164 1 unsigned char shang1,shang2,yu_shu;
165 1 if(x1>=x2)_x=x1-x2;
166 1 else _x=x2-x1;
167 1 if(y1>=y2)_y=y1-y2;
168 1 else _y=y2-y1;
169 1 if(!_x)
170 1 {
171 2 if(y1>y2)for(i=y2;i<=y1;i++)Point(x1,i,n);
172 2 else for(i=y1;i<=y2;i++)Point(x1,i,n);
173 2 }
174 1 else if(!_y)
175 1 {
176 2 if(x1>x2)for(i=x2;i<=x1;i++)Point(i,y1,n);
177 2 else for(i=x1;i<=x2;i++)Point(i,y1,n);
178 2 }
179 1 else if(_x>=_y)
C51 COMPILER V7.50 DISP160_128 05/21/2009 07:54:16 PAGE 4
180 1 {
181 2 shang1=_x/_y;
182 2 yu_shu=_x%_y;
183 2 shang2=_x/yu_shu;
184 2 //if(_x%yu_shu*10/yu_shu>=5)shang2+=shang2;
185 2 if((y2>y1)&&(x2>x1))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -