⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pictiva.c

📁 oled 驱动
💻 C
字号:
/*
    Title:    Pictiva mit ATMEGA32
	Version:  1.00
    Author:   Jens Dietrich
    Start:    26/12/2006
    Date:     30/12/2006
    Purpose:  3,3 Volt
    Software: AVR-GCC
    Hardware: ATMEGA32 + 3,3 Volt
    Note:     http://www.icplan.de
	File:     pictiva.c
*/

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "pictiva.h"

int main(void)
{
	unsigned int a;
	
	PORTA = 0x00;			    									/* port a ausgaenge auf low */
	DDRA =0xff;  				    								/* port a output */
	
	DDRC = 0xfc;													/* bit 0,1 I2C rest ausgaenge */

	PORTD = 0b00000010;		    									/* port c bit txd mit pulup */
	DDRD =  0b11111100; 		                              		/* bit 2-7 output ; bit 0,1 input rs232 */
	PORTD = 0x00;
	DDRD =  0b11111110; 		                              		/* bit 1-7 output ; bit 0 input rs232 */

	TWBR = 0x80;													/* i2c bitrate etwa 40 khz */
	UBRRL = 103;													/* 51=8 103=16 mhz bei 9600 baud */
	UCSRB = 0x98;													/* rx, tx + inter bei rx einschalten */
 	
	TCCR1B = 0x03;	    											/* CK/8 = 0x02 */
	TIMSK = 0x04;		    										/* timer 1 overflow enable */

    PORTA &= ~(0x08);
    delay(10);
    PORTA |= (0x08);												/* reset display */
    delay(200);

// pictiva display laut herstellerangaben initialisieren

    send_data(0x15); 												/* Set Column Address */
	send_data(0x00); 												/* Start = 0 */
	send_data(0x3F); 												/* End = 127 */

	send_data(0x75); 												/* Set Row Address */
	send_data(0x00); 												/* Start = 0 */
	send_data(0x3F);												/* End = 63 */

	send_data(0x81); 												/* Set Contrast Control (1) */
	send_data(0x66); 												/* 0 ~ 127 */

	send_data(0x86); 												/* Set Current Range 84h:Quarter, 85h:Half, 86h:Full*/

	send_data(0xA0); 											    /* Set Re-map */
	send_data(0x41); 											    /* [0]:MX, [1]:Nibble, [2]:H/V address [4]:MY, [6]:Com Split Odd/Even "1000010"*/

	send_data(0xA1); 											    /* Set Display Start Line */
	send_data(0x00);											    /* Top */

	send_data(0xA2);											    /* Set Display Offset */
	send_data(0x44);											    /* Offset 76 rows */

	send_data(0xA4);											    /* Set DisplaMode,A4:Normal, A5:All ON, A6: All OFF, A7:Inverse */

	send_data(0xA8); 											    /* Set Multiplex Ratio */
	send_data(0x3F); 											    /* 64 mux*/

	send_data(0xB1); 											    /* Set Phase Length */
	send_data(0x22); 												/* [3:0]:Phase 1 period of 1~16 clocks */
																    /* [7:4]:Phase 2 period of 1~16 clocks POR = 0111 0100 */

	send_data(0xB2); 											    /* Set Row Period */
	send_data(0x46); 											    /* [7:0]:18~255, K=P1+P2+GS15 (POR:4+7+29)*/

	send_data(0xB3); 											    /* Set Clock Divide (2) */
	send_data(0xF1); 											    /* [3:0]:1~16, [7:4]:0~16, 70Hz */


	send_data(0xBF); 											    /* Set VSL */
	send_data(0x0D); 											    /* [3:0]:VSL */

	send_data(0xBE); 											    /* Set VCOMH (3) */
	send_data(0x02); 											    /* [7:0]:VCOMH, (0.51 X Vref = 0.51 X 12.5 V = 6.375V)*/

	send_data(0xBC); 											    /* Set VP (4) */
	send_data(0x10); 											    /* [7:0]:VP, (0.67 X Vref = 0.67 X 12.5 V = 8.375V) */

	send_data(0xB8); 											    /* Set Gamma with next 8 bytes */
	send_data(0x01); 											    /* L1[2:1] */
	send_data(0x11); 											    /* L3[6:4], L2[2:0] 0001 0001 */
	send_data(0x22); 											    /* L5[6:4], L4[2:0] 0010 0010 */
	send_data(0x32); 											    /* L7[6:4], L6[2:0] 0011 1011 */
	send_data(0x43); 											    /* L9[6:4], L8[2:0] 0100 0100 */
	send_data(0x54); 											    /* LB[6:4], LA[2:0] 0101 0101 */
	send_data(0x65); 											    /* LD[6:4], LC[2:0] 0110 0110 */
	send_data(0x76); 											    /* LF[6:4], LE[2:0] 1000 0111 */

	send_data(0xAD); 											    /* Set DC-DC */
	send_data(0x02); 											    /* 03=ON, 02=Off */

	send_data(0xAF); 											    /* AF=ON, AE=Sleep Mode */

	for (a=0;a<(128*32);a++) send_char(0x00);						/* display loeschen */

	zeichen_big2 ('A',0,0,0,15);									/* 2 sehr grosse zeichen */
	zeichen_big2 ('B',4,0,0,15);

	zeichen_big ('A',0,4,0,15);									/* 10 grosse zeichen */
	zeichen_big ('B',2,4,0,15);
	zeichen_big ('C',4,4,0,15);
	zeichen_big ('D',6,4,0,15);
	zeichen_big ('E',8,4,0,15);
	zeichen_big ('X',0,6,0,15);
	zeichen_big ('Y',2,6,0,15);
	zeichen_big ('0',4,6,0,15);
	zeichen_big ('1',6,6,0,15);
	zeichen_big ('2',8,6,0,15);

	unsigned char w=0x40;											/* normale zeichen ausgeben */
      unsigned char u=0,v=0;
      for(v=0;v<8;v++)
	  {
		for(u=10;u<20;u++)
        {
		  zeichen (w++,u,v,0,15);
		  if(w==0x80)w=0x20;
		  delay(200);
		}
      }

    for (;;)
	{
	};
}

// zeichenausgabe an bestimmte displayposition - display hat 20 spalten/zeichen und 8 zeilen
// z=zeichen 0x20-0x7f ; spalte=0-19 ; zeile=0-7 ; back(hintergrundfaerbung)=0-15 ; color(zeichenfaerbung)=0-15 

void zeichen (unsigned char z, unsigned char spalte, unsigned char zeile, unsigned char back, unsigned char color)
{
  unsigned char a ,b ,c;
  unsigned int stelle;

  if((z<0x20)||(z>0x7f))z=0x20;
  stelle = 8*(z-0x20);
  
  send_data(0x15);
  send_data(3*spalte);
  send_data((3*spalte)+2);
  send_data(0x75);
  send_data(8*zeile);
  send_data((8*zeile)+7);
  
  for(c=0;c<8;c++)
  {
    b=(back&0x0f)+((back&0x0f)<<4);
    a = pgm_read_byte(&z_code[stelle]); 
    if(a&0x20)b = (b & 0x0f) + ((color&0x0f)<<4);
    if(a&0x10)b = (b & 0xf0) + (color&0x0f);
    send_char(b);
    b=(back&0x0f)+((back&0x0f)<<4);
    a = pgm_read_byte(&z_code[stelle]);
	if(a&0x08)b = (b & 0x0f) + ((color&0x0f)<<4);
    if(a&0x04)b = (b & 0xf0) + (color&0x0f);
    send_char(b);
    b=(back&0x0f)+((back&0x0f)<<4);
    a = pgm_read_byte(&z_code[stelle++]);
	if(a&0x02)b = (b & 0x0f) + ((color&0x0f)<<4);
    if(a&0x01)b = (b & 0xf0) + (color&0x0f);
    send_char(b);
  }
}

// doppelte zeichengroesse an bestimmte displayposition - display hat 20 spalten/zeichen und 8 zeilen
// durch die doppelte zeichengroesse nimmt das zeichen 2 spalten nebeneinander und 2 zeilen untereinander platz ein
// z=zeichen 0x20-0x7f ; spalte=0-19 ; zeile=0-7 ; back(hintergrundfaerbung)=0-15 ; color(zeichenfaerbung)=0-15 

void zeichen_big (unsigned char z, unsigned char spalte, unsigned char zeile, unsigned char back, unsigned char color)
{
  unsigned char a ,b ,c ,d , ba, co;
  unsigned int stelle;

  if((z<0x20)||(z>0x7f))z=0x20;
  stelle = 8*(z-0x20);
  ba=(back&0x0f)+((back&0x0f)<<4);
  co=(color&0x0f)+((color&0x0f)<<4);
  
  send_data(0x15);
  send_data(3*spalte);
  send_data((3*spalte)+5);
  send_data(0x75);
  send_data(8*zeile);
  send_data((8*zeile)+15);
  
  for(c=0;c<8;c++)
  {
    a = pgm_read_byte(&z_code[stelle]); 
	for(d=0;d<2;d++)
	{
      b=ba;
      if(a&0x20)b = co;
      send_char(b);
      b=ba;
      if(a&0x10)b = co;
      send_char(b);
      b=ba;
      if(a&0x08)b = co;
      send_char(b);
      b=ba;
      if(a&0x04)b = co;
      send_char(b);
      b=ba;
      if(a&0x02)b = co;
      send_char(b);
      b=ba;
      if(a&0x01)b = co;
      send_char(b);
    }
    stelle++;
  }
}

// vierfache zeichengroesse an bestimmte displayposition - display hat 20 spalten/zeichen und 8 zeilen
// durch die vierfache zeichengroesse nimmt das zeichen 4 spalten nebeneinander und 4 zeilen untereinander platz ein
// z=zeichen 0x20-0x7f ; spalte=0-19 ; zeile=0-7 ; back(hintergrundfaerbung)=0-15 ; color(zeichenfaerbung)=0-15 

void zeichen_big2 (unsigned char z, unsigned char spalte, unsigned char zeile, unsigned char back, unsigned char color)
{
  unsigned char a ,b ,c ,d , ba, co;
  unsigned int stelle;

  if((z<0x20)||(z>0x7f))z=0x20;
  stelle = 8*(z-0x20);
  ba=(back&0x0f)+((back&0x0f)<<4);
  co=(color&0x0f)+((color&0x0f)<<4);
  
  send_data(0x15);
  send_data(3*spalte);
  send_data((3*spalte)+11);
  send_data(0x75);
  send_data(8*zeile);
  send_data((8*zeile)+31);
  
  for(c=0;c<8;c++)
  {
    a = pgm_read_byte(&z_code[stelle]); 
	for(d=0;d<4;d++)
	{
      b=ba;
      if(a&0x20)b = co;
      send_char(b);
      send_char(b);
      b=ba;
      if(a&0x10)b = co;
      send_char(b);
      send_char(b);
      b=ba;
      if(a&0x08)b = co;
      send_char(b);
      send_char(b);
      b=ba;
      if(a&0x04)b = co;
      send_char(b);
      send_char(b);
      b=ba;
      if(a&0x02)b = co;
      send_char(b);
      send_char(b);
      b=ba;
      if(a&0x01)b = co;
      send_char(b);
      send_char(b);
    }
    stelle++;
  }
}

void send_char(unsigned char zeichen)
{
  PORTA |= (0x04);		
  senden_spi(zeichen);
}

void send_data(unsigned char zeichen)
{
  PORTA &= ~(0x04);	
  senden_spi(zeichen);
  PORTA |= (0x04);		
}

void senden_spi(unsigned char zeichen)
{
  unsigned char a=0, b=0b10000000,c ,d=0;
  PORTA &= ~(0x10);	
  PORTA |= (0x02);		

  for(a=0;a<8;a++)
  { 
    if(zeichen&b)PORTA |= (0x01);
    else PORTA &= ~(0x01);
	PORTA &= ~(0x02);												/* clock low  */
    PORTA |= (0x02);												/* clock high */
    b=b>>1;
  }
  PORTA |= (0x10);													/* cs high */
}

void delay(unsigned char d)										/* zeitschleife */
{
  unsigned char i, j;
  for (i=0; i<d; i++)
	for (j=0; j<255; j++);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -