' http://electronics598.rssing.com/browser.php?indx=8435866&item=10874 библиотека дисплея,совместим с ILI9481 '************************************************************************************** ' осциллоскоп версия 101 * ' * '************************************************************************************** 'продолжение,начало oscilloscop_button_07 $regfile = "m32def.dat" ' контроллер $crystal = 16000000 ' частота '$sim $hwstack = 64 'ХЗЧНР $swstack = 32 ' ХЗЧНР $framesize = 256 'ХЗЧНР ' БИБЛИОТЕКА ДИСПЛЕЯ,ссылка откуда стырил в 1 сточке $include "hx8357_bascom_avr.inc" ' пины дисплея Cs_disp Alias Portb.2 : Config Cs_disp = Output ' /Chip Select Display Res_disp Alias Portb.3 : Config Res_disp = Output ' /Reset Display fьr INIT Rs_disp Alias Portb.0 : Config Rs_disp = Output ' Indexregister = 0, Data = 1 Wr_disp Alias Portb.1 : Config Wr_disp = Output ' write data to Display 0 -> 1 = latch it Data_disp_lo Alias Porta : Config Data_disp_lo = Output ' Data to Display DB0-DB7 Data_disp_hi Alias Portc : Config Data_disp_hi = Output ' Data to Display DB8-DB15 Cs_disp = 0 Res_disp = 1 'Reset Display :ACTIVE=LOW Wr_disp = 1 'WRITE active high Data_disp_lo = 0 Data_disp_hi = 0 button_up alias flag.1 ' вверх button_down alias flag.4 ' вниз button_Left alias flag.2 ' влево button_right alias flag.3 ' вправо button_paus alias flag.0 config PORTB.4 = OUTPUT : PORTB.4 = 0 config PORTB.5 = OUTPUT : PORTB.5 = 1 config PORTB.6 = OUTPUT : PORTB.6 = 1 config PORTB.7 = OUTPUT : PORTB.7 = 0 dim kdel as Byte : kdel = 4 dim osc(1024) as byte at &H0100 'массив считываний ацп dim osc_clear(500) as byte at &H0500 'массив очистки дисплея 'временные переменные dim x as word dim y as word dim z as word dim a as word dim b as word dim razv as byte : razv = 4 ' развертка dim pause as byte : pause = 0 ' пауза откл dim flag as byte : flag = 0 ' флаг нажатия кнопок dim menu as byte : menu = 0 ' 0=V/дел 1=развертка 2=AC/DC 3=синхронизация CONST MENU_MAX = 3 'МАХ количество пунктов меню DIM AC_DC AS BIT : AC_DC = 0 '0=DC,1=AC dim sinhr as word : sinhr = 128 dim Usinc as byte : Usinc = 128 dim Usinc_copy as byte dim sdvig as word DIM FREQ AS SINGLE dim text as String * 14 Config portd = INPUT Dim w As word '?????????? R ? ??????? ????? ?????????? ????????? ? ??? dim color as word sdvig = 0 '**************************************************************************************************************************** Call Hx8357c_init(0) 'Init display and choose Display orientation:0=Landscape/1=Portrait Call Hx8357c_clrscr(Black) Orient = 0 ' 0=Landscape ЗАСТАВКА Call Hx8357c_text( "oscilloscop_demo_01.bas" , 132 , 20 , 3 , Yellow , Black) '18 БУКВ*12= 216-480=-264/2= -132 WAITMS 500 Call Hx8357c_text( "OSCILLOSKOP V 1.01 " , 132 , 20 , 3 , Black , Black) 'GOSUB DELENIJA ' РИСУЕМ ЭКРАН GOSUB шкала_развертки color = Red GOSUB MENU_LCD color = Blue3 ' ЦВЕТ КУРСОРА СИНХРОНИЗАЦИИ gosub Usinc_lcd portb.7 = AC_DC portb.6 = kdel.0 portb.5 = kdel.1 portb.4 = kdel.2 'text = "kdel=" + STR(kdel) + " " ' Call Hx8357c_text(text , 352 , 280 , 3 , Blue3 , Black) Do gosub кнопки ' ОПРОС КНОПОК gosub сетка ' РИСУЕМ СЕТКУ gosub read_adc if razv = 0 then gosub zoom4 if razv = 1 then gosub zoom2 gosub синхронизация gosub график color = Blue ' цвет курсора gosub Usinc_lcd LOOP кнопки: flag = 255 portc = 255 config portc = INPUT flag = pinc config portc = outPUT IF button_right = 0 THEN INCR MENU IF MENU > MENU_MAX THEN MENU = 0 GOSUB MENU_LCD END IF IF button_Left = 0 THEN DECR MENU IF MENU > 200 THEN MENU = MENU_MAX GOSUB MENU_LCD END IF if button_up = 0 or button_down = 0 then 'если нажата вверх или вниз if menu = 0 then ' 0=V/дел если в меню =0 if button_up = 0 then kdel = kdel - 1 else kdel = kdel + 1 if kdel > 200 then kdel = 0 if kdel > 7 then kdel = 7 portb.6 = kdel.0 portb.5 = kdel.1 portb.4 = kdel.2 GOSUB MENU_LCD end if if menu = 1 then ' 1=развертка если в меню =1 if button_up = 0 then razv = razv + 1 else razv = razv - 1 if razv > 200 then razv = 0 if razv > 9 then razv = 9 gosub шкала_развертки GOSUB MENU_LCD end if if menu = 2 then ' 2=AC/DC если в меню =2 Usinc_copy toggle AC_DC portb.7 = AC_DC GOSUB MENU_LCD end if if menu = 3 then ' 3=синхронизация если в меню =2 color = Black gosub Usinc_lcd if button_up = 0 then Usinc = Usinc - 4 else Usinc = Usinc + 4 color = Blue3 'Red цвет курсора gosub Usinc_lcd GOSUB MENU_LCD end if end if return Usinc_lcd: Call Hx8357c_set_pixel(1 , Usinc + 12 , color) Call Hx8357c_set_pixel(1 , Usinc + 11 , color) Call Hx8357c_set_pixel(1 , Usinc + 10 , color) Call Hx8357c_set_pixel(1 , Usinc + 9 , color) Call Hx8357c_set_pixel(1 , Usinc + 8 , color) Call Hx8357c_set_pixel(2 , Usinc + 11 , color) Call Hx8357c_set_pixel(2 , Usinc + 10 , color) Call Hx8357c_set_pixel(2 , Usinc + 9 , color) Call Hx8357c_set_pixel(3 , Usinc + 10 , color) return сетка: ' рисуем горизонтальные линии,ацп 0-1 вольт,линии через 0,2 вольта color = Blue ' ЦВЕТ СЕТКИ ' for x = 00 to 479 step 20 ' for y = 10 to 266 step 20 '32 ' Call Hx8357c_set_pixel(x , y , color) ' next y ' next x ' рисуем вертикальные линии,через 10 мксек 'частота кварца 16 мгц,8 такта,опрос каждые 8/16 мксек,20 мксек/(8/16)= 40 деления for x = 00 to 479 step 40 for y = 10 to 265 step 20 Call Hx8357c_set_pixel(x , y , color) next y next x RETURN 'Рисуем режим меню MENU_LCD: 'Call Hx8357c_text( " " , 0 , 280 , 3 , Blue3 , Black) ' 0=V/дел 1=развертка 2=AC/DC 3=синхронизация 4=... X = 0 ' ПОЛОЖЕНИЕ КУРСОРА Y = X * 12 ' ТАК ПРОЩЕ ) ) ) color = Yellow 'Green1 'цвет выделения меню if kdel = 0 then text = "10 V" if kdel = 1 then text = "5 V " if kdel = 2 then text = "2 V " if kdel = 3 then text = "1 V " if kdel = 4 then text = "0.5V" if kdel = 5 then text = "0.2V" if kdel = 6 then text = "0.1V" if kdel = 7 then text = "50mV" if menu = 0 then Call Hx8357c_text(text , Y , 280 , 3 , Blue3 , color) ELSE Call Hx8357c_text(text , Y , 280 , 3 , Blue3 , Black) X = 5 : Y = X * 12 Call Hx8357c_text( " " , Y , 280 , 3 , Blue3 , Black) X = 6 : Y = X * 12 if razv = 0 then text = "2.5 us" if razv = 1 then text = "5.0 us" if razv = 2 then text = "10 us " if razv = 3 then text = "20 us " if razv = 4 then text = "50 us " if razv = 5 then text = "0.1 ms" if razv = 6 then text = "0.2 ms" ' 1такт=1/2, 250 мс=500 тактов/20=25-65536= 65516 if razv = 7 then text = "0.5 ms" if razv = 8 then text = "1 ms " if razv = 9 then text = "5 ms " if pause = 1 then text = "Pause " if menu = 1 then Call Hx8357c_text(text , Y , 280 , 3 , Blue3 , color) ELSE Call Hx8357c_text(text , Y , 280 , 3 , Blue3 , Black) X = 13 : Y = X * 12 Call Hx8357c_text( " " , Y , 280 , 3 , Blue3 , Black) X = 14 : Y = X * 12 '0=DC,1=AC IF AC_DC = 0 THEN text = "AC" IF AC_DC = 1 THEN text = "DC" if menu = 2 then Call Hx8357c_text(text , Y , 280 , 3 , Blue3 , color) ELSE Call Hx8357c_text(text , Y , 280 , 3 , Blue3 , Black) X = 17 : Y = X * 12 Call Hx8357c_text( " " , Y , 280 , 3 , Blue3 , Black) X = 19 : Y = X * 12 'sinhr if menu = 3 then Call Hx8357c_text( "SYNC" , y , 280 , 3 , Blue3 , color) ELSE Call Hx8357c_text( "SYNC" , y , 280 , 3 , Blue3 , Black) X = 23 : Y = X * 12 Call Hx8357c_text( " " , Y , 280 , 3 , Blue3 , Black) X = 0 : Y = 0 'СБРАСЫВАЕМ НА ВСЯК СЛУЧАЙ 'рисуем пределы синхронизации ' text = "SYNHR=" + STR(sinhr) + " " ' if sinhr => 550 then text = " NO SYNHR!!! " ' Call Hx8357c_text(text , 150 , 280 , 3 , Blue3 , Black) ' text = "Sdvig=" + STR(sdvig) + " " ' Call Hx8357c_text(text , 150 , 300 , 3 , Blue3 , Black) 'text = "kdel=" + STR(kdel) + " " 'Call Hx8357c_text(text , 352 , 280 , 3 , Blue3 , Black) Orient = 0 'Demo-loop starts with landscape mode return DELENIJA: Orient = 0 Call Hx8357c_text( "1.0 V" , 2 , 8 , 1 , Yellow , Black) Call Hx8357c_text( "0.75V" , 2 , 72 , 1 , Yellow , Black) Call Hx8357c_text( "0.5 V" , 2 , 136 , 1 , Yellow , Black) Call Hx8357c_text( "0.25V" , 2 , 200 , 1 , Yellow , Black) Call Hx8357c_text( "0.0 V" , 2 , 260 , 1 , Yellow , Black) RETURN шкала_развертки: ' " x....x....x....x....x....x....x....x....x....x....x ....x " if razv = 0 then Call Hx8357c_text( "0 2.5 5 7.5 10 12.5 15 17.5 20 22.5 25 27.5 " , 0 , 0 , 1 , Blue3 , Black) ' 46 , 0 , 1 , if razv = 1 then Call Hx8357c_text( "0 05 10 15 20 25 30 35 40 45 50 55 " , 0 , 0 , 1 , Blue3 , Black) if razv = 2 then Call Hx8357c_text( "0 10 20 30 40 50 60 70 80 90 100 110 " , 0 , 0 , 1 , Blue3 , Black) if razv = 3 then Call Hx8357c_text( "0 20 40 60 80 100 120 140 160 180 200 220 " , 0 , 0 , 1 , Blue3 , Black) if razv = 4 then Call Hx8357c_text( "0 50 100 150 200 250 300 350 400 450 500 550 " , 0 , 0 , 1 , Blue3 , Black) if razv = 5 then Call Hx8357c_text( "0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 " , 0 , 0 , 1 , Blue3 , Black) if razv = 6 then Call Hx8357c_text( "0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 " , 0 , 0 , 1 , Blue3 , Black) if razv = 7 then Call Hx8357c_text( "0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 " , 0 , 0 , 1 , Blue3 , Black) if razv = 8 then Call Hx8357c_text( "0 1 2 3 4 5 6 7 8 9 10 11 " , 0 , 0 , 1 , Blue3 , Black) if razv = 9 then Call Hx8357c_text( "0 5 10 15 20 25 30 35 40 45 50 55 " , 0 , 0 , 1 , Blue3 , Black) 'if razv = 0 then Call Hx8357c_text( "0 10 20 30 40 50 60 70 80 90 100 " , 46 , 0 , 1 , Blue3 , Black) return zoom2: for x = 1024 to 1 step -1 y = x / 2 osc(x) = osc(y) next x return zoom4: for x = 1024 to 1 step -1 y = x / 4 osc(x) = osc(y) next x return синхронизация: 'gosub read4 y = 0 z = 0 for x = 3 to 512 'if osc(x) => 128 then z = 1 if osc(x) < Usinc and z = 0 then y = 1 if osc(x) => Usinc and y = 1 then z = 1 sinhr = x - 2 goto label1 end if next x sinhr = 512 '+ sdvig label1: return график: 'стираем стаый график for x = 1 to 480 w = x - 1 ' + 50 'Call Hx8357c_line(w , osc_clear(x) + 10 , w + 1 , osc_clear(x + 1) + 10 , Black) if osc_clear(x) < osc_clear(x + 1) then for y = osc_clear(x) to osc_clear(x + 1) Call Hx8357c_set_pixel(w , y + 10 , Black) next y else for y = osc_clear(x + 1) to osc_clear(x ) Call Hx8357c_set_pixel(w , y + 10 , Black) next y end if 'рисуем новый гафик 'Call Hx8357c_line(w , osc(x) + 10 , w + 1 , osc(x + 1) + 10 , red) a = x + sinhr 'a = a + sdvig if osc(a ) < osc(a + 1 ) then for y = osc(a) to osc(a + 1) if a < 1025 then Call Hx8357c_set_pixel(w , y + 10 , red) next y else for y = osc(a + 1) to osc(a ) if a < 1025 then Call Hx8357c_set_pixel(w , y + 10 , red) next y end if next x for x = 1 to 480 'заполняем буфер для последующего стирания a = x + sinhr a = a + sdvig osc_clear(x) = osc(a) next x return $include "Font8x8.font" $include "Font12x16.font" $include "ADCREAD_asm_01.inc"