📄 1602driver.c
字号:
/****************************************/////////////////////////////
/*文件名称:1602driver
*文件标识:
*摘 要:LCD 1602 驱动程序,显示内容:数字,英文字符,ascii码符号,
* 内设有几个子函数 1.显示位置的控制,根据 line ,row 的值设定,随意开始显示的位置
2.显示字符子函数,调用函数,(“要显示的字符”)
3.显示数值子函数,调用该函数(整数部分的数值,小数部分的数值)
4.显示数值+字符的子函数 调用函数 ((“要显示的字符”,整数,小数,“单位”)
*作 者:陈军
*完成日期:20080923
*
*
*///////////////////////////////////////***************************************/
#include <reg52.h>
//各功能设定时候的指令码如下:
const unsigned char CLEAR_SCREEN = 0X01;
const unsigned char CURSOR_RETURN = 0X02;
const unsigned char MODE_SET = 0X06; // 完成一个字码传送后,AC自动加1,显示不发生位移
const unsigned char DISPLAY_ON = 0X0C; // 开显示,光标不显示,光标所在位置的字符不闪烁
const unsigned char CURSOR_DISPLAY_SHIFT = 0X14;//光标向右移,显示不动,AC自动加1
const unsigned char FUNCTION_SET = 0X38; //数据接口宽度为8位,两行显示,5*8点阵字符
const unsigned char CGRAM_ADD_INI = 0X40; //CGRAM 初始地址设为000000,
const unsigned char DDRAM_ADD_INI_1 = 0X80; //DDRAM 初始地址设为1000000
const unsigned char DDRAM_ADD_INI_2 = 0XC0;
const bit E_READ = 1; // E=1,读
const bit RS_INST = 0; //RS=0,DB7~0,数据操作指向指令寄存器
const bit RS_DATA = 1; //RS=1,DB7~0,数据操作指向数据寄存器
const bit RW_READ = 1; //此时进行访问的为,读操作
const bit RW_WRITE = 0; //此时进行访问的为,写操作
//端口定义
// P07~P00 对应的为LCD数据窗口的DB7~DB0
sbit RS = P2^0; //指向指令、数据寄存器的mcu控制端口
sbit RW = P2^1; //读写操作控制由 mcu P2^1端口提供
sbit E = P2^2; //读写控制使能信号,由P2^3控制
sbit BF = P0^7;
unsigned char code num_dis_code[10]="0123456789";
unsigned char *p_number = &num_dis_code[0];
unsigned char code self_definition_char[] = {
0x06,0x02,0x0a,0x11,0x08,0x12,0x0d,0x00, //"公"代码
0x0e,0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00, //"元"代码
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00, //"年"代码
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00, //"月"代码
0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00, //"日"代码
0x00,0x1F,0x15,0x15,0x1B,0x11,0x1F,0x00, //"四"代码
0x1F,0x04,0x04,0x1E,0x0A,0x12,0x1F,0x00, //"五"代码
0x08,0x04,0x1F,0x00,0x0A,0x11,0x00,0x00, //"六"代码
0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00, //"\"代码
0x01,0x02,0x05,0x02,0x06,0x02,0x02,0x02, //自定义字符
0x04,0x0A,0x1F,0x04,0x1F,0x0E,0x15,0x0C, //自定义字符
0x01,0x0F,0x04,0x02,0x01,0x02,0x04,0x08, //自定义字符
0x00,0x1E,0x08,0x10,0x00,0x10,0x08,0x06, //自定义字符
0x0F,0x12,0x0F,0x04,0x0F,0x00,0x0F,0x00, //自定义字符
0x1F,0x12,0x1C,0x10,0x1E,0x10,0x1F,0x10, //自定义字符
};
//unsigned char *p_number = "0123456789";
unsigned char k;
//unsigned char start_positon;
unsigned char second=0; /*相应的位置上要显示的字符,时分秒,10*(时,分,秒)*/
unsigned char ten_second=0;
unsigned char miniute=0;
unsigned char ten_miniute=0;
unsigned char hour=0;
unsigned char ten_hour=0; //char code int2charLCD[]="0123456789";
///////////////////////////////////////////////////////////////////////////////
void fun_wait_bf(void) ///读,等待,busy标志位,busy=0 方可进行操作
{
RS = RS_INST;
RW = RW_READ;
E = E_READ;
while (BF)
{
}
}
void fun_write_e(void) //制造一个E 的上升沿,能够为写数据服务
{
E=0;
E=0;
E=1;
E=1;
E=0;
E=0;
}
void fun_write_instruction(unsigned char instruction_data)//函数1—写命令
{
fun_wait_bf(); //在开始操作前,确定bf,负责等待到 lcd 模块空闲后再操作
RS = RS_INST; //指向指令寄存器
RW = RW_WRITE; //写操作控制
P0 = instruction_data; //将命令送如IO口 //具体指令码送P0口,即DB7~DB0
fun_write_e(); // e制造一个xia升沿,让指令写入,lcd模块的内部寄存器
}
void fun_write_data(unsigned char data_data) //函数2-写数据
{
fun_wait_bf(); //在开始操作前,确定bf,负责等待到 lcd 模块空闲后再操作
RS = RS_DATA; //指向数据寄存器
RW = RW_WRITE; //写操作控制
P0 = data_data; //具体数据送P0口,即DB7~DB0
fun_write_e(); // e制造一个上升沿,让数据写入,lcd模块的内部寄存器
}
/*
*函数介绍: .显示位置的控制,根据 line ,row 的值设定,随意开始显示的位置
*输入参数: line 行 =1,2 row =0~15.
*输出参数:
*返回值 :
*/
void fun_display_position(unsigned char line,unsigned char row) //
{
unsigned char start_position = 0;
if (line == 1)
{
start_position = DDRAM_ADD_INI_1 + row; //开始位置设定在 第一行,根据row定第几列
}
if (line == 2 )
{
start_position = DDRAM_ADD_INI_2 + row; //开始位置设定在 第二行,根据row定第几列
}
fun_write_instruction(start_position);//--读写数据位置命令
}
void fun_display_char(unsigned char *p_char) //函数3-显示字符 //显示字符符子函数
{
while (*p_char) //指针指向要显示字符的首地址,只要字符就传送字符对应的字模
{ //直到指针找不到字符为止,判断为要传送的字符结束。
fun_write_data(*p_char);
p_char++;
}
}
void fun_display_num4(unsigned long int zhengshu)//函数4-显示整数
{
unsigned char ge,shi,bai,qian;
if ((zhengshu>=1000) && (zhengshu<=9999)) //数值再10的3次方以上
{
qian = zhengshu/1000;
bai = (zhengshu%1000)/100;
shi = (zhengshu%100)/10;
ge = (zhengshu%10);
p_number = &num_dis_code[0]+qian;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+bai;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+shi;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+ge;
fun_write_data(*p_number);
}
if ((zhengshu>=100) && (zhengshu<=999)) //数值再10的2次方以上
{
bai = zhengshu/100;
shi = (zhengshu%100)/10;
ge = (zhengshu%10);
p_number = &num_dis_code[0]+bai;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+shi;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+ge;
fun_write_data(*p_number);
}
if ((zhengshu>=10) && (zhengshu<=99)) //数值再10的1次方以上
{
shi = zhengshu/10;
ge = (zhengshu%10);
p_number = &num_dis_code[0]+shi;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+ge;
fun_write_data(*p_number);
}
if ((zhengshu>=0) && (zhengshu<=9)) //只有个位
{
ge = (zhengshu%10);
p_number = &num_dis_code[0]+ge;
fun_write_data(*p_number);
}
}
/*************************************************************************
*函数介绍:显示数值子函数,调用该函数(整数部分的数值,小数部分的数值),
*输入参数:整数部分的最大值,显示为10000000,小数部分显示3位,
*输出参数:小数部分,输入0,显示 。000, 输入123 显示 。123,以此类推
*返回值 :
*/////////////////////////////////////////////////////////////////////
void fun_display_num_dot(unsigned long int zhengshu,unsigned int dot)
{
unsigned char ge,shi,bai,qian,wang,wang10,wang100,wang1000,dot1,dot01,dot001;
if ((zhengshu>=10000000) && (zhengshu<99999999)) //数值再10的7次方以上
{
wang1000 = zhengshu/10000000; //取各个数量级位,
wang100 = (zhengshu%10000000)/1000000;
wang10 = (zhengshu%1000000)/100000;
wang = (zhengshu%100000)/10000;
qian = (zhengshu%10000)/1000;
bai = (zhengshu%1000)/100;
shi = (zhengshu%100)/10;
ge = (zhengshu%10);
p_number = &num_dis_code[0]+wang1000; //显示各个数量级位置
fun_write_data(*p_number);
p_number = &num_dis_code[0]+wang100;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+wang10;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+wang;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+qian;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+bai;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+shi;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+ge;
fun_write_data(*p_number);
}
if ((zhengshu>=1000000) && (zhengshu<9999999)) //数值再10的6次方以上
{
wang100 = zhengshu/1000000; //
wang10 = (zhengshu%1000000)/100000;
wang = (zhengshu%100000)/10000;
qian = (zhengshu%10000)/1000;
bai = (zhengshu%1000)/100;
shi = (zhengshu%100)/10;
ge = (zhengshu%10);
p_number = &num_dis_code[0]+wang100;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+wang10;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+wang;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+qian;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+bai;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+shi;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+ge;
fun_write_data(*p_number);
}
if ((zhengshu>=100000) && (zhengshu<999999)) //数值再10的5次方以上
{
wang10 = zhengshu/100000;
wang = (zhengshu%100000)/10000;
qian = (zhengshu%10000)/1000;
bai = (zhengshu%1000)/100;
shi = (zhengshu%100)/10;
ge = (zhengshu%10);
p_number = &num_dis_code[0]+wang10;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+wang;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+qian;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+bai;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+shi;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+ge;
fun_write_data(*p_number);
}
if ((zhengshu>=10000) && (zhengshu<99999)) //数值再10的4次方以上
{
wang = zhengshu%100000/10000;
qian = (zhengshu%10000)/1000;
bai = (zhengshu%1000)/100;
shi = (zhengshu%100)/10;
ge = (zhengshu%10);
p_number = &num_dis_code[0]+wang;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+qian;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+bai;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+shi;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+ge;
fun_write_data(*p_number);
}
if ((zhengshu>=1000) && (zhengshu<9999)) //数值再10的3次方以上
{
qian = zhengshu/1000;
bai = (zhengshu%1000)/100;
shi = (zhengshu%100)/10;
ge = (zhengshu%10);
p_number = &num_dis_code[0]+qian;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+bai;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+shi;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+ge;
fun_write_data(*p_number);
}
if ((zhengshu>=100) && (zhengshu<999)) //数值再10的2次方以上
{
bai = zhengshu/100;
shi = (zhengshu%100)/10;
ge = (zhengshu%10);
p_number = &num_dis_code[0]+bai;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+shi;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+ge;
fun_write_data(*p_number);
}
if ((zhengshu>=10) && (zhengshu<99)) //数值再10的1次方以上
{
shi = zhengshu/10;
ge = (zhengshu%10);
p_number = &num_dis_code[0]+shi;
fun_write_data(*p_number);
p_number = &num_dis_code[0]+ge;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -