You are on page 1of 11

include <16f877a.

h>
device*=16 adc=10
fuses hs,noprotect,nolvp,nowdt,noput
use delay(clock=20000000)
#use fast_io(b)
#use fast_io(a)
byte porta=0x05
#byte portb=0x06
bit sck= portB.0
#bit data= portB.1
#bit scl= portB.3
void write_data( unsigned char a,b)
{
unsigned int i, temp;
for(i=0; i<8; i++)
{
temp=a;
temp=temp&0x80;
if (temp == 0x80)
data=1;
else
data=0;
a=a*2;
sck=0;
sck=1;
}
for(i=0; i<8; i++)
{
temp=b;
temp=temp&0x80;
if (temp == 0x80)
data=1;
else data=0;
b=b*2;
sck=0;
sck=1;
}
scl=0;
scl=1;
}
void main()
{
set_tris_A(0xff);

set_tris_B(0x00);
float adc_value;
unsigned char v,dozens, unit;
setup_adc_ports(AN0);
setup_adc(ADC_clock_internal);
delay_ms(10);
set_adc_channel(0);
while(1)
{
const unsigned char led_7_seg[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
adc_value= read_ADC();
adc_value= adc_value/2.048;
v= (int)adc_value;
dozens= v/10;
unit=v%10;
write_data(led_7_seg[dozens],led_7_seg[unit] ) ;
}
}

Code week 6 (temporary):


#include <16f877a.h>
#use delay(clock=1000000)
#FUSES NOWDT, HS, NOLVP
#use fast_io(b)
#use i2c(master,sda = PIN_C4,scl = PIN_C3)
#include "ds1307.c"
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4
PIN_D4
#define LCD_DATA5
PIN_D5
#define LCD_DATA6
PIN_D6
#define LCD_DATA7
PIN_D7
#include <lcd.c>

static unsigned char keypad_4x4[4][3] = {'1','2','3','4'


'5','6','7','8'
'9','o','0','E'};
unsigned char scan_code[3] = {0xC1,0xA1,0x61};
int key,m,q,key_flag = 0;
int8 sec,min,hrs,day,month,yr,dow;

int checkpad()
{
int i,j,keyin;
for(i=1;i<5;i++)
{
output_B(0xFF - (1<<i));
delay_us(10);
keyin = input_B()&0xE1;
if(keyin!=0xE1)
for(j=0;j<3;j++)
if(keyin==scan_code[j]) return keypad_4x4[i-1][j];
}
return 0;
}
void set_time() {
for(q=3;q<11;q++) {
while(1) {
lcd_gotoxy(q,2);
if((q==5)|(q==8)) break;
lcd_cursor_on(TRUE);
delay_ms(50);
lcd_cursor_on(FALSE);

key = checkpad();
if(key==0) key_flag = 0;
if(key&&(key_flag==0)) {
key_flag = 1;
lcd_putc(key);
delay_ms(500); break;
}
}
}
hrs = (lcd_getc(3,2) - 48)*10 + (lcd_getc(4,2) - 48);
min = (lcd_getc(6,2) - 48)*10 + (lcd_getc(7,2) - 48);
sec = (lcd_getc(9,2) - 48)*10 + (lcd_getc(10,2) - 48);
}

void set_date() {
for(q=5;q<13;q++) {
while(1) {
lcd_gotoxy(q,2);
if((q==7)|(q==10)) break;
lcd_cursor_on(TRUE);
delay_ms(50);
lcd_cursor_on(FALSE);
key = checkpad();
if(key&&(key_flag==0)) {
key_flag = 1;
lcd_putc(key);
delay_ms(500); break;
}
else if(key==0) key_flag = 0;
}
}
yr = (lcd_getc(5,2) - 48)*10 + (lcd_getc(6,2) - 48);
month = (lcd_getc(8,2) - 48)*10 + (lcd_getc(9,2) - 48);
day = (lcd_getc(11,2) - 48)*10 + (lcd_getc(12,2) - 48);
}

void display()
{
while(1) {
ds1307_get_date(day,month,yr,dow);
ds1307_get_time(hrs,min,sec);
lcd_gotoxy(1,1);
lcd_putc("Time:");
lcd_gotoxy(6,1);
lcd_putc(hrs/10+48);
lcd_putc(hrs%10+48);
lcd_putc(':');
lcd_putc(min/10+48);
lcd_putc(min%10+48);
lcd_putc(':');

lcd_putc(sec/10+48);
lcd_putc(sec%10+48);

lcd_gotoxy(1,2);
lcd_putc("Date:");
lcd_gotoxy(6,2);
lcd_putc(day/10+48);
lcd_putc(day%10+48);
lcd_putc('-');
lcd_putc(month/10+48);
lcd_putc(month%10+48);
lcd_putc('-');
lcd_putc("20");
lcd_putc(yr/10+48);
lcd_putc(yr%10+48);
}
}

void me_cmn_nu()
{
lcd_putc('\f');
while(1) {
lcd_gotoxy(1,1);
lcd_putc("1: Adjust time");
lcd_gotoxy(1,2);
lcd_putc("2: Hen gio");
key = checkpad();
if(key=='1') { m = 1; break; }
else if(key=='2') { m = 2; break; }
else if(key=='E') { m = 0; break; }
}
delay_ms(500);
lcd_putc('\f');
switch(m) {
case 0: break;
case 1: {
while(1) {
lcd_putc("Setting time:");
lcd_gotoxy(3,2);
lcd_putc("HH:MM:SS");
set_time();
break;
}
lcd_putc('\f');
while(1) {
lcd_putc("Setting date:");
lcd_gotoxy(3,2);
lcd_putc("20YY:MM:DD");
set_date();
break;
}

ds1307_set_date_time(day,month,yr,dow,hrs,min,sec);
break;
}
case 2: {
lcd_putc("DEO hen gio");
delay_ms(1000);
break;
}
}
lcd_putc('\f');
delay_ms(500);
}

#int_EXT
void hienthi()
{
clear_interrupt(int_EXT);
disable_interrupts(GLOBAL);
me_cmn_nu();
enable_interrupts(GLOBAL);
}

void main()
{
output_low(LCD_RW_PIN);
set_tris_B(0xE1);
lcd_init();
delay_ms(10);
ds1307_init();
ds1307_set_date_time(1,3,14,7,23,59,40);
enable_interrupts(int_EXT);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);
lcd_putc('\f');
display();
}

Code week 6 (version 2.0 still temporary):


#include <16f877a.h>
#use delay(clock=200000)
#FUSES NOWDT, HS, NOLVP
#use fast_io(b)
#use i2c(master,sda = PIN_C4,scl = PIN_C3)
#include "ds1307.c"
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4
PIN_D4
#define LCD_DATA5
PIN_D5
#define LCD_DATA6
PIN_D6
#define LCD_DATA7
PIN_D7
#include <lcd.c>

static unsigned char keypad_4x4[4][3] = {'1','2','3','4'


'5','6','7','8'
'9','o','0','E'};
unsigned char scan_code[3] = {0xC1,0xA1,0x61};
int key,m,t = 0,q,key_flag = 0,exit = 0;
int8 sec,min,hrs,day,month,yr,dow;
int8 x,y,z;

int checkpad()
{
int i,j,keyin;
for(i=1;i<5;i++)
{
output_B(0xFF - (1<<i));
delay_us(10);
keyin = input_B()&0xE1;
if(keyin!=0xE1)
for(j=0;j<3;j++)
if(keyin==scan_code[j]) return keypad_4x4[i-1][j];
}
return 0;
}
void nhap_so(int x,int y)
{
while(1) {

lcd_gotoxy(x,y);
lcd_cursor_on(TRUE);
delay_ms(50);
lcd_cursor_on(FALSE);
key = checkpad();
if(key==0) key_flag = 0;
if(key=='E') { exit = 1; break; }
else if(key=='o') { m = 0; break; }
if(key&&(key_flag==0)) {
key_flag = 1;
lcd_putc(key);
delay_ms(500);
break;
}
}
}

void set_time() {
for(q=3;q<11;q++) {
if((exit)|(m==0)) break;
if((q==5)|(q==8)) continue;
nhap_so(q,2);
if(q==10) q=2;
}
hrs = (lcd_getc(3,2) - 48)*10 + (lcd_getc(4,2) - 48);
min = (lcd_getc(6,2) - 48)*10 + (lcd_getc(7,2) - 48);
sec = (lcd_getc(9,2) - 48)*10 + (lcd_getc(10,2) - 48);
}

void set_date() {
for(q=5;q<13;q++) {
if((exit)|(m==0)) break;
if((q==7)|(q==10)) continue;
nhap_so(q,2);
if(q==12) q=4;
}
yr = (lcd_getc(5,2) - 48)*10 + (lcd_getc(6,2) - 48);
month = (lcd_getc(8,2) - 48)*10 + (lcd_getc(9,2) - 48);
day = (lcd_getc(11,2) - 48)*10 + (lcd_getc(12,2) - 48);
}

void check_time_date() {
if(hrs>=24) hrs = 0;

if(min>=60) min = 0;
if(sec>=60) sec = 0;
if((month==0)|(month>12)) month = 1;
}

void hen_gio() {
for(q=3;q<11;q++) {
if((exit)|(m==0)) break;
if((q==5)|(q==8)) continue;
nhap_so(q,2);
if(q==10) q=2;
}
x = (lcd_getc(3,2) - 48)*10 + (lcd_getc(4,2) - 48);
y = (lcd_getc(6,2) - 48)*10 + (lcd_getc(7,2) - 48);
z = (lcd_getc(9,2) - 48)*10 + (lcd_getc(10,2) - 48);
}

void display()
{
while(1) {
ds1307_get_date(day,month,yr,dow);
ds1307_get_time(hrs,min,sec);
lcd_gotoxy(1,1);
lcd_putc("Time:");
lcd_gotoxy(6,1);
lcd_putc(hrs/10+48);
lcd_putc(hrs%10+48);
lcd_putc(':');
lcd_putc(min/10+48);
lcd_putc(min%10+48);
lcd_putc(':');
lcd_putc(sec/10+48);
lcd_putc(sec%10+48);

lcd_gotoxy(1,2);
lcd_putc("Date:");
lcd_gotoxy(6,2);
lcd_putc(day/10+48);
lcd_putc(day%10+48);
lcd_putc('-');
lcd_putc(month/10+48);
lcd_putc(month%10+48);
lcd_putc('-');
lcd_putc("20");
lcd_putc(yr/10+48);

lcd_putc(yr%10+48);
if(((x==hrs)&&(y==min)&&(z==sec))|t) {
t = 1;
output_high(PIN_E0);
}
}
}

void menu()
{
lcd_putc('\f');
while(1) {
lcd_gotoxy(1,1);
lcd_putc("1: Adjust time");
lcd_gotoxy(1,2);
lcd_putc("2: Hen gio");
key = checkpad();
if(key=='1') { m = 1; break; }
else if(key=='2') { m = 2; break; }
else if(key=='E') { m = 0; break; }
}
delay_ms(500);
lcd_putc('\f');
switch(m) {
case 0: break;
case 1: {
while(1) {
lcd_putc("Setting time:");
lcd_gotoxy(3,2);
lcd_putc("HH:MM:SS");
set_time();
delay_ms(200);
break;
}
m = 1;
if(exit) break;
lcd_putc('\f');
while(1) {
lcd_putc("Setting date:");
lcd_gotoxy(3,2);
lcd_putc("20YY:MM:DD");
set_date();
break;
}
check_time_date();
ds1307_set_date_time(day,month,yr,dow,hrs,min,sec);

break;
}
case 2: {
while(1) {
lcd_putc("Setting time:");
lcd_gotoxy(3,2);
lcd_putc("HH:MM:SS");
hen_gio();
break;
}
break;
}
}
lcd_putc('\f');
delay_ms(200);
}

#int_EXT
void hienthi()
{
clear_interrupt(int_EXT);
disable_interrupts(GLOBAL);
menu();
enable_interrupts(GLOBAL);
}

void main()
{
output_low(LCD_RW_PIN);
set_tris_B(0xE1);
set_tris_E(0x00);
output_low(PIN_E0);
lcd_init();
delay_ms(10);
ds1307_init();
ds1307_set_date_time(1,3,14,7,23,59,40);
enable_interrupts(int_EXT);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);
lcd_putc('\f');
display();
}

You might also like