Lƣu đồ thuật toán:

Một phần của tài liệu Giám sát, điều khiển thiết bị điện qua cổng Parrallel dùng Wireless (Trang 36)

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

Giải thích:

- Khởi tạo hệ thống: sẽ khởi tạo các module cần thiêt, bao gồm:

o Khởi tạo LCD

o Khởi tạo I2C

o Khởi tạo SPI.

o Khởi tạo module Wireless

o Set chế độ nhận cho Wireless

o Đọc giá trị cài đặt hẹn giờ từ Flash

- Việc kiểm tra dữ liệu từ Wireless được thực hiện bằng cách đọc giá trị trong thanh ghi trạng thái của Wireless Module. (REG_RX_INT_STAT)

- Đọc DS1307 và hiển thị LCD dùng ham API của module I2Cm và LCD, các hàm API này do PSOC Designer cung cấp.

Begin Khởi tạo hệ thống Có data từ wireless Thực hiện lênh từ máy tính Đọc DS1307, hiển thị thời gian

Có hẹn giờ Có phím nhấn Điều khiển thiết bị Thực hiện chương trình cài đặt Y N Y Y N N

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

- Sau đó giá trị thời gian hiện thời được so sánh với giá trị hẹn giờ cài đặt, nếu đúng giờ hẹn, các thiết bị được hẹn giờ sẽ được bật hay tắt tùy theo cài đặt. - Kiểm tra phím: nếu có phím nhấn, chương trình sẽ thực hiện phần cài đặt trực

tiếp tại mạch, chương trình cài đặt bao gồm: chương trình điều chỉnh giờ, chương trình, hiển thị menu để điều khiển thiết bị và thông tin về thiết bị.

3.3.2 Chƣơng trình cài đặt giờ:

Giải thích:

- Chương trình sẽ kiểm tra phím nhấn, khi nhấn phím SET (key == 4) thì con trỏ hiển thị sẽ lần lượt dịch chuyển tới số cần điều chỉnh (ngày, tháng, năm, giờ phút, giây) Y Y N N Y N Y N Giảm giá trị mục hiện thời (muc i) Begin Đọc DS1307, hiển thị ,i=6 Key == 4 (phím SET) Chờ phím nhấn Chuyển vị trí con trỏ, i-- Key = =2 (phím tăng) Key == 3 (Phím giảm) Tăng giá trị mục hiện thời (mục i) i==FFH (-1) End

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

- Hàm tăng và giảm mục hiện thời (mục i)( ngày, tháng, năm,…) sẽ căn cứ vào giá trị của i để tăng hoặc giảm thích hợp. hàm: inc_field(i),dec_field(i) sẽ tăng hoặc giảm mục I 1 đơn vị, hàm này cúng có so sánh tùy theo giá trị hiện thời đang là giờ phút giây… sẽ cho phép giá trị tăng (giảm) trong phạm vi cho phép (ví dụ: 0<phút< 60…), và hiệu chỉnh số BCD (dữ liệu đọc từ DS1307 ở dạng BCD).

3.3.3 Chƣơng trình hiển thị menu:

Hàm hiển thị menu (void hien_thi_menu(const char* const menu[],BYTE n,BYTE menu_thiet_bi)) sẽ hiển thị menu, khi người sử dụng phím 2, hoặc 3 sẽ chuyển mục con (menu con) Mode se lưu giá trị vị trí mục được chọn

Y N Y Begin Chờ phím nhấn i = 0 Key = =2 (phím tăng) Hiển thị mục i i++ i<n Hiển thị mục 0 N Y N Key = =3 (phím giảm) Hiển thị mục i i-- i>0 Hiển thị mục n N Y Begin Mode = i

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

3.3.4. Chƣơng trình hiển thị và cài đặt trên PSOC:

hien_thi_menu(men uchinh,5,0); Begin Xoa_cai_dat(); hien_thi_menu(men uthongtin,10,0); hien_thi_menu(men ucaidat,5,0); hien_thi_menu(menut hietbi,6,thiet_bi); cai_dat_thiet_bi(thi et_bi,mode); Key==1 N Y Mode==4 N Y mode==2 N Y Mode==3 N Y

Mode_kt=1 (hen gio daily) Key==1 N Y Key==1 N Y End

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

3.3.5. Chƣơng trình xử lý dữ liệu từ máy tính:

Đọc 1 byte từ wireless->bWUSB Begin bWUSB == lệnh mở tbi N Y bWUSB == lệnh tắt tbi N Y Bật thiêt bị Tăt thiết bị bWUSB == cài đặt hẹn giờ N Y bWUSB ==yêu cầu gửi dữ liệu N Y bWUSB == cập nhật time N Y Đọc 25 byte từ MT, lưu vào FLASH (adsbygoogle = window.adsbygoogle || []).push({});

Gửi data

Đọc 6 byte time data, ghi vào DS1307

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

Phần 4: CHƢƠNG TRÌNH GIAO TIẾP CỔNG SONG SONG TRÊN MÁY TÍNH

4.1 Giới thiệu chƣơng trình giao tiếp máy tính với module wireless.

Chương trình được viết bằng ngôn ngữ Visual Basic (VB) trong bộ công cụ Visual Studio.NET phiên bản 2005 của Microsoft s ử dụng thư viện động (file DLL) thực hiện truy cập trực tiếp cổng song song. Chương trình thực hiện nhiệm vụ truyền dữ liệu từ máy tính tới module wireless thông qua cổng song song.

Giao diện của chương trình:

Các module xử lí của chƣơng trình:

Để xuất dữ liệu và từ điều khiển ra cổng song song, ta xuất trực tiếp ra địa chỉ của các thanh ghi của cổng song song. Ở đây ta sử dụng cổng song song LPT1, hoặc LPT2.

Đƣa file thƣ viện liên kết động vào chƣơng trình.

Cách thêm thư viện liên kết động vào chương trình được thực hiện theo phần hướng dẫn MSDN của Visual Studio .NET 2005.

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

Đoạn chương trình đưa file liên kết động vào: PublicClass Form1

'Gửi dữ liệu ra port

PublicDeclareFunction Inp Lib"inpout32.dll" _

Alias"Inp32" (ByVal PortAddress AsInteger) AsInteger

'Nhận dữ liệu từ port

PublicDeclareSub Out Lib"inpout32.dll" _

Alias"Out32" (ByVal PortAddress AsInteger, ByVal Value AsInteger)

4.2 Các module chính của chƣơng trình: 4.2.1 Hàm set và clear 1 bit: 4.2.1 Hàm set và clear 1 bit:

Hàm set và clear 1 bit của thanh ghi có địa chỉ „port‟

Hàm này được xây dựng để thuận tiện trong quá trình truyền dữ liệu nối tiếp (SPI), và set hoặc clear các chân (output) của cổng song song 1 cách riêng lẻ.

'set 1 bit của thanh ghi ‘port’

PrivateSub setbit(ByVal port AsInteger, ByVal bit AsInteger) Dim data1 AsInteger

data1 = Inp(port)

data1 = data1 Or (2 ^ bit) Out(port, data1)

EndSub

'clear 1 bit của thanh ghi ‘port’

PrivateSub ClrBit(ByVal port AsInteger, ByVal bit AsInteger) Dim data1 AsInteger (adsbygoogle = window.adsbygoogle || []).push({});

data1 = Inp(port)

data1 = data1 And (Not (2 ^ bit)) Out(port, data1)

EndSub

4.2.2 Hàm đọc trạng thái của 1 bit: ở đây, hàm được thiết kế để đọc giá trị từ chân BS của cổng song song, do đó tín hiệu vào cần phải đảo bit BS của cổng song song, do đó tín hiệu vào cần phải đảo bit

PrivateFunction readbit(ByVal port AsInteger, ByVal bit AsInteger) As Boolean

Dim data1 AsInteger data1 = Inp(port)

If (data1 And (2 ^ bit)) Then ReturnFalse

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

Else

ReturnTrue EndIf

EndFunction

4.2.3 Hàm gửi 1 byte lên bus SPI: Hàm này có nhiệm vụ dịch 8 bit ra chân MOSI (chân data out của bus SPI) . (chân data out của bus SPI) .

PrivateSub SendByteSPI(ByVal dat AsInteger) Dim i AsInteger

ClrBit(data, SCK)

setbit(data, D5) 'cho LED báo hiệu sáng

For i = 0 To 7

If (dat And (2 ^ (7 - i))) Then 'gửi MSB trƣớc

setbit(data, MO) Else ClrBit(data, MO) End If setbit(data, SCK) ClrBit(data, SCK) ClrBit(data, D5) Next EndSub

4.2.4 Hàm nhận đọc 1 byte trên bus SPI:

PrivateFunction readbyteSPI() AsInteger Dim i, dat AsInteger

dat = 0

ClrBit(data, SCK)

setbit(data, D5) 'cho LED báo hiệu sáng

For i = 0 To 7 setbit(data, SCK)

If readbit(Status, DI) Then

dat = dat Xor (2 ^ (7 - i)) 'đọc MSB trƣớc

End If

ClrBit(data, SCK) Next

Return dat EndFunction

4.2.5 Hàm ghi đata vào 1 thanh ghi của module wireless: (adsbygoogle = window.adsbygoogle || []).push({});

Để ghi tới 1 thanh ghi của module wireless, trước tiên ta phải chọn chân nSS, cho nSS xuống mức logic 0. Đối với quá trình ghi, bit MSB của địa chỉ cần ghi tới phải được set lên 1. Trước tiên ta gửi lên bus SPI địa chỉ cần ghi, sau đó, gửi giá trị cần ghi.

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

PrivateSub Write_WUSB_REG(ByVal reg AsInteger, ByVal value As Integer)

ClrBit(data, nSS) 'chan nSS=0

SendByteSPI(&H80 Or reg) 'set bit MSB->quá trình ghi

SendByteSPI(value) setbit(data, nSS) ClrBit(data, SCK) ClrBit(data, MO) EndSub

4.2.6 Hàm đọc data từ 1 thanh ghi của module wireless: tương tự như quá trình ghi, nhưng ở đây, bit MSB của địa chỉ cần đọc để ở mức 0. ghi, nhưng ở đây, bit MSB của địa chỉ cần đọc để ở mức 0.

PrivateFunction Read_WUSB_REG(ByVal reg AsInteger) AsInteger Dim value AsInteger

ClrBit(data, SCK) ClrBit(data, nSS) SendByteSPI(reg) value = readbyteSPI() setbit(data, nSS) ClrBit(data, SCK) Return value EndFunction

4.2.7 Hàm khởi động module wireless:

Để khởi tạo module wireless, trước tiên la phải set bit nPD (bit power down) lên 1 để module này hoạt động. Quá trình khởi động của module này có thời gian để bộ dao động của nó ổn định, trong thời gian này không nên ghi dữ liệu tới nó. Do đó ta cần trì hoãn 1 thời gian dùng hàm System.Threading.Thread.Sleep(1). Sau khi khởi động ta cần Reset module, set bit nSS (không chọn truyền SPI, chỉ mỗi khi cần truyền dữ liệu ta mới clear bit này). Tiếp theo ghi giá trị 41H đến 2 thanh ghi REG_CLOCK_MANUAL và REG_CLOCK_ENABLE để module được hoạt động đúng, và ghi 07H tới thanh ghi REG_SERDES_CTL để chọn số bit cần đẻ kêt thúc 1 chuỗi bit.(ở đây chọn 7 bit)

PrivateSub WUSB_Init() setbit(data, nPD) System.Threading.Thread.Sleep(1) ClrBit(data, nRESET) System.Threading.Thread.Sleep(1) setbit(data, nRESET) setbit(data, nSS) System.Threading.Thread.Sleep(1)

Write_WUSB_REG(&H33, &H41) 'REG_CLOCK_MANUAL = 0x33

Write_WUSB_REG(&H32, &H41) 'REG_CLOCK_ENABLE 0x32

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

EndSub

4.2.8 Hàm chọn chế độ truyền cho module 6935: Module wireless có thể hoạt động ở chế độ truyền hoặc chế độ nhận tùy thuộc vào bit điều khiển tương ứng trong ở chế độ truyền hoặc chế độ nhận tùy thuộc vào bit điều khiển tương ứng trong thanh ghi REG_CONTROL

PrivateSub Set_Transmit_Mode() 'Set transmit mode

Write_WUSB_REG(&H3, &H40) 'REG_CONTROL 0x03; (chọn chế độ truyền, và bộ khuêch đại bên trong chip)

Write_WUSB_REG(&H6, &HF) 'Set he so khuech dai cong suat lon nhat

Write_WUSB_REG(&H23, &H7) 'REG_PA 0x23;mPA_BIAS 0x07

'set so bit valid trong thanh ghi REG_SERDES, bit =1->valid, bit = 0 invalid

Write_WUSB_REG(&H10, &HFF) 'REG_VALID_TX 0x10

EndSub

4.2.9 Phát 1 byte dùng module wireless:

Để phát 1 byte, trước hết ta phải set module ở chế độ truyền. sau đó ghi dữ liệu cần phát đến thanh ghi: REG_TX_DATA ở địa chỉ 0x0F. Sau khi ghi dữ liệu đến thanh ghi nay, ta có thể kiểm tra việc dữ liệu đã truyền xong hay chưa thông qua việc đọc thanh ghi REG_TX_INT_STAT (0x0E), kiểm tra bit 0 (bit Empty).

Vd: truyền byte 0xFE:

Write_WUSB_REG(&HF, &HFE);

4.2.10 Nhận 1 byte:

Để nhận 1 byte, trước hết ta phải set module ở chế độ nhận, sau đó kiểm tra thanh ghi trạng thái nhận REG_RX_INT_STAT (0x08), nếu bit 0 (bit Full A, set lên 1 khi dữ liệu đã nhận đủ) được set lên 1 thì ta đọc giá trị nhận được trong thanh ghi REG_RX_DATA_A (0x09). (Giá trị nhận được lưu trong 2 kênh A và B, ở đây ta đọc giá trị ở kênh A) (adsbygoogle = window.adsbygoogle || []).push({});

Vd:

If (Read_WUSB_REG(&H8) And 1) Then receive(0) = Read_WUSB_REG(&H9)

4.2.11 Sự kiện cho nút ‘Bắt đâu’:

Khởi động module Wireless Chọn chế độ truyền

4.2.12 Sự kiện cho nút ‘Cài đặt’:

Gửi lệnh FFH: lệnh để báo hiệu cho VDK biết đó là gửi chuỗi dữ liệu hẹn giờ.

Gửi byte cấu hình đầu tiên (byte để nhận biết thiết bị nào được hẹn giờ, và ở chế độ nào)

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

- Bit 0,2,4,6: Bit nào được set lên 1 -> thiết bị tương ứng (1,2,3,4) được hẹn giờ. Dữ liệu cho các bit này được lấy từ các checkbox thiết bị.

- Bit 1,3,5,7: Bit set lên 1 tương ứng với hẹn giờ on cho thiết bị. các bit này được set hay clear dựa vào Listbox mode.

Gửi 24 byte hẹn giờ cho 4 thiết bị (mỗi thiết bị 6 byte). Dữ liệu này được chọn từ các Listbox ở mục „Giờ‟, „Phút‟, „Giây‟, „Ngày‟. Vì dữ liệu ghi tới DS1307 ở board mạch VDK ở dạng BCD, dữ liệu hẹn giờ được so sánh ở dạng số BCD nên trước khi truyền dữ liệu, chúng phải được chuyển đổi sang BCD. Sử dụng hàm:

PrivateFunction ConverttoBCD(ByVal deci AsInteger) AsInteger Return ((deci \ 10) * 16 + (deci Mod 10))

EndFunction

4.2.13 Sự kiện cho nút ‘Cập nhật thời gian’:

Gửi byte lệnh F5H tới VDK để báo hiệu dữ liệu tiếp theo được gửi là dữ liệu thời gian hệ thống.

Lấy giờ của hệ thống, chuyển đổi qua BCD sau đó gửi 6 byte thời gian hệ thống xuống VDK.

4.2.14 Sự kiện cho nút ‘Nhận dữ liệu’:

Gửi byte lệnh F6H, lệnh yêu cầu VDK gửi dữ liệu lên máy tính. Chuyển module wireless sang chế độ nhận,

Chờ đọc đủ 25 byte được gửi từ VDK

Nếu sau thời gian là 3s mà không có dữ liệu hoặc dữ liệu không đủ thì tự động kết thúc việc đọc module wireless. Việc định giờ này được thiết lập nhờ Timer1.

Chuyển module wireless sang chế độ truyền trở lại.

4.2.15 Sự kiện cho timer2.

Sau 1s thì sự kiện Timer2_Tick được gọi để yêu cầu truyền dữ liệu cập nhật trạng thái của thiết bị.

Quá trình này giống như sự kiện cho nút „nhận dữ liệu‟, điểm khác là byte lệnh đầu tiên là F4H, và chỉ yêu cầu truyền 1byte từ VDK.

Do timer2_tick tự động được gọi sau mỗi 1s do đó tất cả các hàm truyền dữ liệu từ PC trước hết phải disable timer2 để tránh xung đột.

4.2.16 Sự kiện cho các nút điều khiển trực tiếp thiết bị:

Điều khiển bật thiết bị 1,2,3,4: lần lượt là các byte FEH, FDH, FCH, FBH.

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

Phần 5: PHỤ LỤC 5.1 Chƣơng trình diều khiển ở VDK

#include <m8c.h> #include "PSoCAPI.h" #include "function.h" #include <flashBlock.h> #include "PSoCGPIOINT.h" const unsigned char (adsbygoogle = window.adsbygoogle || []).push({});

months[]={0x31,0x28,0x31,0x30,0x31,0x30,0x31,0x31,0x30,0x3 1,0x30,0x31};

const char* const menuchinh[]={"Menu chinh","1.Cai

Dat","2.Xoa cai dat","3.Hen gio daily","4.Thong tin N1"}; const char* const menuthongtin[]={"Thong tin nhom

1","1.N.Ngoc Nhan","2.D.Van Khanh","3.L.Van Sanh","4.D.H.Cam Le","5.N.T.H.Oanh","6.N.Trong

Tri","7.N.Viet Trung","8.N.Duc Khoa","9.S.Thongsoul"}; const char* const menucaidat[]={"Cai Dat Thiet

Bi","1.Thiet bi 1","2.Thiet bi 2","3.Thiet bi 3","4.Thiet bi 4"};

const char* const menuthietbi[]={"Thiet bi ","1.Dat gio On","2.Dat gio Off","3.On","4.Off","5.Trang Thai"}; unsigned char mode,j,i,thiet_bi,mode_kt,bWUSB;

unsigned char flashBuf[25];

unsigned char time[8],i2cBuf[9],key_flag,key,field,day; unsigned char addr=0;

void display_time() {

I2Cm_bWriteBytes(0x68,&addr,1,I2Cm_NoStop);

//gui byte dia chi dau tien cua vung RAM can doc

I2Cm_fReadBytes(0x68,time,7,I2Cm_RepStart);

//DOc 7 byte lien tiep

display(); } void display() { LCD_1_Position(1,9); LCD_1_PrCString(":");

//di chuyen con tro LCD den hang 1,cot 9,in ki tu ":"

LCD_1_Position(1,12);LCD_1_PrCString(":"); LCD_1_Position(0,9); LCD_1_PrCString("/");

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng LCD_1_Position(0,12);LCD_1_PrCString("/"); LCD_1_Position(1,13);LCD_1_PrHexByte(time[0]); LCD_1_Position(1,10);LCD_1_PrHexByte(time[1]); LCD_1_Position(1,7);LCD_1_PrHexByte(time[2]); LCD_1_Position(0,7); LCD_1_PrHexByte(time[4]); LCD_1_Position(0,10);LCD_1_PrHexByte(time[5]); LCD_1_Position(0,13);LCD_1_PrHexByte(time[6]); } void delay(){ unsigned char k; for(k=0;k<100;k++); } char get_key() { check_key(); if(key_flag==1) { for(i=0;i<100;i++) { check_key(); if(key_flag==1) i=0; } return 1; } return 0; } void check_key(){ key_flag=1; if(!(PRT0DR&0x80))key=1;

else if(!(PRT0DR&0x20)) key=2; else if(!(PRT0DR&0x08)) key=3; else if(!(PRT0DR&0x02)) key=4; else key_flag=0;

}

//ham gui 1 byte du lieu toi dia chi add cua DS1307 //2 ham nay ko dung trong chuong trinh, chi de test

void send_data(BYTE add,BYTE data){ I2Cm_fSendStart(0x68,I2Cm_WRITE); I2Cm_fWrite(add);

I2Cm_fWrite(data); I2Cm_SendStop();

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng

}

BYTE read_data(BYTE add){ BYTE data; I2Cm_fSendStart(0x68,I2Cm_WRITE); I2Cm_fWrite(add); I2Cm_fSendRepeatStart(0x68,I2Cm_READ); data=I2Cm_bRead(I2Cm_NAKslave); I2Cm_SendStop(); return data; } ////////////////////////////////////////////////////////// //

///Ham hien thi menu:

///n: so muc chon lua cua menu,

//menu_thiet_bi:bien dung de xac dinh neu la menu thiet bi /////thi them chi so chi thiet bi thu menu_thiet_bi vao dong hien thi

void hien_thi_menu(const char* const menu[],BYTE n,BYTE menu_thiet_bi){ (adsbygoogle = window.adsbygoogle || []).push({});

j=1;

//j: bien dung de xac dinh muc can hien thi LCD_1_Control(LCD_1_DISP_CLEAR_HOME);

LCD_1_Position(0,0);

LCD_1_PrCString(menu[0]);//muc chinh cua menu if(menu_thiet_bi){

LCD_1_Position(0,9);

LCD_1_PrHexByte(menu_thiet_bi); }

LCD_1_Position(1,1);

LCD_1_PrCString(menu[1]);//muc 1 cua menu while(!get_key()); while(key==2||key==3){ if(key==2){ j++; if(j==n) j=1; LCD_1_Control(LCD_1_DISP_CLEAR_HOME); LCD_1_PrCString(menu[0]); LCD_1_Position(1,1); LCD_1_PrCString(menu[j]); if(menu_thiet_bi){ LCD_1_Position(0,9); LCD_1_PrHexByte(menu_thiet_bi);

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng } } else { j--; if(j==0) j=n-1; LCD_1_Control(LCD_1_DISP_CLEAR_HOME); LCD_1_PrCString(menu[0]); LCD_1_Position(1,1); LCD_1_PrCString(menu[j]); if(menu_thiet_bi){ LCD_1_Position(0,9); LCD_1_PrHexByte(menu_thiet_bi); } } while(!get_key()); } mode=j;

///bien mode de biet duoc ta da chon muc nao

}

void set_date(){

field=5;//bien de xac dinh dang o vi tri

gio,phut,giay,ngay,thang,nam

//field=5 -> giay,4->phut,...

LCD_1_Control(LCD_1_DISP_CLEAR_HOME);

I2Cm_bWriteBytes(0x68,&addr,1,I2Cm_NoStop);

//ham I2Cm_bWriteBytes: 0x68:dia chi cua DS1307 (device address),

//addr=0:write dia chi o nho dau tien trong DS1307

I2Cm_fReadBytes(0x68,time,7,I2Cm_RepStart);

//Doc lien tiep 7 byte cua DS1307

LCD_1_Control(LCD_1_DISP_CLEAR_HOME); display() ; LCD_1_Position(1,14); LCD_1_Control(LCD_1_CURSOR_BLINK); do{ while(!get_key());

//dung phim thu 4,(phim SET) de thay doi field

if(key==4&&field>=0) change_field(); else if(key==2) inc_field();

else if(key==3) dec_field(); time[7]=0x10;

Nhóm 01 – Lớp 04ĐT2 – Khoa ĐTVT – ĐHBK Đà Nẵng ///byte dieu khien DS1307-> 0x10->tao xung ra tso 1Hz

if(field==0xff){//neu nhan qua het cac field-

>field=-1->thoat LCD_1_Control(LCD_1_CURSOR_OFF); break; } } while(1); } void change_field(){ field--; if(field!=0xff){ LCD_1_Position(field/3,8+3*(field%3));

//field/3 = 0:hien thi dong 0,=1 hien thi dong 1 //8+3*(field%3)) :vi tri cua

gio,phut,giay,ngay,thang,nam LCD_1_Control(LCD_1_CURSOR_BLINK); } } void inc_field(){ ///ham inc_field(): (adsbygoogle = window.adsbygoogle || []).push({});

// tang gia tri cua field(gio,phut,giay,ngay,thang,nam) hien thoi

//tuy vao ta dang o field nao ma ham se xu ly de tang dung gia tri

//(vi du:ko the tang giay>=60.hoac <0)

switch (field) {

case 5: time[0]++;//tang giay if((time[0]%16)>9)

Một phần của tài liệu Giám sát, điều khiển thiết bị điện qua cổng Parrallel dùng Wireless (Trang 36)