PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 16-06-2011, 02:41 PM   #1
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
sửa lại như hình gửi kèm thì nó chạy thôi.
code của em chạy cũng được ,nhưng có nhược điểm khi chuyển chế độ khác nó phải làm hết chế độ cũ rồi mới chuyển.
Code:
#include <16F877A.h>

#FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=4000000)
int8 mode,i;
byte temp;
#byte portb=0x06
#byte portd=0x08
#byte trisb=0x86
#byte trisd=0x88
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#INT_EXT
EXT_ISR(){
mode++;
if(mode==5) mode=0;
}

void pro1();
void pro2();
void pro3();
void pro4();

void main(){
trisd=0x00;
trisb=0b00000001;
portd=0xff;
enable_interrupts(INT_EXT);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);
mode=0;
while(1)
{ switch(mode){
 case 0:
  portd=0xff;
  break;
  case 1:pro1();break;
  case 2:pro2();break;
  case 3:pro3();break;
  case 4:pro4();break;
}}
}
//+++++++++++++++++++++++++++++++++++
void pro1(){

portd=0b11111111;
delay_ms(200);
portd=0b00000000;
delay_ms(200);
}
//+++++++++++++++++++++++++++++++++
void pro2(){
temp=0xFF;
for(i=0;i<=8;i++)
{ portd=temp;
delay_ms(50);//chèn thêm lệnh này cho dễ quan sát
  temp>>=1;
}
}
//+++++++++++++
void pro3(){
temp=0xFF;
for(i=0;i<=8;i++)
{ portd=temp;
delay_ms(50);//chèn thêm lệnh này cho dễ quan sát
temp<<=1;
}}
//++++++++++++++++++
void pro4(){
portd=0b11110000;
delay_ms(200);
portd=0b00001111;
delay_ms(200);
}
Hình Kèm Theo
File Type: jpg sua_lai.jpg (187.7 KB, 14 lần tải)
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.

thay đổi nội dung bởi: tdm, 16-06-2011 lúc 02:55 PM.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-06-2011, 07:16 PM   #2
pstin
Đệ tử 7 túi
 
Tham gia ngày: Jul 2010
Nơi Cư Ngụ: TP HCM
Bài gửi: 190
:
Chiêu trong nút nhấn.

- Chiêu 1: Là khi nhấn phím thì phải chờ cho nó nhả rồi mới thực hiện lệnh. Đoạn dưới là khi phím mode được nhấn thì set thời gian cho DS1307, sau đó qua tiếp trang 3.

If (mode==1)
{
while(mode==1)
{output_high(PIN_B1);
delay_ms(10);
}
output_low(PIN_B1);
ds1307_set_date_time(day,mth,year,dow,hr,min,sec);
delay_us(10);
lcd_refresh();
ttmode=3;
count=0;

}

- Chiêu 2: Là khi phím nhấn đang được nhấn thì tăng hay giảm giá trị liên tục. Thời gian 250ms là tương đối chuẩn. Đoạn dưới là khi phím "len" được nhấn thì tăng giá trị của giờ hoặc phút. Nhấn rồi thả thì tăng 1 đơn vị, nhấn luôn thì tăng liên tục.
Biến count là để đêm thời gian thực hiện ngắt timer để thoát khỏi trang hiện tại khi không có ai nhấn phím. Nếu không thì vđk cứ ở hoài trang chỉnh thì "trớt wớt"!!!!!!!!
if(len==1)

{
while(len==1)
{ output_high(PIN_B1);
count=0;
if(vitrichinh==0)
{
min=min+1;
if(min==60) min=0;
delay_ms(250);
lcd_gotoxy(10,2);
lcd_putc(min/10+0x30);
lcd_gotoxy(11,2);
lcd_putc(min%10+0x30);
lcd_gotoxy(11,2);
lcd_send_byte(0,0x0f);
}
if(vitrichinh==1)
{
hr=hr+1;
if(hr==24) hr=0;
delay_ms(250);
lcd_gotoxy(7,2);
lcd_putc(hr/10+0x30);
lcd_gotoxy(8,2);
lcd_putc(hr%10+0x30);
lcd_gotoxy(8,2);
lcd_send_byte(0,0x0f);
}
}
output_low(PIN_B1);
}

Nói chung là còn "dấu nghề" do cái bịnh của xứ VN ta từ xưa tới nay, anh em chịu khó thui. Cái chuyện phím nhấn này làm được nhiều thứ đó.

thay đổi nội dung bởi: pstin, 16-06-2011 lúc 07:24 PM.
pstin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-06-2011, 09:58 PM   #3
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi pstin View Post
- Chiêu 1: Là khi nhấn phím thì phải chờ cho nó nhả rồi mới thực hiện lệnh. Đoạn dưới là khi phím mode được nhấn thì set thời gian cho DS1307, sau đó qua tiếp trang 3.

If (mode==1)
{
while(mode==1)
{output_high(PIN_B1);
delay_ms(10);
}
output_low(PIN_B1);
ds1307_set_date_time(day,mth,year,dow,hr,min,sec);
delay_us(10);
lcd_refresh();
ttmode=3;
count=0;

}

- Chiêu 2: Là khi phím nhấn đang được nhấn thì tăng hay giảm giá trị liên tục. Thời gian 250ms là tương đối chuẩn. Đoạn dưới là khi phím "len" được nhấn thì tăng giá trị của giờ hoặc phút. Nhấn rồi thả thì tăng 1 đơn vị, nhấn luôn thì tăng liên tục.
Biến count là để đêm thời gian thực hiện ngắt timer để thoát khỏi trang hiện tại khi không có ai nhấn phím. Nếu không thì vđk cứ ở hoài trang chỉnh thì "trớt wớt"!!!!!!!!
if(len==1)

{
while(len==1)
{ output_high(PIN_B1);
count=0;
if(vitrichinh==0)
{
min=min+1;
if(min==60) min=0;
delay_ms(250);
lcd_gotoxy(10,2);
lcd_putc(min/10+0x30);
lcd_gotoxy(11,2);
lcd_putc(min%10+0x30);
lcd_gotoxy(11,2);
lcd_send_byte(0,0x0f);
}
if(vitrichinh==1)
{
hr=hr+1;
if(hr==24) hr=0;
delay_ms(250);
lcd_gotoxy(7,2);
lcd_putc(hr/10+0x30);
lcd_gotoxy(8,2);
lcd_putc(hr%10+0x30);
lcd_gotoxy(8,2);
lcd_send_byte(0,0x0f);
}
}
output_low(PIN_B1);
}

Nói chung là còn "dấu nghề" do cái bịnh của xứ VN ta từ xưa tới nay, anh em chịu khó thui. Cái chuyện phím nhấn này làm được nhiều thứ đó.
code trên là của 'halinh12sinh' nếu bạn muốn giúp thì hãy sửa thẳng trên code của bạn ấy, để người mới học có cái nhìn trực quan hơn.
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-06-2011, 12:17 PM   #4
halinh12sinh
Đệ tử 1 túi
 
Tham gia ngày: Jun 2011
Bài gửi: 14
:
Smile

Trích:
Nguyên văn bởi tdm View Post
sửa lại như hình gửi kèm thì nó chạy thôi.
code của em chạy cũng được ,nhưng có nhược điểm khi chuyển chế độ khác nó phải làm hết chế độ cũ rồi mới chuyển.
Code:
#include <16F877A.h>

#FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=4000000)
int8 mode,i;
byte temp;
#byte portb=0x06
#byte portd=0x08
#byte trisb=0x86
#byte trisd=0x88
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#INT_EXT
EXT_ISR(){
mode++;
if(mode==5) mode=0;
}

void pro1();
void pro2();
void pro3();
void pro4();

void main(){
trisd=0x00;
trisb=0b00000001;
portd=0xff;
enable_interrupts(INT_EXT);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);
mode=0;
while(1)
{ switch(mode){
 case 0:
  portd=0xff;
  break;
  case 1:pro1();break;
  case 2:pro2();break;
  case 3:pro3();break;
  case 4:pro4();break;
}}
}
//+++++++++++++++++++++++++++++++++++
void pro1(){

portd=0b11111111;
delay_ms(200);
portd=0b00000000;
delay_ms(200);
}
//+++++++++++++++++++++++++++++++++
void pro2(){
temp=0xFF;
for(i=0;i<=8;i++)
{ portd=temp;
delay_ms(50);//chèn thêm lệnh này cho dễ quan sát
  temp>>=1;
}
}
//+++++++++++++
void pro3(){
temp=0xFF;
for(i=0;i<=8;i++)
{ portd=temp;
delay_ms(50);//chèn thêm lệnh này cho dễ quan sát
temp<<=1;
}}
//++++++++++++++++++
void pro4(){
portd=0b11110000;
delay_ms(200);
portd=0b00001111;
delay_ms(200);
}
anh có thể chỉ cho em cách khắc phục nhược điểm mà anh nói được không?thanks anh trước hj
halinh12sinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 02:38 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam