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

📄 12864zongxian.c

📁 单片机与FPGA控制128*64液晶显示程序
💻 C
字号:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
//#include "hzk16x16.h"
#define   uchar unsigned char
#define   uint   unsigned int

#define   LCD_BUS   P1
sbit      cs     =P3^2	;	//片选信号
sbit      WR1    =   P3^3;                   //写控制信号
sbit      RD1    =   P3^4;                   //读控制信号
sbit      CD1    =   P3^5;                   //通道信号, cd=1指令 cd=0 数据
void      delay(uchar t);                 //延时
void      wr_com ( uchar wr_com );        //写命令
void      wr_data( uchar wr_data);        //写数据
          ReadSdate() ;
void      delay(uchar t)   ;
void      RWcheck();
void      WriteData(uchar dat);
void      AutoRcheck(void);
void      AutoWcheck(void);
void      AutoWriteData( uchar dat) ;
void      ClearScreen(unsigned int ram) ;
void      draw_dot(uchar x,uchar y,uchar mode);
void      WriteCmd1(unsigned char cmd);
void      WriteCmd2(unsigned char dat,unsigned char cmd);
void      WriteCmd3(unsigned char dat1,unsigned char dat2,unsigned char cmd);
void      CursorPosSet(unsigned char x,unsigned char y) ;
unsigned char Cursor_X,Cursor_Y;        //光标的坐标
/************************************************************
                       指令代码定义
************************************************************/
#define   CursorPointer    0x21          // 光标地址设置
#define   OffsetReg        0x22          // CGRAM偏移地址设置
#define   AddrSet          0x24          // 显示地址设置
#define   TextHomeAddr     0x40          // 文本首地址
#define   TextArea         0x41          // 文本宽度设置
#define   GraHomeAddr      0x42          // 图形首地址设置
#define   GraArea          0x43          // 图形宽度设置
#define   OrMode           0x80          // 或模式显示
#define   ExorMode         0x81          // 异或模式显示
#define   AndMode          0x83          // 与模式显示
#define   TextAttMode      0x84          // 文本属性模式
#define   InterCGROM       0             // 内部CGROM
#define   ExCGRAM          0x08          // 外部CGRAM
#define   DisplayOff       0x90          // 显示关闭
#define   CursorOn         0x92          // 光标显示,但不闪烁
#define   CursorBlink      0x93          // 光标闪烁
#define   TextOn           0x94          // 文本模式打开
#define   GraOn            0x98          // 图形模式打开
#define   TGAllOn          0x9c          // 文本图形模式都打开
#define   DataAutoWrite    0xb0          // 数据自动写
#define   DataAutoRead     0xb1          // 数据自动读
#define   ExitAutoRW       0xb2          // 退出数据自动读写模式
#define   DataWAddrI       0xc0          // 数据写,地址加1
#define   DataWAddrD       0xc2          // 数据写,地址减1
#define   DataWAddrNV      0xc4          // 数据写,地址不变
#define   DataRAddrI       0xc1          // 数据读,地址加1
#define   DataRAddrD       0xc3          // 数据读,地址减1
#define   DataRAddrNV      0xc5          // 数据读,地址不变
#define   ScreenPeek       0xe0          // 屏读
#define   ScreenCopy       0xe1          // 屏拷贝
#define   LineChar         32            // 设置宽度

/********************************************************************************
函数名:    ReadSdate(void)
函数功能: IOPORT输出数据并检查LCD忙数据。
返回数据:checkbusy
/********************************************************************************/
ReadSdate()
{
    uchar   checkbusy;
    LCD_BUS = 0xff;
    CD1=1;
    RD1=0;
    checkbusy=LCD_BUS;
    RD1=1;
    return ( checkbusy );
}
/********************************************************************************
函数名:    Void RWcheck()
函数功能: 判断状态位STA1,STA0子程序(读写指令和读写数据状态),在写指令的读,
           写数据之前这两个标志位必须同时为1
/********************************************************************************/
void RWcheck(void)
{
     uchar   databusy;
     do{   databusy=ReadSdate();}
while( !(databusy&0x03) );
}
/********************************************************************************
函数名:    Void AutoRcheck()
函数功能: 判断状态位STA2的子程序(数据自动读状态),该位在数据自动读操作过程中
           取代STA0和STA1有效。在连续读过程中每读一次之前都要确认STA2=1
********************************************************************************/
void AutoRcheck(void)
{
     uchar   databusy;
     do{databusy=ReadSdate(); }
while( !(databusy&0x04) );
}
/********************************************************************************
函数名: Void AutoWcheck()
函数功能: 判断状态位STA3子程序(数据自动写状态)
********************************************************************************/
void AutoWcheck(void)
{
     uchar   databusy;
     do{databusy=ReadSdate(); }
while( !(databusy&0x08) );
}
/********************************************************************************
函数名:    Void WriteCmd1(uchar cmd)
           Void WriteCmd2(uchar dat1,uchar cmd)
           Void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
     Void WriteData(uchar dat)
函数功能: 写指令和写数据子程序
********************************************************************************/
void WriteData(uchar dat)
{
RWcheck();
CD1=0;
LCD_BUS=dat;
WR1=0;
WR1=1;
}
void WriteCmd1(unsigned char cmd)
{
RWcheck();
CD1=1;
LCD_BUS=cmd;
WR1=0;
WR1=1;
}
void WriteCmd2(uchar dat,uchar cmd)
{
    WriteData(dat);
    WriteCmd1(cmd);
}
void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
{
    WriteData(dat1);
    WriteData(dat2);
    WriteCmd1(cmd);
}
void AutoWriteData( uchar dat)
{
    AutoWcheck();
    CD1 = 0;
    LCD_BUS= dat;
    WR1=0;
    WR1=1;
}
/********************************************************************************
函数名:   void lcd_init (void)
函数功能:LCD初始化设置
********************************************************************************/
void lcd_init (void)
{
    WriteCmd3(0x00,0x00,0x40);   //文本首地址
    WriteCmd3(0x20,0x00,0x41);   //文本宽度设置
    WriteCmd3(0x00,0x00,0x42);   // 图形首地址
    WriteCmd3(0x20,0x00,0x43);   //设置图形宽度
                                //即一行显示所占字节数
    WriteCmd1(0xa1);             //光标设置
    WriteCmd1(0x80);             //显示方式设置   逻辑"或"合成
    WriteCmd1(0x9f);             //显示开关
    Cursor_X=0x08;
    Cursor_Y=0x4f;
    CursorPosSet(Cursor_X,Cursor_Y);
    ClearScreen(0x2000);
   }
/********************************************************************************
函数名: Void ClearScreen(unsigned int ram)
函数功能: 清除整个屏幕
     ram : 需要清零的单元数
********************************************************************************/
void ClearScreen(uint ram)
{
     unsigned int i;
                                                            // 清显示 RAM 区 0000h--2000h (8k)
     WriteCmd3(0x00,0x00,0x24);                              // 设置指针地址0000H
     WriteCmd1(0xb0);                                        // 设置自动写状态
     for(i=0x00;i<ram;i++) AutoWriteData(0x00);                  // data=0;
     WriteCmd1(0xb2);                                        // 自动写结束
}
/********************************************************************************
函数原型: void draw_dot(x,y)
功     能; T6963屏上打点
入口参数: 横坐标(x),枞坐标(y)
出口参数:
********************************************************************************/
void draw_dot(uchar x,uchar y,uchar mode)
{   uchar dat11,dat22;
    uchar n,t;
    dat11=(y*32)%256 +x/8;
    dat22=(y*32)/256;
    delay(20);
    WriteCmd3(dat11,dat22,0x24);
    if(mode)    n=0xf8;
    else        n=0xf0;
    t=n|((~(x%8))&0x07);
    WriteCmd1(t);
}
/********************************************************************************
函数名: Void CursorPosSet(uchar X,uchar Y)
函数功能:   光标位置设置
********************************************************************************/
void CursorPosSet(unsigned char x,unsigned char y)
{
    WriteCmd3(x,y,CursorPointer);          //X的取值范围0-20;Y的取值范围0-15;
}
/********************************************************************************
函数名: Void CursorUp()
函数功能:   光标向上移动一格
********************************************************************************/
void CursorUp()
{
         if(Cursor_Y>0)Cursor_Y-=1;
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函数名: Void CursorDown()
函数功能:   光标向下移动一格
********************************************************************************/
void CursorDown()
{
         if(Cursor_Y<8)Cursor_Y+=1;
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函数名: Void CursorRight()
函数功能:   光标向右移动一格
********************************************************************************/
void CursorRight()
{
         if(Cursor_X<20)Cursor_X+=1;
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函数名: Void CursorLeft()
函数功能:   光标向左移动一格
********************************************************************************/
void CursorLeft()
{
         if(Cursor_X>0)Cursor_X-=1;
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函数名: Void CursorEnter()
函数功能:   光标换行
********************************************************************************/
void CursorEnter()
{
    Cursor_X=0;
    Cursor_Y+=1;
    WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函数原型: void delay(uchar t)
功     能; (1)延时 T*10 (2) 1MS*k
入口参数: (1) uchar t   (2)uint k
出口参数:
********************************************************************************/
void delay(uchar t)
{
   uchar i,j;
   for(i=0;i<t;i++) {   for(j=0;j<10;j++);   }
}
void delay1(uint k)
{
   uchar j;
   while ((k--)!=0) {   for (j=0;j<125;j++);}
}
/********************************************************************************
函数名:Void ShowHZ16x16(unsigned char column,unsigned char lin,unsigned int hzcode)
函数功能:显示一个汉字(16*16点阵)
           column:汉字起始列(0-15) (128/8=16)
           lin: 汉字起始行(0-3)     (64/16=4)
        hzcode: 汉字代码(自定义的)
注:超出范围的将直接写到RAM中,可以实现卷屏效果
********************************************************************************/
void ShowHZ16x16(unsigned char column,unsigned char lin,unsigned int hzcode)
{
     unsigned char temp1,temp2;
     unsigned int StartAddr;
     unsigned char i=0;
     unsigned int * temp;
    // temp=&HZK16x16[hzcode][0];
     StartAddr=16*lin*LineChar+ column;        //定位起始行
     for(i=0;i<16;i++)
     {
       WriteCmd3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), AddrSet);
       temp1=0x45;
      // temp1=HZK16x16[hzcode][i*2+*temp];
       WriteCmd2(temp1, DataWAddrI);          // 左半部 地址加一
       temp2=0x56 ;
      // temp2=HZK16x16[hzcode][i*2+1+*temp];
       WriteCmd2(temp2, DataWAddrNV);             // 右半部 显示地址不变
       StartAddr=StartAddr + LineChar;            // 换到下一行
     }
}
//***********************************************************
//         主函数
//***********************************************************
main()
{
   uchar   x;
   uchar   m;
   cs=0;
   lcd_init();
      /*for(x=0;x<240;x++)
      {
        draw_dot(2*x,94,1);
        draw_dot(2*x,47,1);
        draw_dot(2*x,0,1);
       }
       for(m=0;m<128;m++)
       {
         draw_dot(0,m*2,1);
         draw_dot(239,m*2,1);
         draw_dot(120,m*2,1);
          }

        ShowHZ16x16(0,6, 0x0b);
        ShowHZ16x16(2,6, 0x0c);
        ShowHZ16x16(0,7,0x0d);
        ShowHZ16x16(2,7,0x0e);
        ShowHZ16x16(5,6, 0x0f);
        ShowHZ16x16(7,6, 0x10);
        ShowHZ16x16(5,7,0x11);
        ShowHZ16x16(7,7,0x12);
    while(1); */
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -