⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12864 st7920.txt

📁 12864液晶显示控制器为ST7920 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 + -