|
我搞1602四线驱动,调试了很久但就是显示不出来,请各位高手帮帮忙,谢谢!
程序如下(用Mega16做的):
#include<ioM16v.h>
#include <macros.h>
/*------宏定义------*/
#define uchar unsigned char
#define uint unsigned int
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
//******************用这个驱动时只须修改下面端口设置*************************/
/*********************************************************************/
#define LM_E 3 //pA3
#define LM_RW 2 //PA2
#define LM_RS 1 //pA1
#define DATAPORT PORTA //数据口PA4/5/6/7
/*********************************************************************/
#define SET_LM_E( ) (PORTA|=(1<<LM_E)) //E=1
#define CLR_LM_E( ) (PORTA&=(~(1<<LM_E))) //E=0
#define SET_LM_RW( ) (PORTA|=(1<<LM_RW)) //RW=1
#define CLR_LM_RW( ) (PORTA&=(~(1<<LM_RW ))) //RW=0
#define SET_LM_RS( ) (PORTA|=(1<<LM_RS)) //RS=1
#define CLR_LM_RS( ) (PORTA&=(~(1<<LM_RS))) //RS=0
#define SET_LM_DDR( ) DDRA|=0xf0;
#define CLR_LM_DDR( ) DDRA&=0x0f;
#define SET_LM_DataPORT( ) PORTA|=0xf0;
#define CLR_LM_DataPORT( ) PORTA&=0x0f;
/*********************************************************************/
///////////////液晶驱动程序初始化/////////////////////////////////////
/////
const uchar NoDisp=0;//无显示
const uchar NoCur =1;//有显示无光标
const uchar CurNoFlash=2;//有光标但不闪
const uchar CurFlash=3;//有光标且闪烁
void LcdPos(uchar,uchar);//确定光标位置
void LcdWd (char);//写字符
void LcdWc (uchar);//送控制字(检测忙信号)
void LcdWcn (uchar);//送控制字(不检测忙信号)
void WaitIdle(void);//检测忙信号
void RstLcd( void);//复位
void ClrLcd( void);//清屏
void SetCur(uchar Para);//设置光标
void WriteChar(char c,uchar xPos,uchar yPos);//显示字符
void WriteString(char *s,uchar xPos,uchar yPos);//显示字符串
///////////////液晶驱动程序//////////////////////////////////////////////
void WriteChar(char c,uchar xPos,uchar yPos)
//显示字符
{
LcdPos(xPos,yPos);
LcdWd(c);
}
//////////youwenti/////////////////////////////////////////////////////////
void WriteString(char *s,uchar xPos,uchar yPos)
//显示字符串
{
uchar i =0;
if(*s=='\0')
return;
for(i=0;;i++)
{
if(*(s+i)=='\0')
break;
WriteChar(*(s+i),xPos,yPos);
xPos++;
if(xPos>15)
break;
}
}
////////////////////////////////////////////////////////////////////////////
void SetCur(uchar Para)
//设置光标
{
delay_nms(10);
switch (Para)
{
case 0:
{
LcdWc(0x08);//关显示NoDisp
break;
}
case 1:
{
LcdWc(0x0c);//开显示但无光标 NoCur
break;
}
case 2:
{
LcdWc(0x0e);//开显示有光标但不闪烁CurNoFlash
break;
}
case 3:
{
LcdWc(0x0f);//开显示有光标且闪烁CurFlash
break;
}
default:break;
}
}
////////////////////////////////////////////////////////////////////
void ClrLcd(void)//清屏函数
{
LcdWc(0x01);
}
///////////////////////////////////////////////////////////?
void WaitIdle(void)//检测忙信号
{
char temp,i=0;
CLR_LM_RS( );//RS=0
SET_LM_RW( );//RW=1
delay_nus(2);
CLR_LM_DDR( );//设置为输入
CLR_LM_DataPORT();//清高四位
SET_LM_E() ;//E=1
delay_nus(2);
for( ; ; )
{
delay_nus(3);
temp=PINA;
if(i==0)
{
temp &=0x80;
if(temp==0)
break;
i=1;
}
else
i=0;
}
SET_LM_DDR( );//置高四位为1
CLR_LM_E( ) ;//E=0
}
//////////////////////////////////////////////////////////////////////?
void LcdWd(char c)
//写字符
{
WaitIdle();
SET_LM_RS();//RS=1
CLR_LM_RW();//RW=0
delay_nus(2);
CLR_LM_DataPORT( );//清高四位
DATAPORT|=c&0xf0; //写高四位
delay_nus(2);
SET_LM_E();//E=1
delay_nus(2);
CLR_LM_E() ;//E=0
c=c<<4;//低四位移到高四位
delay_nus(2);
CLR_LM_DataPORT( ) ;//清高四位
DATAPORT|=c&0xf0; //写低四位
delay_nus(2);
SET_LM_E();//E=1
delay_nus(2);
CLR_LM_E() ;//E=0
}
////////////////////////////////////////////////////////////////
void LcdWc(uchar c)//送控制字(检测忙信号)
{
WaitIdle();
LcdWcn(c);
}
void LcdWcn(uchar c)//送控制字(不检测忙信号)//////////?
{
CLR_LM_RS();//RS=0
CLR_LM_RW();//RW=0
delay_nus(2);
CLR_LM_DataPORT() ;//清高四位
DATAPORT|=c&0xf0; //写高四位
delay_nus(2);
SET_LM_E();//E=1
delay_nus(2);
CLR_LM_E() ;//E=0
delay_nus(1);
c=c<<4;//低四位移到高四位
delay_nus(2);
CLR_LM_DataPORT() ;//清高四位
DATAPORT|=c&0xf0; //写低四位
delay_nus(2);
SET_LM_E();//E=1
delay_nus(2);
CLR_LM_E() ;//E=0
delay_nus(1);
}
/////////////////////////////////////////////////////////////////
void LcdPos(uchar xPos,uchar yPos)//确定光标位置
{
unsigned char tmp;
xPos &=0x0f;
yPos &=0x01;
if(yPos==0)
tmp=xPos;
else
tmp=xPos+0x40;
tmp|=0x80;
LcdWc(tmp);
}
///////////////??????难点??????????////////////
void LcdPosCGRAM(uchar xPos) //CGRAM地址设置
{
LcdWc(xPos|0x40);
}
void WriteCharCGRAM(char a[],uchar xPos)
//创建一个字符,
{
char i;
WaitIdle();
for(i=0;i<8;i++)
{
LcdPosCGRAM(xPos);
LcdWd(a);
xPos++;
}
}
/////////////////////??????难点???????????/////////
////////////////////////////////////////////////////////////////
void display09(char a,char x,char y) //显示0~9字符
{
switch(a)
{
case 0:SetCur(NoCur); delay_nus(2); WriteChar('0',x,y);break;
case 1:SetCur(NoCur); delay_nus(2); WriteChar('1',x,y);break;
case 2:SetCur(NoCur); delay_nus(2); WriteChar('2',x,y);break;
case 3:SetCur(NoCur); delay_nus(2); WriteChar('3',x,y);break;
case 4:SetCur(NoCur); delay_nus(2); WriteChar('4',x,y);break;
case 5:SetCur(NoCur); delay_nus(2); WriteChar('5',x,y);break;
case 6:SetCur(NoCur); delay_nus(2); WriteChar('6',x,y);break;
case 7:SetCur(NoCur); delay_nus(2); WriteChar('7',x,y);break;
case 8:SetCur(NoCur); delay_nus(2); WriteChar('8',x,y);break;
case 9:SetCur(NoCur); delay_nus(2); WriteChar('9',x,y);break;
default:break;
}
}
/////////////////////////////////////
void RstLcd(void)//复位
{
LcdWc(0x28);//四位数据,显示两行,5*7
delay_nms(5);
LcdWc(0x08);//关显示
delay_nms(5);
LcdWc(0x01);//清屏
delay_nms(5);
LcdWc(0x06);//光标右移一格,AC加1
delay_nms(5);
LcdWc(0x0c);//开显示但无光标
}
///////////////////////液晶驱动程序///////////////////////////////////////////
//端口初始化
void port_init(void)
{
PORTA = 0xff;
DDRA = 0xff;
}
//初始化函数
void init_devices(void)
{
CLI( ); //禁止所有中断
port_init();
SEI( );//开全局中断
}
///字库数组
char temp[]={0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00};//创建“日”字
//主函数
void main(void)
{
init_devices( );
RstLcd( );
delay_nus(5);
ClrLcd( );
SetCur(1);
delay_nus(5);
WriteChar('J',0,1);//显示字符
WriteString("xie xie ",1,1);//显示字符串
WriteCharCGRAM(temp,0);//创建一个字符
//在这继续添加你的代码
WriteChar(0,0,0);//显示自创字符时,char c用0~7数字代替
while(1)
{
;
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|