
If I succeeded or not, you will find only if you will hit the "...read more" link.
...read more.
/*
'*******************************************************************************
' Project name: Distance Sensor Sharp 2YOA21 & LCD Display
' Description:
' In this experiment we will try to display on LCD 2x16 character,
' distance helped by IR senzor "Sharp 2Y0A21YK" wich is able to give
' distance betwen 10cm~80cm.
' Written by:
' Aureliu Raducu Macovei, 2011.
' Test configuration:
' MCU: PIC16F876A;
' Test.Board: WB-106 Breadboard 2420 dots;
' SW: MikroC PRO for PIC 2011 (version v4.60);
' Configuration Word:
' Oscillator: HS (8Mhz)on pins 9 and 10;
' Watchdog Timer: OFF;
' Power up Timer: OFF;
' Browun Out Detect: ON;
' Low Voltage Program: Disabled;
' Data EE Read Protect: OFF;
' Flash Program Write: Write Protection OFF;
' Background Debug: Disabled;
' Code Protect: OFF
'*******************************************************************************
*/
// LCD module connections;
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections;
unsigned int cm,cm10;
unsigned int math;
char *text;
char *digit = "00";
void calc_distance(void)
{
// from the datasheet the analog voltage is
// the inverse of distance, so distance can be calculated
// d = (1 / volts) then just scaled to suit the datasheet
// load ADC value in 16bit math variable.
math = ADC_Read(0);
math = ADRESH;
math = (math * 255);
math += ADRESL;
// now invert it; (1 / volts) use (6050 / volts) for scaling, 6050 is a constant;
math = (6050 / math);
if(math >= 2) math -= 2; // fix linear error (-2)
if(math < 10) math = 10; // min limit at 10cm
if(math > 80) math = 80; // max limit at 80cm
// convert from 0-99 to 2 decimal digits, 0-99cm
cm10=0;
while(math >= 10)
{
cm10++;
math -= 10;
}
cm = math;
}
void main(void)
{
ADCON0 = 0X01; // RA0 as Analog Input;
ADCON1 = 0X0E; // Reference VDD and VSS, with left justified;
CMCON |=7; // Disable comparator;
TRISA0_bit = 1; // Make RA0 as input;
PORTA = 0x00; // Initial value of PORTA;
LCD_Init(); // Initialize the LCD;
LCD_Cmd(_LCD_CURSOR_OFF); // Cursor mode off;
LCD_Cmd(_LCD_CLEAR); // Clear the entire LCD;
text = "Sharp 2Y0A21";
LCD_Out(1,3,text);
text = "Distance:";
LCD_Out(2,1,text);
text = "cm";
LCD_Out(2,13,text);
while(1)
{
calc_distance(); // Call the "calc_distance" function;
digit[0] = cm10 + 48; // tens digit;
digit[1] = cm +48; // unit digit;
Lcd_Out(2,10,digit); // display on LCD from column 2, from character 10;
delay_ms(100);
}
}
/*
'*******************************************************************************
' Project name: PIC16F876A & MAX7219 For 8x8 LED Display
' Description:
' Trough the current experiment we wish to succed the next task:
' Display on 8x8 Led matrix, the alphabet. The sequence between letters,
' will have one second delay.
' Written by:
' Mark &
' Aureliu Raducu Macovei, 2011.
' Test configuration:
' MCU: PIC16F876A;
' Test.Board: WB-106 Breadboard 2420 dots;
' SW: MikroC PRO for PIC 2011 (version v4.60);
' Configuration Word:
' Oscillator: HS (8Mhz)on pins 9 and 10;
' Watchdog Timer: OFF;
' Power up Timer: OFF;
' Browun Out Detect: ON;
' Low Voltage Program: Disabled;
' Data EE Read Protect: OFF;
' Flash Program Write: Write Protection OFF;
' Background Debug: Disabled;
' Code Protect: OFF
'*******************************************************************************
*/
// For more space, we don't need byte 0 and byte 7.
// We have stripped them out, if/when we have a need and a bigger PIC,
// then we can put them back if we want.
// Here we define row values for each of the six columns corresponding to the
// Alphabet, from A through Z.
unsigned const short Alphabet[156]={
0x7f, 0x88, 0x88, 0x88, 0x88, 0x7f, // A
0xff, 0x91, 0x91, 0x91, 0x91, 0x6e, // B
0x7e, 0x81, 0x81, 0x81, 0x81, 0x42, // C
0xff, 0x81, 0x81, 0x81, 0x81, 0x7e, // D
0x81, 0xff, 0x91, 0x91, 0x91, 0x91, // E
0x81, 0xff, 0x91, 0x90, 0x90, 0x80, // F
0x7e, 0x81, 0x81, 0x89, 0x89, 0x4e, // G
0xff, 0x10, 0x10, 0x10, 0x10, 0xff, // H
0x00, 0x81, 0xff, 0xff, 0x81, 0x00, // I
0x06, 0x01, 0x81, 0xfe, 0x80, 0x00, // J
0x81, 0xff, 0x99, 0x24, 0xc3, 0x81, // K
0x81, 0xff, 0x81, 0x01, 0x01, 0x03, // L
0xff, 0x60, 0x18, 0x18, 0x60, 0xff, // M
0xff, 0x60, 0x10, 0x08, 0x06, 0xff, // N
0x7e, 0x81, 0x81, 0x81, 0x81, 0x7e, // O
0x81, 0xff, 0x89, 0x88, 0x88, 0x70, // P
0x7e, 0x81, 0x85, 0x89, 0x87, 0x7e, // Q
0xff, 0x98, 0x98, 0x94, 0x93, 0x61, // R
0x62, 0x91, 0x91, 0x91, 0x91, 0x4e, // S
0xc0, 0x81, 0xff, 0xff, 0x81, 0xc0, // T
0xfe, 0x01, 0x01, 0x01, 0x01, 0xfe, // U
0xfc, 0x02, 0x01, 0x01, 0x02, 0xfc, // V
0xff, 0x02, 0x04, 0x04, 0x02, 0xff, // W
0xc3, 0x24, 0x18, 0x18, 0x24, 0xc3, // X
0xc0, 0x20, 0x1f, 0x1f, 0x20, 0xc0, // Y
0xc3, 0x85, 0x89, 0x91, 0xa1, 0xc3, // Z
};
unsigned const short Symbols[114]={
0x00, 0x3c, 0x42, 0x81, 0x00, 0x00, // (
0x00, 0x00, 0x81, 0x42, 0x3c, 0x00, // )
0x00, 0x00, 0xff, 0x81, 0x00, 0x00, // [
0x00, 0x00, 0x81, 0xff, 0x00, 0x00, // ]
0x00, 0x18, 0xe7, 0x81, 0x00, 0x00, // {
0x00, 0x00, 0x81, 0xe7, 0x18, 0x00, // }
0x00, 0x18, 0x24, 0x42, 0x81, 0x00, // <
0x00, 0x81, 0x42, 0x24, 0x18, 0x00, // >
0x00, 0x03, 0x0c, 0x30, 0xc0, 0x00, // /
0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, // \
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
0x00, 0x00, 0xfd, 0xfd, 0x00, 0x00, // !
0x60, 0x80, 0x8d, 0x8d, 0x90, 0x60, // ?
0x42, 0x24, 0xff, 0xff, 0x24, 0x42, // *
0x24, 0xff, 0x24, 0x24, 0xff, 0x24, // #
0x62, 0x91, 0xff, 0xff, 0x91, 0x4e, // $
0x66, 0x99, 0x99, 0x66, 0x09, 0x00, // &
0x42, 0xa4, 0x48, 0x12, 0x25, 0x42, // %
0x20, 0x3f, 0x20, 0x20, 0x3e, 0x21, // pi
};
// Serial 8x8 Matrix Display connections.
sbit Chip_Select at RC0_bit;
sbit Chip_Select_Direction at TRISC0_bit;
// End Serial 8x8 Matrix Display connections.
// Here we set the configuration of max7219.
void max7219_init1()
{
Chip_Select = 0; // SELECT MAX
SPI1_write(0x09); // BCD mode for digit decoding
SPI1_write(0x00);
Chip_Select = 1; // DESELECT MAX
Chip_Select = 0; // SELECT MAX
SPI1_write(0x0A);
SPI1_write(0x0F); // Segment luminosity intensity
Chip_Select = 1; // DESELECT MAX
Chip_Select = 0; // SELECT MAX
SPI1_write(0x0B);
SPI1_write(0x07); // Display refresh
Chip_Select = 1; // DESELECT MAX
Chip_Select = 0; // SELECT MAX
SPI1_write(0x0C);
SPI1_write(0x01); // Turn on the display
Chip_Select = 1; // DESELECT MAX
Chip_Select = 0; // SELECT MAX
SPI1_write(0x00);
SPI1_write(0xFF); // No test
Chip_Select = 1; // DESELECT MAX
}
// This is write Byte function.
void Write_Byte(unsigned short myColumn, unsigned short myValue)
{
Chip_Select = 0; // select max7219.
SPI1_write(myColumn); // send myColumn value to max7219 (digit place).
SPI1_write(myValue); // send myValue value to max7219 (digit place).
Chip_Select = 1; // deselect max7219.
}
// This is clear matrix function.
void Clear_Matrix(void)
{
unsigned short x;
for(x=1;x<9;x++)
{
Write_Byte(x,0x00);
}
}
void Write_Char(char myChar)
{
unsigned short Column, Start_Byte;
// We will use only uppercase characters, so we will start from 65
// (look at the ascii chart), with an offset of 6, becouse we are using only 6
// bytes for each character.
// Clear the display first.
Clear_Matrix();
// The next line defines our byte, from which to start the array.
Start_Byte = (myChar - 65) * 6; // 65 represents the letter "A" in ASCII code.
// We are using only columns from 2 through 7 for displaying the character.
for(Column=2;Column<8;Column++)
{
Write_Byte(Column, Alphabet[Start_Byte++]);
}
}
// This is write char function.
void Write_Symbol(char mysymbols)
{
unsigned short Column1, Start_Byte1;
// We will use only uppercase characters, so we will start from 65
// (look at the ascii chart), with an offset of 6, becouse we are using only 6
// bytes for each character.
// Clear the display first.
Clear_Matrix();
// The next line defines our byte, from which to start the array.
Start_Byte1 = (mysymbols-0) * 6 ;
// We are using only columns from 2 through 7 for displaying the character.
for(Column1=2;Column1<8;Column1++)
{
Write_Byte(Column1, Symbols[Start_Byte1++]);
}
}
// Here we have the main function.
void main()
{
unsigned int x,y;
Chip_Select_Direction = 0; // Set RC0 pin as output.
SPI1_init(); // Initialize SPI1 module.
max7219_init1(); // initialize max7219.
do // infinite loop.
{
// You can write the characters this way, one at a time.
/*
Write_Char('R');
Delay_ms(1000);
Write_Char('A');
Delay_ms(1000);
Write_Char('D');
Delay_ms(1000);
Write_Char('U');
Delay_ms(1000);
*/
// or
for(x=65;x<=90;x++) // Increment with 1, from 65 until 90.
{
Write_Char(x);
Delay_ms(1000); // This is our delay, between two consecutive character.
}
Clear_Matrix(); // Clear the Matrix display;
delay_ms(500);
for(y=0;y<=18;y++)
{
Write_Symbol(y); // This is our delay, between two consecutive character.
Delay_ms(1000);
}
}while(1); // do forever.
}