求STC12C5A60S2单片机的12864液晶串行程序?
发布网友
发布时间:2022-05-15 15:25
我来回答
共3个回答
热心网友
时间:2023-09-07 00:46
不知你的液晶是什么控制器的,这个是st7920的
/********************************************************************
* 文件名 : 串行12864显示.c
* 描述 : 该程序实现了12864以串行的方式进行通信。
* 创建人 : 东流,2009年4月10日
* 版本号 : 2.0
***********************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P2^5; //片选信号
sbit SID=P2^6;//数据信号
sbit SCLK=P2^7;//时钟信号
sbit RST=P2^2;//复位信号
sbit CH = P2^4;//并行、串行选择信号
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
* 输入 : t
* 输出 : 无
***********************************************************************/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID = 1;
}
else
{
SID = 0;
}
SCLK = 0;
SCLK = 1;
}
}
/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8);
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名称 : lcdinit()
* 功能 : 初始化函数
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void lcdinit()
{
RST = 0;
delay(100);
RST = 1;
delay(20000);
write_com(0x30);
delay(50);
write_com(0x0c);
delay(50);
}
/********************************************************************
* 名称 : hzkdis()
* 功能 : 显示字符串
* 输入 : *s
* 输出 : 无
***********************************************************************/
void hzkdis(unsigned char code *s)
{
while(*s > 0)
{
write_data(*s);
s++;
delay(50);
}
}
/********************************************************************
* 名称 : Test()
* 功能 : 显示子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Test()
{
write_com(0x03);
delay(50);
write_com(0x81);
hzkdis(" HOT-51");
write_com(0x91);
hzkdis("单片机开发板");
write_com(0x89);
hzkdis(" ");
write_com(0x98);
hzkdis(" 东流电子");
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
CH = 0;
delay(1);
lcdinit();
delay(10);
while(1)
{
Test();
delay(5000);
}
}
热心网友
时间:2023-09-07 00:46
#include"main.h"
uchar code add[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
};
uchar code str[]="好好学习天天向上实现人生梦想!";
void send_12864byte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK=0;
byte=byte<<1; //左移一位 先发送高位数据
SID=CY; //移出的位送给SID
SCLK=1; //上升沿触发发送
SCLK=0;
}
}
void write_12864com(uchar com)
{
delay_1ms(1);//检测忙程序不写,串行不支持读操作
send_12864byte(0xf8);//11111,rw(0),0
send_12864byte(0xf0&com);//高四位 数据分两次发送,而且把数据放在高四位上发送
send_12864byte(0xf0&com<<4);//低四位(先执行<<)
}
void write_12864data(uchar date)
{
delay_1ms(1);
send_12864byte(0xfa);//11111,rw(0),0
send_12864byte(0xf0&date);//高四位 数据分两次发送,而且把数据放在高四位上发送
send_12864byte(0xf0&date<<4);//低四位(先执行<<)
}
void lcd_init()
{
delay_50us(1);
write_12864com(0x30);//选择基本指令集 0x34选择扩充指令集
delay_50us(1);
write_12864com(0x30);//选择8比特数据流 DL=0/1:4/8位数据 RE=1:扩充指令操作RE=0 :基本指令操作
delay_50us(1);
write_12864com(0x0c); //开显示(无游标、不反白)
write_12864com(0x01);//清楚显示,并且设定地址之真为00H
delay_50us(1);
}
void display(uchar x,uchar y,uchar code*s)
{
write_12864com(add[8*x+y]);//写地址 x,y是用来确定起始地址的 从零开始算起
while(*s!=0)//空格的地址是0
{
if(y==8) //判断换行
{ //若不判断,则自动从第一行到第三行
y=0;
x++;
}
if(x==4)
{
x=0;//一屏显示完,回到屏左上角
}
write_12864com(add[8*x+y]);//更新地址 一个地址要写完一个字,则要与两次数据写完
write_12864data(*s);//写数据
s++;
write_12864data(*s);//写数据
s++;
y++;//写完一个字地址要往前走一位
}
}
void main()
{
BSP=0;
lcd_init();
display(0,0,str);//就是在第二行第一列显示“AAAAA”
while(1);
}
热心网友
时间:2023-09-07 00:47
武汉 谷鑫科技专业从事单片机驱动液晶显示。
http://tieba.baidu.com/club/10621043/p/10224215
参考资料:http://tieba.baidu.com/club/10621043/p/10224215