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

Ðề tài đã khoá
 
Ðiều Chỉnh Xếp Bài
Old 26-04-2006, 12:38 PM   #31
minhpic
Đệ tử 9 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 99
:
Đúng là mọi người không chịu vào hết các trang mà mình quan tâm, địa chỉ các thanh ghi cũng như các thứ khác các bạn lấy ở đây.
File Kèm Theo
File Type: txt DEFS_F87X.txt (7.5 KB, 1706 lần tải)
File Type: txt defs_f84.txt (2.6 KB, 1138 lần tải)

thay đổi nội dung bởi: minhpic, 26-04-2006 lúc 12:46 PM.
minhpic vẫn chưa có mặt trong diễn đàn  
Old 26-04-2006, 12:50 PM   #32
minhpic
Đệ tử 9 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 99
:
Mình xem qua các chương trình cậu viết ở trên đều không sai nhưng chưa tối ưu, các cậu cứ xem phần chương trình bên asm thì rõ, vấn đề này cũng đã được thảo luận rất nhiều rồi mà. Các file mình đưa ra xẽ giúp chúng ta hỗ trợ thêm cách lập trình bằng C, và đến một lúc nào đó nếu các bạn đã thông tư tưởng của mình thì, lúc đấy viết trên HTpic hay CCs đều không khác nhau.
minhpic vẫn chưa có mặt trong diễn đàn  
Old 28-04-2006, 10:45 PM   #33
vnt3140
Nhập môn đệ tử
 
Tham gia ngày: Nov 2005
Bài gửi: 2
:
Gửi nhh:
Bài : Giải mã bàn phím
Mạch quét 16 phím, hiện kết quả lên led 7 đoạn.
Trong chuong trinh thieu dinh nghia
#byte intcon=0x000B
và port xuất ra led 7 đoạn là PORTC không phải portd như hình vẽ.
vnt3140 vẫn chưa có mặt trong diễn đàn  
Old 29-04-2006, 10:22 AM   #34
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
To vnt3140

Đúng là trong đó hình vẽ và chương trình có nhầm portc và portd, do khi chạy proteus và mạch thật thiết lập port ok nhưng khi vẽ ORCAD bị nhầm.
Các bạn chỉ thay đổi chút xíu thôi mà!

Còn chưa định nghĩa byte intcon, sao bạn chỉ phát hiện ra nó, còn các bít RBx nữa thì sao.....Nhưng tất cả đã được định nghĩa trong file defs_16F877A.h.Mình nhớ đã gởi file này lên rồi nhưng bây giờ tìm lại không thấy đâu cả.Pó tay luôn ! Dạo này sao lú lẫn quá!Mình sẽ gởi lên sau!
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn  
Old 29-04-2006, 03:01 PM   #35
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
Trích:
Nguyên văn bởi nhh
Chào cả nhà !

Sao không thấy bác nào post bài vào luồng này vậy kà !Trầm quá...!Trầm quá...!Hay cái CCS C này không hấp dẫn mọi người chăng!
Không ai viết gì, tớ vẫn post cho nó đỡ trầm....!

Đã ví dụ về ngắt Timer, sau đây là 2 ví dụ về ngắt ngoài trên chân RB0 và trên các chân RB4 đến RB7:

Chương trình sau dùng ngắt ngoài trên RB0 đếm số lần cái button được nhấn xuống, hiển thị lên led 7 đoạn (common cathode).Nếu số lần nhấn vượt quá 9, chương trình sẽ quay về hiển thị lên led từ số 1.
Code:
//*****************************************************************************
// Author  : nhh
// Date    : 03/04/06
// Hardware: PIC16F877A
//*****************************************************************************
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
#byte portb=0x06
#byte portd=0x08
const unsigned char digital[]={0b00000110, 0b01011011, 0b01001111, 0b01100110,\
						0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111};
                  // ma hoa digital duoi dang mang
// Chuong trinh ngat
#int_ext
void ngat_RB0()
{
int i;
   if(i<9)
      {
      portd=digital[i];
      ++i;
      }
   if(i==9)
      {
      i=0;
      }
}
// Chuong trinh chinh
main()
{
set_tris_b(0b00000001);
set_tris_d(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
portd=0b00111111;
while(true)
   {
   // chi doi ngat nen vong lap nay ko co gi ca !
   }
}
Theo tại hạ, hàm ngắt trên có vấn đề. Ở chỗ khai báo biến i. Biến i là biến cục bộ của hàm ngắt, vậy khi ra khỏi ngắt biến i sẽ bị mất khỏi bộ nhớ tức không được cấp phát ô nhớ. Lần sau ngắt xảy ra thì biến i này sẽ được khai báo lại. Tóm lại vần đề là tầm khai báo biến.
Bác nên khai báo biến i là biến toàn cục thì mới có khả năng đếm số lần ngắt.
Chúc khỏe.
hpecom.
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..
hpecom vẫn chưa có mặt trong diễn đàn  
Old 29-04-2006, 03:27 PM   #36
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
Trích:
Nguyên văn bởi nhh
Mạch quét 16 phím, hiện kết quả lên led 7 đoạn.
Code:
//*****************************************************************************
// Author  : nhh
// Date    : 03/04/06
// Hardware: PIC16F877A
//*****************************************************************************
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#byte portb = 0x06
#byte portc = 0x07
#bit RB0 = 0x06.0
#bit RB1 = 0x06.1
#bit RB2 = 0x06.2
#bit RB3 = 0x06.3
#bit RB4 = 0x06.4
#bit RB5 = 0x06.5
#bit RB6 = 0x06.6
#bit RB7 = 0x06.7
#bit RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int a;
const unsigned char dig[]={0b00111111,0b00000110, 0b01011011,0b01001111,\
0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111,0b01110111,\
0b01111100,0b00111001,0b01011110,0b11111001,0b11110001};
                  // ma hoa digital duoi dang mang
// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
   {
         {
         if(RB4&&RB0)
         a=dig[0];
         }
         {
         if(RB4&&RB1)
         a=dig[4];
         }
         {
         if(RB4&&RB2)
         a=dig[8];
         }
         {
         if(RB4&&RB3)
         a=dig[12];
         }
//.......
         {
         if(RB5&&RB0)
         a=dig[1];
         }
         {
         if(RB5&&RB1)
         a=dig[5];
         }
         {
         if(RB5&&RB2)
         a=dig[9];
         }
         {
         if(RB5&&RB3)
         a=dig[13];
         }
//........
          {
         if(RB6&&RB0)
         a=dig[2];
         }
         {
         if(RB6&&RB1)
         a=dig[6];
         }
         {
         if(RB6&&RB2)
         a=dig[10];
         }
         {
         if(RB6&&RB3)
         a=dig[14];
         }
//........
          {
         if(RB7&&RB0)
         a=dig[3];
         }
         {
         if(RB7&&RB1)
         a=dig[7];
         }
         {
         if(RB7&&RB2)
         a=dig[11];
         }
         {
         if(RB7&&RB3)
         a=dig[15];
         }
   RBIF=0; //Xoa co ngat RB
   }
}
// Chuong trinh chinh
main()
{
set_tris_b(0b11110000);
set_tris_c(0);
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
portb=0;
portc=0;
while(true)
   {
   portb=1;
   portb=2;
   portb=4;
   portb=8;
   portc=a;
   }
}
Bác nên treo các chân lên nguồn và quét mức thấp vì nếu bác bỏ hở chân như thế thì có khả năng nhiễu làm cho chương trình mất ổn định.
Chúc sức khỏe.
hpecom.
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..
hpecom vẫn chưa có mặt trong diễn đàn  
Old 29-04-2006, 07:06 PM   #37
tuan2007
Nhập môn đệ tử
 
Tham gia ngày: Apr 2006
Bài gửi: 1
:
minh dang lam ve de tai dieu khien ma tran led
da co ai nghien cuu ve van de nay chua
neu co tai lieu thi gui cho minh voi
cam on nhe
tuan2007 vẫn chưa có mặt trong diễn đàn  
Old 02-05-2006, 08:07 PM   #38
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Talking

Trích:
Nguyên văn bởi vnt3140
Gửi nhh:
Bài : Giải mã bàn phím
Mạch quét 16 phím, hiện kết quả lên led 7 đoạn.
Trong chuong trinh thieu dinh nghia
#byte intcon=0x000B
và port xuất ra led 7 đoạn là PORTC không phải portd như hình vẽ.
Thật ra thì không thiếu định nghĩa này đâu bạn, mình đã định nghĩa các bit cần dùng của nó trong chương trình rồi.

Để cho việc viết chương trình được thuận lợi hơn, những lần sau nên include cái file DEFS_16F877A.h vào để không phải khai báo dài dòng nữa !
File Kèm Theo
File Type: rar DEFS_16F877A.rar (542 Bytes, 1895 lần tải)
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn  
Old 05-05-2006, 09:38 AM   #39
ncv
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 16
:
Chương trình gửi ký tự ra 2x16 LCD dùng CCS C

Chương trình gửi ký tự ra 2x16 LCD dùng CCS C

#include "16F877A.h" // PIC16F877A header file
#use delay(clock=4000000) // for 4Mhz crystal
#fuses XT, NOWDT, NOPROTECT, NOLVP // for debug mode

#define WRITE_DATA 0
#define WRITE_COMMAND 1

#define NCHAR_PER_LINE 16 // max char numbers per line
#define MS10 10 // 10 milliseconds
#define US400 400 // 400 microseconds

#define LCD_RS PIN_A1
#define LCD_RW PIN_A2
#define LCD_E PIN_A3

///////////////////////////////////////////////////////////
//
/* private */ void lcd_write(byte dat, int1 option) {
delay_us(US400);
if (option == WRITE_DATA)
output_high(LCD_RS);
else // option == WRITE_COMMAND
output_low(LCD_RS);
output_low(LCD_RW);
output_b(dat);

output_high(LCD_E);
delay_us(US400);
output_low(LCD_E);
}

///////////////////////////////////////////////////////////
//
void lcd_init(void) {
output_low(LCD_E); // Let LCD E line low

lcd_write(0x38, WRITE_COMMAND); // Set LCD 16x2, 5x7, 8bits data
delay_ms(15);
lcd_write(0x01, WRITE_COMMAND); // Clear LCD display
delay_ms(MS10);
lcd_write(0x0f, WRITE_COMMAND); // Open display & current
delay_ms(MS10);
lcd_write(0x06, WRITE_COMMAND); // Window fixed (Character Entry Mode?)
delay_ms(MS10);
}

///////////////////////////////////////////////////////////
//
void lcd_display_char(int8 line, int8 pos, char ch) {
line = (line == 0) ? 0 : 1;
pos = (pos > NCHAR_PER_LINE) ? NCHAR_PER_LINE : pos;

lcd_write(0x80 + 0x40 * line + pos, WRITE_COMMAND);
lcd_write(ch, WRITE_DATA);
}

///////////////////////////////////////////////////////////
void lcd_display_str(int8 line, char str[], int8 nchars) {
int8 i;
for (i = 0; i < nchars; i++)
lcd_display_char(line, i, str[i]);
}

///////////////////////////////////////////////////////////
/**
* Display characters to a 2x16 LCD
*
* (1) LCD1 to GND
* (2) LCD2 to VDD 5 volts
* (3) LCD4 (RS) - LCD5 (RW) - LCD6 (E) to A1, A2, A3
* (4) LCD7-LCD14 to B0-B7 (bus data)
*
* Ref: http://pic16.com/bbs/dispbbs.asp?boa...ID=5879&page=1
*/
void main(void) {
int8 i;
char LINE1[] = { "SGN Tech" };
char LINE2[] = { "Xin chao" };

lcd_init();

// use of lcd_display_char()
for (i = 0; i < 8; i++)
lcd_display_char(0, i, LINE1[i]);

// use of lcd_display_str
lcd_display_str(1, LINE2, 8);
}
ncv vẫn chưa có mặt trong diễn đàn  
Old 05-05-2006, 11:48 AM   #40
ncv
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 16
:
Re: Chương trình gửi ký tự ra 2x16 LCD dùng CCS C

CCS C có một ví dụ hay hơn: Chỉ cần dùng 4 bits D4-D7 của LCD:

Examples\EX_LCDKB.C

Trích:
Nguyên văn bởi ncv
Chương trình gửi ký tự ra 2x16 LCD dùng CCS C

#include "16F877A.h" // PIC16F877A header file
#use delay(clock=4000000) // for 4Mhz crystal
#fuses XT, NOWDT, NOPROTECT, NOLVP // for debug mode
...
}
ncv vẫn chưa có mặt trong diễn đàn  
Old 06-05-2006, 10:28 AM   #41
ncv
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 16
:
Ví dụ nhỏ về ngắt ngoài

Bình thường thì LED6 sáng, LED7 tối. Khi nhấn phím, LED6 tối, LED7 sáng
trong vòng 0,5 giây, rồi trở về trạng thái ban đầu (LED6 sáng, LED7 tối)

#include <16F877A.h>
#fuses NOWDT, XT
#use delay(clock=4000000)

void high_b6_low_b7() {
output_high(PIN_B6);
output_low(PIN_B7);
}

void low_b6_high_b7() {
output_low(PIN_B6);
output_high(PIN_B7);
}

///////////////////////////////////////////////////////////
#INT_EXT
void RB0_handler() {
low_b6_high_b7();
delay_ms(500);
high_b6_low_b7();
}

///////////////////////////////////////////////////////////
/**
* Keep B6 on and B7 off. Pressing the button causes interrupt:
* B6 off and B7 on, delay half second, then B6 on and B7 off
*
* Wiring (TM Board)
* (1) PIC's B0 to Matrix Key R0
* Matrix Key C0 to GND
* (2) PIC's B6-B7 to LED6-LED7
*
* Ref: Interrupt Mechanism
* http://www.mikroelektronika.co.yu/en...sicbook/06.htm
*/
void main() {
enable_interrupts(GLOBAL); // enable all interrupts
enable_interrupts(INT_EXT); // enable external interrupt from pin RB0/INT

high_b6_low_b7();
while (true) {
// do nothing
}
}
ncv vẫn chưa có mặt trong diễn đàn  
Old 06-05-2006, 01:56 PM   #42
ncv
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 16
:
Ngắt ngoài và đèn 7 đoạn

Một phương án khác:

#include <16F877A.h>
#fuses NOWDT, XT
#fuses NOLVP // important
#use delay(clock=4000000)

// 0 1 2 3 4 5 6 7 8 9
byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
int8 i = 0;

///////////////////////////////////////////////////////////
/* private */void off_on_led_transistor() {
output_low(PIN_D1);
delay_ms(1);
output_high(PIN_D1);
}

///////////////////////////////////////////////////////////
/* private */void display(int8 digit) {
output_c(DIGITS[digit] ^ 0xff);
off_on_led_transistor();
}

///////////////////////////////////////////////////////////
#INT_EXT
void ngat_RB0() {
i = (i < 9) ? i+1 : 1;
delay_ms(200); // switch debounce period
}

///////////////////////////////////////////////////////////
/**
* Count number of key presses and display it on a 7-segment LED.
* If the number is 9, the next count will be 1
*
* Wiring (TM Board)
* (1) PIC's B0 to R0
* Matrix Key C0 to GND
* (2) PIC's C0-C6 to 7-segment LED's A-G
* PIC's D1 to 7-segment LED's C2
*/
void main() {
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);

while (true)
display(i);
}

Trích:
Nguyên văn bởi nhh
Chào cả nhà !

Sao không thấy bác nào post bài vào luồng này vậy kà !Trầm quá...!Trầm quá...!Hay cái CCS C này không hấp dẫn mọi người chăng!
Không ai viết gì, tớ vẫn post cho nó đỡ trầm....!

Đã ví dụ về ngắt Timer, sau đây là 2 ví dụ về ngắt ngoài trên chân RB0 và trên các chân RB4 đến RB7:

Chương trình sau dùng ngắt ngoài trên RB0 đếm số lần cái button được nhấn xuống, hiển thị lên led 7 đoạn (common cathode).Nếu số lần nhấn vượt quá 9, chương trình sẽ quay về hiển thị lên led từ số 1.
Code:
//*****************************************************************************
// Author  : nhh
// Date    : 03/04/06
// Hardware: PIC16F877A
...
// Chuong trinh chinh
main()
{
set_tris_b(0b00000001);
set_tris_d(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
portd=0b00111111;
while(true)
   {
   // chi doi ngat nen vong lap nay ko co gi ca !
   }
}
ncv vẫn chưa có mặt trong diễn đàn  
Old 08-05-2006, 05:36 PM   #43
NTVinh
Đệ tử 2 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 32
:
Chương trình ví dụ sau mô tả cách dùng PWM do CCS cung cấp.
PWM là gì? sử dụng nó vào mục đích gì?
1) PWM là gì? PWM là một bộ điều chế độ rộng xung. Có hai thông số (tạm gọi đơn giản như vậy, và có lẽ cũng chỉ quan tâm đến hai thông số này với PWM) quan trọng của PWM là chu kỳ xung T và thời gian t1 của mức logic 0,
trong ví dụ này thì t1 tương ứng với value. Để "điều chế độ rộng xung" thì chúng ta sẽ giữ nguyên T và thay đổi t1, theo yêu cầu của bài toán cụ thể.
Value trong ví dụ sau lấy được từ đầu vào anlaog, chu kỳ (hay tần số) của xung được chọn lựa từ PC thông qua cổng truyền thông nối tiếp RS232.
2) PWM dùng vào mục đích gì? Có nhiều ứng dụng cho nó, ví dụ truyền thông, điều khiển các van bán dẫn trong các biến tần, làm bộ nguồn chuyển mạch,...ôi nhiều lắm!
Bắt đầu viết nhé:

#if defined(__PCM__)
#include <16F877.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK)

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=10000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK)
#endif


void main() {
char selection=1;
int8 value;



printf("\r\nFrequency:\r\n");
printf(" 1) 7.8 khz\r\n");
printf(" 2) 19.5 khz\r\n");
printf(" 3) 0.48 khz\r\n");
do {
selection=getc();
}while((selection<'1')||(selection>'3'));


setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM

// The cycle time will be (1/clock)*4*t2div*(period+1)
// In this program clock=4000000 and period=127 (below)
// For the three possible selections the cycle time is:
// (1/4000000)*4*1*128 = 12.8 us or 7.8 khz
// (1/4000000)*4*4*128 = 51.2 us or 19.5 khz
// (1/4000000)*4*16*128= 204.8 us or 0.48 khz
switch(selection) {
case '1' : setup_timer_2(T2_DIV_BY_1, 127, 1);
break;
case '2' : setup_timer_2(T2_DIV_BY_4, 127, 1);
break;
case '3' : setup_timer_2(T2_DIV_BY_16, 127, 1);
break;
}



setup_port_a(ALL_ANALOG);
setup_adc(adc_clock_internal);
set_adc_channel( 0 );
printf("%c\r\n",selection);

while( TRUE ) {
value=read_adc();
//value++;
printf("%2X\r",value);
set_pwm1_duty(value); //value may be an 8 or 16 bit constant or variable
// This sets the time the pulse is
// high each cycle. We use the A/D
// input to make a easy demo.
// the high time will be:
// if value is LONG INT:
// value*(1/clock)*t2div
// if value is INT:
// value*4*(1/clock)*t2div
// for example a value of 30 and t2div
// of 1 the high time is 30us
// WARNING: A value too high or low will
// prevent the output from
// changing.
}

}
Nguyen The Vinh.
NTVinh vẫn chưa có mặt trong diễn đàn  
Old 09-05-2006, 09:18 PM   #44
ncv
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 16
:
Chương trình hiển thị phím số ra đèn 7 đoạn (không dùng interrupt)

Code:
Chương trình hiển thị phím số trên ma trận phím 4x3 ra đèn 7 đoạn (không dùng interrupt)

#include <16F877A.h>
#fuses NOWDT, XT
#fuses NOLVP // important
#use delay(clock=4000000)

#include <kbd.c> // in PICC\Drivers

// 0 1 2 3 4 5 6 7 8 9
byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };

///////////////////////////////////////////////////////////
/* private */void off_on_led_transistor() {
output_low(PIN_D1);
delay_ms(1);
output_high(PIN_D1);
}

///////////////////////////////////////////////////////////
void display(int8 digit) {
output_c(DIGITS[digit] ^ 0xff);
off_on_led_transistor();
}

///////////////////////////////////////////////////////////
int8 char_to_digit(char c) {
return c & 0b00001111; // first 4 bits only
}

///////////////////////////////////////////////////////////
int1 digit_key_pressed(char key) {
byte pattern;
pattern = 0b00110000;
return (key & pattern) == pattern;
}

///////////////////////////////////////////////////////////
/**
* Echo digit-key presses (0 to 9) of a 4x3 keypad to the 7-segment LED
*
* Configuration:
* Use PORTB for keypad by uncommenting the following line in PICC\Drivers\KBDD.c
* #define use_portb_kbd TRUE
*
* Wiring: (TM Board)
* (1) PIC's B1-B7 to Matrix Keypad's R3-R0&C2-C0 (notice the reverse order)
* (2) PIC's C0-C6 to 7-segment LED's A-G
* PIC's D1 to 7-segment LED's C2
*/
void main() {
int8 i, digit;
char key;

kbd_init();
while (true) {
key = kbd_getc();
if (digit_key_pressed(key)) {
digit = char_to_digit(key);
for (i = 0; i < 200; i++) // repeat the display for human eyes
display(digit);
}
}
}

thay đổi nội dung bởi: falleaf, 12-05-2006 lúc 09:01 PM.
ncv vẫn chưa có mặt trong diễn đàn  
Old 12-05-2006, 05:24 PM   #45
ncv
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 16
:
Chương trình hiển thị phím số ra đèn 7 đoạn (DÙNG INTERRUPT)

Chương trình hiển thị phím số trên bàn phím 4x3 ra đèn 7 đoạn (DÙNG INTERRUPT).

#include <16F877A.h>
#fuses NOWDT, XT
#fuses NOLVP // important
#use delay(clock=4000000)

#include <kbd.c> // in PICC\Drivers

// 0 1 2 3 4 5 6 7 8 9
byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };

///////////////////////////////////////////////////////////
/* private */void off_on_led_transistor() {
output_low(PIN_D1);
delay_ms(1);
output_high(PIN_D1);
}

///////////////////////////////////////////////////////////
void display(int8 digit) {
output_c(DIGITS[digit] ^ 0xff);
off_on_led_transistor();
}

///////////////////////////////////////////////////////////
int8 char_to_digit(char c) {
return c & 0b00001111; // first 4 bits only
}

///////////////////////////////////////////////////////////
int1 digit_key_pressed(char key) {
byte pattern;
pattern = 0b00110000;
return (key & pattern) == pattern;
}

///////////////////////////////////////////////////////////
#INT_RB
void RB_handler() {
int8 i, digit;
char key;

key = kbd_getc();
if (digit_key_pressed(key)) {
digit = char_to_digit(key);
for (i = 0; i < 200; i++) // repeat the display for human eyes
display(digit);
}
}
///////////////////////////////////////////////////////////
/**
* Echo digit-key presses (0 to 9) of a 4x3 keypad to the 7-segment LED
*
* Configuration:
* Use PORTB for keypad by uncommenting the following line in PICC\Drivers\KBDD.c
* #define use_portb_kbd TRUE
*
* Wiring: (TM Board)
* (1) PIC's B1-B7 to Matrix Keypad's R3-R0&C2-C0 (notice the reverse order)
* (2) PIC's C0-C6 to 7-segment LED's A-G
* PIC's D1 to 7-segment LED's C2
*/
void main() {
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
kbd_init();
while (true) {
// do nothing
}
}
ncv vẫn chưa có mặt trong diễn đàn  
Ðề tài đã khoá


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

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
TUT ve I2C ( pic16f877a ) mafd_47a MPASM 26 07-05-2024 08:55 AM
TUT về USART trong PIC16F877A mafd_47a MPASM 11 04-05-2024 04:43 AM
Lập nhóm PIC16F877A nhh Cơ bản về vi điều khiển và PIC 285 08-03-2017 11:08 PM
Bộ so sánh và PWM cho PIC16F877A anhquangngai Cơ bản về vi điều khiển và PIC 24 08-09-2012 09:00 AM
Pic16f877a TỪ DỄ TỚi KhÓ ntc Cơ bản về vi điều khiển và PIC 373 23-05-2009 10:24 PM


Múi giờ GMT. Hiện tại là 03:35 AM.


Đượ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