搜索
您的当前位置:首页正文

我爱中国

来源:好走旅游网
#include //调用头文件,可以去keil软件下去查找at89x52单片机的头文件 #include //因为本例中,有用到_nop_();所以必须调用该头文件

sbit RSPIN=P3^4; //定义IO口,具体可以去查看原理图 sbit RWPIN=P3^3; //定义IO口,具体可以去查看原理图 sbit EPIN=P2^0; //定义IO口,具体可以去查看原理图 sbit D0=P1^0; //定义IO口,具体可以去查看原理图 sbit D1=P1^1; //定义IO口,具体可以去查看原理图 sbit D2=P1^2; //定义IO口,具体可以去查看原理图 sbit D3=P1^3; //定义IO口,具体可以去查看原理图 sbit D4=P1^4; //定义IO口,具体可以去查看原理图 sbit D5=P1^5; //定义IO口,具体可以去查看原理图 sbit D6=P1^6; //定义IO口,具体可以去查看原理图 sbit D7=P2^1; //定义IO口,具体可以去查看原理图

sbit B_0=B^0; //方便位操作 sbit B_1=B^1; sbit B_2=B^2; sbit B_3=B^3; sbit B_4=B^4; sbit B_5=B^5; sbit B_6=B^6; sbit B_7=B^7;

//---------------------------------------

//名称: 非精确延时函数 //----------------------------------------- void delay(unsigned int t) { unsigned int i,j; for(i=0;i//--------------------------------------- //名称: 1602忙检测函数 //----------------------------------------- void lcd_wait_busy(void) { D7=1; //数据口D7置1,为读状态做准备 RSPIN=0; //选择指令寄存器 RWPIN=1; //选择读 EPIN=1; //使能线电平变化 while(D7==1); //读忙状态,不忙时退出 EPIN=0; //恢复使能线电平 }

//---------------------------------------

//名称: 1602写命令函数 //-----------------------------------------

void lcd_write_com(unsigned char combuf) {

RSPIN=0; //选择指令寄存器 RWPIN=0; //选择写

B=combuf; //把命令字送入B D0=B_0; //把combuf的0位写入D0 D1=B_1; //把combuf的1位写入D1 D2=B_2; //把combuf的2位写入D2 D3=B_3; //把combuf的3位写入D3 D4=B_4; //把combuf的4位写入D4 D5=B_5; //把combuf的5位写入D5 D6=B_6; //把combuf的6位写入D6 D7=B_7; //把combuf的7位写入D7

EPIN=1; //使能线电平变化,命令送入1602的8位数据口 _nop_();

EPIN=0; //恢复使能线电平 }

//---------------------------------------

//名称: 1602写命令函数(带忙检测) //-----------------------------------------

void lcd_write_com_busy(unsigned char combuf) {

lcd_wait_busy(); //调用忙检测函数 lcd_write_com(combuf); //调用写命令函数 }

//---------------------------------------

//名称: 1602写数据函数(带忙检测) //-------------------------

void lcd_write_data(unsigned char databuf) { lcd_wait_busy(); //调用忙检测函数 RSPIN=1; //选择数据寄存器 RWPIN=0; //选择写

B=databuf; //把databuf送入B D0=B_0; //把databuf的0位写入D0 D1=B_1; //把databuf的1位写入D1 D2=B_2; //把databuf的2位写入D2 D3=B_3; //把databuf的3位写入D3 D4=B_4; //把databuf的4位写入D4 D5=B_5; //把databuf的5位写入D5 D6=B_6; //把databuf的6位写入D6

D7=B_7; //把databuf的7位写入D7

EPIN=1; //使能线电平变化,命令送入1602的8位数据口 _nop_();

EPIN=0; //恢复使能线电平 }

//--------------------------------------- //名称: 1602显示地址写函数 //-----------------------------------------

void lcd_write_address(unsigned char x,unsigned char y) {

x&=0x0f; y&=0x01; if(y==0x00)

//列地址限制在0-15 //行地址限制在0-1

lcd_write_com_busy(x|0x80); //第一行的列地址写入,此处有疑问者 else //需要自行查看1602写地址的指令格式 lcd_write_com_busy((x+0x40)|0x80); //第二行的列地址写入 }

//--------------------------------------- //名称: 1602初始化函数 //----------------------------------------- void lcdreset(void) { delay(150); lcd_write_com(0x38); delay(50); lcd_write_com(0x38); delay(50); lcd_write_com(0x38);

lcd_write_com_busy(0x38); //8位数据,双列,5*7字形 lcd_write_com_busy(0x08); //显示功能关,无光标 lcd_write_com_busy(0x01); //清屏指令 lcd_write_com_busy(0x06); //写入新的数据后,光标右移,显示屏不移动 lcd_write_com_busy(0x0c); //显示功能开,无光标, }

//---------------------------------------

//名称: 指定地址写入函数 //-----------------------------------------

void lcd_write_char(unsigned char x,unsigned char y,unsigned char buf) { lcd_write_address(x,y); //写入地址 lcd_write_data(buf); //写入显示数据 }

//--------------------------------------- //名称: 主函数

//----------------------------------------- void main() { lcdreset(); //复位1602液晶 lcd_write_char(2,0,'I'); lcd_write_char(5,0,'L'); lcd_write_char(6,0,'O'); lcd_write_char(7,0,'V');

lcd_write_char(8,0,'E'); lcd_write_char(11,0,'C'); lcd_write_char(12,0,'H'); lcd_write_char(13,0,'I'); lcd_write_char(14,0,'N'); lcd_write_char(15,0,'A');

lcd_write_char(2,1,'M'); lcd_write_char(3,1,'O'); lcd_write_char(4,1,'R'); lcd_write_char(5,1,'E'); lcd_write_char(7,1,'T'); lcd_write_char(8,1,'H'); lcd_write_char(9,1,'A'); lcd_write_char(10,1,'N'); lcd_write_char(12,1,'E'); lcd_write_char(13,1,'V'); lcd_write_char(14,1,'E');

lcd_write_char(15,1,'R'); while(1) { } }

// I LOVE CHINA MORE THAN EVER !!!

因篇幅问题不能全部显示,请点此查看更多更全内容

Top