📄 12864 st7920.txt
字号:
//串行试验程序:
//12864(ST7920)串口C51程序
//12864F(7920)的串行模式C51范例
#include <reg51.h>
#include <intrins.h>
sbit E_CLK =P2^2;//clock input 同步时钟输入端
sbit RW_SID=P2^1;//data input/output 串行数据输入、输出端
sbit RS_CS =P2^0;//chip select 片选端
//****************************************
#ifndef uint
#define uint unsigned int
#endif
#ifndef uchar
#define uchar unsigned char
#endif
//******************************************
void delay(unsigned int n)
{
unsigned int i;
for(i=0; i<n; i++) {;}
}
//串行发送一字节数据
void SendByte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
E_CLK=0;
if(dat&0x80)RW_SID=1;else RW_SID=0;
E_CLK=1;
dat=dat<<1;
}
}
//串行接收一字节数据
unsigned char ReceieveByte(void)
{
unsigned char i,d1,d2;
for(i=0;i<8;i++)
{
E_CLK=0;delay(100);
E_CLK=1;
if(RW_SID)d1++;
d1=d1<<1;
}
for(i=0;i<8;i++)
{
E_CLK=0;delay(100);
E_CLK=1;
if(RW_SID)d2++;
d2=d2<<1;
}
return (d1&0xF0+d2&0x0F);
}
//读取标志位BF
bit ReadBF(bit bf)
{
unsigned char dat;
SendByte(0xFA);//11111,01,0 RW=1,RS=0
dat=ReceieveByte();
if(dat>0x7F)bf=1;else bf=0; //大于7F忙。
return bf;
}
//写控制命令
void SendCMD(unsigned char dat)
{
// while(ReadBF){;}
RS_CS=1;
SendByte(0xF8);//11111,00,0 RW=0,RS=0 同步标志
SendByte(dat&0xF0);//高四位
SendByte((dat&0x0F)<<4);//低四位
RS_CS=0;
}
//写显示数据或单字节字符
void SendDat(unsigned char dat)
{
// while(ReadBF){;}
RS_CS=1;
SendByte(0xFA);//11111,01,0 RW=0,RS=1
SendByte(dat&0xF0);//高四位
SendByte((dat&0x0F)<<4);//低四位
RS_CS=0;
}
/* 写汉字到LCD 指定的位置
x_add显示RAM的地址
dat1/dat2显示汉字编码
*/
//void display(unsigned char x_add,unsigned char dat1,unsigned char dat2)
//{
// SendCMD(x_add);//1xxx,xxxx 设定DDRAM 7位地址xxx,xxxx到地址计数器AC
// SendDat(dat1);
// SendDat(dat2);
//}
//void PutStr(unsigned char x, unsigned char y, unsigned char *ptr)
//{
// WriteCommand(0x00,0xCD);
// LocateXY(x,y);
// while(*ptr != '\0')
// {
// WriteData(*ptr);
// ++ptr;
// }
//}
void display(unsigned char x_add,unsigned char *ptr)
{
SendCMD(x_add);//1xxx,xxxx 设定DDRAM 7位地址xxx,xxxx到地址计数器AC
while(*ptr != '\0')
{
SendDat(*ptr);
++ptr;
}
}
//初始化 LCM
void initlcm(void)
{
//RST=0;
RS_CS=0;
// PSB=0;//serial mode
delay(100);
// RST=1;
SendCMD(0x30);//功能设置,一次送8位数据,基本指令集
SendCMD(0x0C);//0000,1100 整体显示,游标off,游标位置off
SendCMD(0x01);//0000,0001 清DDRAM
SendCMD(0x02);//0000,0010 DDRAM地址归位
SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
// SendCMD(0x04);//点设定,显示字符/光标从左到右移位,DDRAM地址加 一
// SendCMD(0x0F);//显示设定,开显示,显示光标,当前显示位反白闪动
}
void main(void)
{
initlcm();
SendCMD(0x81);//1000,0001 设定DDRAM 7位地址000,0001到地址计数器AC
SendDat(0x33);
SendDat(0x42);
SendDat(0x43);
SendDat(0x44);
SendCMD(0x00);
for(;;)
{
delay(100);
display(0x80,"大通电子商行");//安
display(0x90,"电话:88821264");//安
SendCMD(0x00);
}
}
================================================================================
//并行试验程序
/***********************************************************
文件名称:简单的12864(控制器ST7920)液晶显示模块并行方式控制
说 明:RS - 指令(0)/数据(1)选择信号;
R/W - 读(1)/写(0)选择信号;
E - 使能信号(1);
PSB - 并(1)/串(0)行接口选择;
RET - 复位(0);
LCD_DB - 数据口;
注 释:E-下降沿锁存!!!
***********************************************************/
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define INT16U unsigned int
#define INT8U unsigned char
//**********I/O口定义**********//
#define LCD_DB P1
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_E = P2^2;
sbit LCD_RET = P2^5;
//**********函数定义**********//
void Delay(INT16U j);
void Ini_SYSCLK(void);
void Ini_PORT(void);
void Ini_LCD(void);
void LCD_P_Ready(void);
void LCD_P_W_Command(INT8U Command);
void LCD_P_W_Data(INT8U Data);
/***********************************************************
函数名称:Main
函数功能:主函数
入口参数:无
出口参数:无
备 注:测试
***********************************************************/
void Main(void)
{
INT8U i;
INT8U tmp0[16] = {"大连单片机开发网"};
INT8U tmp1[16] = {" www.DL-MCU.com "};
INT8U tmp2[16] = {"并行方式控制测试"};
//初始化
Ini_LCD();
//测试内容
LCD_P_W_Command(0x80); //第一行显示
for (i=0; i<16; i++)
{
LCD_P_W_Data(tmp0[i]);
}
LCD_P_W_Command(0x90); //第二行显示
for (i=0; i<16; i++)
{
LCD_P_W_Data(tmp1[i]);
}
LCD_P_W_Command(0x88); //第三行显示
for (i=0; i<16; i++)
{
LCD_P_W_Data(tmp2[i]);
}
while(1);
}
/***********************************************************
函数名称:Delay
函数功能:延时
入口参数:INT8U j
出口参数:无
备 注:无
***********************************************************/
void Delay(INT16U j)
{
INT8U i;
for (i=0; i<j; i++)
{
_nop_();
}
}
/***********************************************************
函数名称:LCD_P_Ready
函数功能:LCD读忙
入口参数:无
出口参数:无
备 注:执行时间:0μs
***********************************************************/
void LCD_P_Ready(void)
{
LCD_DB = 0xFF;
LCD_RW = 1;
LCD_RS = 0;
LCD_E = 1;
while (LCD_DB&0x80) ;
LCD_E = 0;
}
/***********************************************************
函数名称:LCD_P_W_Command
函数功能:向LCD发送指令
入口参数:INT8U Command
出口参数:无
备 注:执行时间:72μs
***********************************************************/
void LCD_P_W_Command(INT8U Command)
{
LCD_P_Ready();
LCD_RW = 0;
LCD_RS = 0;
LCD_DB = Command;
LCD_E = 1;
Delay(10);
LCD_E = 0;
}
/***********************************************************
函数名称:LCD_P_W_Data
函数功能:向LCD发送数据
入口参数:INT8U Data
出口参数:无
备 注:执行时间:72μs
***********************************************************/
void LCD_P_W_Data(INT8U Data)
{
LCD_P_Ready();
LCD_RW = 0;
LCD_RS = 1;
LCD_DB = Data;
LCD_E = 1;
Delay(10);
LCD_E = 0;
}
/***********************************************************
函数名称:Ini_LCD
函数功能:LCD初始化
入口参数:无
出口参数:无
备 注:无
***********************************************************/
void Ini_LCD(void)
{
//复位
LCD_RET = 0;
LCD_RET = 1;
LCD_P_W_Command(0x0C); //显示状态:开,执行时间:72μs//
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -