久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4283|回復: 1
打印 上一主題 下一主題
收起左側

帶漢字庫128x64液晶串行方式C51驅動程序及LCD.h頭文件下載

[復制鏈接]
跳轉到指定樓層
樓主
ID:75263 發表于 2015-3-25 00:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
//******************************************************************************
//  用于河北北方學院宣化教學部2005級單片機課程實驗的
//  128x64點陣帶漢字庫串行接口液晶顯示器C51驅動代碼
//   
//  代碼沿革
//      創建: 2015年4月1日,
//      修改: 2015年4月4日,代碼優化
//            2015年4月9日,注釋
//            2015年4月13日,修改一處錯誤,LCD_Write(...)函數中有一處需要加一點延時
//  版權聲明
//      1.版權擁有者是河北北方學院宣化教學部2005級單片機課程全體學生及該課程任課
//        教師.
//      2.任何團體或個人均可無條件使用本代碼, 但版權擁有者不對由此引起的任何直接
//        或間接后果負擔任何法律責任
//        3.一旦部分或全部使用本代碼,則必須在源程序文檔中無條件包含本版權聲明
//******************************************************************************
#include "LCD.h"
#include "reg52.h"
//******************************************************************************
//  LCD復位函數:LCD_Reset(void)
//******************************************************************************
void LCD_Reset(void)
{
    uint ns=1000;
    LCD_CS  = 1;
    LCD_CLK = 1;
    LCD_RST = 0;
    while(ns--);
    LCD_RST = 1;     ns=1000,while(ns--);
    LCD_CS  = 1; }
//******************************************************************************
//  LCD寫字節函數:LCD_Write(char inst, uchar x)
//  入口參數  inst=1/0: 命令/數據標志
//            x       : 命令/數據字節
//******************************************************************************
void LCD_Write(char inst, uchar x)
{
  uchar i;
  long int q;
  if(!inst) q = 0x00fa0000;       //數據:0000 0000 1111 1010 0000 0000 0000 0000
  else      q = 0x00f80000;       //命令:0000 0000 1111 1000 0000 0000 0000 0000
  q += (((x)&0xf0)<<8) + ((x<<4)&0xf0);//0000 0000 1111 10?0 hofx 0000 lofx 0000
  q <<= 8;          //1111 10?0 hofx 0000 lofx 0000 0000 0000
  LCD_CS = 1;                                           //選中LCD模塊
  for(i=0;i<24;i++)                        //串行傳送24個二進制位
  {                    //從最高位開始傳送
    if(q & 0x80000000) LCD_SID = 1;                                //最高位為1時
    else               LCD_SID = 0;           //最高位為0時
    LCD_CLK = 0;                                    //拉低CLK引腳,準備產生上升沿
    LCD_CLK = 1;            //拉高CLK引腳,產生一個上升沿,最高位被傳送到LCD模塊中
    LCD_CLK = 1;            //延長CLK高電平持續時間,不這樣搞一下,就不行,大家注意了!
    LCD_CLK = 1;            //進一步延長CLK高電平持續時間,更保險了
    q <<= 1;                                  //左移一位,準備下一個待傳送的位   }
  LCD_CS = 0;               //撤消LCD模塊選中,防止干擾
}
//******************************************************************************
//  LCD清除屏幕函數:ClearScreen(void)
//******************************************************************************
void ClearScreen(void)
{   
  LCD_Write(1, 0x01);
}
//******************************************************************************
//  LCD打開顯示函數:DisplayOn(void)
//******************************************************************************
void DisplayOn(void)
{
  LCD_Write(1, 0x0c);
}
//******************************************************************************
//  LCD字符串顯示函數:Disp_Str(uchar x, uchar y, char *str)
//  入口參數  x:   字符串起始顯示位置的x坐標
//            y:   字符串起始顯示位置的y坐標
//          str:   指向待顯示字符串的字符指針,字符串以'\0'結尾
//
//  關于行定義的特別說明:
//  按照數據手冊介紹,本LCD模塊的行由上到下依次為0,1,2,3行,但對應的行顯示緩沖區地
//  址不是按行序排列的,其中
//  0行的顯示緩沖區為:80H~87H
//  2行的顯示緩沖區為:88H~8FH
//  1行的顯示緩沖區為:90H~87H
//  3行的顯示緩沖區為:98H~9FH
//  從視覺觀看的角度說,          自上而下的行順序依次為0,1,2,3行
//  從顯示緩沖區地址連續的角度說,自上而下的行順序依次為0,2,1,3行
//  考慮到顯示字符串的長度是不定的,可能出現換行,程序中對此必須加以考慮調整
//
//  關于顯示起始位置的說明:漢字顯示時, 顯示位置x坐標為0~7,顯示西文字符時顯示位置
//  x坐標也是0~7,但每個顯示位置可以顯示兩個西文字符,當中西文混合顯示時, 注意西文
//  子串應包含偶數個西文字符.
//******************************************************************************
void Disp_Str(uchar x, uchar y, char *str)
{
  uchar addr, i = 0;
  if(x>7)  x = 7;
  if(y>3)  y = 3;
  switch(y)                                      //根據x,y坐標確定顯示緩沖區地址
  {
    case 0: addr = 0x80 + x;  break;
    case 1: addr = 0x90 + x;  break;
    case 2: addr = 0x88 + x;  break;
    case 3: addr = 0x98 + x;  break;
  }
  LCD_Write(1, addr);                                            //設置DDRAM地址
  while(*str)
  {           //下一行:從設置好的DDRAM地址開始寫字符并準備好指向下一個字符的指針
    LCD_Write(0, *str++);
    i++;
    if(i==2)
    {
      i = 0;
      addr++;   //每寫倆字節DDRAM地址會自動增量,跟蹤DDRAM的地址變化,以便換行調整
      if( (addr&0x07) == 0 ) //當addr=88H,90H,98H,a0H時,說明DRAM地址需要重新指定
      {
        switch(addr)
        {
          case 0x88: addr = 0x90;   break;
          case 0x98: addr = 0x88;   break;
          case 0x90: addr = 0x98;   break;
          case 0xa0: addr = 0x80;   break;
        }
        LCD_Write(1, addr);                        //設置被重新指定了的DDRAM地址
      }
    }
  }
}
//******************************************************************************
//  LCD十進制整數顯示函數:Disp_Digital_Str(uchar x, uchar y, uint val,uchar len)
//  入口參數  x: 顯示位置x坐標
//            y: 顯示位置y坐標
//          val: 待顯示的整數
//          len: 顯示位數
//******************************************************************************
void Disp_Digital_Str(uchar x, uchar y, uint val, uchar len)
{
  char i, temp[11];
  if( len > 10 ) len = 10;
  if(len == 0) len = 1;
  temp[10] = 0;
  for(i=0; i<10; i++)
  {
    temp[9-i] = (val%10) + '0';
    val /= 10;
  }
  Disp_Str(x, y, &temp[10-len]);
}
//******************************************************************************
//  LCD十進制小數顯示函數:
//  Disp_Digital_Str_Dec(uchar x, uchar y, uint val, uchar len, uchar dotpos)
//  入口參數  x: 顯示位置x坐標
//            y: 顯示位置y坐標
//          val: 待顯示的數
//          len: 顯示位數,包括小數點
//       dotpos: 小數點位置
//******************************************************************************
void Disp_Digital_Str_Dec(uchar x, uchar y, uint val, uchar len, uchar dotpos)
{
  char i, temp[12];
  if(len > 10) len = 10;
  if(len < 1) len = 1;
  if(dotpos > (len-1)) dotpos = len-1;
  temp[11] = 0;
  for(i=0; i<11; i++)
  {
     if(i == dotpos) temp[10-i] ='.'; else
     {
       if(i < dotpos) temp[10-i] = (val%10) + '0'; else
         temp[10-i] = (val%10) + '0';
      val /= 10;
     }
  }
  Disp_Str(x, y, &temp[10-len]);
}
//******************************************************************************
//  LCD十六進制長整數顯示函數:Disp_Hex_StrL(uchar x,uchar y, ulong val,uchar len)
//  入口參數  x: 顯示位置x坐標
//            y: 顯示位置y坐標
//          val: 待顯示的數
//          len: 顯示位數
//******************************************************************************
void Disp_Hex_StrL(uchar x, uchar y, ulong val, uchar len)
{
  char i, temp[9];   
  if(len > 8) len = 8;
  if(len == 0) len = 1;
   
  temp[len] = 0;
  for(i=0; i<len; i++)
  {
    temp[len-1-i] = (val&0x0f);
    if( (temp[len-1-i]) < 0x0a ) temp[len-1-i] += 0x30;
    else temp[len-1-i] += 0x37;
    val >>= 4;
  }
  Disp_Str(x, y, temp);
}
//******************************************************************************
//  LCD十六進制整數顯示函數:Disp_Hex_StrI(uchar x, uchar y, uint val, uchar len)
//  入口參數  x: 顯示位置x坐標
//            y: 顯示位置y坐標
//          val: 待顯示的數
//          len: 顯示位數
//******************************************************************************
void Disp_Hex_StrI(uchar x, uchar y, uint val, uchar len)
{
  char i, temp[5];
   
  if(len > 4) len = 4;
  if(len == 0) len = 1;
   
  temp[len] = 0;
  for(i=0; i<4; i++)
  {
    temp[len-1-i] = (val&0x0f);
    val >>= 4;
    if( (temp[len-1-i]) < 0x0a ) temp[len-1-i] += 0x30;
    else temp[len-1-i] += 0x37;
  }
  Disp_Str(x, y, temp);
}
//******************************************************************************
//  LCD十六進制短整數顯示函數:Disp_Hex_StrC(uchar x,uchar y, uint val,uchar len)
//  入口參數  x: 顯示位置x坐標
//            y: 顯示位置y坐標
//          val: 待顯示的數
//          len: 顯示位數
//******************************************************************************
void Disp_Hex_StrC(uchar x, uchar y, uchar val, uchar len)
{
  char i, temp[3];
   
  if(len > 2) len = 2;
  if(len == 0) len = 1;
   
  temp[2] = 0;
  for(i=0; i<2; i++)
  {
    temp[len-1-i] = (val&0x0f);
    val >>= 4;
    if( (temp[len-1-i]) < 0x0a ) temp[len-1-i] += 0x30;
    else temp[len-1-i] += 0x37;
  }
  Disp_Str(x, y, temp);
}
//******************************************************************************
//  字符串中填十進制數函數:
//  Fill_Dec_Str(char * str,int v,unsigned char len,unsigned char pos, char sig)
//  入口參數str: 原始字符串
//            v: 待填的數
//          len: 數的位數
//          pos: 填的位置
//          sig: 符號位0+/1-
//******************************************************************************
void Fill_Dec_Str(char * str,int v,unsigned char len,unsigned char pos,char sig)
{
    char i;
    int x = 1;
    if(sig)
    {
        if(v>=0)  str[pos]='+';
        else    { str[pos]='-';  v = -v;}
        pos++; len--;
    }
    for(i=1; i<len; i++)
   x = (x<<3) + (x<<1);
    for(i=pos; i<pos+len; i++)
    {
        str[ i]=v/x + '0';
        v %= x;   
  x /= 10;
    }
}
//******************************************************************************
//  LCD初始化函數:LCD_Init()
//******************************************************************************
void  LCD_Init()
{
  LCD_Reset();                                                   //LED顯示器復位
  DisplayOn();
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:75263 發表于 2015-3-25 00:50 | 只看該作者
LCD.H頭文件下載:(復制下列代表后用記事本保存為lcd.h即可)
  1. #ifndef LCD_H
  2. #define LCD_H
  3. #include "reg52.h"
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define ulong unsigned long int
  7. //*******************************LCD控制引腳定義********************************
  8. sbit LCD_RST  = P2^4;                                              //    LCD復位
  9. sbit LCD_CLK  = P2^5;                                            //LCD串行時鐘
  10. sbit LCD_SID  = P2^6;                                            //LCD串行數據
  11. sbit LCD_CS   = P2^7;                                            //    LCD片選
  12. //*****************************LCD.C中公用函數聲明******************************
  13. void ClearScreen(void);
  14. void DisplayOn(void);
  15. void Disp_Str(uchar x, uchar y, char *str);
  16. void Disp_Digital_Str(uchar x, uchar y, uint val, uchar len);
  17. void Disp_Digital_Str_Dec(uchar x, uchar y, uint val, uchar len, uchar dotpos);
  18. void Disp_Hex_StrL(uchar x, uchar y, ulong val, uchar len);
  19. void Disp_Hex_StrI(uchar x, uchar y, uint  val, uchar len);
  20. void Disp_Hex_StrC(uchar x, uchar y, uchar val, uchar len);
  21. void Fill_Dec_Str(char* str,int v,unsigned char len,unsigned char pos,char sig);
  22. void LCD_Init(void);
  23. #endif
復制代碼
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产9999精品 | 午夜99| 电影91久久久 | 国产精品成人一区二区三区夜夜夜 | 欧美中文字幕一区二区三区亚洲 | 日本激情一区二区 | 欧美日韩精品一区二区天天拍 | 在线免费观看毛片 | 亚洲精品乱码久久久久久黑人 | 日韩免费视频 | 九色在线视频 | 欧美老少妇一级特黄一片 | 亚洲a在线观看 | 成人免费在线观看 | 成人欧美一区二区 | 国产精品一区二区视频 | jizz18国产 | 久久亚洲一区二区三区四区 | 午夜精 | h视频在线观看免费 | 欧美精品一二三区 | 久久久久国产一区二区三区四区 | 91一区二区三区 | 二区视频 | 色综合一区二区三区 | 婷婷一级片 | 福利网站导航 | 精品国产乱码久久久久久果冻传媒 | 精品国产综合 | 亚洲三级国产 | 夜夜骚 | 韩三级在线观看 | 国产成人99久久亚洲综合精品 | 日本成人午夜影院 | 日韩视频国产 | 日韩区 | 黄色一级毛片 | 日韩综合一区 | 亚洲综合区 | 毛片一区 | 日韩一二三区 |