原创 好长时间没有更新博客了

2007-8-19 15:22 3023 9 9 分类: 工程师职场

最近一直出差,周末还要去北大青鸟上课,忙的团团转,很郁闷呀,北大青鸟的课个人认为还讲的不错,可惜的是对c没有很深入的讲解,只是做一般程度的讲解,重点在java,我个人对c比较感兴趣,今天搞了一天的单片机


用汇编写的可以仿真成功,用c写的如果生成hex文件烧入可以成功,但是仿真好像就会跑飞,我用的是学林电子的xl600,不知道什么问题,现在把程序贴上来,大家帮忙看看会不会是程序错误


[注:AT89S51使用12M晶振]
=============================================================*/


#define LCM_RW P2_1 //定义引脚
#define LCM_RS P2_0
#define LCM_E P2_2
#define LCM_Data P0
#define Busy P0_7 //用于检测LCM状态字中的Busy标识


#include <at89x51.h>


void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);


unsigned char code cdle_net[] = {"cat  and  lydia"};
unsigned char code email[] = {"zhuzhu  le yuan"};


void main(void)
{



Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)


DisplayListChar(0, 0, cdle_net);
DisplayListChar(0, 1, email);
ReadDataLCM();//测试用句无意义
while(1);
}


//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
}


//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}


//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}


//读状态
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}


void LCMInit(void) //LCM初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();


WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}


//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}


//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;


ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}


//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}


//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=2;//7269;
while(TempCycB--);
};
}


 


第二个


 


/*****************************************************************
作者:李全茂
日期:2007-08-18
描述:点亮两个灯
*****************************************************************/
#include <AT89X51.h>


void main(void)
{
 unsigned int a;//声明变量  无符号整型  值域0--65535
 unsigned char b;  //无符号字符型 值域0--255
 
 do
 {
  for(a=0;a<65535;a++) //延时,循环65535次
   P1_0=0;//点亮p1
  P1_0=1;//熄灭led


  for(a=0;a<30000;a++);//空循环


  for(b=0;b<255;b++) //延时, 循环255次
   P1_1=0;//点亮P1_1
  


  for(a=0;a<30000;a++);//空循环
 }while(1);
}

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条