Skip to content

Instantly share code, notes, and snippets.

@bc080401210
Created July 27, 2016 13:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bc080401210/0098f790ec1ebed3cd9ebc1743a0e710 to your computer and use it in GitHub Desktop.
Save bc080401210/0098f790ec1ebed3cd9ebc1743a0e710 to your computer and use it in GitHub Desktop.
#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