欣欣学习网,老工程师带你学习单片机技术,欢迎来坐坐。
首  页 | 学习NIOSII | 学习C51 | 学习CPLD | 51+CPLD实验板 | | | MY-RTOS

本栏目的实验需在 WinXp 上操作。建议在 Virtual Box 虚机上安装WinXp系统,使用更方便。

 学习板概述
 安装keil C51软件
 在线烧写程序
 keil C51使用入门
 使用keil C51仿真调试
 使用标准输入输出设备
 点灯程序
 跑马灯程序
 LED数码管扫描显示程序
 键盘扫描程序
 键盘数码管联合扫描
 计时秒表程序
 蜂鸣器发声程序
 产生音阶程序
 字符LCD控制程序
 Flash读写程序
 使用ADC检测模拟量程序
 相关软件与文档


单片机/C51学习板

字符LCD控制程序


该程序通过实验板上的LCD接口,在一个字符型LCD上显示一行字符,示例了如何操控实验板上的LCD接口。

1.

点击 这里 下载示例工程,保存并解压到 D: 盘根目录下。

2.

启动 ISP 软件,将 D:\character 下的 mon51.hex 文件烧写到实验板上,关闭 ISP 软件。如果实验板上已有调试代理程序,可略过这一步。ISP 软件的使用方法参见:在线烧写程序

3.

启动 Keil uVision2 集成开发软件,打开 D:\character 下的 character.Uv2 工程,重新编译。Keil uVision2 软件的使用方法见:keil C51使用入门

4.

设置好 Monitor-51 Driver 所使用的串口号后,在 Debug 菜单下,点击 Start/Stop Debug session 命令,启动调试界面。如何设置串口号,请参阅:使用keil C51仿真调试

5.

在命令行窗口里,输入 pc = 0x2000 命令,然后按 F5 键,执行该程序。

程序代码如下:

#include <reg52.h>       /* special function register declarations   */
#include <absacc.h>      /* for the intended 8051 derivative         */

#include <stdio.h>       /* prototype declarations for I/O functions */

sbit CD = P1^0;
sbit CLK = P1^1;

unsigned int i;

unsigned char timer1;

void lcdClkPulse();
void textOut(char *p);

/***************************************************
 * 主程序入口。                                    *
 ***************************************************/
void main (void)  
{ 

/***************************************************
 * CD 为LCD的命令/数据选择信号,当CD=1时,为数据传 *
 * 输,当CD=0时,为命令传输。                      *
 ***************************************************/
  CD = 0;

/***************************************************
 * LCD 功能设置,寄存器定义如下:                  *
 * B7  B6  B5  B4  B3  B2  B2  B0                  *
 * 0   0   1   DL  N   F   X   X                   *
 * DL:数据长度选择位。                            *
 *     DL=1 时为8位数据传输,DL=0 时为4位数据传输,*
 *     使用 D7 - D4 4个位,分2次送入一个完整的字符 *
 *     数据。                                      *
 * N: 显示屏为单行或双行选择。                    *
 *     N=1 为单行显示,N=0 则为双行显示。          *
 * F: 大小字符显示选择。                          *
 *     当F=1时,为5x10点阵字符,当F=0时为5x7点阵字 *
 *     符。                                        *
 * LCD 的数据端口位于是 XDATA 空间的 0xa00 地址。  *
 ***************************************************/
  XBYTE[0xa000] = 0x38;

  lcdClkPulse();

/***************************************************
 * 0x02 是LCD的光标归位命令。LCD内部的地址计数器清 *
 * 0,光标移到左上角。                             *
 ***************************************************/
  XBYTE[0xa000] = 0x02;

  lcdClkPulse();

/***************************************************
 * 设定字符进入模式,寄存器定义如下:              *
 * B7  B6  B5  B4  B3  B2  B1  B0                  *
 * 0   0   0   0   0   1   I/D S                   *
 * I/D: 地址计数器增、减控制。I/D=1时,每传送一个 *
 *       字符,地址计数器加1,光标右移一个位置;当 *
 *       I/D=0时,每传送一个字符,地址计数器减1,  *
 *       光标左移一个位置。                        *
 * S:   S=1 时光标移动,S=0 时光标不移动。        *
 ***************************************************/
  XBYTE[0xa000] = 0x07;

  lcdClkPulse();

/***************************************************
 * 显示开关。                                      *
 * B7  B6  B5  B4  B3  B2  B1  B0                  *
 * 0   0   0   0   1   D   C   B                   *
 * D: D=1时,显示屏开启,D=0时,显示屏关闭。      *
 * C: C=1时,光标出现在屏上,C=0时不出现。        *
 * B: B=1时,光标闪烁,B=0时,光标不闪烁。        *
 ***************************************************/
  XBYTE[0xa000] = 0x0c;

  lcdClkPulse();
  
  textOut("Hello world!");

  while(1){}
}                               

void textOut(char *p)
{
  char i;
 
  CD = 1;
  while(i!=0){
    XBYTE[0xa000]=i;
    lcdClkPulse();
    p++;
    i = *p;    
  }
}

void lcdClkPulse()
{
  char i;
  CLK = 1;
  for(i=0;i<250;i++){}
  CLK = 0;
  for(i=0;i<250;i++){}
}




管理员信箱: stonewayqi@hotmail.com

欣 欣 学 习 网

粤ICP备2023138008号