Created
July 27, 2016 13:03
-
-
Save bc080401210/0098f790ec1ebed3cd9ebc1743a0e710 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <16F887.h> | |
#fuses HS,NOWDT,NOPROTECT,NOLVP | |
#use delay(crystal=4000000) | |
#define keypad_port PORTD | |
#define keypad_tris TRISD | |
#define init_segments() set_tris_b(0x00); | |
#define init_keypad() set_tris_d(0x0F); | |
#define c4 PIN_D7 | |
#define c3 PIN_D6 | |
#define c2 PIN_D5 | |
#define c1 PIN_D4 | |
#define r1 PIN_D3 | |
#define r2 PIN_D2 | |
#define r3 PIN_D1 | |
#define r4 PIN_D0 | |
unsigned char seg_code[]= | |
{0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0xFF};//a=pin7,g=pin1,dp=pin0 | |
#define disp1 PIN_C0 | |
#define disp2 PIN_C1 | |
#define disp3 PIN_C2 | |
#define disp4 PIN_C3 | |
unsigned char digit4=0,digit3=0,digit2=0,digit1=0; | |
unsigned char bac_d1=0,bac_d2=0,bac_d3=0,bac_d4=0; | |
void backup_digits() | |
{ | |
bac_d1=digit1; | |
bac_d2=digit2; | |
bac_d3=digit3; | |
bac_d4=digit4; | |
} | |
void restore_digits() | |
{ | |
digit1=bac_d1; | |
digit2=bac_d2; | |
digit3=bac_d3; | |
digit4=bac_d4; | |
} | |
void off_all_digits() | |
{ | |
digit1=10; | |
digit2=10; | |
digit3=10; | |
digit4=10; | |
} | |
void reset_digits() | |
{ | |
digit1=0;digit2=0;digit3=0;digit4=0; | |
} | |
void rotate_digits(unsigned char new_val) | |
{ | |
digit4=digit3; | |
digit3=digit2; | |
digit2=digit1; | |
digit1=new_val; | |
} | |
void mux4() | |
{ | |
output_b(seg_code[digit4]); | |
output_low(disp4); | |
delay_ms(1); | |
output_high(disp4); | |
output_b(seg_code[digit3]); | |
output_low(disp3); | |
delay_ms(1); | |
output_high(disp3); | |
output_b(seg_code[digit2]); | |
output_low(disp2); | |
delay_ms(1); | |
output_high(disp2); | |
output_b(seg_code[digit1]); | |
output_low(disp1); | |
delay_ms(1); | |
output_high(disp1); | |
} | |
void mdelay() | |
{ | |
int i=0; | |
for(i=0;i<13;i++) | |
{ | |
mux4(); | |
delay_ms(5); | |
} | |
} | |
int readkeypad (void) | |
{ | |
output_bit (r1, 0); | |
output_bit (r2, 0); | |
output_bit (r3, 0); | |
output_bit (r4, 0); | |
output_bit (r1, 1);//activate 1st row and scan for column | |
mdelay(); | |
//mdelay(); | |
IF (input (c1)) {while(input(c1)){mdelay();} RETURN 10;}; | |
IF (input (c2)) {while(input(c2)){mdelay();} RETURN 0;}; | |
IF (input (c3)) {while(input(c3)){mdelay();} RETURN 11;}; | |
IF (input (c4)) {while(input(c4)){mdelay();} RETURN 12;}; | |
output_bit (r1, 0);//Deactivate 1st row | |
output_bit (r2, 1);//activate 2nd row and scan for column | |
mdelay(); | |
//mdelay(); | |
IF (input (c1)) {while(input(c1)){mdelay();} RETURN 7;}; | |
IF (input (c2)) {while(input(c2)){mdelay();} RETURN 8;}; | |
IF (input (c3)) {while(input(c3)){mdelay();} RETURN 9;}; | |
IF (input (c4)) {while(input(c4)){mdelay();} RETURN 13;}; | |
output_bit (r2, 0);//Deactivate 2nd row | |
output_bit (r3, 1);//activate 3rd row and scan for column | |
mdelay(); | |
//mdelay(); | |
IF (input (c1)) {while(input(c1)){mdelay();} RETURN 4;}; | |
IF (input (c2)) {while(input(c2)){mdelay();} RETURN 5;}; | |
IF (input (c3)) {while(input(c3)){mdelay();} RETURN 6;}; | |
IF (input (c4)) {while(input(c4)){mdelay();} RETURN 14;}; | |
output_bit (r3, 0);//Deactivate 3rd row | |
output_bit (r4, 1);//activate 4th row and scan for column | |
mdelay(); | |
//mdelay(); | |
IF (input (c1)) {while(input(c1)){mdelay();} RETURN 1;}; | |
IF (input (c2)) {while(input(c2)){mdelay();} RETURN 2;}; | |
IF (input (c3)) {while(input(c3)){mdelay();} RETURN 3;}; | |
IF (input (c4)) {while(input(c4)){mdelay();} RETURN 15;}; | |
output_bit (r4, 0);//Deactivate 4th row | |
RETURN 255; | |
} | |
void count4_up() | |
{ | |
digit1++; | |
if(digit1>9) | |
{ | |
digit1=0; | |
digit2++; | |
if(digit2>9) | |
{ | |
digit2=0; | |
digit3++; | |
if(digit3>9) | |
{ | |
digit3=0; | |
digit4++; | |
if(digit4>9) | |
{ | |
digit4=0; | |
} | |
} | |
} | |
} | |
} | |
void count4_down() | |
{ | |
digit1--; | |
if(digit1==255) | |
{ | |
digit1=9; | |
digit2--; | |
if(digit2==255) | |
{ | |
digit2=9; | |
digit3--; | |
if(digit3==255) | |
{ | |
digit3=9; | |
digit4--; | |
if(digit4==255) | |
{ | |
digit4=9; | |
} | |
} | |
} | |
} | |
} | |
//------------------------------------------------- | |
void flash_all() | |
{ | |
char i=0; | |
for(i=0;i<3;i++) | |
{ | |
backup_digits(); | |
off_all_digits(); | |
mdelay(); | |
mdelay(); | |
mdelay(); | |
restore_digits(); | |
mdelay(); | |
mdelay(); | |
mdelay(); | |
} | |
} | |
//-------------------------------- | |
void main() | |
{ | |
int k=0; | |
init_segments(); | |
while(TRUE) | |
{ | |
k=readkeypad(); | |
if(k>-1 && k<10) | |
{ | |
rotate_digits(k); | |
} | |
else if(k==15) | |
{ | |
count4_up(); | |
flash_all(); | |
} | |
else if(k==14) | |
{ | |
count4_down(); | |
flash_all(); | |
} | |
else if(k==11) | |
{ | |
reset_digits(); | |
} | |
else if(k==12) | |
{ | |
flash_all(); | |
} | |
mdelay(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment