#include<iom16v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
#define cs1 PORTD |= (1 << PD0)
#define cs0 PORTD &= ~(1 <<PD0)
#define rd1 PORTD |= (1 << PD1)
#define rd0 PORTD &= ~(1 <<PD1)
#define wr1 PORTD |= (1 << PD2)
#define wr0 PORTD &= ~(1 <<PD2)
//#define BINT1 PORTD |= (1 << PD3)
//#define BINT0 PORTD &= ~(1 <<PD3)
#define rs1 PORTD |= (1 << PD4)
#define rs0 PORTD &= ~(1 <<PD4)
#define rst1 PORTD |= (1 << PD5)
#define rst0 PORTD &= ~(1 <<PD5)
#define Read_BUSY PIND & (1 << PD7)
#define BUS PORTB
//#define Read_lcd_data PINC & (0XFF)
#define Read_BUS PINB
//----------------------------------1us延时子程序-----------------------------
void delay_us(uint delay_counter)//延时1us
{
do
{
delay_counter--;
}while(delay_counter>1);
}
void delay_nms(unsigned int delay_counter)//延时1ms
{
while(delay_counter!=0)
{
delay_us(1000);
delay_counter--;
}
}
//$$$$$$$$$$$$$$$$$$$$$//lcd$$$$$$$$$$$$$$$$$$$$$$$$$$$
void softrst()
{
delay_nms(2);
cs0;
rd1;
rst0;
delay_nms(200);
rst1;
delay_nms(200);
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
unsigned char LCD_CmdRead(unsigned char Addr)
{
unsigned char Data;
LCD_CmdWrite( Addr);
DDRB=0x00;
wr1;
delay_us(2);
cs0;
delay_us(2);
rs0;
delay_us(2);
rd0;
Data=Read_BUS;
//PORTA =Data;
delay_nms(1);
delay_us(2);
rd1;
delay_us(2);
rs1;
delay_us(2);
cs1;
return Data;
}
uchar LCD_StasRead(void)
{
uchar Data;
DDRB=0xff;
PORTB =0xff;
DDRB=0x00;
cs0;
delay_us(2);
rs1;
delay_us(2);
rd0;
delay_us(2);
wr1;
Data = Read_BUS;
PORTA =Data;
delay_nms(2);
delay_us(2);
rd1;
delay_us(2);
cs1;
return Data;
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void LCD_CmdWrite(unsigned char cmdaddr)//8080
{
DDRB=0xFF;
/////////////////BUS=cmdaddr;
rs1;
delay_us(2);
cs0;
delay_us(2);
rd1;
delay_us(2);
BUS=cmdaddr;
wr0;
delay_nms(2);
delay_us(2);
wr1;
delay_us(2);
rs0;
delay_us(2);
cs1;
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void LCD_DataWrite(unsigned char wrdata)
{
DDRB=0xFF;
DDRD=0x7F;
while(Read_BUSY==0);
///////////////////BUS=wrdata;
rs0;
delay_us(2);
cs0;
delay_us(2);
rd1;
delay_us(2);
BUS=wrdata;
wr0;
delay_nms(2);
delay_us(2);
wr1;
delay_us(2);
rs1;
delay_us(2);
cs1;
}
//******************消除雪花模式******************
void clearsnow(void) //在文本方式下,无法使用消除雪花模式,在图形模式下可以用
{ unsigned char temp;
temp=LCD_CmdRead(0x01);
temp |=0x80;
//temp |=0x88;
LCD_CmdWrite(0x01);
LCD_DataWrite(temp);
}
//******************不消除雪花模式--正常模式******************
void noclearsnow(void)
{ unsigned char temp; //在文本方式下,无法使用消除雪花模式
temp=LCD_CmdRead(0x01);
temp &=0x7f;
LCD_CmdWrite(0x01);
LCD_DataWrite(temp);
}
//******************X,Y坐标定位******************
void LCD_GotoXY(unsigned char xx,unsigned char yy) //123456
{
LCD_CmdWrite(0x60);
LCD_DataWrite(xx&0x3f);
delay_us(1);
LCD_CmdWrite(0x70);
LCD_DataWrite(yy & 0xff);
delay_us(1);
}
//*************绘图模式**************************
void LCD_Graphic(void)
{ unsigned char temp;
temp=LCD_CmdRead(0x00);
temp &=0xf7;
LCD_CmdWrite(0x00);
LCD_DataWrite(temp);
clearsnow(); //开启消除雪花功能
}
void Only_Show_Page1(void) //将DDRAM1的数据显示于屏幕上。
{
uchar temp;
temp =LCD_CmdRead(0x12);
temp &= 0xbf;
temp &= 0xdf;
temp |= 0x10;
LCD_CmdWrite(0x12);
LCD_DataWrite(temp);
}
//***********DDRAM2 显示**************************
void Only_Show_Page2(void)
{
unsigned char temp;
temp=LCD_CmdRead(0x12);
temp &=0xaf;
temp |=0x20;
LCD_CmdWrite(0x12);
LCD_DataWrite(temp);
}
//***********DDRAM1和DDRAM2 双图层显示***************
void Show_Two_Layer(void)
{
unsigned char temp;
temp=LCD_CmdRead(0x12);
temp &=0xbf;
temp |=0x30;
LCD_CmdWrite(0x12);
LCD_DataWrite(temp);
}
//***********DDRAM1和DDRAM2 OR方式显示***************
void OR_Two_Layer(void)
{
unsigned char temp;
temp=LCD_CmdRead(0x12);
temp &=0xf3;
LCD_CmdWrite(0x12);
LCD_DataWrite(temp);
}
//***********存取DDRAM1*******************************
void Access_Page1(void)
{
unsigned char temp;
temp=LCD_CmdRead(0x12);
temp &=0xfd;
temp |=0x01;
LCD_CmdWrite(0x12);
LCD_DataWrite(temp);
}
//***********存取DDRAM2*******************************
void Access_Page2(void)
{
unsigned char temp;
temp=LCD_CmdRead(0x12);
temp &=0xfe;
temp |=0x02;
LCD_CmdWrite(0x12);
LCD_DataWrite(temp);
}
void lcd_inital()
{
LCD_CmdWrite(0x00); //[00H] , Default --> 0x00
LCD_DataWrite(0x04); //屏幕显示开启 disp_off输出high
LCD_CmdWrite(0x01); //[01H] , Default --> 0x00
LCD_DataWrite(0x04);
LCD_CmdWrite(0x03); //[03H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x0f); //[0FH] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x10); //[10H] , Default --> 0x00
//////////////////////////////////LCD_DataWrite(0x00);
LCD_DataWrite(0x40);
LCD_CmdWrite(0x11); //[11H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x12); //[12H] , Default --> 0x11
LCD_DataWrite(0x11);
LCD_CmdWrite(0x20); //[20H] , Default --> 0x27
LCD_DataWrite(0X1D);
LCD_CmdWrite(0x21); //[21H] , Default --> 0x27
LCD_DataWrite(0X1D);
LCD_CmdWrite(0x30); //[30H] , Default --> 0xEF
LCD_DataWrite(0X7F);
LCD_CmdWrite(0x31); //[31H] , Default --> 0xEF
LCD_DataWrite(0X7F);
LCD_CmdWrite(0x40); //[40H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x50); //[50H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x60); //[60H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x61); //[61H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x62); //[62H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x70); //[70H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x71); //[71H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x72); //[72H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x80); //[80H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0x90); //[90H] , Default --> 0x00 需要调整
LCD_DataWrite(0x80);
LCD_CmdWrite(0xe0); //[E0H] , Default --> 0x00
LCD_DataWrite(0x00);
LCD_CmdWrite(0xf0); //[F0H] , Default --> 0x00
////////////////////////////////////////LCD_DataWrite(0x00);
LCD_DataWrite(0x80);
LCD_CmdWrite(0xf1); //[F1H] , Default --> 0x00
LCD_DataWrite(0x00);
}
/////////////////清屏子程序//////////////////////////
void clear(void)
{
unsigned char temp;
//LCD_Graphic(); //选择绘图模式
//////////////////////////////noclearsnow(); //关闭消除雪花功能
LCD_CmdWrite(0xe0);
LCD_DataWrite(0x00);
temp = LCD_CmdRead(0xf0);
temp |= 0X08; //内存清除功能开启,将FNTR数据填满整个工作窗口。
LCD_DataWrite(temp);
do{
delay_us(1);
}
while(LCD_StasRead() & 0x80);
}
//*************文字模式**************************
void LCD_Text(void) //123456
{
unsigned char temp;
temp=LCD_CmdRead(0x00);
//temp |=0x08;
temp |=0x0C;
LCD_CmdWrite(0x00);
LCD_DataWrite(temp);
//noclearsnow(); //关闭消除雪花功能
}
/////////////在指定的坐标处显示字符串////////////////////
void LCD_ShowStr(unsigned char xxx,unsigned char yyy,unsigned char *text)//123456
{
LCD_Text(); //选择文本模式
LCD_CmdWrite(0x12);
LCD_DataWrite(0x31);
LCD_GotoXY(xxx,yyy); //设定X,Y坐标位置
LCD_CmdWrite(0xB0);
while(*text != '\0')
{
delay_nms(100);
LCD_DataWrite(*text);
++text;
delay_nms(1);
}
}
void main()
{
int tp;
DDRD = 0x7F;
PORTD = 0x00;
PORTB = 0x00;
DDRB = 0xBF;
DDRA=0xFF; //端口C设置
PORTA = 0xFF;
DDRC=0xFF; //端口C设?
PORTC = 0xFF;
softrst();
lcd_inital();
////////////////Only_Show_Page2();
//////////////Access_Page2();
//clear();
//display_biao();
///////////////////Access_Page1();
///////////clear();
/////////////LCD_ShowStr(0x00,0x00,"温度");
///////////////////Only_Show_Page1();
/////////////OR_Two_Layer();
/////////////////Show_Two_Layer();
/////////////delay_nms(3000);
clear();
while(1)
{
//PORTA = 0xFF;
//delay_nms(100);
// LCD_ShowStr(0x00,0x00,"1234");
///////////////////////////////LCD_ShowStr(0x00,0x00,"温度湿度");
//////////////////////delay_nms(100);
//////////////////////////Access_Page1();
///////////////////////////////////////////////Only_Show_Page1();
//LCD_GotoXY(0x03,0x40);
//////////////////LCD_GotoXY(0x00,0x00);
/////////////////////LCD_CmdWrite(0xb0);
/////////////////////////LCD_DataWrite(0x02+0x30);
LCD_ShowStr(0x00,0x00,"温度湿度");
delay_nms(1000);
clear();
}
}
|