//写指令 输入 RS=L,R/W=L,D0-D7=指令码,E=高脉冲 输出 无
//读数据 输入 RS=H,R/W=H,E=H 输出 D0-D7=数据
//写数据 输入 RS=H,R/W=L,D0-D7=数据,E=高脉冲 输出 无
#include"DSP28_Device.h"
#define lcd_rs GpioDataRegs.GPADAT.bit.GPIOA8
#define lcd_rw GpioDataRegs.GPADAT.bit.GPIOA9
#define lcd_ep GpioDataRegs.GPADAT.bit.GPIOA10
#define D0 GpioDataRegs.GPADAT.bit.GPIOA0
#define D1 GpioDataRegs.GPADAT.bit.GPIOA1
#define D2 GpioDataRegs.GPADAT.bit.GPIOA2
#define D3 GpioDataRegs.GPADAT.bit.GPIOA3
#define D4 GpioDataRegs.GPADAT.bit.GPIOA4
#define D5 GpioDataRegs.GPADAT.bit.GPIOA5
#define D6 GpioDataRegs.GPADAT.bit.GPIOA6
#define D7 GpioDataRegs.GPADAT.bit.GPIOA7
void Lcd_Init(void);//初始化LCD
void delay_1ms(unsigned int );//延时1m
void delay_40us(unsigned int);//延时40us
void lcd_write_command(unsigned int);//写命令函数
void lcd_write_data(unsigned char);//写数据函数
int lcd_check_busy(void);//检查忙信号。
void lcd_display_pose(unsigned int, unsigned int);//显示位置函数。
unsigned char dis1[]={"jiangkeqin"};//第一行要显示数据。
unsigned char dis2[]={"18995947988"};//第二行要显示数据。
void main()
{
unsigned int i;
InitSysCtrl(); //初始化系统函数。
DINT;
IER=0X0000; //禁止所有CPU中断。
IFR=0x0000; //清楚所有CPU中断
InitPieCtrl(); //初始化中断向量。
InitPieVectTable(); //初始化中断向量表。
InitPeripherals(); //初始化中断CPU定时器模块。
InitGpio(); //初始化GPIIO口。
EINT; //使能全局中断。
ERTM; //使能实时中断。
Lcd_Init(); //初始化LCD。
delay_1ms(10);
lcd_display_pose(0,0);//设计第一行显示位置。
for(i=0;dis1[i]!='\0';i++)//第一行显示数据。
{
while(lcd_check_busy());//检查忙信号。
lcd_write_data(dis1[i]);//写第i个字符。
}
delay_1ms(10);
lcd_display_pose(4,1);//从第二行第5个开始写。
for(i=0;dis2[i]!='\0';i++)//第二行显示数据。
{
while(lcd_check_busy());
lcd_write_data(dis2[i]);
}
while(1);
}
int lcd_check_busy()//检查忙信号。忙返回1,不忙返回0.
{
int result;
lcd_rs=0;
lcd_rw=1;
lcd_ep=1;
result=D7;
// ep=0;///?读数据和读状态ep=H;
delay_40us(1);//命令执行时间为40us.
return result;
}
void lcd_write_command(unsigned int com)//写指令函数。
{
lcd_rs=0;//
lcd_rw=0;//
lcd_ep=1;//容许 下降沿触发1-0;
D0=com&0x0001; //把8位数据写到16位的串口的低8位中去A0~A7中,保留高8位数据。例如把0x38写进去。
D1=(com>>1)&0x0001;
D2=(com>>2)&0x0001;
D3=(com>>3)&0x0001;
D4=(com>>4)&0x0001;
D5=(com>>5)&0x0001;
D6=(com>>6)&0x0001;
D7=(com>>7)&0x0001;
lcd_ep=0;//下降沿触发1---0???
delay_40us(1); //写指令所要时间为40us
}
void lcd_write_data(unsigned char data)//写数据函数。
{
while(lcd_check_busy());
lcd_rs=1;
lcd_rw=0;
lcd_ep=1;
D0=data&0x0001; //把8位数据写到16位的串口的低8位中去A0~A7中,保留高8位数据。例如把0x38写进去。
D1=(data>>1)&0x0001;
D2=(data>>2)&0x0001;
D3=(data>>3)&0x0001;
D4=(data>>4)&0x0001;
D5=(data>>5)&0x0001;
D6=(data>>6)&0x0001;
D7=(data>>7)&0x0001;
lcd_ep=0;
delay_40us(1);
}
void lcd_display_pose(unsigned int x,unsigned int y)
{
unsigned int address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
while(lcd_check_busy());
lcd_write_command(address);
}
//初始化LCD程序。
void Lcd_Init()
{
delay_1ms(15);
lcd_write_command(0x38);
delay_1ms(5);
lcd_write_command(0x38);
delay_1ms(5);
lcd_write_command(0x38);
while(lcd_check_busy());//判断LCD忙信号。
lcd_write_command(0x38);
while(lcd_check_busy());//判断LCD忙信号。
lcd_write_command(0x08);//显示关闭。
while(lcd_check_busy());//判断LCD忙信号。
lcd_write_command(0x01);//显示清屏
delay_40us(41);//清屏执行时间为1.64ms。
while(lcd_check_busy());//判断LCD忙信号。
lcd_write_command(0x06);//显示光标移动设置。
while(lcd_check_busy());//判断LCD忙信号。
lcd_write_command(0x0C);//显示开及光标设置
}
void delay_1ms(unsigned int t1)//延时d1ms*1ms.
{
unsigned int k1,j1;
while(t1>0)
{
for(k1=0;k1<1000;k1++)//延时1ms
{
for(j1=0;j1<150;j1++){}
}
t1--;
}
}
void delay_40us(unsigned int t2)
{
unsigned int k2;
while(t2>0)
{
for(k2=0;k2<6000;k2++){}//延时40us。
t2--;
}
}
那个大神帮我看看,哪儿有问题啊 |