Code:
/**********************************************************************************************
* Mo ta : Nhan phim ma tran phim, 8 led portD hien so tuong ung 0-15, so nay cung duoc goi
* len may tinh bang giao tiep RS232
*----------------------------------------------------------------------------------------------
* Phan cung : PIC16F877A, thach anh 10MHz
* ma tran phim noi voi portB, 8 led don noi voi portD qua tro han dong 220R
* Pic giao tiep RS232 voi may tinh
*----------------------------------------------------------------------------------------------
* Nguoi viet: nhh
* Ngay viet : 12/11/06
* Trinh dich: CCS C v3.013
***********************************************************************************************/
#include <DEFS_16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock = 10000000)
#use rs232(baud = 9600,xmit = pin_C6,rcv = pin_C7)
#define key_port PORTB
#define key_tris TRISB
#define led_port PORTD
#define led_tris TRISD
/*---------------------------------------------------------------------------------------------
Khai bao bien toan cuc
---------------------------------------------------------------------------------------------*/
const unsigned char number[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
/*---------------------------------------------------------------------------------------------
Khai bao nguyen mau cac ham su dung
---------------------------------------------------------------------------------------------*/
void column_check(unsigned char);
void key_scan(void);
/*---------------------------------------------------------------------------------------------
Ham kiem tra hang nao trong cot column xuong 0
---------------------------------------------------------------------------------------------*/
void column_check(unsigned char column)
{
switch(column)
{
case 0:
{
if(!bit_test(key_port,0))
{
while(!bit_test(key_port,0));
delay_ms(10);
led_port = number[0];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,1))
{
while(!bit_test(key_port,1));
delay_ms(10);
led_port = number[1];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,2))
{
while(!bit_test(key_port,2));
delay_ms(10);
led_port = number[2];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,3))
{
while(!bit_test(key_port,3));
delay_ms(10);
led_port = number[3];
printf("%u\n\r",led_port);
}
}
break;
case 1:
{
if(!bit_test(key_port,0))
{
while(!bit_test(key_port,0));
delay_ms(10);
led_port = number[4];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,1))
{
while(!bit_test(key_port,1));
delay_ms(10);
led_port = number[5];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,2))
{
while(!bit_test(key_port,2));
delay_ms(10);
led_port = number[6];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,3))
{
while(!bit_test(key_port,3));
delay_ms(10);
led_port = number[7];
printf("%u\n\r",led_port);
}
}
break;
case 2:
{
if(!bit_test(key_port,0))
{
while(!bit_test(key_port,0));
delay_ms(10);
led_port = number[8];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,1))
{
while(!bit_test(key_port,1));
delay_ms(10);
led_port = number[9];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,2))
{
while(!bit_test(key_port,2));
delay_ms(10);
led_port = number[10];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,3))
{
while(!bit_test(key_port,3));
delay_ms(10);
led_port = number[11];
printf("%u\n\r",led_port);
}
}
break;
case 3:
{
if(!bit_test(key_port,0))
{
while(!bit_test(key_port,0));
delay_ms(10);
led_port = number[12];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,1))
{
while(!bit_test(key_port,1));
delay_ms(10);
led_port = number[13];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,2))
{
while(!bit_test(key_port,2));
delay_ms(10);
led_port = number[14];
printf("%u\n\r",led_port);
}
if(!bit_test(key_port,3))
{
while(!bit_test(key_port,3));
delay_ms(10);
led_port = number[15];
printf("%u\n\r",led_port);
}
}
break;
}
}
/*---------------------------------------------------------------------------------------------
Ham quet phim
---------------------------------------------------------------------------------------------*/
void key_scan(void)
{
int count;
for(count = 4;count <= 7; count++)
{
key_tris = 0xF0; // cot ngo vao, hang ngo ra
key_port = 0xF0; // cot muc 1, hang muc 0
if(!bit_test(key_port,count)) // cot count xuong 0 chua?
{
delay_ms(10);
if(!bit_test(key_port,count)) // kiem tra lai cot count co xuong 0 ko?
{
key_tris = 0x0F; // cot ngo ra, hang ngo vao
key_port = 0xEF; // cot 0 xuong 0
column_check(0);
key_port = 0xDF; // cot 1 xuong 0
column_check(1);
key_port = 0xBF; // cot 2 xuong 0
column_check(2);
key_port = 0x7F; // cot 3 xuong 0
column_check(3);
}
}
}
}
/*---------------------------------------------------------------------------------------------
Chuong trinh chinh
---------------------------------------------------------------------------------------------*/
void main(void)
{
led_tris = 0x00;
led_port = 0xFF;
while(true)
{
key_scan();
}
}