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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

pic單片機兩個IO口四線驅動LCD1602

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年08月06日   【字體:

   經過多天調式,優化程序。只用兩個IO端口驅動74LS164擴展成并口驅動LCD1602(四線模式),這是個完整簡單的例子,可實現字符串左移200次,右移200次,不停的循環。現上傳與大家共享成果!//引入頭文件*********************************************************
#include      <pic.h>
#include      <pic12f6x.h>
#include   "delay.h"
#include   "delay.c"

//熔絲配置***********************************************************
__CONFIG(PROTECT & CPD & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);

//端口定義***********************************************************
#define       Port      GPIO                               //端口址址
#define       Tris      TRISIO                             //方向設置

//腳位定義***********************************************************
#define       Dat       GPIO4                              //數據引腳
#define       Clk       GPIO5                              //時鐘引腳

//顯示字符***********************************************************
     unsigned char TopChar[] = {"www.pic16.com   "};       //
     unsigned char BotChar[] = {"ivws            "};       //      

//*******************************************************************
//函數名稱:PortInit();
//輸入參數:無
//輸出參數:無
//功能描述:端口設置
//建造日期:2008.12.08
//********************************************************************
void PortInit(void)
 {
     Port = 0x00;                                          //端口設置
     Tris = 0x00;
 }

//*******************************************************************
//函數名稱:ConInit();
//輸入參數:無
//輸出參數:無
//功能描述:定時器設置
//建造日期:2008.12.08
//*******************************************************************
void ConInit(void)
 {  
     OPTION = 0x00;                                        //允許上拉
     CMCON  = 0x07;                                        //關比較器
 }

//*******************************************************************
//函數名稱: TxLs164(data);
//輸入參數:串行數據
//輸出參數:無
//功能描述:串行發送數據
//建造日期:2008.12.08
//*******************************************************************
void TxLs164(unsigned char data)
 {
     unsigned char i;
    
     i = 6;                                                //送出六位
       
     do
      {
       Dat = 0;                                            //數據清零
       Clk = 1;                                            //時鐘置位
       Clk = 0;                                            //時鐘清零
      }
     while (--i);                                          //循環發送                                    

     i = 6;                                                //送出六位

     do
      {
       Dat = 0;                                            //先高后低

       if (data & 0x20) Dat = 1;                           

       Clk = 1;                                            //時鐘置位
       data <<= 1;                                         //數據左移
       Clk = 0;                                            //時鐘清零
      }
     while (--i);                                          //循環發送
 }
    
//*******************************************************************
//函數名稱: WriteData(data, rs);
//輸入參數:待寫數據, 0 = 指令,1 = 數據
//輸出參數:無
//功能描述:數據寫入LCD
//建造日期:2008.12.08
//*******************************************************************
void WriteData(unsigned char data, unsigned char rs)
 {  
     unsigned char temp;

     temp = data >> 4;                                     //取高四位
     temp |= 1 << 5;                                       //使用置位

     if (rs & 0x01) temp |=  1 << 4;                       //數據選擇                            

     TxLs164(temp);                                        //寫高四位
     Dat = 1;                                              //使能下沿
     Dat = 0;
     DelayUs(50);                                          //延時等待

     temp = data & 0x0f;                                   //取低四位
     temp |= 1 << 5;                                       //使用置位

     if (rs & 0x01) temp |=  1 << 4;                       //數據選擇

     TxLs164(temp);                                        //寫高四位
     Dat = 1;                                              //使能下沿
     Dat = 0;
     DelayUs(50);                                          //延時等待
 }

//*******************************************************************
//函數名稱:AddrSite(x, y);
//輸入參數:坐標參數
//輸出參數:無
//功能描述:設置顯示地址
//建造日期:2008.12.08
//*******************************************************************
void AddrSite(unsigned char x, unsigned char y)
 {  
     x &= 0x3f;                                            //截取地址     

     if (y == 0)
      {
       WriteData((0x80 | x), 0);                           //首行地址
      }

     else
      {
       WriteData((0xc0 | x), 0);                           //次行地址
      }
 }

//*******************************************************************
//函數名稱:PrintChar(*s);
//輸入參數:緩沖區首址
//輸出參數:無
//功能描述:字符串輸出顯示
//建造日期:2008.12.08
//*******************************************************************
void PrintChar(unsigned char *s)
 {
     while(*s)                                            
      {
       WriteData(*s, 1);                                   //字符數據
       s++;                                                //下個字符
      }
 }

//*******************************************************************
//函數名稱:LcdInit();
//輸入參數:無
//輸出參數:無
//功能描述:液晶初始化
//建造日期:2008.12.08
//*******************************************************************
void LcdInit(void)
 {  
     unsigned char i = 3; 

     TxLs164(0x23);                                        //接口設置
  
     do
      {
       Dat = 1;                                            //使能下沿
       Dat = 0;
       DelayUs(50);                                        //延時等待
      }
     while (--i);

     TxLs164(0x22);                                        //四線模式

     Dat = 1;                                              //使能下沿
     Dat = 0;
     DelayUs(50);                                          //延時等待

     WriteData(0x28, 0);                                   //接口設置
     WriteData(0x0c, 0);                                   //顯示打開
     WriteData(0x01, 0);                                   //顯示清屏
     WriteData(0x06, 0);                                   //光標右移
 }

//*******************************************************************
//函數名稱:ShiftChar(*buff);
//輸入參數:緩沖區首址, 0 = 左移 1 = 右移
//輸出參數:無
//功能描述:移動字符
//建造日期:2008.12.08
//*******************************************************************
void ShiftChar(unsigned char *buff, unsigned char rl)
 {
     unsigned char temp, i;
    
     if (rl & 0x01)                                        //字符右移
      {
       temp = buff[15];                                    //取尾字符
    
       for (i = 15; i > 0; i--)                             
        {
         buff[i] = buff[i - 1];                            //數據右移
        }
    
       buff[0] = temp;                                     //首尾交換
      }
 
     else                                                  //字符左移
      {
       temp = buff[0];                                     //取首字符

       for (i = 0; i < 15; i++)
        {
         buff[i] = buff[i + 1];                            //數據左移
        }
      
       buff[15] = temp;                                    //字符交換                               
      }
 }

//*******************************************************************
//函數名稱:main();
//輸入參數:無
//輸出參數:無
//功能描述:主要程序
//建造日期:2008.12.08
//*******************************************************************
void main(void)                                           
 {  
     unsigned char i, rl;

     PortInit();                                           //腳位設置
     ConInit();                                            //配置設置
     LcdInit();                                            //液晶設置
 
     DelayMs(50);                                          //短暫延時
     AddrSite(0, 0);                                       //坐標設置
     PrintChar(TopChar);                                   //發送字符
          
     i  = 0;                                               //移動記數
     rl = 0;                                               //左右移動  

     while (1)
      {
       if (i++ > 200)                                      //移動記數
        {
         i = 0;                                            //記數清零
         rl ^= 0x01;                                       //移動取反
        }

       DelayMs(250);                                       //延時顯示
       ShiftChar(BotChar, rl);                             //移動字符

       AddrSite(0, 1);                                     //坐標設置
       PrintChar(BotChar);                                 //發送字符
      } 
 }



源代碼下載:http://m.zg4o1577.cn/f/1602ym.rar
仿真文件下載:http://m.zg4o1577.cn/f/1602fz.rar

 

關閉窗口

相關文章

51Hei缂傚倷绶¢崰妤呭磿閹惰棄绠圭憸鏃堢嵁閹烘惟闁靛ǹ鍎抽ˇ锟�
主站蜘蛛池模板: 日韩av在线免费播放 | 国产在线日韩 | 一区二区三区国产精品 | 日韩精品二区 | 午夜精品久久久久 | 中文字幕在线免费观看视频 | 精品国产一区二区在线观看 | 国产精品一品二区三区的使用体验 | 亚洲天堂国产 | 91色网站 | 午夜亚洲精品 | 久久久精品国产sm调教 | 久久成人精品 | 黄色在线播放 | 秋霞午夜伦理 | 4438成人网 | 能看毛片的网站 | www.久草 | 欧美 日韩 国产 成人 在线 | 在线观看的av网站 | 精久久久久 | 麻豆国产一区二区三区四区 | 懂色av一区二区三区 | 欧美日韩成人 | 欧美激情一二三区 | 最近中文字幕在线 | 高潮毛片无遮挡免费看 | 精品一二三区 | 中文字幕在线免费观看视频 | 超碰成人在线观看 | 天天拍夜夜操 | 亚洲黄色一级 | 日韩一区二区三区在线播放 | 天天爽天天操 | 亚洲综合国产 | 亚洲第一黄网 | 五月天毛片 | 亚洲国产天堂 | 中文字幕在线免费观看视频 | 大乳女喂男人吃奶 | 免费人成|