osdbasic.lst
来自「显示屏驱动源代码」· LST 代码 · 共 538 行 · 第 1/2 页
LST
538 行
C51 COMPILER V7.06 OSDBASIC 02/21/2008 14:00:28 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE OSDBASIC
OBJECT MODULE PLACED IN .\Output\Osdbasic.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Osdbasic.c COMPACT OPTIMIZE(9,SIZE) BROWSE INCDIR(.\Include\) DEBUG OBJECTE
-XTEND PRINT(.\Source\Osdbasic.lst) OBJECT(.\Output\Osdbasic.obj)
stmt level source
1 //osd_basic.c
2 // ver0.11 2/1x/2001 Change display format from hex to decimal
3 // 1.32 LJY11262001 .Add border features to OSD window
4 // 1.70 LJY05302003 .Support a menu with external OSD.
5 // 2.00 BYH05102007 .Support internal MCU, which connect with direct memoty bus
6 // It needs change whole ReadTW88, WriteTW88 to regTW88
7
8 #include "Config.h"
9
10 #include "typedefs.h"
11 #include "i2c.h"
12 #include "main.h"
13 #include "tw88.h"
14
15 #include "osdbasic.h"
16 #include "dispinfo.h"
17 #include "measure.h"
18 #include "printf.h"
19 #include "udfont.h"
20 #include "regmap.h"
21
22 extern CODE struct RegisterInfo UserRange;
23
24 //CODE BYTE ZoomAttr[]={ 0, 0, 0x40, 0x80, 0xc0 };
25
26 //IDATA struct BarInfo BarInfo;
27 IDATA struct OSDStrInfo OSDStrInfo;
28 extern bit I2CAutoIncFlagOn ;
29
30 //********************************************************************
31 //
32 // Font
33 //
34 //********************************************************************
35
36 void WaitEndofDisplayArea(void)
37 {
38 1 BYTE ret,i;
39 1
40 1 ret = ReadTW88(OSDWINSTATUS) & 0x40;
41 1
42 1 for(i=0;i<10;i++){
43 2 if( ret^ (ReadTW88(OSDWINSTATUS)&0x40)) break;
44 2 }
45 1 }
46
47 //=============================================================================
48 // Download OSD Color Look up
49 //=============================================================================
50 void Change_OSDColorLookup(void)
51 {
52 1 BYTE i,j;
53 1 for(j=0; j<2; j++) {
54 2 for(i=0; i<8; i++) {
C51 COMPILER V7.06 OSDBASIC 02/21/2008 14:00:28 PAGE 2
55 3 WriteTW88(0x9c, i+j*8);
56 3 WriteTW88(0x9d, OSD_Color_LookUp_Data_Table[j][i]);
57 3 }
58 2 }
59 1 }
60
61 //=============================================================================
62 // Download RAM Font Data
63 //=============================================================================
64 #ifdef INTERNAL_MCU // it doesn't have auto increase I2C mode
void DownloadUDFont(void)
{
BYTE i, j;
#ifndef INTERNAL_MCU
BYTE k;
#endif
WriteTW88(TW88_MULTISTART, COLORFONT_START); // Set Color Font Start Address.
for(i=0; (i< NO_UDFONT) && (i<= MAX_FONT_RAM_CHARS) ; i++) {
//DownloadFont(i, RAMFONTDATA[i]);
WriteTW88(TW88_ENABLERAM, ReadTW88(TW88_ENABLERAM) | 0x01); // Font RAM access mode ON
WriteTW88(TW88_FONTRAMADDR, i);
WriteTW88(0xff, ReadTW88(0xff) | 0x10); // Disable I2C index auto increment during multi-write
//WriteI2Cn( TW88I2CAddress, TW88_FONTRAMDATA, fontdata, 27 );
for ( j = 0; j<27; j++ ) {
WriteTW88(TW88_FONTRAMDATA, RAMFONTDATA[i][j]);
#ifndef INTERNAL_MCU
for ( k=5; k!=0; k-- ) ;
#endif
}
WriteTW88(TW88_ENABLERAM, (ReadTW88(TW88_ENABLERAM) & 0xfe)); // OSD RAM access mode OFF
#ifdef DEBUG_OSD
if (( i % 10 )== 0)
dPuts("\r\n");
dPrintf("%02xh, ", (WORD)i);
#endif
}
}
#else
99 void DownloadFont(BYTE cod, CODE_P BYTE *fontdata)
100 {
101 1 WriteTW88(TW88_ENABLERAM, ReadTW88(TW88_ENABLERAM) | 0x01); // Font RAM access mode
102 1 WriteTW88(TW88_FONTRAMADDR, cod);
103 1
104 1 // WriteTW88(0xff, ReadTW88(0xff) | 0x10); // Disable I2C index auto increment during multi-write
105 1 WriteTW88(0xe0, ReadTW88(0xe0) | 0x10); // Disable I2C index auto increment during multi-write
106 1 WriteI2Cn( TW88I2CAddress, TW88_FONTRAMDATA, fontdata, 27 );
107 1
108 1 WriteTW88(TW88_ENABLERAM, ReadTW88(TW88_ENABLERAM) & 0xfe); // OSD RAM access mode
109 1 }
110
111 void DownloadUDFont(void)
112 {
113 1 BYTE i;
114 1
115 1 WriteTW88(TW88_MULTISTART, COLORFONT_START); // Set Color Font Start Address.
116 1
C51 COMPILER V7.06 OSDBASIC 02/21/2008 14:00:28 PAGE 3
117 1 for(i=0; i< NO_UDFONT && i<= MAX_FONT_RAM_CHARS ; i++) {
118 2 DownloadFont(i, RAMFONTDATA[i]);
119 2 }
120 1 }
121 #endif
122 //*****************************************************************************
123 // OSD Window internal subfunction for TW88xx
124 //*****************************************************************************
125 //*****************************************************************************
126 // Functions for TW88xx internal OSD
127 //*****************************************************************************
128 #ifdef SUPPORT_OSDPOSITIONMOVE
129
130 void SetOSDWindowX_TW88(BYTE winno, BYTE x)
131 {
132 1 WORD tmp;
133 1 BYTE dat;
134 1
135 1 if( winno<1 || winno>8 ) return;
136 1 SetOSDWindowNum(winno);
137 1
138 1 tmp = x << 3;
139 1
140 1 dat = ReadTW88(TW88_WINSTART_HI) & 0xf0;
141 1 dat = dat | (tmp>>8);
142 1
143 1 WriteTW88(TW88_WINSTART_HI, dat);
144 1 WriteTW88(TW88_WINXSTART, tmp);
145 1 }
146 #endif
147 void SetOSDWindowY_TW88(BYTE winno, BYTE y)
148 {
149 1 WORD tmp;
150 1 BYTE dat;
151 1
152 1 if( winno<1 || winno>8 ) return;
153 1 SetOSDWindowNum(winno);
154 1
155 1 tmp = y << 2;
156 1
157 1 dat = ReadTW88(TW88_WINSTART_HI) & 0x0f;
158 1 dat = dat | ((tmp>>8)<<4);
159 1
160 1 WriteTW88(TW88_WINSTART_HI, dat);
161 1 WriteTW88(TW88_WINYSTART, tmp);
162 1 }
163
164 //=============================================================================
165 // ShowOSDWindow_TW88
166 //=============================================================================
167 void ShowOSDWindowAll(BYTE on)
168 {
169 1 BYTE rd;
170 1
171 1 WaitEndofDisplayArea();
172 1 rd = ReadTW88(TW88_OSDLOCKUPSEL);
173 1
174 1 if( on )
175 1 WriteTW88(TW88_OSDLOCKUPSEL, rd&0xef); //
176 1 else
177 1 WriteTW88(TW88_OSDLOCKUPSEL, rd|0x10); // OSD All Off (TW8806B)
178 1
C51 COMPILER V7.06 OSDBASIC 02/21/2008 14:00:28 PAGE 4
179 1 }
180 void ShowOSDWindow_TW88(BYTE winno, BYTE onoff)
181 {
182 1 BYTE rd;
183 1
184 1 if( winno<1 || winno>8 ) return;
185 1 SetOSDWindowNum(winno);
186 1
187 1 rd = ReadTW88(TW88_WINATTR);
188 1 if( onoff ) rd |= 0x01;
189 1 else rd &= 0xfe;
190 1
191 1 WaitEndofDisplayArea();
192 1 WriteTW88(TW88_WINATTR, rd);
193 1 }
194
195 #ifdef SUPPORT_OSDPOSITIONMOVE
196 WORD GetOSDWindowX(BYTE winno)
197 {
198 1 WORD x;
199 1
200 1 if( winno<1 || winno>8 ) return 0;
201 1 SetOSDWindowNum(winno);
202 1
203 1 x = (ReadTW88(TW88_WINSTART_HI) & 0x0f) << 8;
204 1 x = x | ReadTW88(TW88_WINXSTART);
205 1
206 1 return (BYTE)(x >> 3);
207 1 }
208 #endif
209
210 WORD GetOSDWindowY(BYTE winno)
211 {
212 1 WORD y;
213 1
214 1 if( winno<1 || winno>8 ) return 0;
215 1 SetOSDWindowNum(winno);
216 1
217 1 y = (ReadTW88(TW88_WINSTART_HI) & 0xf0) << 4;
218 1 y = y | ReadTW88(TW88_WINYSTART);
219 1
220 1 return (BYTE)(y >> 2);
221 1 }
222
223 #include "osdTW88.c"
224 //*****************************************************************************
225 //
226 // Internal Font test
227 //
228 //*****************************************************************************
229 //-----------------------------------------------------------------------------
230 // CopyUDCharToOSDWindow(BYTE winno, BYTE xoff, BYTE yoff, BYTE attr, BYTE ch)
231 // - For FONT RAM Char.
232 //-----------------------------------------------------------------------------
233 code BYTE FontTestWindow[] = { 0xa1, 10, 0xa2, 10, 0xa0, 0, 0xa3, 16, 0xa4, 16, 0xa5, 0x91,
234 0xa6, 1, 0xa7, 1, 0xa8, 0x22, 0xa9, 0x00, 0xaa, 00, 0xab, 0x62 };
235 void DisplayROMFont( BYTE scode )
236 {
237 1 BYTE i;
238 1
239 1 WriteTW88( 0x94, 0x02 ); // clear OSD RAM clear
240 1 WriteTW88( 0x9e, 0 ); // window #0
C51 COMPILER V7.06 OSDBASIC 02/21/2008 14:00:28 PAGE 5
241 1 for ( i=0; i<(sizeof(FontTestWindow)/2); i++ )
242 1 WriteTW88(FontTestWindow[i*2], FontTestWindow[i*2+1]);
243 1 if ( scode == 0 ) {
244 2 WriteTW88( 0x94, 0x00 ); //0000 1100 ROM Font select with same attribute
245 2 for ( i=0; i<0xfe; i++ ) {
246 3 WriteTW88( 0x96, i );
247 3 WriteTW88( 0x97, i );
248 3 WriteTW88( 0x98, 0x97 );
249 3 }
250 2 }
251 1 else {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?