
用这个吧。我以前用的
#include <reg52h>
#include<intrinsh>
#include <stringh>
#define uchar unsigned char
#define uint unsigned int
//8bit数据接入IO口
#define Part P0 //P0接8位数据线
//控制数据端
sbit LCD_RS=P3^2; //定义12864液晶RS端,寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit LCD_RW=P1^1; //定义12864液晶RW端,读/写信号 H:读 L:写
sbit LCD_EN=P1^2; //定义12864液晶LCDEN端, 片选信号 下降沿触发,锁存数据
//sbit LCD_PSB=P3^2; //定义12864液晶PSB端, H:并行 L:串行
sbit LCD_RST=P3^6; //定义12864液晶RST端, H:不复位 L:复位
sbit AD_ST=P1^6;//定义AD
sbit AD_OE=P3^7;
sbit AD_A=P1^3;
sbit AD_B=P1^4;
sbit AD_C=P1^5;
sbit AD_EOC=P1^7;
sfr T2MOD=0XC9;
uchar code dis1[]={"转速"};
uchar code dis2[]={"加速度x方向"};
uchar code dis3[]={"加速度y方向"};
uchar code dis4[]={"加速度z方向"};
uchar code Text[]={"欢迎大家观看"};
uint i;
uchar code dat[];
int jishu;
int sudu1;
int sudu2;
int maichong1;
int maichong2;
//毫秒延时函数
void delayms(uint x) //nms的延时
{
uint i;
while(x--)
{
for(i=0;i<125;i++)
{;}
}
}
void delay(uint xms)
{
uint i,j;
for(j=0;i<xms;j++)
for(i=0;i<110;i++);
}
//LCD忙检测函数
bit lcd_busy()
{
bit result;
LCD_RS=0;
LCD_RW=1;
LCD_EN= 1;
result=(bit)(Part & 0x80);
LCD_EN=0;
return result;
}
//液晶写命令函数
void lcd_write_cmd(uchar com)
{
while(lcd_busy());
LCD_RS=0; //选择指令寄存器
LCD_RW=0; //写
LCD_EN=0;
Part=com; //指令值赋给P0口
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//液晶写一个字符数据函数
void lcd_write_dat(uchar date)
{
while(lcd_busy());
LCD_RS=1; //选择数据寄存器
LCD_RW=0; //写
LCD_EN=0;
P0=date; //数据值赋给P0口
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//液晶写一个字符串函数
void lcd_write_string(uchar str)
{
while(str!='\0') //未结束
{
lcd_write_dat(str++);
delay(5);
}
}
//液晶显示位置函数
void lcd_pos(uchar x,uchar y) //从第X行的第Y位置开始显示
{
uchar pos;
if(x==1) //第一行
{x=0x80;}
else if(x==2) //第二行
{x=0x90;}
else if(x==3) //第三行
{x=0x88;}
else if(x==4) //第四行
{x=0x98;}
pos=x+y-1; //首地址为0X80
lcd_write_cmd(pos);
}
//液晶初始化函数
void lcd_init()
{
// LCD_PSB=1; //并行方式
LCD_RST=1; //不复位
lcd_write_cmd(0x30);
delay(5);
lcd_write_cmd(0x0c); //开显示,不显示光标
delay(5);
lcd_write_cmd(0x06); //写一个字符后地址指针自动加1
delay(5);
lcd_write_cmd(0x01); //清屏
delay(5);
}
/12864并行接口参考程序,控制器st7920/
#include <reg51h>
#include <intrinsh>
sbit RS = P3^0;
sbit RW = P3^3;
sbit E = P3^4;
sbit PSB = P3^1; //串并口选择
sbit RES = P3^5;
#define FIRST_ADDR 0 //定义字符/汉字显示起始位置
//延时子程序
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++);
for(j=0;j<10;j++);
}
//测忙
void chk_busy()
{ RS=0;
RW=1;
E=1;
while((P1&0x80)==0x80);
E=0;
}
//读数据
unsigned char lcdrd()
{ unsigned char i;
P3=0xFB;
_nop_();
E=1;
delay(5);
i=P1;
_nop_();
E=0;
return i;
}
//写数据
void lcdwd(unsigned char dispdata)
{ chk_busy();
_nop_();
RS=1;
RW=0;
E=1;
P1=dispdata;
delay(5);
_nop_();
E=0;
_nop_();
P1=0xff;
}
//写指令代码
void lcdwc(unsigned char cmdcode)
{ chk_busy();
_nop_();
RS=0;
RW=0;
E=1;
P1=cmdcode;
delay(5);
_nop_();
E=0;
_nop_();
P1=0xff;
}
//初始化
void lcdreset()
{ delay(2000);
lcdwc(0x30); //选择基本指令集
lcdwc(0x30); //选择8bit数据流
delay(5);
lcdwc(0x0c); //开显示(无游标、不反白)
delay(5);
lcdwc(0x01); //清除显示,并且设定地址指针为00H
delay(5);
lcdwc(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
void hzkdis(unsigned char code s)
{ while(s>0)
{ lcdwd(s);
s++;
delay(500);
}
}
void hzklib()
{ lcdwc(0x80+FIRST_ADDR);
hzkdis("少小离家老大回,");
lcdwc(0x90+FIRST_ADDR);
hzkdis("乡音无改鬓毛衰。");
lcdwc(0x88+FIRST_ADDR);
hzkdis("儿童相见不相识,");
lcdwc(0x98+FIRST_ADDR);
hzkdis("笑问客从何处来。");
}
//整屏显示
//当ii=0时显示上面128×32
//当ii=8时显示下面128×32
void lcdfill(unsigned char disdata)
{ unsigned char x,y,ii;
for(ii=0;ii<9;ii+=8)
for(y=0;y<0x20;y++)
for(x=0;x<8;x++)
{ lcdwc(0x36);
lcdwc(y+0x80); //行地址
lcdwc(x+0x80+ii); //列地址
lcdwc(0x30);
lcdwd(disdata);
lcdwd(disdata);
}
}
//当ii=0时显示上面128×32
//当ii=8时显示下面128×32
void lcdfill_upright(unsigned char disdata)
{ unsigned char x,y,ii;
unsigned char i,f,k;
for(ii=0;ii<9;ii+=8)
for(y=0;y<4;y++)
{ f=disdata;
for(i=0;i<8;i++)
{ if((f&1)==1)
k=0xff;
else
k=0;
for(x=0;x<8;x++)
{ lcdwc(0x36);
lcdwc(y8+i+0x80);
lcdwc(x+0x80+ii);
lcdwc(0x30);
lcdwd(k);
lcdwd(k);
}
f>>=1;
}
}
}
main()
{ unsigned char i;
i=0x55;
RES=0;
_nop_();
RES=1;
while(1)
{ PSB=1;
RW=0;
lcdreset(); //初始化LCD屏
lcdwc(0x01);
delay(1000);
lcdfill(0xff);
delay(6000);
lcdfill(i); //显示竖条
delay(6000);
lcdfill_upright(i); //显示横条
delay(6000);
lcdfill(0);
lcdwc(0x01);
delay(1000);
hzklib();
delay(4000);
i=~i;
}
}
以上就是关于关于51单片机12864程序的问题全部的内容,包括:关于51单片机12864程序的问题、用51单片机控制TH12864-15LCD显示文字程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)