البرنامج :
كود:
/*
'*******************************************************************************
' Alphanumeric LCD and Push Button.
' Description:
' In this experiment we will work with alphanumeric LCD and push button.
' Communication with LCD will be performed through 4-bits and connections
' is made as follows: D4 with RB0, D5 with RB1, D6 with RB2, D7 with RB3;
' RS with RB4 and EN with RB5.
' The Push button is connected to PORT RA4 (for increment) and PORT RA6
' (for decrement). Of course both button have pull-up resistors (4k7).
' To make this project more interesting , you can reach from 0000 to 9999
' by pressing the button.
' Test configuration:
' MCU: PIC16F628A
' SW: MikroC PRO for PIC 2010 (version v4.15)
' Configuration Word
' Oscillator: INTOSC:I/O on RA.6, I/O on RA.7
' Watchdog Timer: OFF
' Power up Timer: Disabled
' Master Clear Enable: Enabled
' Browun Out Detect: Enabled
' Low Voltage Program: Disabled
' Data EE Read Protect: Disabled
' Code Protect: OFF
'*******************************************************************************
*/
// LCD module connections
sbit LCD_RS at RB4_bit; // LCD_RS assigned to PORT RB4;
sbit LCD_EN at RB5_bit; // LCD_EN assigned to PORT RB5;
sbit LCD_D4 at RB0_bit; // LCD_D4 assigned to PORT RB0;
sbit LCD_D5 at RB1_bit; // LCD_D5 assigned to PORT RB1;
sbit LCD_D6 at RB2_bit; // LCD_D6 assigned to PORT RB2;
sbit LCD_D7 at RB3_bit; // LCD_D7 assigned to PORT RB3;
sbit LCD_RS_Direction at TRISB4_bit; // LCD_RS assigned to TRIS B4;
sbit LCD_EN_Direction at TRISB5_bit; // LCD_EN assigned to TRIS B5;
sbit LCD_D4_Direction at TRISB0_bit; // LCD_D4 assigned to TRIS B0;
sbit LCD_D5_Direction at TRISB1_bit; // LCD_D5 assigned to TRIS B1;
sbit LCD_D6_Direction at TRISB2_bit; // LCD_D6 assigned to TRIS B2;
sbit LCD_D7_Direction at TRISB3_bit; // LCD_D7 assigned to TRIS B3;
// End LCD module connections
char Message1[]="COUNTER"; // Message for line1;
unsigned int number = 0;
char *digit = "0000";
void Display_init() // define display_init;
{
digit[0] = number/1000 + 48; // thousands digit;
digit[1] = (number/100)%10 +48; // hundreds digit;
digit[2] = (number/10)%10 + 48; // tens digit;
digit[3] = number%10 +48; // unit digit;
Lcd_Out(2,7,digit); // display on LCD from column 2, character 7;
}
bit oldstate1; // Old state flag
bit oldstate2;
void main() // main;
{
CMCON |= 7; // turn off analogue comparator and make PORTA to digital I/O;
TRISA6_bit = 1; // make PORT RA6 as input for button;
TRISA7_bit = 1; // make PORT RA7 as input for button;
PORTA = 0; // Turn ON PORTA;
TRISB = 0; // Set PORTB direction to be output;
PORTB = 0; // Turn ON PORTB;
Lcd_init(); // LCD Initialization;
Lcd_cmd(_LCD_CLEAR); // Clear LCD;
Lcd_cmd(_LCD_CURSOR_OFF); // Cursor mode, off;
Lcd_out(1,2,Message1); // display message1 from column 1, character 3;
do{
if (Button(&PORTA, 4, 1, 1)) { // Detect logical
oldstate1 = 1; // Update flag
}
if (oldstate1 && Button(&PORTA, 4, 1, 0)) { // Detect one-to-zero transition
Delay_ms(200); // If button is pressed, delay 0,2s and decrement "number" with 1;
number = number +1;
oldstate1 = 0; // Update flag
}
if(Button(&PORTA,6,1,1)){
oldstate2 = 1; // Update flag
}
if (oldstate2 && Button(&PORTA, 6, 1, 0)) { // Detect one-to-zero transition
Delay_ms(200); // If button is pressed, delay 0,2s and decrement "number" with 1;
number = number -1;
oldstate2 = 0; // Update flag
}
if (number > 9999u) // if it's more than 9999 go to 0;
number = 0;
display_init(); // call display_init();
if(number>10) PORTB.B6=1;
else PORTB.B6=0;
if(number>20) PORTB.B7=1;
else PORTB.B7=0;
} while(1); // infinite loop;
}