#1楼主:EDN51板子的LCD1604的测试程序
文章发表于:2008-08-27 01:19
/************************************************/
/*功 能:使用51内核的单片机驱动的字符型液晶LCD*/
/*LCD型号:TC1604A */
/*MCU型号:STC89C54RD+ */
/*编程语言:C51(KEIL C) */
/*编写者:王兴权 */
/************************************************/
/*TC1604的管脚说明 */
/* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */
/* VSS VDD VL RS R/W ET D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK */
/*数据手册见文件夹中的数据手册 */
#include <reg51.h>
//LCD1604与微处理器的端口映射关系定义
#define LCD_Data_BUS P0 /*数据端 */
sbit LCD_RS=P1^0;/*数据/命令选择端:H/L */
sbit LCD_RW=P1^1;/*读/写选择端:H/L */
sbit LCD_ET=P1^2;/*使能控制端 */
/*LCD的各种状态的指令码定义*/
#define LCD_CODE_RESET 0x38
#define LCD_CODE_SETUP 0x08
#define LCD_CODE_SETUP_CUR_FLASH 0x01
#define LCD_CODE_CLEAR 0x01
#define LCD_CODE_SET_OFFSET 0x80
#define LCD_Display_DELAY 250
#define HIGHT 1
#define LOW 0
/*行设置 */
#define line_1 0x00
#define line_2 0x40
#define line_3 0x10
#define line_4 0x50
/****************LCD程序&&&&&&&&&&&&&&&&&&/
/************************************/
/*函数名称:Delay_LCD */
/*函数功能:LCD的延时函数 */
/*传递参数:无 */
/*返 回 值:无 */
/*备 注: */
/************************************/
void Delay_LCD()
{
unsigned int j;
for(j=0;j<300;j++)
{;}
}
/************************************/
/*函数名称:Write_LCD_Command */
/*函数功能:LCD的写指令函数 */
/*传递参数:指令码(comm) */
/*返 回 值:无 */
/*备 注: */
/************************************/
void Write_LCD_Command(comm)
unsigned char comm;
{
LCD_RS = LOW;
LCD_RW = LOW;
LCD_ET = LOW;
LCD_Data_BUS = comm;
LCD_ET = HIGHT;
Delay_LCD();
LCD_ET = LOW;
}
/************************************/
/*函数名称:Read_LCD_Status */
/*函数功能:读LCD的状态 */
/*传递参数:无 */
/*返 回 值:状态数据 */
/*备 注: */
/************************************/
unsigned char Read_LCD_Status()
{
unsigned char dat;
LCD_ET = LOW; //收回使能
LCD_Data_BUS = 0xFF;
LCD_RS = LOW; //命令
LCD_RW = HIGHT; //送写使能
LCD_ET = HIGHT; //使能
dat = LCD_Data_BUS;
LCD_ET = LOW; //收回片选
return(dat);
}
/************************************/
/*函数名称:Write_LCD_Data */
/*函数功能:LCD的写数据函数 */
/*传递参数:所写数据wdata(1个字节) */
/*返 回 值:无 */
/*备 注: */
/************************************/
void Write_LCD_Data(wdata)
unsigned char wdata;
{
LCD_RS = HIGHT;
LCD_RW = LOW;
LCD_ET = LOW;
LCD_Data_BUS = wdata;
LCD_ET = HIGHT;
Delay_LCD();
LCD_ET = LOW;
}
/************************************/
/*函数名称:Init_LCD */
/*函数功能:LCD的初始化函数 */
/*传递参数:无 */
/*返 回 值:无 */
/*备 注: */
/************************************/
void Init_LCD()
{
Delay_LCD();
Write_LCD_Command(LCD_CODE_RESET);
Delay_LCD();
Write_LCD_Command(LCD_CODE_RESET);
Delay_LCD();
Write_LCD_Command(LCD_CODE_RESET);
Delay_LCD();
Write_LCD_Command(LCD_CODE_RESET);
Delay_LCD();
Write_LCD_Command(LCD_CODE_SETUP);
Write_LCD_Command(LCD_CODE_CLEAR);
Write_LCD_Command(0x06);
Write_LCD_Command(0x0C);
}
/************************************/
/*函数名称:Clear_LCD */
/*函数功能:清屏函数 */
/*传递参数:无 */
/*返 回 值:无 */
/*备 注: */
/************************************/
void Clear_LCD()
{
Write_LCD_Command(LCD_CODE_CLEAR);
}
/************************************/
/*函数名称:Clear_LCD */
/*函数功能:设置坐标*/
/*传递参数:Line,Row*/
/*返 回 值:0/1*/
/*备 注:*/
/************************************/
unsigned char Set_LCD_XY(Line,Row)
unsigned char Line;
unsigned char Row;
{
unsigned char Delay,Data = 0;
Delay = LCD_Display_DELAY;
while(Delay > 0){
Data = Read_LCD_Status();
if ((Data & 0x80) == 0){
Write_LCD_Command((Line + Row) + LCD_CODE_SET_OFFSET);
return(0);
}
Delay--;
}
return(1);
}
/************************************/
/*函数名称:Cursor_Glint */
/*函数功能:光标闪烁控制函数 */
/*传递参数:0/1 */
/*返 回 值:无 */
/*备 注:0是关,1是开 */
/*下面两句结合控制光标的闪烁位置*/
/* Set_LCD_XY(line_2,6);*/
/* Cursor_Glint(1);*/
/************************************/
void Cursor_Glint(NoOff)
unsigned char NoOff;
{
unsigned char com;
com=NoOff << 2;
com |= 13;
Write_LCD_Command(com);
}
/************************************/
/*函数名称:Display_BCDToLCD */
/*函数功能:在LCD显示BCD码的数字函数 */
/*传递参数:dat */
/*返 回 值:无 */
/*备 注: */
/************************************/
void Display_BCDToLCD(dat)
unsigned char dat;
{
unsigned char b;
b= (dat>>4)&0x0f;//高四位
if (b<10){
Write_LCD_Data('0'+b);
}else{
Write_LCD_Data('A'+(b-10));
}
b = dat & 0x0f;//低四位
if (b<10){
Write_LCD_Data('0'+b);
}else{
Write_LCD_Data('A'+(b-10));
}
//Write_LCD_Data(' '); //空格
}
/************************************/
/*函数名称:Display_Strings */
/*函数功能:LCD显示字符串函数 */
/*传递参数:line,strings,number*/
/*返 回 值:*/
/*备 注:line是显示行的位置参数,可以取得的值可*/
/* 以是line_1,line_2,line_3,line_4*/
/* strings是要显示的字符串,使用""括起来*/
/* number是显示的字符串的个数*/
/*调用格式:Display_Strings(line_2+2,"Display",7);*/
/*含义:从第2行的第2个位置开始显示Display*/
/************************************/
void Display_Strings(line,strings,number)
unsigned char line;
char *strings;
unsigned int number;
{
unsigned char i;
Write_LCD_Command(line+0X80);
for(i=0;i<number;i++)
{
Write_LCD_Data(strings[i]);
}
}
/*****************LCD程序END****************/
/************************************/
/*函数名称:Delay_System */
/*函数功能:通用延时函数*/
/*传递参数:延时值(t)*/
/*返 回 值:无*/
/*备 注:*/
/************************************/
void Delay_System(unsigned int Delay)
{
unsigned int i;
for(;Delay>0;Delay--)
{
for(i=1000;i>0;i--);
}
}
/************************************/
/*函数名称:main */
/*函数功能:主函数*/
/*传递参数:*/
/*返 回 值:*/
/*备 注:*/
/************************************/
main()
{
unsigned int cishu;
Init_LCD();
//Write_LCD_Data(0x65);
//Write_LCD_Data('A');
//Delay_System(65534);
//Clear_LCD();
Display_Strings(line_1+4,"LCD Test",8);
//下面两句结合控制光标的闪烁位置
//Set_LCD_XY(line_2,6);
//Cursor_Glint(1);
for(cishu=0;cishu<=99;cishu++)
{
Init_LCD();
Display_Strings(line_1+4,"LCD Test",8);
Set_LCD_XY(line_3,6);
Display_BCDToLCD(cishu);
Delay_System(100);
if(cishu==99)
cishu = 0;
}
}
LCD1604.c