?? pictiva.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++);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -