arm从零开始3

ARM 114浏览

 灯点亮了,C代码可以运行了,再来点个屏,呵呵:-),都是没什么技术含量的东西,初学罢了
点击此处下载 ourdev_392613.rar(文件大小:63K) (原文件名:lcd1602.rar) 


 (原文件名:hello,world.jpg) 

启动代码就可以用点灯的了,反正也没用到复杂的东东,编译的设置也可以不用变,直接改下主程序就可以咯^_^

/****************************************************************************
* File: main.c
* 功能:向LCD输出字符
****************************************************************************/
#include  "config.h"

#define rs (1<<8)
#define rw (1<<9)
#define en (1<<10)
#define busy (1<<7)

#define MAXX 16

unsigned char str0[]={"Hello,World!"};
unsigned char str1[]={"Hello,ARM!"};
/****************************************************************************
* 名称:ChkBusy()
* 功能:检查总线是否忙
****************************************************************************/
void ChkBusy()
{
IO0DIR=0x700;
while(1)
{
IO0CLR=rs;
IO0SET=rw;
IO0SET=en;
if(!(IO0PIN & busy))break;
IO0CLR=en;
}
IO0DIR=0x7ff;
}

/****************************************************************************
* 名称:WC_Lcd()
* 功能:写函数
****************************************************************************/
void WC_Lcd(unsigned char dat)
{
ChkBusy();
IO0CLR=rs; //全部清零
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
}
/****************************************************************************
* 名称:WD_Lcd()
* 功能:写数据函数
****************************************************************************/
void WD_Lcd(unsigned char dat)
{
ChkBusy();
IO0SET=rs;
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
}
/****************************************************************************
* 名称:lcd_init()
* 功能:lcd初始化函数
****************************************************************************/
void lcd_init(void)
{
WC_Lcd(0x01); //显示模式设置,开始要求每次检测忙信号
WC_Lcd(0x38); //关闭显示
WC_Lcd(0x0f); //显示清屏
WC_Lcd(0x06); // 显示光标移动设置
WC_Lcd(0x0C); // 显示开及光标设置
}

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

/********************************************************************************
* 名称:DispString()
* 功能:在指定位置显示一串字符
*********************************************************************************/
void DispString(unsigned char X, unsigned char Y, unsigned char *DData)
  {
unsigned char StrLen;

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

  }
  
  
/****************************************************************************
* 名称:strlen()
* 功能:计算字符串长度
****************************************************************************/
int strlen(unsigned char s[])
{
int i=0;
while(s[i]!='/0')
i++;
return i;
}

/****************************************************************************
* 名称:main()
* 功能:显示文本
****************************************************************************/

int  main(void)
{   
    lcd_init();
IO0DIR=0x7ff; //设置为输出
IO0CLR=0x7ff;
DispString((MAXX-strlen(str0))/2, 0, str0);//居中显示字符串
DispString((MAXX-strlen(str1))/2, 1, str1);//居中显示字符串
while(1);
}