|
刚学习不久,代码写的比较烂,主要想学习下LCD,抄了下某开发板的代码,自己改了下,代码如下:
#include
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
uchar stringaz[15];
uchar disp1[]={" sattracker "};
uchar disp2[]={"AZ:000 EL:000 "};
uchar az[4];
uchar el[4];
uchar iaz,azlen;
uint record,a,j,k,douhao,len;
int numaz,numel;
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
/********************************************************************
* 名称 : Convert(uchar In_Date)
* 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
* 输入 : 1602资料上的值
* 输出 : 送到1602的值
***********************************************************************/
uchar Convert(uchar In_Date)
{
uchar i, Out_Date = 0, temp = 0;
for(i=0; i<8; i++)
{
temp = (In_Date >> i) & 0x01;
Out_Date |= (temp << (7 - i));
}
return Out_Date;
}
/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void enable(uchar del)
{
P0 = Convert(del);
RS = 0;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write(uchar del)
{
P0 = Convert(del);
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == '\0')
break;
write(*p);
p++;
}
}
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
if(RI)
{
RI = 0;
stringaz[iaz++]=SBUF;
if(SBUF == '*')
{
stringaz[iaz]='\0';
iaz=0;
}
}
}
void data_cl()
{
douhao=0;
j=0;
k=0;
len=strlen(stringaz);
for(a=0;a
{
if(stringaz[a]==',')
{
douhao++;
a++;
}
if(douhao==1)
{
az[j]=stringaz[a];
j++;
}
if(douhao==2)
{
el[k]=stringaz[a];
k++;
}
if(stringaz[a]=='*')
{
numaz=atoi(az);//数据格式的AZ数据
numel=atoi(el);//数据格式的EL数据
azlen=strlen(az);//查看AZ的长度
j=0;
k=0;
}
}
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1;
//启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
j=0;
k=0;
Delay_1ms(1);
Com_Init();
L1602_init();
L1602_string(1,1,disp1);
L1602_string(2,1,disp2);
while(1)
{
data_cl();
if(azlen==3) //当AZ数据是三位数时
{
disp2[3]=numaz/100+'0';//3位数据时候的百位
disp2[4]=numaz%100/10+'0';//十位
disp2[5]=numaz%100%10+'0';//个位
L1602_string(2,1,disp2);//送显
}
if(azlen==2) //AZ数据是2位的时候
{
disp2[3]=0x30; //高位显示0是不是可以用来清楚原来写的高位数据
disp2[4]=numaz/10+'0'; //2位AZ数据的10位
disp2[5]=numaz%10+'0'; //2位数据时候的个位
L1602_string(2,1,disp2);
}
}
}
串口调试软件发送特定格式的数据(如:“#,11,22,*”11放分离出的AZ数组,22放分离出的EL数组,EL数组暂时没用),串口数据接收正常,数码管显示正常(现在暂时没用),现在的问题是:比如第一次送个2位的数据如11,LCD显示011,正常,再送个3位的数据333,LCD显示333,但要是再换回2位的数据如44,LCD就显示443。程序写的比较烂,看下哪出了问题。
这是开发板的代码,好象也没什么查看BUSY标志的,但是可以很好显示。
|
|