📄 test.c
字号:
//ICC-AVR application builder : 2005-4-16 21:20:40
// Target : M8
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#define csl asm("cbi 0x18,0") //PB0
#define csh asm("sbi 0x18,0")
#define restl asm("cbi 0x12,1") //PB4
#define resth asm("sbi 0x12,1")
#define sclkl asm("cbi 0x18,7") //PB5
#define sclkh asm("sbi 0x18,7")
#define sdatal asm("cbi 0x18,5") //PB3
#define sdatah asm("sbi 0x18,5")
#define CS 3
#define SCLK 7
#define SDATA 5
#define RESET 2
#define CMD 0
#define DATA 1
void port_init(void)
{
PORTB = 0xFF;
DDRB = 0x00;
PORTC = 0x7F; //m103 output only
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0x00;
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
//CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
//SEI(); //re-enable interrupts
//all peripherals are now initialised
}
//
//ICC-AVR application builder : 2005-4-16 21:20:40
// Target : M8
// Crystal: 8.0000Mhz
void delay5ms(void) {
volatile int i;
for(i=0; i<2200; i++);
}
//----------------------------
//发送指令或数据 硬件SPI
//速度快,没有刷屏现象
//----------------------------
void send(unsigned char myData,unsigned char cd)
{
if(cd==DATA)
{
csl;
sclkl;
sdatah;
sclkh;
}
else
{
csl;
sclkl;
sdatal;
sclkh;
}
SPCR = 0x50; //setup SPI
SPDR = myData;
while(!(SPSR & 0x80));
csh;
SPCR = 0x00;
}
//----------------------------
//发送指令或数据 软件模拟SPI
//速度较慢,有刷屏现象
//----------------------------
void send2(char data, char cd)
{
// CS auf Low setzen
PORTD &= ~(0x01 << CS);
// Kommando oder Daten?
PORTB &= ~(0x01 << SCLK);
if(cd == CMD)
PORTB &= ~(0x01 << SDATA);
else
PORTB |= 0x01 << SDATA;
PORTB |= 0x01 << SCLK;
// 1. Bit (MSB)
PORTB &= ~(0x01 << SCLK);
if((data & 0x80) == 0x80)
PORTB |= 0x01 << SDATA;
else
PORTB &= ~(0x01 << SDATA);
PORTB |= 0x01 << SCLK;
// 2. Bit (MSB)
PORTB &= ~(0x01 << SCLK);
if((data & 0x40) == 0x40)
PORTB |= 0x01 << SDATA;
else
PORTB &= ~(0x01 << SDATA);
PORTB |= 0x01 << SCLK;
// 3. Bit (MSB)
PORTB &= ~(0x01 << SCLK);
if((data & 0x20) == 0x20)
PORTB |= 0x01 << SDATA;
else
PORTB &= ~(0x01 << SDATA);
PORTB |= 0x01 << SCLK;
// 4. Bit (MSB)
PORTB &= ~(0x01 << SCLK);
if((data & 0x10) == 0x10)
PORTB |= 0x01 << SDATA;
else
PORTB &= ~(0x01 << SDATA);
PORTB |= 0x01 << SCLK;
// 5. Bit (MSB)
PORTB &= ~(0x01 << SCLK);
if((data & 0x08) == 0x08)
PORTB |= 0x01 << SDATA;
else
PORTB &= ~(0x01 << SDATA);
PORTB |= 0x01 << SCLK;
// 6. Bit (MSB)
PORTB &= ~(0x01 << SCLK);
if((data & 0x04) == 0x04)
PORTB |= 0x01 << SDATA;
else
PORTB &= ~(0x01 << SDATA);
PORTB |= 0x01 << SCLK;
// 7. Bit (MSB)
PORTB &= ~(0x01 << SCLK);
if((data & 0x02) == 0x02)
PORTB |= 0x01 << SDATA;
else
PORTB &= ~(0x01 << SDATA);
PORTB |= 0x01 << SCLK;
// 8. Bit (MSB)
PORTB &= ~(0x01 << SCLK);
if((data & 0x01) == 0x01)
PORTB |= 0x01 << SDATA;
else
PORTB &= ~(0x01 << SDATA);
PORTB |= 0x01 << SCLK;
}
void cs(void) {
PORTD |= 0x01 << CS; // CS wieder auf 1
}
int main(void) {
int i;
char s;
init_devices();
DDRB = 0xFF; // PortB = Output
DDRD = 0xff;
// LCD Hardware Reset
PORTD &= ~(0x01 << 0);
delay5ms();
PORTD |= 0x01 << 0;
PORTD |= 0x01 << CS;
PORTB |= 0x01 << SCLK;
PORTB |= 0x01 << SDATA;
send(0x01, CMD); // LCD Software Reset
cs();
delay5ms();
send(0xC6, CMD); // Initial Escape
cs();
send(0xB9, CMD); // Refresh set
send(0x00, DATA);
cs();
send(0xB6, CMD); // Display Control
send(128, DATA);
send(128, DATA);
send(129, DATA);
send(84, DATA);
send(69, DATA);
send(82, DATA);
send(67, DATA);
cs();
send(0xB3, CMD); // Gray Scale Position
send(1, DATA);
send(2, DATA);
send(4, DATA);
send(8, DATA);
send(16, DATA);
send(30, DATA);
send(40, DATA);
send(50, DATA);
send(60, DATA);
send(70, DATA);
send(80, DATA);
send(90, DATA);
send(100, DATA);
send(110, DATA);
send(127, DATA);
cs();
send(0xB5, CMD); // Gamma Curve Set
send(1, DATA);
cs();
send(0xBE, CMD); // Power Control
send(3, DATA);
cs();
send(0x3A, CMD); // Power Control
send(0b00000011, DATA);
cs();
send(0x11, CMD); // Sleep out
cs();
send(0xB7, CMD); // Temperature gradient set
for(i=0; i<14; i++) {
send(0, DATA);
}
cs();
send(0x03, CMD); // Booster Voltage ON
cs();
for(i=0; i<8; i++) { // Booster Voltage stabilisieren lassen
delay5ms();
}
send(0x20, CMD); // Inversion control
cs();
send(0x25, CMD); // Write contrast
send(63, DATA);
cs();
send(0x2C, CMD); // Memory Write
// roter Balken
s=0;
for(i=0; i<1176; i++) {
if(s == 0) send(15, DATA);
else if(s == 1) send(240, DATA);
else if(s == 2) send(255, DATA);
if(++s == 3)
s = 0;
}
// gr黱er Balken
s=0;
for(i=0; i<1176; i++) {
if(s == 0) send(141, DATA);
else if(s == 1) send(56, DATA);
else if(s == 2) send(211, DATA);
if(++s == 3)
s = 0;
}
// blauer Balken
s=0;
for(i=0; i<1176; i++) {
if(s == 0) send(255, DATA);
else if(s == 1) send(15, DATA);
else if(s == 2) send(240, DATA);
if(++s == 3)
s = 0;
}
// gelber Balken
s=0;
for(i=0; i<1176; i++) {
if(s == 0) send(0, DATA);
else if(s == 1) send(240, DATA);
else if(s == 2) send(15, DATA);
if(++s == 3)
s = 0;
}
// magenta Balken
s=0;
for(i=0; i<1176; i++) {
if(s == 0) send(15, DATA);
else if(s == 1) send(0, DATA);
else if(s == 2) send(240, DATA);
if(++s == 3)
s = 0;
}
// cyan Balken
s=0;
for(i=0; i<1176; i++) {
if(s == 0) send(240, DATA);
else if(s == 1) send(15, DATA);
else if(s == 2) send(0, DATA);
if(++s == 3)
s = 0;
}
// wei遝r Balken
for(i=0; i<1176; i++) {
send(0, DATA);
}
// schwarzer Balken
for(i=0; i<1617; i++) {
send(255, DATA);
}
cs();
send(0x29, CMD); // Display On
cs();
while(1) {;}
//return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -