Chuyện Tình Đơn Phương




Từng ngày qua tui yêu em nhưng người có hay,
Người con gái trong tim tôi luôn thầm mong ước,
Nàng đẹp xinh như cánh hoa hồng đang hé nỡ,
Để lòng tôi bao luyến thương đêm ngày mong nhớ,

Rồi một hôm theo xe hoa em về xứ xa,
Để lại đây con tim tôi đang dần khô héo,
Chuyện tình tôi yêu đơn phương dài theo tháng ngày,
Để rồi đây tôi mất em ngận ngùi xót xa,

Ngồi mong nhớ bóng giáng em đã lìa xa,
Trách ngày xưa tại sao ta quá dại khờ,
Một tiếng yêu mà sao lặng căm trong lòng,
Để em nào đau nào đau hay biết,

Và ta cứ ngu ngơ ôm mối tình căm,
Nhưng đến nay em đã cất bước theo chồng,
Về phía phương trời xa nàng đã vui bên người,
Thấu chăng lòng anh gời đây âu sầu người tình ơi.

Thủ thuật SEO cho Website mới nhất năm 2011

Nếu nói về những thủ thuật SEO cho một website mới chắc nhiều bạn đã ngao ngán với vô số các bài đọc về việc làm sao để được index nhanh, làm sao để nhanh qua sandbox của Google ... Nhưng để hình dung một cách cụ thể những công việc cần phải làm cho một website mới hoàn toàn thì hầu như chưa mấy ai nói cụ thể về vấn đề này.
Hôm nay nhân đang lúc đang có tâm sự trong lòng, lại bị lên cơn lười chán làm việc cheeky, mình muốn viết một bài chia sẽ những kinh nghiệm mà bản thân mình thường áp dụng cho việc phát triển website mới. Hy vọng rằng bài viết sẽ hữu ích với những webmaster mới còn ít kinh nghiệm.

1. Bước đầu tiền cho 1 website:

Khi mới hoàn thiện 1 website và chuẩn bị release phiên bản đầu tiên, phần lớn các bạn thường nghĩ đến việc làm sao để có nhiều thật nhiều backlink một cách nhanh nhất, làm sao để Google index cho nó nhanh ... Nhưng theo mình thì việc đầu tiên các bạn cần làm là quên ngay những suy nghĩ ở bên trên đi và tập trung vào hoàn thiện website hiện tại trước.
"Hoàn Thiện" xin đưa vào ngoặc kép và in đậm, mục đích là để các bạn chú ý vào đấy. Hoàn thiện ở đây gồm những công việc sau:
  • Kiễm tra các bugs lặt vặt như các lỗi font, nhảy trình duyệt, png ....
  • Tối ưu hóa tốc độ load website: bật cache, nén Css, tắt script ko cần thiết ...
  • Kiếm tra thật kĩ lại css để chánh các hidden text và các hidden link lỡ tay đặt vào website
  • Làm một cái sitemap "chuẩn": chuẩn là đây là đúng chuẩn rss 2, cấu hình ưu tiên url cụ thể ...
  • Verify với Google, Yahoo nếu là website chơi Google Adsense thì cho thêm thằng Bing. Đừng nghĩ chỉ có 1 mình Google đem về traffic nhé, trang tiếng anh của mình traffic chính là từ Yahoo & bing đấy.
  • Tạo tài khoản Google Analytics: cái này chắc ai cũng biết để làm gì.
Đấy trên là sơ sơ những vấn đề bắt buộc phải làm để hoàn thiện một website non.

2. Bước tiếp theo viết một vài bài cho ra hồn.

Khổ nhất với những website non là ở chỗ này, vì sau này già rồi thì có đi copy tí chút cũng chẳng sao cả. Nhưng mà còn non mà đã hóng hớt đi copy là bị bắt chết ngay.
Việc copy các nội dung từ website khác cho một website mới, tuy nói nghe nhẹ nhàng đơn giãn nhưng hậu quả nó để lại là rất nặng nề và gây nhiều "biến chứng" về sau.
Các search engine là những cái máy, những nó chẳng ngu đâu, nó khôn phết đấy. Bộ lọc nội dung của nó đủ khôn để biết được nội dung nào là mới và nội dung nào là các bố đi copy về. Nhưng website có nội dung copy thì được đưa vào dạng duplicate content, ở đây ko phải là nội dung trùng lặp trên cùng 1 website mà là website non này có nội dung trùng lặp với một website khác nhiều tuổi hơn. Với số lượng website lên đến hàng tỷ thì phần thắng thuộc vê ai thì ai cũng biết rồi, nói nữa thêm mõi mồm.
Đây là mới kể đến các search engine, còn người dùng mới ác. Nội dung bạn copy trang khác, tức là website bạn chẳng có gì đặc biết để kiến người dùng phải nhung nhớ mà quay lại hằng ngày. Người dùng Vietnam còn dễ tính, chứ người dùng nước ngoài thì nó liệt website của bạn vào danh sách những trang không cần vào cũng biết nội dung trong đấy là gì.
Nói chung chung các tác hại của nó là như thế, các bạn cần phải biết web non thì mình phải đầu tư. Chứ cứ ăn trực của thằng khác mãi thì ko ổn.

3. Bước tiếp theo là xây dựng các kênh vệ tinh.

Kênh vệ tinh ở đây là các sub-page trên các mạng xã hội điển hình: Facebook, Twitter là cần phải có, còn lại Linked, Sina, Sing, Quora ... thì tùy vào điều kiện "thổ nhưỡng" cũng như lượng người xem mà bạn tập trung vào.
Việc xây dựng sub-page hay fanpage thì đơn gian rồi ko cần phải nói, nhưng để xây dựng sao cho pro thì để có thêm tí tuổi rồi hẳng tính. Mình sẽ có vài bài nói về nó sau.
Vậy mục đích của việc này là gì và tại sao nó cần phải có. Rằng thì là nó như thế này, với xu thể hiện tại các directory đã chết nên việc website của bạn đạt độ tin tưởng cao hay thấp là phụ thuộc phần nhiều vào độ viral của website trên các mạng xã hội thông dụng. Đây là chân lý 2010-2011 đấy, ko phải mình bịa ra đâu.

4. Bước cuối cùng:

Cái này hơi cay đắng những cần phải nói cho nó ra vấn đề.
Bước này tốn tầm 1 tháng hoặc hơn tùy vào sức khỏe mỗi bạn. Công việc chính của nó là bạn quên cái công việc SEO đi và tập trung sàn lọc trên mạng những nguồn nội dung phù hợp với website của bạn, sau đó biên tập và đăng lên website thật đều đặn. Đều như vắt chanh ý, một tuần ít nhất 3 bài, bạn nào khỏe thì 5-10 bài, khỏe hơn thì ngày 3 bài cũng okay. Nhưng mà đừng có khỏe quá 5-10 bài/ngày là ko được đâu. Nguồn tài nguyên Google dành cho việc index nội dung trên website của bạn là ko đủ để nuôi số ấy.
Còn nếu bạn nào thuộc hàng siêu khỏe, thì tự biên tập tự viết lấy. Nội dung loại này thì đảm bảo 100% sẽ được index.
Trên là cụ thể 4 bước căn bản cần bắt buộc phải làm cho một website mới, nếu bạn có ý định thực sự đầu tư vào website của mình. Các bạn nên nhớ nếu bắt đầu tốt thì mọi việc sẽ trở nên thuận lợi hơn rất nhiều trong tương lai, hy vọng với bài viết này sẽ giup các bạn bắt đầu thật tốt.

Hướng dẫn làm led cube 5x5x5 with 89s52 !!

Highslide JS

I, Cần nói qua một chút về led cube 5x5x5 cấu tạo và nguyên tắc hoạt động của mạch :

LED CUBE  được tạo thành từ 125 bóng LED, xếp thành 5 lớp, mỗi lớp 25 bóng. Điều đặt biệt là ta không dùng 125 mối nối để thắp sáng từng bóng mà thay vào đó, ta mắc chung các chân anode của 25 bóng trên 1 lớp lại với nhau và mắc chung 5 chân cathode để tạo thành cột (có 25 cột).   

Để cho 1 led bất kỳ bật sáng, đầu tiên ta nối chân anode chung của lớp với điểm có điện thế cao, khi đó 25 bóng led sẽ  có chân anode được gắn với điểm điện thế cao, việc còn lại là nối điểm điện thế thấp cho chân cathode của bóng led nào cần thắp sáng.   

Việc cấp điện thế cao cho các lớp được thực hiện bởi 5 transistor PNP. 5 Transistor này được điều khiển bởi 5 chân IO của vi điều khiển và được phân cực ở vùng bão hòa và vùng ngưng tương ứng với mức logic 0 và 1 (ngược mức logic với chân IO của vi điều khiển) Việc cấp điện thế thấp cho các cột được thực hiện bởi 25 chân IO của vi điều khiển, do không có transistor để nhận dòng nên khi khi tính toán điện trở hạn dòng cho led phải lưu ý đến khả năng nhận dòng của chân IO vi điều khiển (thông số IOL khoảng 200mA là tối đa). Ở thời điểm nào đó, mỗi chân này phải nhận dòng từ 5 bóng led của 1 cột. Sơ đồ nguyên lý điều khiển sau đây:

Highslide JS

Highslide JS

II, Các bước thực hiện

1, Chọn led :
Tùy vào mỗi người mà chọn màu sắc led khác nhau , nhưng cần phải chú ý điện áp của từng led khác nhau mà tính toán giá trị của điện trở .Led thường được chọn là led vỏ đục đảm bảo độ phát sáng ra xung quanh tốt nhất.

Highslide JS

2, Tạo khung led:
Tham khảo cách làm của các trang web nước ngoài thấy phương pháp được sử dụng nhiều thường là làm khuôn xong khoan lỗ vừa bóng led sau đó hàn dây .Với cách làm này đảm bảo các led thẳng nhau tránh chạm chập . Khuôn ở đây có thể dùng gỗ ép , gỗ dán , nhưng theo như mình làm thì bằng xốp là tiện lợi nhất vẫn đảm bảo chất lượng

Highslide JS

Highslide JS

Highslide JS

Sau khi có khung xong ta tiến hành bẻ chân led như sau anot là chân dài hơn ta bẻ vuông góc ,chân katot giữ nguyên sau khi bẻ ta tiến hành hàn led .Hàn đủ 25 led ta được 1 lớp thứ nhất ,

Highslide JS

Highslide JS

Highslide JS

Highslide JS

Highslide JS

Highslide JS

Highslide JS

Sau khi đủ 5 lớp ta tiến hành ghép khối led

Highslide JS

Highslide JS

Highslide JS

Khi có khối led hoàn chỉnh gắn led vào đế và hàn dây nối

3,Thiết kế mạch:
Tùy khả năng lập trình của từng người mà chọn các chip khác nhau như AVR hay PIC , đối với người mới học tốt nhất nên chọn 8051 đơn giản và thông dụng. Dưới đây là sơ đồ nguyên lý mạch dùng 89s52 do mình thiết kế:



Và PBC dùng orcad:



Do đang trong quá trình thi nên chưa có thời gian hoàn thiện mới chỉ xong phần khối led .Show vài bức cho mọi người xem .Phiên bản chính thức sẽ được update lên trang web trong thời gian sớm nhất !









Update ngày 15/01/2011
Sau 3 tuần thi cử bận rộn cuối cùng cũng đã xong , việc đầu tiên phải làm là hoàn thiện quả led cube 5x5x5 để về chơi tết .
Hôn nay cũng đã gần xong mình update trước một số hình ảnh mới nhất về nó cho mọi người coi :

Phần mạch:



Phần khung hôm nay đã được gắn hộp meka :





Phần mạch coi như đã ổn công việc hiện giờ là lập trình hiệu ứng cũng vất vả đây , hi vọng sẽ ra mắt mọi người sớm nhất.

Học lập trình Keil C cho 8051


Highslide JS

Trong lập trình vi xử lý ngôn ngữ thường dùng là ngôn ngữ lập trình  ASM  và ngôn ngữ C . Ngôn ngữ lập trình ASM hay lập trình hợp ngữ là ngôn ngữ lập trình trực tiếp cho vi điều khiển ( lập trình trực tiếp ) còn ngôn ngữ C hay còn gọi là lập trình hướng đối tượng nó gần với ngôn ngữ con người hơn . Điều này có nghĩa là với ASM người lập trình ra lệnh trực tiếp thông qua ngôn ngữ câu lệnh có tính ràng buộc còn ngôn ngữ C sử dụng các cấu trúc điều kiện và vòng lặp theo ý muốn .Nói về ngôn ngữ C thì   ưu điểm của ngôn ngữ C là nó dễ hiểu nhưng cấu trúc lại dài và phức tạp so với ngôn ngữ ASM .

Tìm hiểu lập trình C cho 8051.
1. Giới thiệu :
C là một ngôn ngữ khá mạnh và có rất nhiều người dung. Nhưng với vi xử lý ta chỉ cần biết một vài vấn đề cơ bản sau :
+ Các kiểu toán tử của C .
+ Các kiểu dữ liệu (int , float , double , char , unsigned char , …)
+ Các hàm trong C
+Cấu trúc cơ bản của một chương trình.
+ Cấu trúc điều khiển hay các tập lệnh.
2. Kiến thức cơ bản về C :
a. Các kiểu toán tử của C
   Toán tử gán (=)
   Các toán tử số học ( + , - ,* , / , % )
           + cộng
             - trừ
             * nhân
             / chia
             % lấy phần dư (trong phép chia)
    Các toán tử gán phức hợp : (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=)
               a -= 5; tương đương với a = a - 5;
               a /= b; tương đương với a = a / b;
               a*=2 ; tương đương với a = a*2
              ………..
    Tăng và giảm ( ++ , -- )
              a++; <=> a+=1; <=> a=a+1;
               a--; <=> a+=1 <=> a=a-1
    Tiền tố hay hậu tố ( ++a ; a++ )
              B=3;
              B=3;A=++B;
             // A là 4, B là 4
      Hay :B=3;
              A=B++;
              // A là 3, B là 4
   Các toán tử quan hệ ( = = , != ,< , > , <= , >= )
             = = Bằng
             != Khác
             > Lớn hơn
             < Nhỏ hơn
             > = Lớn hơn hoặc bằng
             < = Nhỏ hơn hoặc bằng
  Các toán tử logic (!, &&, || )
              ! NOT
              && AND
              || OR
   Các toán tử thao tác bit (&, |, ^, ~, <<, >> )
               & AND Logical AND
               | OR Logical OR
               ^ XOR Logical exclusive OR
               ~ NOT Đảo ngược bit
               << SHL Dịch bit sang trái
               >> SHR Dịch bit sang phải
     *Thứ tự ưu tiên
           1   () [ ] -> .
           2
                  ++ -- tăng/giảm
                   ~ Đảo ngược bit
                   ! NOT
                   & * Toán tử con trỏ
                   + - Dương hoặc âm
           3      * / % Toán tử số học
           4      + - Toán tử số học
           5     << >> Dịch bit
           6     < <= > >= Toán tử quan hệ
           7      == != Toán tử quan hệ
           8      & ^ | Toán tử thao tác bit
           9      && || Toán tử logic
           10     ?: Toán tử điều kiện
           11     = += -= *= /= %=
                    >>= <<= &= ^= |= Toán tử gán
           12     ,  Dấu phẩy
b. Các kiểu biến dữ liệu :
Char : 1byte ( -128 ; 127 )
Unsigned char : 1byte ( 0; 255)
Enum : 2byte ( -32,768 ; 32,768 )
Short : 2byte ( -32,768 ; 32,768 )
Unsigned short : 2byte ( 0 ; 65,535 )
Int : 2byte (  -32,768 ; +32,767 )
Unsigned int : 2byte (0 ; 65,535 )
Long : 4byte (- 2,147,483,648 ; +2,147,483,647 )
Unsigned long : 4byte (0 ; 4,294,697,295 )
………….
Khai báo biến:
Cấu trúc :
          Kiểu biến  Tên biến
VD :
          unsigned char x;
Ta cũng có thể gán luôn giá trị ban đầu cho biến. Nghĩa là thay vì:
           unsigned char x;
             x=0;
ta viết là : unsigned char x=0;
Hoặc ta cũng có thể khai báo nhiêu biến một lúc:
unsigned char x,y,z;
Ngoài ra dung cho vi điều khiển trình biên dich chuyên dụng còn hỗ trợ các biến sau
Dạng biến      Số Bit Số Byte    Miền giá trị
Bit                  1        0              0 ; 1
sbit                 1        0              0 ; 1
sfr                  8        1             0 đến 255
sf16               16      & ; ;nbs p; 2           ; ; ; ;0 đến 65,535
Trong đó bit có thể dung như các biến trong C nhưng các biến còn lại thì liên quan đến các thanh ghi hoặc địa chỉ cổng cua 8051( có nghĩa là khi khai bao biến kiểu bit thì không cần định địa chỉ trong RAM các biến khác phải địn rõ địa chỉ trong RAM vì nó là  các dạng biến đặc biệt gọi là special function registers (SFR)
VD: bit kiemtra;
        sfr P1_0=0x90
Các SFR được khai báo trong thư viện
         at89x51.h và at89x52.h

c. Các hàm trong C
Có hai loai hàm trong C :
+Hàm trả lai giá trị:
Kiểu giá trị hàm trả lại  Tên hàm(Biến truyền vào hàm)
{
// Các câu lệnh xử lý
}
VD;
unsigned char cong(unsigned char x, unsigned char y)
+ Hàm không trả lại giá trị
void  Tên hàm( Biến truyền vào hàm)
{
// các câu lệnh xử lý
}
VD:
void cong(unsigned char x,unsigned char y)
{
//các câu lệnh
}
(*) Hàm có thể có biến truyền vào hoặc không
+ Hàm không có biến truyền vào
unsigned char Tên hàm(void)
{
//câu lệnh
}
+ Hàm có biến truyền vào
void  Tên hàm(unsigned char x)
{
//các câu lệnh
}
(**) Số biến truyền vào là tùy ý miễn sao là đủ bộ nhớ , các biến ngăn cách nhau bằng dấu “,”.
VD: void Tên hàm(unsigned char x,unsigned char y,unsigned char z)
(***) Ngoài ra trong Keil C còn co một loại hàm là hàm ngắt:
Cấu trúc:
void  Tên hàm(void) interrupt nguồn ngắt using băng thanh ghi
{
}
Hàm ngắt không được phép trả lại giá  tri hay truyền tham biến vào hàm
Tên hàm : tùy chọn
Interrupt : từ khóa chỉ hàm ngắt
Nguồn ngắt : từ 0 đến 5 theo bảng vecter ngắt
Ngắt do                     Cờ       Địa chỉ vector      Nguồn ngắt
Reset hệ thống         RST        0000H                    -
Ngắt ngoài 0              IE0        0003H                   0
Timer 0                     TF0       000BH                   1
Ngắt ngoài 1              IE1        001 3H                  2
Timer 1                     TF1       001BH                   3
Port nối tiếp        RI hoặc TI     0023H                   4
Timer 2        TF2 hoặc EXF2     002BH                   5
Băng thanh ghi trên RAM chon từ 0 đến 3.
d. Các câu lệnh cơ bản của C
+ Cấu trúc điều kiện: if , else
Cấu trúc if : if (điều kiện) lệnh ( đưa ra điều kiện và tuyên bố thưc hiện)
    VD : if (x<10) x++; // nếu x< 10 thì tăng x thêm 1
Cấu trúc if & else : if (điều kiện) lệnh1 else lệnh 2 ( thỏa mãn điều kiện if thì thực hiện  lệnh 1 còn ngược lại thực hiện lệnh 2
VD : if (x=10) x++;
          Elese x--;
+ Cấu trúc lặp :
- Vòng lặp while .
Dạng của nó như sau:
while (biểu hiện) lệnh
Cấu trúc hay găp trong chương trình vi xử lý là
while(1)
{
//vòng lặp mãi mãi ;
}
Tạo vòng lặp mãi mãi trong lập trình VXL .Chương trình chính sẽ được viết trong dấu
ngoặc.
- Vòng lặp do-while
Dạng thức:
do lệnh while (điều kiện);
VD:
do
{
x++; // cho nay cac ban co the viet nhieu cau lenh ,
}
while(x>10)
tăng giá trị của x cho đến khi x > 10
Chức năng của nó là hoàn toàn giống vòng lặp while chỉ trừ có một điều là điều kiện điều khiển vòng lặp được tính toán sau khi lệnh được thực hiện, vì vậy lệnh sẽ được thực hiện ít nhất một lần ngay cả khi điều kiện không bao giờ được thoả mãn .Như ví dụ trên kể cả x >10 thì nó vẫn tăng giá trị 1 lần trước khi thoát
- Vòng lặp for:
Cấu trúc : for (khởi tạo;điều kiện;tăng giá trị) lệnh
và chức năng chính của nó là lặp lại lệnh chừng nào điều kiện còn mang giá trị đúng, như
trong vòng lặp while. Nhưng thêm vào đó, for cung cấp chỗ dành cho lệnh khởi tạo và lệnh tăng. Vì vậy vòng lặp này được thiết kế đặc biệt lặp lại một hành động với một số lần xác định.
Cách thức hoạt động của nó như sau:
(*) Khởi tạo được thực hiện. Nói chung nó đặt một giá khí ban đầu cho biến điều khiển. Lệnh này được thực hiện chỉ một lần.
(**) Điều kiện được kiểm tra, nếu nó là đúng vòng lặp tiếp tục còn nếu không vòng lặp kết thúc và lệnh được bỏ qua.
(***) Lệnh được thực hiện. Nó có thể là một lệnh đơn hoặc là một khối lệnh được bao trong một cặp ngoặc nhọn.
(****) Cuối cùng, thực hiện để tăng biến điều khiển và vòng lặp quay trở lại bước kiềm tra điều kiện.
Phần khởi tạo và lệnh tăng không bắt buộc phải có. Chúng có thể được bỏ qua nhưng vẫn phải có dấu chấm phẩy ngăn cách giữa các phần. Vì vậy, chúng ta có thể viết for (;n<10;) hoặc for (;n<10;n++).
Bằng cách sử dụng dấu phẩy, chúng ta có thể dùng nhiều lệnh trong bất kì trường nào trong vòng for, như là trong phần khởi tạo. Ví dụ chúng ta có thể khởi tạo một lúc nhiều biến trong vòng lặp:
for ( n=0, i=100 ; n!=i ; n++, i-- )
{
// các câu lệnh;
}
VD: Tạo hàm delayms dung vòng lăp for
void delay (unsigned int ms) // ham tao thoi gian tre ms
{
unsigned int i ; // hoặc ta có thể khai báo int  i j;
unsigned char j ;
for (i=0;i
{
for (j=0;j<125;j++)
{} // khong lam gi ca
}
}
+ Các lệnh rẽ nhánh và lệnh nhảy
Lệnh break.
Sử dụng break chúng ta có thể thoát khỏi vòng lặp ngay cả khi điều kiện để nó kết thúc chưa được thoả mãn. Lệnh này có thể được dùng để kết thúc một vòng lặp không xác định hay buộc nó phải kết thúc giữa chừng thay vì kết thúc một cách bình thường. Ví dụ, chúng ta sẽ dừng việc đếm ngược trước khi nó kết thúc.
// break loop example
#include
int main ()
{
int n;
for (n=10; n>0; n--) {
cout << n << ", ";
if (n==3)
{
cout << "dung dem”;
break; //dem den 3 thi dung;
} }
return 0;
}
Lệnh continue.
Lệnh continue làm cho chương trình bỏ qua phần còn lại của vòng lặp và nhảy sang lần lặp tiếp
theo. Ví dụ chúng ta sẽ bỏ qua số 5 trong phần đếm ngược:
#include
int main ()
{
for (int n=10; n>0; n--) {
if (n==5) continue;
cout << n << ", ";
}
cout << "FIRE!";
return 0;
}
Hàm exit.
Mục đích của exit là kết thúc chương trình và trả về một mã xác định. Dạng thức của nó như sau
void exit (int exit code);
exit code được dùng bởi một số hệ điều hành hoặc có thể được dùng bởi các chương trình gọi.
Theo quy ước, mã trả về 0 có nghĩa là chương trình kết thúc bình thường còn các giá trị khác 0 có nghĩa là có lỗi. các lệnh trên chủ yếu chỉ dùng lệnh break để thoát khỏi vòng lặp . Các lệnh khác thường rất ít dược sử dụng
Cấu trúc lựa chọn: switch
Cú pháp của lệnh switch hơi đặc biệt một chút. Mục đích của nó là kiểm tra một vài giá trị hằng cho một biểu thức, tương tự với những gì chúng ta làm ở đầu bài này khi liên kết  một vài lệnh if và else if với nhau. Dạng thức của nó như sau:
switch (expression)
{
case constant1:
block of instructions 1
break;
case constant2:
block of instructions 2
break;
.
.
.
default:
default block of instructions
}
Nó hoạt động theo cách sau: switch tính biểu thức và kiểm tra xem nó có bằng constant1 hay không, nếu đúng thì nó thực hiện block of instructions 1 cho đến khi tìm thấy từ khoá break, sau đó nhảy đến phần cuối của cấu trúc lựa chọn switch. Còn nếu không, switch sẽ kiểm tra xem biểu thức có bằng constant2 hay không. Nếu đúng nó sẽ thực hiện block of instructions 2 cho đến khi tìm thấy từ khoá break. Cuối cùng, nếu giá trị biểu thức không bằng bất kỳ hằng nào được chỉ định ở trên (bạn có thể chỉ định bao nhiêu câu lệnh case tuỳ thích), chương trình sẽ thực hiện các lệnh trong phần default: Nếu nó tồn tại vì phần này không bắt buộc phải có.

e. Cấu trúc cơ bản của của một chương trình C cho 8051 :
+ Phần đầu tiên là liệt kê các header file
Các bạn dùng bằng từ khóa
#include “Tên các header”
Hoặc :
#incude
Khi bạn viết theo cách thứ nhất thì trình biên dịch sẽ tìm kiếm file .h hoặc .c này trong thư mục hiện tại chứa dự án của bạn, nếu không có thì sẽ tìm kiếm trong thư mục Inc trong thư mục cài đặt KeilC.
Viết theo cách thứ hai thì trình biên dịch sẽ tìm luôn trong thư mục /INC luôn.
Để có thể sử dụng đúng các file .h cho các vi điều khiển mở thư mục /inc trong thư mục này có các thư mục con như tên của hãng sản xuất. Ví dụ như của Atmel thì bạn tìm trong thư mục /Atmel thì sẽ thấy được file reg51.h
Phần thứ 2 : Định nghĩa các macro (thiết lập vĩ mô). Cách khai báo sử dụng từ khóa #define. Ví dụ:để khai báo mặc led 1 được nối với chân 0 của port 1 ta viết như sau
#define led1 P1_0
+ Các hàm ngắt như ngắt (timer0, timer1, ngắt nối tiếp, ngắt ngoài )nêu ở phần khai báo biến . Copy lại như sau :
Cấu trúc:
void  Tên hàm(void) interrupt nguồn ngắt using băng thanh ghi
{
}
Hàm ngắt không được phép trả lại giá  tri hay truyền tham biến vào hàm
Tên hàm : tùy chọn
Interrupt : từ khóa chỉ hàm ngắt
Nguồn ngắt : từ 0 đến 5 theo bảng vecter ngắt

Ngắt do                     Cờ       Địa chỉ vector      Nguồn ngắt
Reset hệ thống         RST         0000H                  -
Ngắt ngoài 0               IE0       0003H                  0
Timer 0                      TF0      000BH                  1
Ngắt ngoài 1               IE1       0013H                  2
Timer 1                      TF1      001BH                  3
Port nối tiếp        RI hoặc TI   0023H                  4
Timer 2          TF2 hoặc EXF2  002BH                  5
Băng thanh ghi trên RAM chon từ 0 đến 3.
     void ngat4(void) interrupt 4 using 2
     {
       //các câu lệnh
      }
Cú pháp các ngắt khác cũng tương tự chỉ thay số 4 bằng số thứ tự của ngắt trong bảng vector ngắt.
+ Các hàm con như Delay, khởi tạo,..
Việc gây trễ trong Keil C có nhiều cách khác nhau
- Dùng vòng lặp while for :
Với tần số thạch anh 11.0582 MHz thì mỗi vòng lặp khi các bạn debug sẽ thấy là chúng ta mất thời gian thực khoảng 8.28 us. Do đó để có thể gây trễ 1ms thì các bạn cần dùng xấp xỉ 121 vòng lặp kiểu này. Viết chương trình như sau:
//*****************************
void delay (unsigned int ms) // ham tao thoi gian tre ms
{
unsigned int i ;
unsigned char j ; //khai bao bien 1 byte
for (i=0;i
{
for (j=0;j<125;j++)
{} // khong lam gi ca
}
}
- Dùng Timer 0 hoặc Timer 1
Tiếp tục với hàm delay() theo cách dùng bộ định thời thì ta thấy nó cũng giống như ngôn ngữ ASM biên dịch với Topview Simulator .
Dùng bộ định thời có 3 chế độ: chế độ 0, chế độ 1, chế độ 2. Chúng ta sẽ sử dụng chế độ khởi động bộ định thời bằng phần mềm tức TMOD.3 và TMOD.7 =0
Việc xác định chế độ nào phụ thuộc vào giá trị của 2 bit TM1 và TM0 của từng timer( các bạn xem định nghĩa từng bít trong thanh ghi TMOD)
TM1=0, TM0 =0 chế độ 0 : Chế độ định thời 13 bit , số đếm 0000H – 1FFFH
TM1=0, TM0 =1 chế độ 1 : Chế độ định thời 16 bit , số đếm 0000H - FFFFH
TM1=1, TM0 =0 chế độ 2 : Chế độ định thời 8 bit tự động nạp số đếm 00H - FFH
TM1=1, TM0 =1 chế độ 3 : Chế độ định thời chia sẻ số đếm 00H – FFH
VD : Gây trễ 1 ms = 1000us ta dùng chế độ định thời 16 bit sử dụng  timer 0
Tdelay=1000 sử dụng calculator của hệ điều hành Windows XP trong Start\Program\Accessories\Calculator ta được
  TH0=FC
  TL0=18
Vậy chương trình sẽ như sau :
void delay(unsigned ms)
{
while (ms--)
{
TMOD=0x01; //dùng timer 0 chế độ 1 ( 16bit )
TH0=0xfc;
TL0=0x18; //hai câu lệnh nạp giá tri đếm
TR0=1; // cho phép timer 0 hoạt động
while (TF0); //chờ TF0=1(cờ tràn =1 )
TF0=0;  //xóa cờ tràn
TR0=0; // ngừng Timer
}
}
  + Chương trình chính:
void main(void)
{
//cấu trúc lệnh điều khiển
}
đối tượng của chương trình là vi điều khiển nên hàm main không có giá trị trả về và không có tham số đưa vào.

Hướng dẫn mắc điện trở cho LED

Download tập đính kèm nhé :))!!! Download here !!!

Hướng dẫn Corel cho làm biển LED

Đã hướng dẫn chi tiết trong giáo trình : Download here !!!

Phần mềm LEDIMM –FULL

Phần mềm USB to COM for Win XP

Các bạn Download phần mềm ở đây : Download here !!!

Phần mềm Corel X3 full

Phần mềm thiết kế LED ma trận

Các bạn Download tại đây: Download here!!

Học vi điều khiển PIC - Điều khiển LED đơn

Phần này giúp chúng ta viết những chương trỉnh phần mềm đơn giản nhất cho PIC, trên quan điểm chúng ta đã có một hệ phần cứng phát triển PIC trong phần đầu .

Bài viết chú trọng vào kiến trúc của Vi Điều khiển PIC, do đó tác giả sử dụng ngôn ngữ Assembly để hướng dẫn chúng ta. Chúc các bạn thành công !

Bài tập 1: Bật tắt đèn LED

Highslide JS

Cực dương của LED được nối với điện trở, điện trở được nối với các chân vi điều khiển. Cực âm của
LED được nối với GND của vi điều khiển. Như vậy, khi chân vi điều khiển ở mức cao, tức là 5V, đèn
LED sẽ sáng. Khi chân vi điều khiển ở mức thấp (0V) đèn LED sẽ tắt.
Lưu ý trong hình: Giá trị của điện trở được xác định dựa vào dòng tối đa của vi điều khiển, điện áp
và dòng điện tối đa của đèn LED. Như vậy, giá trị nhỏ nhất của điện trở được dùng được tính toán
như trong hình. R = 125 Ohm.
Tuy nhiên, để đảm bảo hoạt động của đèn LED, chúng ta nâng giá trị điện trở lên thành 200 Ohm.
Đèn LED khi sáng quá, chỉ cần sờ tay vào nó, hoặc các va chạm mạnh, hoặc trường hợp bị tĩnh
điện, đèn LED có thể bị hư ngay. Hiện tượng này dễ thấy nhất là ở các LED cực sáng dùng trong
các bảng hiệu hoặc biển báo giao thông, các đèn LED cực sáng chỉ cần chạm tay vào, sẽ có hiện
tượng tĩnh điện và nổ ngay. Với các LED thường và dùng trong thí nghiệm, khó xảy ra hiện tượng
này, tuy nhiên chất lượng sản xuất của các đèn LED cũng không đảm bảo, do vậy chúng ta chọn
giải pháp an toàn là trên hết. Hơn nữa, chúng ta cũng không cần đèn LED quá sáng.
Để bắt đầu bài tập 1, chúng ta tìm hiểu sơ qua về cấu trúc một chương trình viết bằng MPASM
như sau:
Bất cứ một chương trình ASM nào, cũng được bắt đầu bằng việc giới thiệu về chương trình, tên
chương trình, người thực hiện chương trình, ngày thực hiện chương trình, ngày hoàn tất, người
kiểm tra lại chương trình, ngày kiểm tra chương trình, phiên bản của chương trình, mô tả phần
cứng của mạch giao tiếp và một số chú thích. Vì vậy, tôi đưa ra đây một form mà tôi cho rằng hợp
lý, từ đây về sau, các bạn chỉ cần cắt dán form này, thay đổi nội dung từng mục để làm phần mở
đầu.
Chúng ta quy định một số quy ước sau:
;========== dùng để phân cách các phần chính của chương trình
;---------------- dùng để phân cách các chương trình con của chương trình

Code:

Trích dẫn

;================================================= =======
; Ten chuong trinh : Mach test den LED_1
; Nguoi thuc hien : Falleaf
; Ngay thuc hien : 23/05/2005
; Phien ban : 1.0
; Mo ta phan cung : Dung PIC16F628A - thach anh 10MHz
; : LED giao tiep voi PORTB
; : Cuc am cua LED noi voi GND
; : RB0 - RB7 la cac chan output
;----------------------------------------------------------------
; Ngay hoan thanh : 23/05/2005
; Ngay kiem tra : 23/05/2005
; Nguoi kiem tra : Doan Hiep
;----------------------------------------------------------------
; Chu thich : Mo ta cac diem khac nhau cua cac phien ban khac nhau
; : hoac cac chu thich khac
; : vd, dung che do Power On Reset, PORTB = 00000000
; : hoac, chuong trinh viet cho PIC Tutorial
; : hoac, chuong trinh nay hoan toan mien phi va co the dung cho
; : moi muc dich khac nhau
;================================================= =======


Mặc dù chưa chắc rằng đoạn chú thích này có thể ngắn hơn chương trình các bạn viết, và như vậy
việc viết chú thích dài hơn việc viết chương trình? Không, thực sự các chú thích này rất quan
trọng, vì sau 1, 2, 3 năm, các bạn nhìn lại, các bạn sẽ vẫn còn hiểu được mình đã làm gì. Có thể
khi mới bắt đầu, các bạn thấy công việc ghi chú này là nhàm chán, chính vì vậy, tôi đã cung cấp
form của ghi chú này, các bạn sau đó chỉ cần cắt và dán. Tôi hy vọng rằng các bạn nên tạo thói
quen đưa đoạn chú thích này vào chương trình để các bạn trở nên chuyên nghiệp hơn khi làm việc
với vi điều khiển, cụ thể ở đây là PIC.
Tất nhiên, đây là bài học đầu tiên, do vậy các chú thích sẽ được ghi rất chi tiết, nhất là khi mô tả
phần cứng. Sau này, với các mạch phức tạp hơn, các bạn không thể ghi chú quá chi tiết như thế
này được, các bạn chỉ ghi chú những điểm chính thôi. Cũng tất nhiên, khi lập trình với CCS C hay
HT PIC, các bạn cũng nên ghi chú như vậy trong chương trình chính, nhưng chúng ta chưa bàn
đến CCS C và HT PIC ở đây.
Phần thứ hai các bạn cần học, đó là khởi tạo PIC. Phần này là phần bắt buộc theo sau phần ghi
chú, bởi vì chương trình dịch cần phải hiểu bạn đang làm việc với con PIC nào, làm việc với nó như
thế nào?
Code:
Trích dẫn
;================================================= ======
TITLE "Mach test LED_1"
PROCESSOR P16F628A
INCLUDE
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC
;================================================= ======


Các bạn sẽ thấy rằng có một số từ khoá như sau:
TITLE: dùng để các bạn ghi chú thích tên chương trình. TITLE là ten chương trình chính. Cú pháp
ghi TITLE như trên. Nhớ phải có dấu nháy kép khi viết tên chương trình.
PROCESSOR: dùng để khai báo dòng vi điều khiển mà các bạn sử dụng. Các bạn lưu ý, trong
MPLAB quy định, không viết đầy đủ tên PIC16F628A mà chỉ viết P16F628A, vì trong chương trình
dịch đã quy định như vậy.
INCLUDE: dùng để đưa thêm vào các file mà bạn viết trong chương trình. Mặc định, trong MPLAB
đường dẫn đến thư mục chứa file P16F628A.inc đã có sẵn. Nếu bạn đặt file ở nơi khác không phải

trong thư mục bạn đang làm việc, hoặc các file include khong phải là file .inc có sẵn của MPLAB,
thì các bạn phải chỉ đường dẫn rõ ràng. Lưu ý rằng, để MPASM dịch được, các bạn phải đặt đường
dẫn từ thư mục gốc đến hết tên file (kể cả phần mở rộng của file) không được quá 60 ký tự.
__CONFIG: dùng để thiết lập các chế độ hoạt động của PIC. Các bạn có thể xem để hiểu thêm về
các chế độ hoạt động này trong tài liệu
PICmicro
Mid Range MCU Family
Reference Manual
Section 27. Device Configuration Bits
Table 27-1 page 27-7
Tài liệu này có thể download trên trang web của microchip http://www.microchip.com/, keyword:
MidRange Manual.
Mỗi directive để đặt chế độ, cách nhau một ký tự &.
Nếu ghi chế độ hoạt động vào đây, các chế độ hoạt động sẽ ở trạng thái mặc định khi khởi động.
Các bạn cũng có cách khác để đặt chế độ hoạt động bằng cách tác động trực tiếp vào các thanh
ghi khởi tạo. Tuy nhiên, việc này là việc làm không cần thiết, khi chúng ta đã có các directive để
viết tắt.
Như vậy, chúng ta đặt ở đây chế độ _CP_OFF, tức là khôngđặt chế độ bảo vệ source code khi
nạp vào PIC, sau khi nạp vào sẽ có thể đọc ngược lại từ PIC ra. Chúng ta không cần bảo vệ
chương trình này, để bạn có thể đọc ngược bằng IC-PROG và kiểm tra lại.
Chế độ _PWRITE_ON, tức là cho timer 0 chạy khi Power On Reset. Thực ra timer0 có chạy hay
không cũng không quan trọng, vì nó chẳng liên quan gì đến công việc của chúng ta. Nếu sau này
muốn dùng timer0, thì các bạn vẫn phải khởi tạo lại giá trị cho nó, chứ đâu thể sử dụng giá trị
ngẫu nhiên của nó được, thành ra cứ để cho nó chạy, sau này cần dùng khỏi phải khởi tạo.
_WDT_OFF, tại thời điểm này, tôi tắt Watch Dog Timer vì lý do các bạn chưa nên tìm hiểu phần
này vội.
_HS_OSC, chúng ta dùng thạch anh 10MHz, tức là chạy chế độ dao động HS. Tham khảo tại:
datasheet PIC16F628A
Section 14. Special Features of the CPU
14.2. Oscillator Configuration
Page 95
Một điểm lưu ý cuối cùng là các bạn phải sử dụng phím TAB để phân cách các cột của một chương
trình viết bằng MPASM. Các dòng khởi tạo này được viết ở cột thứ 3. Các directive __CONFIG,
TITLE, PROCESSOR, INCLUDE được viết vào cột thứ 3. Còn chi tiết khởi tạo được viết vào cột thứ
tư.
Cột thứ nhất dùng để viết các [NHÃN], cột thứ hai để viết mã lệnh, cột thứ ba lại dùng để viết
chi tiết các tham số của lệnh, và cột thứ tư bỏ trống để tạo khoảng cách với cột thứ năm. Cột thứ
năm dùng để viết các chú thích.
Các chú thích bắt đầu bằng dấu chấm phẩy ( . Trên một dòng, tất cả các ký tự viết sau
dấu chấm phẩy đều vô nghĩa. Chính vì vậy, khi viết phần chú thích ban đầu, các bạn thấy rằng tất
cả nội dung đó đều bắt đầu bằng dấu chấm phẩy. Như vậy, một dòng lệnh được cụ thể như sau:
Code:

Trích dẫn
NHÃN LỆNH thamso1, thamso2 ; chú thích dòng lệnh


Bây giờ chúng ta dành chút thời gian cho lý thuyết, các bạn mở datasheet PIC16F628A trang 15,
Section 4. Memory Organization
Chúng ta sẽ thấy rằng tổ chức bộ nhớ chương trình của PIC được chia ra làm mấy phần như sau:
- Pointer
- Stack
- Interrupt vector
- Program memory

Chúng ta tạm thời chưa bàn đến pointer và stack.
Interrupt vector được đặt ở địa chỉ 0x0004
Program memory được đặt ở địa chỉ 0x0005
Vậy từ địa chỉ 0x0000 đến địa chỉ 0x0003 chúng ta làm được gì?
Khi PIC được reset, nó lập tức nhảy về địa chỉ 0x0000. Rồi cứ sau một chu kỳ máy, nó
nhảy đến địa chỉ tiếp theo, xem xem trong địa chỉ đó yêu cầu nó làm gì, nó thực hiện việc đó,
xong rồi lại nhảy tiếp. Cứ làm như thế cho đến khi hết chương trình. Tất nhiên, khi chúng ta thực
hiện một số lệnh điều khiển vị trí nhảy, thì nó sẽ nhảy không theo thứ tự nữa, nhưng việc này
chưa bàn vội. Chúng ta trước mắt chỉ cần biết rằng nó cứ nhảy như vậy cho đến hết chương trình.
Như vậy, nếu không sử dụng ngắt, thì chúng ta viết chương trình từ địa chỉ 0x0000 luôn, vì
nó cứ thế là nhảy từ 0x0000 khi khởi động, cho đến hết chương trình. Tuy nhiên, nếu làm như
vậy, sau này chúng ta sử dụng chương trình ngắt, thì chúng ta sẽ gặp trục trặc vì thói quen viết
từ địa chỉ 0x0000.
Chính vì vậy, chúng ta nên đặt chương trình trong phần Program Memory như ý đồ thiết kế PIC.
Vậy, chương trình của chúng ta sẽ viết như sau:
Code:
Trích dẫn
;================================================= ===================
ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
.....
END.
;================================================= ===================

Đây sẽ là cấu trúc một chương trình mà chúng ta sẽ thực hiện. Directive ORG dùng để xác định
địa chỉ mà chúng ta sẽ làm việc. Bây giờ chúng ta xem tiếp đến trang 16 của datasheet. Chúng ta
thấy rằng, bộ nhớ dữ liệu của PIC16F628A được chia ra thành 4 BANK, hay chúng ta gọi tiếng Việt
là 4 BĂNG. Trong 4 băng này, chúng ta thấy rõ nó được chia làm 3 phần. Phần thứ nhất là phần
các thanh ghi có địa chỉ xác định (được ghi chú ở bên cạnh) và có tên tuổi rõ ràng. Những thanh
ghi này được gọi là những thanh ghi đặc biệt của PIC. Tên của chúng, thực ra không có, một
thanh ghi chỉ được xác định bằng địa chỉ của thanh ghi mà thôi.
Tuy nhiên, chúng ta đã làm động tác include file P16F628A.inc, file này đã định nghĩa sẵn
tên các thanh ghi này, và là quy ước của MPLAB, đồng thời cũng là quy ước chung cho tất cả
người dùng PIC. Chúng ta có thể thay đổi, sửa chữa những định nghĩa này, tuy nhiên việc làm đó
vừa không cần thiết, lại vừa gây ra rất nhiều khó khăn khi làm việc nhóm.
Vậy các bạn phải hiểu, những tên thanh ghi này xem như là không thay đổi trong PIC, và
chúng ta sử dụng nó như nó đã tồn tại vài chục năm nay.
Phần thứ hai, đó là phần General Purpose Register. Chúng ta gọi nó là các Thanh Ghi Dùng
Chung. Những thanh ghi này chưa được định nghĩa, và vì thế nó cũng không có tên. Những thanh
ghi này có giá trị như các biến trong chương trình mà chúng ta sẽ sử dụng.
Phần thứ ba, đó là các thanh ghi nằm ở địa chỉ 70h đến 7Fh, và vị trí tương ứng của nó ở
băng 1, 2, 3. Các thanh ghi tương ứng đó ở bank1, 2, 3 sẽ tương thích với các thanh ghi từ 70h
đến 7Fh ở băng 0. Tuy nhiên, chúng ta tạm thời chưa quan tâm đến phần này.
Bây giờ chúng ta học viết chương trình
Code:

Trích dẫn
;================================================= ==============================
ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
BANKSEL TRISB ; bank select
CLRF TRISB ; trisb = 00000000
; portb = output
BANKSEL PORTB
BSF PORTB, 0 ; rb0 = 1
; RB0 = 5V
GOTO $ ; dung chuong trinh tai day
; vong lap tai cho^~
; khong bao gio ket thuc
END. ; lenh bat buoc de ket thuc
;================================================= ===============================


Rồi, như vậy, chúng ta đã thực hiện xong một chương trình viết bằng MPASM cho PIC16F628A.
Phân tích chương trình, chúng ta sẽ thấy, mới khởi động, chương trình gặp lệnh goto main,
nó sẽ nhảy đến nhãn MAIN. Ở nhãn MAIN, nó gặp lệnh banksel, tức là lệnh bank select. Có nghĩa
là nó sẽ chuyển sang hoạt động ở băng có chứa thanh ghi TRISB. Vì sao? Bởi vì ban đầu khởi
động, PIC luôn nằm ở băng 0. Nhưng thanh ghi TRISB lại nằm ở băng 1, vì thế cần phải chuyển
sang băng 1 để làm việc. Thực ra chúng ta cũng có cách để yêu cầu PIC chuyển sang băng 1 một
cách đích danh, chứ không phải là chuyển sang băng có thanh ghi trisb như chúng ta vừa làm.
Nhưng việc này là không cần thiết, cả hai việc làm đều giống nhau. Chính vì vậy, chúng ta chọn
cách viết nào cho dễ nhớ là được. Sau khi chuyển sang băng 1. Chúng ta dùng lệnh CLRF để xoá
thanh ghi TRISB.
Tức là TRISB = 00000000
Chúng ta lưu ý một điều rằng, thanh ghi TRISB có công dụng quy định PORTB sẽ có những
chân nào là chân xuất, chân nào là chân nhập. Chúng ta nhớ thêm một điều nữa, số 0 giống chứ
O, và số 1 giống chữ I. Như vậy, khi TRISB = 00000000 tức là PORTB sẽ là OOOOOOOO, tức có
nghĩa là tất cả các chân của portB đều là Output. Nếu TRISB = 01010101 thì PORTB sẽ là
OIOIOIOI. Có nghĩa là RB0 sẽ là Input, RB1 là Output, RB2 là Input, RB3 là Output.. cứ như thế
cho đến RB7 là Output. Lưu ý rằng RB0 đến RB7 được tính từ phải sang trái.
Sau đó, chúng ta lại thực hiện lệnh Banksel portb, tức là chúng ta lại nhảy về băng 0 (băng chứa
thanh ghi portb). Tất cả các lệnh làm thay đổi giá trị của thanh ghi portb, sẽ làm thay đổi tín hiệu
điện ở bên ngoài chân của PORT B. Sau khi chuyển sang băng 0, chúng ta thực hiện lệnh BSF
PORTB,0. Có nghĩa là chúng ta set bit ở vị trí 0 của portb, tức là chúng ta cho RB0 = 1.
Có nghĩa là ở ngoài chân RB0 sẽ mang giá trị điện áp 5V. Khi đó, đèn LED nối với RB0 sẽ sáng.
Các bạn sẽ thấy mach ngoài hoạt động như thế này:
Khi bật điện lên, PIC được reset. Nó lập tức bật sáng đèn LED ở RB0, rồi sau đó giữ nguyên như
vậy, không làm gì cả.
Bây giờ các bạn lưu chương trình vừa viết thành LED_1.asm vào một thư mục nào đó.
Nhấn Alt - F10, chương trình sẽ dịch LED_1.asm thành LED_1.hex
Các bạn dùng mạch nạp PG2C và chương trình nạp IC-PROG để nạp vào PIC (tham khảo Hướng
dẫn mạch nạp Falleaf PG2C - PIC Tutorial).
Công việc của các bạn như sau:
0) Chạy thử chương trình ban đầu
1) Thay đổi lệnh BSF PORTB, 0 bằng lệnh BSF PORTB, 1. Nạp lại chương trình mới vào PIC. Bạn
sẽ thấy bây giờ đèn LED không sáng ở vị trí RB0 nữa mà sáng ở vị trí RB1.
2) Thay lệnh BSF PORTB,0 bằng đoạn lệnh
MOVLW b'11110000'
MOVWF PORTB
Bạn sẽ thấy các các chân từ RB0 đến RB3 sẽ tắt đèn, và các chân từ RB4 đến RB7 đèn sẽ sáng.
3) Bạn thay lệnh CLRF TRISB bằng đoạn lệnh
CLRF TRISB
BSF TRISB, 0
và giữ nguyên lệnh
BSF PORTB, 0
Các bạn sẽ thấy rằng đèn LED trong trường hợp này sẽ không sáng nữa.
Bởi vì các bạn đã làm cho TRISB = 00000001. Như vậy, RB0 trở thành chân Input. Khi RB0 trở
thành chân Input, thì lệnh BSF PORTB, 0 sẽ không còn tác dụng nữa. RB0 lúc này không thể thay
đổi giá trị bằng chương trình, nó chỉ có thể nhận giá trị điện áp từ bên ngoài vào.

4) Trong trường hợp mạch này, các bạn sẽ làm thế nào?

Highslide JS

Kết luận: Qua bài học này, các bạn đã học được các nội dung sau:
- Làm một mạch chạy PIC
- Cấu trúc một chương trình PIC
- Lập trình từ máy tính, nạp vào PIC, và cho PIC hoạt động
- Hiểu được hoạt động xuất nhập của PIC, chức năng của thanh ghi TRISA, TRISB, PORTA, PORTB,
hiểu được các lệnh CLRF (xoá thanh ghi bất kỳ), MOVLW (ghi một giá trị bất kỳ vào thanh ghi W),
MOVWF (ghi giá trị của thanh ghi W vào một thanh ghi khác), BSF (bật một bit trong một thanh
ghi bất kỳ), GOTO (nhảy đến một nhãn bất kỳ), GOTO $ (nhảy tại chỗ), BANKSEL (chon băng
trong bộ nhớ chương trình, chứa một thanh ghi bất kỳ), ORG định địa chỉ trong bộ nhớ chương
trình. Hiện nay các bạn chưa học đến làm thế nào để Input, nhưng có thể các bạn sẽ thực hiện dễ
dàng bằng việc thay LED bằng một nút bấm. Hoặc giả, các bạn muốn đèn LED nhấp nháy, về
nguyên tắc các bạn có thể thực hiện bật tắt liên tục đèn LED bằng lệnh BSF và BCF. Nhưng làm
như thế nó nháy quá nhanh, không thể thấy được.
Bài học sau, chúng ta sẽ học cách viết hàm Delay, và các bạn có thể thực hiện việc làm cho đèn
LED nhấp nháy, làm cho dãy đèn từ RB0 đến RB7 chạy qua chạy lại...
Chúc các bạn may mắn trong bài học đầu tiên, và chúc các bạn thành công với PIC!

Hướng dẫn cài Web Server với Apache, PHP, MySQL trên Window

1. Chuẩn bị

Để cài đặt 1 web server, cần chuẩn bị 1 số đồ nghề sau

Apache 2.2.16 - httpd-2.2.16-win32-x86-no_ssl.msi
PHP 5.2.12 - PHP 5.2.12 zip package (ko nên cài các bản mới vì nó khó cài hơn, các hosting hiện nay cũng vẫn xài PHP 5.2)
MySQL 5.1.51 - mysql-essential-5.1.51-win32.msi
phpMyAdmin - phpMyAdmin-3.3.7-english.zip (lang eng là đủ vì các lang kia cũng ko xài, dow hết nặng máy)

Lưu ý, cái này là tự cài từng phần 1 cho những ai thích vọc, còn nếu bạn còn đang rất lơ mơ thì mình khuyên là nên dùng bộ cài đặt trọng gói Vertrigo (http://vertrigo.sourceforge.net/) thì sẽ nhanh và ổn định hơn là tự lần mò

2. Cài Apache

Cái này cài đặt chỉ việc next là xong

Network domain: localhost
Server name: localhost
Administrator's email address: email của bạn@abc.com

Để đơn giản, ở bước tiếp theo chọn kiểu cài đặt Typical

Chọn đường dẫn là C:\App\ cho ngắn + tiện vào hoặc ko thì tùy các bạn

Okie, sau khi cài xong, các bạn bật trình duyệt lên, gõ http://localhost vào xem đã chạy chưa, nếu nó hiện lên chữ It's Work tức là đã cài thành công

3. Cài PHP

Sau khi download PHP 5.2.12 về, các bạn giải nén ra, và coppy tất cả các file vào thư mục C:\App\php (Thư mục C:\App giống như ở trên cài Apache)

Đổi tên file php.ini-dist thành php.ini

mở file php.ini vừa đổi tên xong lên

tìm :

extension_dir = "./"

sửa thành

extension_dir = "C:\App\php\ext"

Tìm tiếp

;extension=php_gd2.dll
;extension=php_mbstring.dll
;extension=php_mysql.dll
;extension=php_mysqli.dll

và xóa dấu ; ở trước đi, để sử dụng các thư viện đó, trong đó có hàng loạt thư viện, cần xài cái nào thì bỏ dấu ; ở trước extension đi là oke

Xong, save lại

Chú ý: Thêm Environmental Variables vào System Path
Để PHP có thể khởi động cùng với hệ điều hành, bạn phải thực hiện việc thêm Environmental Variables vào System Path như sau:
Bạn vào Start->Control Panel->System->Advanced System Settings, chọn advanced tab, click chọn nút Environmental Variables kéo xuống phía dưới của system variables, tìm biến PATH, chọn Edit và thêm vào đầu tiên của dòng có sẳn đoạn sau: C:\server\php;
Sau khi hoàn thành, nhất định bạn phải khởi động lại máy, phải khởi động, logging off là chưa đủ. Nếu bạn vội vàng chuyển qua bước tiếp theo mà không khởi động, chắc chắn sẽ gặp lỗi.

Tiếp theo cấu hình cho Apache

Mở file httpd.conf trong folder conf lên

Tìm dòng

LoadModule vhost_alias_module modules/mod_vhost_alias.so

Xóa dấu # ở trước nó đi và thêm vào bên dưới

LoadModule php5_module "C:/App/php/php5apache2_2.dll"
PHPIniDir "C:/App/php"

Tìm tiếp

DirectoryIndex index.html

Sửa thành

DirectoryIndex index.html index.php

để ưu tiên các file mặc định, nếu ko thích là index các bạn có thể sửa là default.php, hay abc.php tùy ý

Tìm tiếp

AddType application/x-gzip .gz .tgz

thêm vào bên dưới

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Tìm tiếp

#Include conf/extra/httpd-vhosts.conf

bỏ dấu # đi, để nếu cài server và muốn tạo nhiều host chạy nhiều domain



Okie, bây giờ các bạn reset lại apache rồi vào C:\App\htdocs tạo 1 file info.php với nội dung là



rồi chạy http://localhost/info.php để test thử, nếu oke thì nó sẽ hiện info PHP lên

4. Cài MySQL

1. Đúp click lên gói MySQL mà bạn đã tải về theo hướng dẫn phần đầu tiên của bài này để tiến hành cài đặt.

2. Chọn Typical và click Next
3. Cứ tiếp tục click Next cho đến khi màn hình xuất hiện đường dẫn trỏ tới nơi mà MySQL sẽ được cài đặt. Click Instal
4. Ở bước MySQL.com Sign Up. Bạn chọn Skip Sign Up, Next
5. Bây giờ là lúc bạn cấu hình cho MySQL, cũng khá là đơn giản. Chọn Configure the MySQL Server now, Click Finish
6. Chọn Detailed Configuration, Next
7. Chọn Developer Machine, Next
8. Chọn Multifunctional Database, Next
9. Click Next
10. Chọn Decision Support (DSS)/OLAP, Next
11. Tíc chọn cả Enable TCP/IP Networking và Enable Strict Mode, Next
12. Chọn Standard Character Set, Next
13. Tíc chọn cả Install as Windows Service (Service name: MySQL, chọn Launch the MySQL Server automatically ) và Include Bin directory in Windows PATH, Next
14. Thiết lập mật khẩu tài khoản root: Click chọn Modify Security Settings.
Nhập mật khẩu vào ô New root password. Nhập lại 1 lần nữa ở ô Confirm và Next
15. Cuối cùng, Click Execute

Vì php5 đã có tích hợp SQL Lite vào rồi, nên để bắt PHP làm việc với MySQL, các bạn cần coppy file libmysql.dll trong thư mục php cho vào C:\WINDOWS\System32

Để chắc chắn 1 số thư viện khác cũng hoạt động tốt, trong thư mục php có bao nhiêu file có tên bắt đầu là lib, đuôi là .dll các bạn cũng coppy rồi cho cả vào C:\WINDOWS\System32

Xong, các bạn chạy lại file info.php để chắc chắn là mysql đã enable rồi

Thế là đã cài xong web server rồi

5. Tạo Virtual Host

Để tạo nhiều host với nhiều domain khác nhau, các bạn mở file httpd-vhosts.conf trong thư mục C:\App\conf\extra lên

VD server của các bạn có IP là 67.220.217.79

Các bạn thay toàn bộ nội dung trong file bằng đoạn bên dưới

NameVirtualHost 67.220.217.79

DocumentRoot "C:/Server"
ServerName server.hoangtuchiplove.com


DocumentRoot "C:/Server/hoangtu.com"
ServerName hoangtu.com


Sau đó trỏ IP của các domain tới server của bạn là okie

6. Tạo account FTP để upload + share

Để máy client có thể upload đc file lên server, các bạn cài thêm phần mềm zFTPServer tại http://zftpserver.com, nếu ai giàu thì buy, còn ko thì có thể xài bản freewave của nó cũng được

Hướng dẫn cài Web Server với Apache, PHP, MySQL trên Window - Image 2

Các bạn có thể tạo acc, set quyền đọc, ghi, xóa, tạo folder v.v.v

Để set thư mục cho account, các bạn bấm vào chỗ C:\Server như của mình rồi chọn Add Resource

để set quyền thì các bạn tích dấu v đỏ như mình tích ở trên. Okie, bây giờ máy client có thể login qua Cute FTP để upload file lên server được rồi

7. Cài đặt phpMyAdmin

Cái này để quản lý database, cách cài cũng ko có gì rắc rối lắm,

các bạn download về, giải nén ra và cho vào thư mục htdocs, tiếp theo chạy đường dẫn http://localhost/phpMyAdmin/setup để tạo account admin quản lý

Các bạn chọn New Server

PHP extension to use: mysql

User for config auth: root (user để đăng nhập)

Password for config auth: matkhau (pass đăng nhập)

Okie, save lại, rồi các bạn chạy link http://localhost/phpMyAdmin/ để đăng nhập vào phpmyadmin, tạo database rồi select query thử v.v.v.

Chú ý: nếu để link là localhost/phpMyAdmin thì ai vào IP của bạn cũng sẽ thấy folder đó, nên các bạn move cái folder phpMyAdmin đó ra ngoài, ngang hàng folder htdocs hoặc để đâu thì tùy.

Nhưng để mình vẫn có thể vào quản lý được, thì các bạn mở file httpd.conf lên, kéo xuống dưới cùng, và thêm dòng


Options All
AllowOverride AuthConfig
Order allow,deny
Allow from All


Alias /phpmyadmin "C:\App\phpMyAdmin"

Như thế các bạn ở trên server vẫn vào bằng link http://localhost/phpmyadmin được, còn người khác vào bằng http://IP server/phpmyadmin thì ko được

Okie. done!

Như thế là các bạn đã cài xong 1 web server cơ bản rồi

Có sử dụng 1 số chi tiết sưu tầm

Tạo Thanh Cuộn - Tiết Kiệm Diện Tích Cho Blog

Để tạo ra một khung cuộn ta dùng  code HTML. Dưới đây là một ví dụ tạo một khung cuộn đơn giản:
<PRE style="BORDER-RIGHT: #009 1px solid; PADDING-RIGHT: 15px;
BORDER-TOP: #009 1px solid; PADDING-LEFT: 20px; BACKGROUND: #ff99ff;
 OVERFLOW: scroll; BORDER-LEFT: #009 1px solid; WIDTH: 500px; COLOR:
#009; PADDING-TOP: 20px; BORDER-BOTTOM: #009 1px solid; HEIGHT:
150px"><BR></PRE>

Code tạo màu nền cho thanh Menu

.itemboxsub {
background: #F5F5DC;
border-color: #279fcc;
color:#FF0000;
font-family: Arial;
}

Thủ Thuật Tạo Khung Độc Đáo Chứa Code Trong Blogspot

Đầu tiên, các bạn hãy vào Trình bày (Layout) và chọn tab Chỉnh sửa HTML mà không cần bật Mở rộng mẫu tiện ích . Sau đó , hãy thêm đoạn code dưới đây ngay trên thẻ ]]></b:skin>

Tạo nút đọc tiếp cho blog (nút Read More)



blogger read more button
Những ai đang dùng chức năng Read More (đọc thêm) mặc định của Blogger sẽ nhận ra là nó không được đẹp cho lắm, vì vậy trong bài này Noct sẽ hướng dẫn cách tùy biến sao cho trông bắt mắt hơn.




Top 10 Add-on “hot” cho Firefox

Firefox vẫn nổi tiếng với hệ thống add-on phong phú, vượt hẳn các trình duyệt khác. Nhờ các “phụ kiện” bổ sung, “cáo lửa” luôn là lựa chọn hàng đầu cho những ai muốn cải thiện, nâng cao trải nghiệm web.

Chạy chữ trong tài liệu HTML






Thẻ <marquee> sẽ làm chạy hầu hết các đối tượng trong thẻ như: Text, ảnh, các định dạng khác.

Cú pháp như sau: 

<marquee> Chữ chạy. </marquee>


Thay đổi hướng chạy.
Mặc định chữ trong HTML sẽ chạy từ phải sang trái.
Tuy nhiên bạn có thể thay đổi hướng chạy.
Thẻ <marquee> hỗ trợ bạn 4 hướng chạy. Down, left, right, up.
Để sử dụng được hướng các hướng chạy này, bạn cần dùng đến thuộc tính direction của thẻ<marquee>

Cú pháp như sau: 

<marquee direction="down"> chữ chạy từ trên xuống. </marquee>
<marquee direction="up"> chữ chạy từ dưới lên</marquee>
<marquee direction="right"> chữ chạy từ trái sang phải</marquee>
<marquee direction="left"> chữ chạy từ phải sang trái.</marquee>


Kiểu chạy
Thẻ <marquee> hộ trợ bạn 3 kiểu chạy: slide: chỉ chạy 1 lần sau đó đứng im.
                                                       : scroll : Kiểu chạy bình thường
                                                       : alternate: Kiểu chữ chạy đi chạy lại. 
Cú pháp như sau: 

    <marquee direction="right" behavior="alternate" > chữ chạy từ trái sang phải và có kiểu chạy đi chạy lại. </marquee>
    <marquee direction="right" behavior="scroll" > chữ chạy từ trái sang phải và có kiểu chạy bình thường.</marquee>
    <marquee direction="right" behavior="slide" > chữ chạy từ trái sang phải và có kiểu chạy 1 lần sau đó đứng im.</marquee>


Tốc độ chạy. Thuộc tính scrollamount giúp bạn tăng hay giảm tốc độ chạy của thẻ <marquee>
Thuộc tính này nhận vào giá trị là các số nguyên. Tốc độ chạy tỉ lệ với giá trị bạn truyền vào.
Cú pháp như sau: 

    <marquee direction="right" behavior="alternate" scrollamount="100"> chữ chạy từ trái sang phải, kiểu chạy đi chạy lại và tốc độ chạy = 100</marquee>

Bạn có thể tăng hoặc giảm tốc độ bằng cách tăng giá trị của thuộc tính scrollamount

Chế độ lặp
Bạn có thể chọn chế độ lặp lại của thẻ <marquee> bằng cách sử dụng thuộc tính loop. Thẻ<marquee>
hỗ trợ 2 cách lặp.
  1. Lặp 1 lần.
  2. Lặp liên tục. 
Để lặp 1 lần bạn sử dụng thuộc tính loop với giá trị =1.
Để lặp liên tục bạn sử dụng thuộc tính loop với giá trị =-1.

Cú pháp như sau: 

    <marquee direction="right"  scrollamount="100"  loop="-1"> chữ chạy từ trái sang phải, tốc độ chạy = 100, lặp liên tục</marquee>
    <marquee direction="right"  scrollamount="100"  loop="-1"> chữ chạy từ trái sang phải, tốc độ chạy = 100, lặp 1 lần</marquee>

Sắp xếp lại các options trong drop list

<script>
function hasOptions(obj) {
if (obj!=null && obj.options!=null) { return true; }
return false;
}

function moveOptionUp(obj) {
if (!hasOptions(obj)) { return; }
for (i=0; i<obj.options.length; i++) {
if (obj.options[i].selected) {
if (i != 0 && !obj.options[i-1].selected) {
swapOptions(obj,i,i-1);
obj.options[i-1].selected = true;
}
}
}
}
function swapOptions(obj,i,j) {
var o = obj.options;
var i_selected = o[i].selected;
var j_selected = o[j].selected;
var temp = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
var temp2= new Option(o[j].text, o[j].value, o[j].defaultSelected, o[j].selected);
o[i] = temp2;
o[j] = temp;
o[i].selected = j_selected;
o[j].selected = i_selected;
}
function moveOptionDown(obj) {
if (!hasOptions(obj)) { return; }
for (i=obj.options.length-1; i>=0; i--) {
if (obj.options[i].selected) {
if (i != (obj.options.length-1) && ! obj.options[i+1].selected) {
swapOptions(obj,i,i+1);
obj.options[i+1].selected = true;
}
}
}
}
</script>
<form id="form1" name="form1" method="post" action="">
<select name="updownlist" size="7" multiple="multiple">
<option value="Option 2">Option 2</option><option value="Option 5">Option 5</option><option value="Option 1">Option 1</option><option value="Option 3">Option 3</option><option value="Option 4">Option 4</option><option value="Option 5"> Option 5
</option><option value="Option 6"> Option 6
</option><option value="Option 7"> Option 7
</option><option value="Option 8"> Option 8
</option><option value="Option 9"> Option 9
</option><option value="Option 10"> Option 10
</option><option value="Option 11"> Option 11
</option><option value="Option 12"> Option 12
</option></select><br />
<input value=" Up " onClick="moveOptionUp(this.form['updownlist'])" type="button">

<input value="Down" onClick="moveOptionDown(this.form['updownlist'])" type="button">
</form>
Nguồn : http://thegioiweb.vn/Story/vn/laptrinhweb/laptrinhWeb_JavaScript/2009/9/9288.html

Bộ sưu tập 200+ đoạn mã Javascript

     Những đoạn Javascript là đồ nghề không thể thiếu với dân thiết kế web. Tuy nhiên, để tìm được những đoạn mã phù hợp, có thể bạn phải bỏ ra khá nhiều thời gian “lùng sục” khắp nơi trên Internet. Vậy tại sao bạn không sử dụng JavaScript Collector(JC), một tập hợp trên 200 đoạn mã JavaScript với rất nhiều chủ đề khác nhau.
Chạy chương trình lần đầu tiên, một hộp thoại sẽ hỏi bạn có muốn thiết lập đường dẫn đến các file thực thi của trình duyệt web đang cài trong máy hay không. Bạn nên chọn Yes, tiếp đó nhấn nút Change Internet Explorer Path/Mozilla Firefox Path/Opera Path và chọn file thực thi (*.exe) của trình duyệt tương ứng. Nhấn Save Browser Settings để lưu các thay đổi.

Chương trình gồm trên 200 đoạn mã hay được sưu tầm từ nhiều nguồn khác nhau và sắp xếp theo cấu trúc hình cây với 23 mục (Background Effect, Banners, Forms, Games, Text Effect, Mouse Effect, Tool & Utilities...).

Muốn xem script nào, bạn chỉ cần nhấn vào tên của script đó và code sẽ được hiển thị ở khung bên phải. Để kiểm tra script này có phù hợp với nhu cầu của mình hay không, bạn nhấn vào biểu tượng của các trình duyệt web phía dưới để xem trước script này sẽ thể hiện như thế nào khi đưa lên web. Nếu cần phải thay đổi tham số của script, bạn nhấn Edit Code và soạn lại theo ý thích.

Muốn đưa thêm những đoạn mã khác vào cơ sở dữ liệu của chương trình, bạn chọn thẻ Add Snippets, chọn chủ đề tương ứng, sau đó nhấn Save Snippet để lưu lại.

Tìm kiếm Script: Để tìm kiếm hãy nhập vào chuỗi kí tự cần tìm trong thẻ Search Snippets và nhấn Search để chương trình tìm kiếm giúp bạn.
Download http://www.mediafire.com/?ymvsihytyy9