×
单片机 > 单片机程序设计 > 详情

IO端口驱动LCD1602

发布时间:2020-06-04 发布时间:
|

只用两个IO端口驱动74LS164扩展成并口驱动LCD1602(四线模式),这是个完整简单的例子,可实现字符串左移200次,右移200次,不停的循环。现上传与大家共享成果!  

//引入头文件********************************************************* 
#include      

IC.h> 

#include       
#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.picbbs.net   "};       // 
     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 <
     if (rs & 0x01) temp |=  1 <
     TxLs164(temp);                                        //写高四位  
     Dat = 1;                                              //使能下沿 
     Dat = 0; 
     DelayUs(50);                                          //延时等待 

     temp = data & 0x0f;                                   //取低四位 
     temp |= 1 <
     if (rs & 0x01) temp |=  1 <
     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         { 
         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);                                 //发送字符 
      }   
 } 



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会