|
单片机/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++){}
}
|
|
|
|