|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2008-5-28 20:26:22
|
显示全部楼层
#include<avr/io.h>
#include<avr/pgmspace.h>
#include<util/delay.h>
#include "pic_temp.h"
#define NOP() asm("nop")
#define DATA_DDR DDRB
#define DATA_PORT PORTB
#define DATA_PIN PINB
#define LCD_CS_DDR DDRA
#define LCD_CS_PORT PORTA
#define LCD_CS_PIN PINA
#define LCD_CS_BIT 0
#define LCD_RS_DDR DDRA
#define LCD_RS_PORT PORTA
#define LCD_RS_PIN PINA
#define LCD_RS_BIT 5
#define LCD_WR_DDR DDRA
#define LCD_WR_PORT PORTA
#define LCD_WR_PIN PINA
#define LCD_WR_BIT 1
#define LCD_RD_DDR DDRA
#define LCD_RD_PORT PORTA
#define LCD_RD_PIN PINA
#define LCD_RD_BIT 6
#define LCD_RST_DDR DDRA
#define LCD_RST_PORT PORTA
#define LCD_RST_PIN PINA
#define LCD_RST_BIT 2
#define LCD_CON_DDR DDRD
#define LCD_CON_PORT PORTD
#define DATA_INPUT() {\
DATA_DDR = 0x00;\
}
#define DATA_OUTPUT() {\
DATA_DDR = 0xff;\
}
#define LCD_CS_H() LCD_CS_PORT |= 1<<LCD_CS_BIT
#define LCD_CS_L() LCD_CS_PORT &= ~(1<<LCD_CS_BIT)
#define LCD_RS_H() LCD_RS_PORT |= 1<<LCD_RS_BIT
#define LCD_RS_L() LCD_RS_PORT &= ~(1<<LCD_RS_BIT)
#define LCD_WR_H() LCD_WR_PORT |= 1<<LCD_WR_BIT
#define LCD_WR_L() LCD_WR_PORT &= ~(1<<LCD_WR_BIT)
#define LCD_RD_H() LCD_RD_PORT |= 1<<LCD_RD_BIT
#define LCD_RD_L() LCD_RD_PORT &= ~(1<<LCD_RD_BIT)
#define LCD_RST_H()LCD_RST_PORT |= 1<<LCD_RST_BIT
#define LCD_RST_L()LCD_RD_PORT &= ~(1<<LCD_RST_BIT)
#define PORT_INI() {\
DATA_INPUT();\
LCD_CS_H();\
LCD_RS_H();\
LCD_WR_H();\
LCD_RD_H();\
LCD_RST_L();\
LCD_CS_DDR |= 1<<LCD_CS_BIT;\
LCD_RS_DDR |= 1<<LCD_RS_BIT;\
LCD_WR_DDR |= 1<<LCD_WR_BIT;\
LCD_RD_DDR |= 1<<LCD_RD_BIT;\
LCD_RST_DDR |= 1<<LCD_RST_BIT;\
}
const char flash_array[] PROGMEM = {"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
void LCD_WR_REG(unsigned char index,unsigned int val)
{
LCD_CS_L();
LCD_RS_L();
DATA_OUTPUT();
DATA_PORT = 0;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
DATA_PORT = (unsigned char)index;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
DATA_PORT = (unsigned char)(val>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
DATA_PORT = (unsigned char)val;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_CS_H();
}
unsigned int LCD_RD_REG(unsigned char index)
{
unsigned int ret;
LCD_CS_L();
LCD_RS_L();
DATA_OUTPUT();
DATA_PORT = 0;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
DATA_PORT = (unsigned char)index;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
DATA_INPUT();
LCD_RD_L();
NOP();
NOP();
ret = DATA_PIN;
LCD_RD_H();
ret <<= 8;
LCD_RD_L();
NOP();
NOP();
ret += DATA_PIN;
LCD_RD_H();
LCD_CS_H();
return ret;
}
void LCD_Write_Start()
{
LCD_CS_L();
LCD_RS_L();
DATA_OUTPUT();
DATA_PORT = 0x00;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
DATA_PORT = 0x22;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
}
void LCD_Write_Data(unsigned int val)
{
DATA_PORT = (unsigned char)val;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
DATA_PORT = (unsigned char)(val>>8);
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
}
void LCD_Write_End()
{
LCD_CS_H();
}
void LCD_Read_Start()
{
LCD_CS_L();
LCD_RS_L();
DATA_OUTPUT();
DATA_PORT = 0x00;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
DATA_PORT = 0x22;
LCD_WR_L();
NOP();
NOP();
LCD_WR_H();
LCD_RS_H();
DATA_INPUT();
LCD_RD_L();//dummy read
NOP();
LCD_RD_H();
NOP();
NOP();
}
unsigned int LCD_RD_DATA()
{
unsigned int ret;
LCD_RD_L();
NOP();
NOP();
NOP();
ret = DATA_PIN;
LCD_RD_H();
ret <<= 8;
LCD_RD_L();
NOP();
NOP();
ret += DATA_PIN;
LCD_RD_H();
NOP();
NOP();
return ret;
}
void LCD_Read_End()
{
LCD_CS_H();
}
void delay_Nms(unsigned int n)
{
while(n--)_delay_ms(1);
}
#define Display_ON() LCD_WR_REG(0x07,0x0173)
#define Display_OFF() LCD_WR_REG(0x07,0x0000)
void LCD_Init()
{
PORT_INI();
LCD_RST_L();
delay_Nms(10);
LCD_RST_H();
//delay 10ms
delay_Nms(10);
//initializing funciton 1
LCD_WR_REG(0xe5,0x8000);
LCD_WR_REG(0x00,0x0001);
LCD_WR_REG(0x2b,0x0010);
LCD_WR_REG(0x01,0x0100);
LCD_WR_REG(0x02,0x0700);
LCD_WR_REG(0x03,0x1230);
LCD_WR_REG(0x04,0x0000);
LCD_WR_REG(0x08,0x0202);
LCD_WR_REG(0x09,0x0000);
LCD_WR_REG(0x0a,0x0000);
LCD_WR_REG(0x0c,0x0000);
LCD_WR_REG(0x0d,0x0000);
LCD_WR_REG(0x0f,0x0000);
LCD_WR_REG(0x50,0x0000);
LCD_WR_REG(0x51,0x00ef);
LCD_WR_REG(0x52,0x0000);
LCD_WR_REG(0x53,0x013f);
LCD_WR_REG(0x60,0x2700);
LCD_WR_REG(0x61,0x0001);
LCD_WR_REG(0x6a,0x0000);
LCD_WR_REG(0x80,0x0000);
LCD_WR_REG(0x81,0x0000);
LCD_WR_REG(0x82,0x0000);
LCD_WR_REG(0x83,0x0000);
LCD_WR_REG(0x84,0x0000);
LCD_WR_REG(0x85,0x0000);
LCD_WR_REG(0x90,0x0010);
LCD_WR_REG(0x92,0x0000);
LCD_WR_REG(0x93,0x0003);
LCD_WR_REG(0x95,0x0110);
LCD_WR_REG(0x97,0x0000);
LCD_WR_REG(0x98,0x0000);
//power setting function
LCD_WR_REG(0x10,0x0000);
LCD_WR_REG(0x11,0x0000);
LCD_WR_REG(0x12,0x0000);
LCD_WR_REG(0x13,0x0000);
delay_Nms(200);
LCD_WR_REG(0x10,0x17b0);
LCD_WR_REG(0x11,0x0004);
delay_Nms(50);
LCD_WR_REG(0x12,0x013e);
delay_Nms(50);
LCD_WR_REG(0x13,0x1f00);
LCD_WR_REG(0x29,0x000f);
delay_Nms(50);
LCD_WR_REG(0x20,0x0000);
LCD_WR_REG(0x21,0x0000);
//initializing function 2
LCD_WR_REG(0x30,0x0204);
LCD_WR_REG(0x31,0x0001);
LCD_WR_REG(0x32,0x0000);
LCD_WR_REG(0x35,0x0206);
LCD_WR_REG(0x36,0x0600);
LCD_WR_REG(0x37,0x0500);
LCD_WR_REG(0x38,0x0505);
LCD_WR_REG(0x39,0x0407);
LCD_WR_REG(0x3c,0x0500);
LCD_WR_REG(0x3d,0x0503);
//display on
LCD_WR_REG(0x07,0x0173);
//Display_ON();
}
void LCD_Set_XY(unsigned int x, unsigned int y)
{
LCD_WR_REG(0x20,x);
LCD_WR_REG(0x21,y);
}
void LCD_Set_Window(unsigned int startX,unsigned int startY,unsigned int endX,unsigned int endY)
{
LCD_Set_XY(startX,startY);
LCD_WR_REG(0x50,startX);
LCD_WR_REG(0x52,startY);
LCD_WR_REG(0x51,endX);
LCD_WR_REG(0x53,endY);
}
//*************************************************************************************************************//
//***********该程序将一BYTE的数据写到LCD缓存中,有两个输入参数LINE_DATA为要显示的数据,COLOR为要显示的颜色*******//
void Write_Line (unsigned char Byte,unsigned int Color)
{
unsigned char l,k;
l = 0x80 ;
LCD_Write_Start();
for(k=0;k<8;k++)
{
if (Byte & l) LCD_Write_Data(Color);
else LCD_Write_Data(0xffff);
l = l >> 1 ;
}
}
//*************************************************************************************************************//
//***********该程序将一Word的数据写到LCD缓存中,有两个输入参数Word为要显示的数据,COLOR为要显示的颜色***********//
void Write_Word (unsigned int Word ,unsigned int Color)
{
unsigned int l;
unsigned char k;
l = 0x8000 ;
LCD_Write_Start();
for(k=0;k<16;k++)
{
if (Word & l) LCD_Write_Data(Color);
else LCD_Write_Data(0xffff);
l = l >> 1 ;
}
}
//*************************************************************************************************************//
//********************************//显示ASCII标准字符程序,颜色,X,Y 坐标 //*******************************//
/*void Write_ASIIC (unsigned int Color ,unsigned char ASIIC_X ,unsigned char ASIIC_Y , unsigned char ASIIC )
{
unsigned char j;
for(j=0;j<16;j++)
{ LCD_Set_XY( ASIIC_X*8, ASIIC_Y*16+j );
Write_Line (pgm_read_byte ( ASIIC_TEXT + ASIIC*16 + j),Color);
}
}
//*************************************************************************************************************/
//********************************//显示ASCII标准字符程序,颜色,X,Y 坐标 //*******************************//
/*void Write_Hanzi (unsigned int Color ,unsigned char Hanzi_X ,unsigned char Hanzi_Y , unsigned int Hanzi )
{
unsigned char j;
for(j=0;j<16;j++)
{ LCD_Set_XY( Hanzi_X*16, Hanzi_Y*16+j );
Write_Word (pgm_read_word ( GB_TEXT + Hanzi*32+j*2),Color);
}
}
//*************************************************************************************************************/
//***********************//在屏幕上Star_X,Star_Y开始的地方显示Size个Color颜色的ASCII字符//********************//
/*void Write_Text (unsigned int Color,unsigned char Star_X,unsigned char Star_Y , char *Text_Tab,unsigned int Size)
{
unsigned int i ;
unsigned char j = 0;
for(i=0;i<Size;i++)
{
Write_ASIIC (Color,Star_X,Star_Y,j);
Star_X = Star_X + 1 ;
if (Star_X > 29)
{
Star_X = 0 ;
Star_Y = Star_Y + 1;
if (Star_Y > 19)
{
Star_Y = 0;
}
}
j = j+1;
if( j > 128) j = 0;
}
}
//************************************************************************************************************/
/*void Write_Wenben (unsigned int Color,unsigned char Star_X,unsigned char Star_Y , char *Text_Tab,unsigned int Size)
{
unsigned int i ;
unsigned int j = 0;
for(i=0;i<Size;i++)
{
Write_Hanzi (Color,Star_X,Star_Y,j);
Star_X = Star_X + 1 ;
if (Star_X > 14)
{
Star_X = 0 ;
Star_Y = Star_Y + 1;
if (Star_Y > 19)
{
Star_Y = 0;
}
}
j = j+1;
if( j > 128) j = 0;
}
}
//*************************************************************************************************************/
//***********************************//人内存中读一片字模数据显示到屏幕上//************************************//
/*void ASIIC_Test (unsigned char *Table ,unsigned int Color)
{
unsigned char k,l,m;
for ( k=0;k<20;k++ )
{
for ( l=0;l<30;l++ )
{
for ( m=0;m<16;m++ )
{
LCD_Set_XY( l*8, k*16+m );
Write_Line (pgm_read_word(Table++ ),Color);
}
}
}
}
//************************************************************************************************************/
//***************************////***************************//
void Write_Test (unsigned int Color ,unsigned char ASIIC_X ,unsigned char ASIIC_Y )
{
unsigned char j,k,l,ASIIC;
ASIIC = 0Xc0 ;
for (j=0;j<8;j++)
{
LCD_Set_XY( ASIIC_X*8, ASIIC_Y*16+j);
l = 0x80 ;
LCD_Write_Start();
for(k=0;k<8;k++)
{ if (ASIIC & l) LCD_Write_Data(Color);
else LCD_Write_Data(0xffff);
l = l >> 1 ;
}
ASIIC = ASIIC>>1 ;
}
ASIIC = 0X03 ;
for (j=8;j<16;j++)
{
LCD_Set_XY( ASIIC_X*8, ASIIC_Y*16+j);
l = 0x80 ;
LCD_Write_Start();
for(k=0;k<8;k++)
{ if (ASIIC & l) LCD_Write_Data(Color);
else LCD_Write_Data(0xffff);
l = l >> 1 ;
}
ASIIC = ASIIC<<1 ;
}
}
//LCD测试程序//*********************************************************************************
void LCD_test()
{
unsigned int i,j,k;
LCD_Set_XY (0x0000,0x0000);
LCD_Write_Start();
k = 0x0000 ;
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
k = k+ 0x0001 ;
LCD_Write_Data(k);
}
}
LCD_Write_End();
}
void LCD_test1()
{
unsigned int i,j,k;
LCD_Set_XY (0x0000,0x0000);
LCD_Write_Start();
k = 0x0000 ;
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
LCD_Write_Data(k);
}
k = k+0x000f ;
}
LCD_Write_End();
}
void LCD_test2()
{
unsigned int k, i;
unsigned char j,l;
LCD_Set_XY (0x0000,0x0000);
LCD_Write_Start();
k = 0;
for(i=0;i<320;i++)
{
for(j=0;j<30;j++)
{
for(l=0;l<8;l++)
{
LCD_Write_Data(k);
}
k = k+0X000f ;
}
}
}
void LCD_Test3 (void)
{
unsigned int Color = 0x0000 ;
unsigned char k,l,m;
for ( k=0;k<20;k++ )
{
for ( l=0;l<30;l++ )
{
for ( m=0;m<16;m++ )
{
LCD_Set_XY( l*8, k*16+m );
Write_Line (0XFF ,Color);
}
Color = Color + 0x00f ;
}
}
}
void LCD_Test4 (void)
{
unsigned int Color = 0x0000 ;
unsigned int l;
unsigned char k;
for ( k=0;k<30;k++ )
{
for ( l=0;l<320;l++ )
{
LCD_Set_XY( k*8, l );
Write_Line (0XFF ,Color);
}
Color = Color + 0x00f ;
}
}
void LCD_Test5 (void)
{
unsigned int Color = 0x0000 ;
unsigned char k,l,m;
for ( k=0;k<20;k++ )
{
for ( l=0;l<15;l++ )
{
for ( m=0;m<16;m++ )
{
LCD_Set_XY (l*16,k*16+m);
Write_Word (0Xffff ,Color);
}
Color = Color + 0x00f ;
}
}
}
void LCD_test6(void)
{ unsigned char i,j,l ;
unsigned int k;
LCD_Set_XY (0x0000,0x0000);
LCD_Write_Start();
k = 0x0000 ;
for(i=0;i<40;i++)
{
for( l=0;l<8;l++)
{
for(j=0;j<240;j++)
{
LCD_Write_Data(k);
}
}
k = k+0x000f ;
}
LCD_Write_End();
}
void LCD_Test7 (void)
{
unsigned int Color = 0x0000 ;
unsigned char k,l,m;
for ( k=0;k<20;k++ )
{
for ( l=0;l<15;l++ )
{
for ( m=0;m<16;m++ )
Write_Word (0Xffff ,Color);
}
Color = Color + 0x00f ;
}
}
//*****************************************************************************************************************************************
/*
unsigned char LCD_DrawPicture(unsigned char startX, unsigned char startY, unsigned int *pic, unsigned char sizeX, unsigned char sizeY)
{
unsigned int endX,endY;
unsigned long totalPixels = (unsigned long)sizeX * (unsigned long)sizeY;
endX = startX+sizeX-1;
endY = startY+sizeY-1;
if(endX>239 || endY>319)return 1;
LCD_Set_Window(startX,startY,endX,endY);
LCD_Write_Start();
while(totalPixels--)LCD_Write_Data(pgm_read_word(pic++));
LCD_Write_End();
return 0;
}
*/
unsigned char LCD_DrawPicture2(unsigned char startX, unsigned char startY, unsigned int *pic, unsigned char sizeX, unsigned char sizeY)
{
unsigned int i,j,k ,l;
if((startX+sizeX)>240 || (startY+sizeY)>320)return 1;
for (j = 0; j<sizeY; j++)
{
LCD_Set_XY(startX,startY);
LCD_Write_Start();
for(i = 0; i<sizeX; i++)
{
k = pgm_read_word(pic++) ;
l= k ;
k = k<<8;
l = l>>8;
k= k+l ;
LCD_Write_Data(k);
}
startY++;//换行
}
LCD_Write_End();
return 0;
}
int main()
{
unsigned char LCD_X ,LCD_Y ,Again;
unsigned int Color = 0x000f ;
Again = 200 ;
LCD_CON_DDR = 0xff;
LCD_CON_PORT = 0xfe ;
LCD_Init();
while (1)
{
LCD_test();
delay_Nms(2000);
delay_Nms(2000);
LCD_test1();
delay_Nms(2000);
delay_Nms(2000);
LCD_test2();
delay_Nms(2000);
delay_Nms(2000);
LCD_Test3();
delay_Nms(2000);
delay_Nms(2000);
LCD_Test4();
delay_Nms(2000);
delay_Nms(2000);
Color = 0x0001 ;
LCD_Test5();
delay_Nms(2000);
delay_Nms(2000);
LCD_test6 () ;
delay_Nms(2000);
delay_Nms(2000);
LCD_Test7();
delay_Nms(2000);
delay_Nms(2000);
Color = 0x0001 ;
for (LCD_Y = 0 ; LCD_Y<20 ; LCD_Y ++ )
{
for (LCD_X = 0 ; LCD_X<30 ; LCD_X ++ )
{
Write_Test (Color,LCD_X,LCD_Y) ;
Color = Color + 0x001f ;
}
}
delay_Nms(2000);
delay_Nms(2000);
LCD_DrawPicture2(55,111,(unsigned int *)yemin,136,102);
delay_Nms(2000);
delay_Nms(2000);
delay_Nms(2000);
delay_Nms(2000);
delay_Nms(2000);
delay_Nms(2000);
delay_Nms(2000);
delay_Nms(2000);
}
} |
|