完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
主控为ST7920的12864.由于手头上Mega8 I/O口不够,只好用PC0-PC3接DB0~3口,PD0~3接DB4~7口。PSB写高电平,用并行输入。 12864一直没反应,求路过的高手帮忙看看,指点迷津。以下是程序: #include #include "lcd12864.h" #define uchar unsigned char #define uint unsigned int #define DB0 PC0 #define DB1 PC1 #define DB2 PC2 #define DB3 PC3 #define DB4 PD0 #define DB5 PD1 #define DB6 PD2 #define DB7 PD3 #define LCD_RS PD7 #define LCD_RW PD6 #define LCD_EN PD5 #define LCD_RET PC6//接Mega8 RESET口,低电平有效 #define SET_DATA() (1<#define SET_INC() (~(1<#define SET_READ() (1<#define SET_WRITE() (~(1<#define SET_EN() (1<#define CLR_EN() (~(1 uchar a; a=((PINC&0x0f)|((PIND&0x0f)<<4)); return a; } void LCD_DataPort(uchar Data) { if(Data&0x80) PORTD|=(1< if(Data&0x40) PORTD|=(1< if(Data&0x20) PORTD|=(1< if(Data&0x10) PORTD|=(1< if(Data&0x08) PORTC|=(1< if(Data&0x04) PORTC|=(1< if(Data&0x02) PORTC|=(1< if(Data&0x01) PORTC|=(1<} void LCD_CheckBusy(void) { uint temp,timeout=0; SET_INC(); SET_READ(); CLR_EN(); SET_EN(); Delay(5); temp=LCD_DataPortRead(); CLR_EN(); while((temp&0x80)&&(++Timeout!=0)); } void LCD_SendCmd(uchar Cmd) { LCD_CheckBusy(); SET_INC(); SET_WRITE(); SET_EN(); LCD_DataPort(Cmd); _delay_us(100); CLR_EN(); } void LCD_SendData(uchar Data) { LCD_CheckBusy(); SET_DATA(); SET_WRITE(); SET_EN(); LCD_DataPort(Data); Delay(5); CLR_EN(); } void Delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void LCD_Init(void) { Delay(50); LCD_SendCmd(0x30); //基本指令集 Delay(5); LCD_SendCmd(0x30); Delay(5); LCD_SendCmd(0x0c); //开显示 Delay(5); LCD_SendCmd(0x01); //清屏 Delay(5); LCD_SendCmd(0x06); //光标右移 } void LCD_SetAddress(uchar x,uchar y) { uchar Address; switch(y) { case 0: Address=0x80+x;break; case 1: Address=0x90+x;break; case 2: Address=0x88+x;break; case 3: Address=0x98+x;break; default: break; } LCD_SendCmd(Address); } void LCD_PutString(uchar x,uchar y,uchar *pData) { LCD_SetAddress(x,y); while(*pData!=' |