|
发表于 2012-9-5 19:52:09
|
显示全部楼层
rundll32 发表于 2012-9-5 18:09
SCT89c51这个
#include "lcd1602.h"
#include "..\main\ext_reg.h"
#include "..\main\port.h"
#include <intrins.h>
#define NOP() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();}
#define _nop_() {;}
/*****************LCD初始化设定****************/
void lcd_init()
{
uchar i;
mDisplay_count=0;
lcd_wcmd(0x38); //设置LCD为16X2显示,5X7点阵,八位数据接口00111000
for (i=0;i<125;i++){NOP();NOP();}
lcd_wcmd(0x38);
for (i=0;i<125;i++){NOP();}
lcd_wcmd(0x0c); //LCD开显示及光标设置(光标不闪烁,不显示"-")
for (i=0;i<125;i++){NOP();}
lcd_wcmd(0x06); //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
for (i=0;i<125;i++){NOP();}
lcd_wcmd(0x01); //清除LCD的显示内容
for (i=0;i<125;i++){NOP();}
}
void LCD_Update()
{
if(mDisplay_count)
{
mDisplay_count--;
return;
}
LCD_DisPosCode();
mDisplay_count = 5;
}
void LCD_DisPosCode()
{
dis_buf1[0]='1';
dis_buf1[1]='2';
dis_buf1[2]='3';
dis_buf1[3]='4';
dis_buf1[4]=' ';
dis_buf1[5]=32;
dis_buf1[6]=53;
dis_buf1[7]=13;
dis_buf1[8]=23;
dis_buf1[9]=' ';
dis_buf1[10]=' ';
dis_buf1[11]=' ';
dis_buf1[12]=' ';
dis_buf1[13]=5+48;
dis_buf1[14]=6+48;
dis_buf1[15]=' ';
dis_buf2[0]=' ';
dis_buf2[1]=' ';
dis_buf2[2]=8+48;
dis_buf2[3]=8+48;
dis_buf2[4]=8+48;
dis_buf2[5]=9+48;
dis_buf2[6]=9+48;
dis_buf2[7]=' ';
dis_buf2[8]='F';
dis_buf2[9]='C';
dis_buf2[10]=1+48;
dis_buf2[11]=1+48;
dis_buf2[12]=1+48;
dis_buf2[13]=1+48;
dis_buf2[14]='A';
dis_buf2[15]=' ';
pro_display();
}
/**********************LCD显示处理程序********************/
void pro_display()
{ uchar i;
lcd_pos(0x00); //第一行
for (i=0;i<=15;i++)
{lcd_wdat(dis_buf1);}
lcd_pos(0x40);//第二行
for (i=0;i<=15;i++)
{lcd_wdat(dis_buf2);}
}
/**************检测LCD忙**********************/
bit lcd_busy()
{ uint i,j;
bit result;
RS = 0;
RW = 1;
EN = 1;
i = 30;
while(i>0) i--;
j=P2;
result =j & 0x80; //D7=1为忙碌,D7=0为空闲
EN = 0;
return result;
}
/**************写入指令到LCD**********************/
void lcd_wcmd(uchar cmd)
{
if(lcd_busy()){return;}; //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令
RS = 0; //RS=0,即是选择1602LCD的指令寄存器
RW = 0; //低电平为写操作
EN = 0;
NOP();
P2 = cmd; //送命令到P0口,即送一个字节的数据到LCD1602的指令寄存器中
NOP();
EN = 0;
EN = 1; //ep即使能端,由高电平跳变到低电平时,执行命令
NOP();
EN = 0;
}
/****************写入数据到LCD*******************/
void lcd_wdat(char dat)
{
while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据
RS = 1;
RW = 0;
EN = 0;
P2 = dat;
NOP();
EN = 1; //ep即使能端,由高电平跳变到低电平时,执行命令
EN = 1;
EN = 0;
NOP();
}
//LCD数据指针位置程序
void lcd_pos(char pos)
{
lcd_wcmd(pos|0x80); //数据指针=80+地址码(00H~27H,40H~67H)
}
你用这个参考下看看,这个我是用STC12C5A48S2通过的 |
|