前一段准备将1602的c语言驱动写出来 不过忙期末考试去了 今天才考完
写了一驱动传上来 现在功能比较简单 不足之处多指教
显示Hello everyone!!
Welcome!
由于是在仿真下完成 不保证实际应用中的可靠性 有时间再讲一讲1602的显示原理及方法
/*1602驱动程序 **********************************************/
/*版本 V1.0 **********************************************/
/*2007-7-13 **********************************************/
/*吾人 **********************************************/
/*属个人原创 转载请注明出处! 谢谢*********************/
/*1602.h***************************/
#include <intrins.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define DATA P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit E =P2^2;
sbit BS=P0^7;
void read_busy() //读忙标志或地址
{
do
{
DATA=0xFF;
RS=0;
RW=1;
E=0;
_nop_();
E=1;
}while(BS);
}
void data_oper(uchar dat)
{
DATA=dat;
RS=0;
RW=0;
E=0;
read_busy();
E=1;
}
void data_opers(uchar dat)
{
DATA=dat;
RS=1;
RW=0;
E=0;
read_busy();
E=1;
}
void clear_display(uchar dat) //清显示 1 清除
{
data_oper(dat);
}
void cursor_back() //光标返回
{
data_oper(0x02);
}
void set_inmod(uchar id,uchar s) //id 光标是否左移或右移 1右移 0 左移
{ //s文字是否同光标一同移动 1是 0 否
data_oper(0x04|(id<<1)|s);
}
void display_sw(uchar d,uchar c,uchar b) //显示开关控制
{ //d 整体开关控制 1 开 2 关
data_oper(0x08|(d<<2)|(c<<1)|b); //c 光标开关控制 1 开 2 关
} //b 光标是否闪烁 1 是 2 否
void curchar_move(uchar sc,uchar rl) //sc 1 移动显示文字 0 移动显示光标
{ //rl 1 右移 0 左移
data_oper(0x10|(sc<<3)|(rl<<2));
}
void set_function(uchar dl,uchar n,uchar f) //dl 1 四位总线 0 八位总线
//有些dl 1 八位总线 0 四位总线 现在做实验的就是
{ //n 1 双行显示 0 单行显示
data_oper(0x20|(dl<<4)|(n<<3)|(f<<2)); //f 1 5*10显示 0 5*7 显示
}
void set_charaddr(uchar agg) //置字符发生器地址
{
data_oper(0x40|agg);
}
void set_dataaddr(uchar add) //显示数据存储器地址
{
data_oper(add|0x80);
}
void write_data(uchar dat) //写显示数据
{
data_opers(dat);
}
void c1602_print(uchar row ,char *p) //显示函数 row显示起始地址 *p显示字符指针
{
uchar a;
set_dataaddr(row);
while((*p)!='\0')
{
write_data(*p++);
a++;
if(((a+row)>=16)||((*p)=='\n'))
{set_dataaddr(0x40);a=0;}
}
}
/*main.c**************************************/
#include <reg51.h>
#include "1602.h"
#define uchar unsigned char
#define uint unsigned int
void c1602_initial()
{
clear_display(1);
set_function(1,1,0);
display_sw(1,0,0);
clear_display(0);
}
void main()
{
c1602_initial();
c1602_print(0x00,"Hello everyone!!\nWelcome!");
while(1);
}