c8051F040单片机驱动74HC595程序

发布者:SparklingMoon最新更新时间:2018-01-06 来源: eefocus关键字:c8051F040  单片机  驱动74HC595 手机看文章 扫描二维码
随时随地手机看文章

#include "C8051F040.h" 
#define uchar unsigned char 
#define uint unsigned int 

uchar xdata virt_port; 
bit SPI_BUSY; 
unsigned char xdata tab1[16]={0x20,0x20,0x42,0x54,0x20,0x46,0x30,0x34,0x30,0x20,0x56,0x31,0x2e,0x30 


                            ,0x20,0x20}; 
unsigned char xdata Netdata[16]={0x77,0x77,0x77,0x2e,0x78,0x68,0x6c,0x2e,0x63,0x6f, 
                                0x6d,0x2e,0x63,0x6e,0x20,0x20};  
sbit LCDCs=P2^5; 
void os_init(); 
void port_init(); 
void spi_init(); 
void writecode(uchar ins); 
void writEDAta(uchar d); 
void lcdchar (void); 
void lcdinit(); 
void writelcd(uchar spi_data); 
void main() 
{   
    WDTCN = 0xDE;                                           // 关闭看门狗 
    WDTCN = 0xAD; 
    os_init(); 
    port_init(); 
    spi_init(); 
      SFRPAGE   = CONFIG_PAGE; 
     EIE1      = 0x01; 
     EA=1; 
   while(1) 
   { 
  
    
   lcdinit(); 
   lcdchar(); 
   } 


void os_init() 

    int i = 0; 
    SFRPAGE   = CONFIG_PAGE; 
    OSCXCN    = 0x67;                                    //外部22.1184M晶振 
    for (i = 0; i < 3000; i++);                         //等待外部晶振稳定  
    while ((OSCXCN & 0x80) == 0); 
    CLKSEL    = 0x01;                                    //系统时钟不分频 

void port_init() 

    SFRPAGE   = CONFIG_PAGE; 
       P0MDOUT=0xff; 
    XBR0      = 0x06; 
    XBR2      = 0x40; 


void spi_init() 

      SFRPAGE   = SPI0_PAGE; 
      SPI0CFG   = 0x40; 
      SPI0CN    = 0x01; 
      SPI0CKR   = 0x6D; 






 void delay1us(void) 
    { 
    uchar xdata i; 
    for(i=10;i>0;i--); 
    }  

void writelcd(uchar spi_data)       //向LV595写数据以SPI方式 

  uint xdata i,j,k; 
     for(i=0;i<9;i++); 
    LcdCs=0; 
    delay1us();     
    SPI_BUSY=1; 
    SFRPAGE   = SPI0_PAGE; 
    SPI0DAT=spi_data; 
    for(j=0;j<500;j++) 
        { 
       if(!SPI_BUSY)break; 
        }  
    delay1us(); 
     
    LcdCs=1; 
    delay1us(); 
    delay1us(); 
    delay1us(); 
    delay1us(); 
    delay1us(); 
    delay1us(); 
    for(k=0;k<5000;k++); 
     
/* ************************************************************************** 
 // 以下这段代码,是用IO口模拟SPI传输的程序 
   LcdCs=0; 
  for(i=0;i<8;i++) 
  { SPICLK=0; 
    if(spi_data&0x80) 
       spi_mosi=1; 
    else  
       spi_mosi=0; 
    spi_data<<=1; 
    SPICLK=1; 
     for(j=0;j<10;j++) 
     {_nop_();} 
    SPICLK=0; 
   } 
   LcdCs=1; 
/***************************************************************************/ 

void writecode(uchar ins)                    //向液晶控制模块写命令 
     { 
      uchar xdata t; 
      uint xdata j; 
     
      for(j=0;j<500;j++);     
      virt_port|=ins&0xf0;                    //取高字节向1602写数据  
      writelcd(virt_port);                    //先写高4位后再写低4位 这是在选择四个数据线的时候 
      
      virt_port|=0x08;                           
      writelcd(virt_port);                    //使能E脚为高电平 
      virt_port&=~0x08;                     
      writelcd(virt_port);                    //使能E脚为低电平 

      t=ins<<4;              
      virt_port|=t&0xf0;                      //取低字节向1602写数据 
      writelcd(virt_port); 
      virt_port|=0x08;                        //使能E脚为高电平 
      writelcd(virt_port); 
      virt_port&=~0x08;                        //使能E脚为低电平 
      writelcd(virt_port); 
      virt_port=0; 
      writelcd(virt_port); 
     } 

void writedata(uchar d)                       //写数据到1602 
     { 
      uchar xdata i,t; 
      uint xdata j; 
       
      for(j=0;j<500;j++);         
      virt_port|=0x02;                       //光标返回指令 
      writelcd(virt_port); 
      virt_port|=d&0xf0;                   //取高字节数据给数据寄存器 
      writelcd(virt_port); 
      virt_port|=0x08;                     //使能E脚为高电平 
      writelcd(virt_port); 
      virt_port&=0xf7;                     //使能E脚为低电平 
      writelcd(virt_port); 
      virt_port&=0x07;                       //设置光标右移,文字也右移 
      writelcd(virt_port); 
            
      t=d&0x0f; 
      virt_port|=t<<4;                       //取低字节数据给数据寄存器 
      writelcd(virt_port); 

      virt_port|=0x08;                     //使能E脚为高电平 
      writelcd(virt_port); 
      for(i=3;i>0;i--);  
      virt_port&=0xf7;                     //使能E脚为低电平 
      writelcd(virt_port); 
      virt_port=0;                           //数据清零 
      writelcd(virt_port); 
    } 

 void lcdchar (void) 
     { 
     uint xdata i,j,k; 
     for(j=0;j<5000;j++);                  //数据读、写操作,画面不动 
     for(k=0;k<5000;k++); 
   
     for(i=0;i<16;i++) 
     { 
       writedata(tab1[i]); 
       for(j=0;j<1000;j++); 
       for(k=0;k<1000;k++); 
       for(k=0;k<5000;k++); 
       for(k=0;k<1000;k++); 
       for(k=0;k<5000;k++); 
       for(k=0;k<5000;k++); 
       for(k=0;k<5000;k++); 
      
      } 
                                         
   
      writecode(0xb0);                       // 换行                    
      for(j=0;j<5000;j++);                                         
      for(k=0;k<5000;k++); 
  
     for(i=0;i<16;i++) 
     { 
       writedata(Netdata[i]); 
       for(j=0;j<5000;j++)    delay1us(); 
       for(k=0;k<5000;k++); 
       for(k=0;k<5000;k++); 
       for(k=0;k<5000;k++); 
       for(k=0;k<5000;k++); 
        
                
      }; 
    
     } 


void lcdinit() 

     uint xdata i; 
     
      virt_port=0x00; 
      writelcd(virt_port);         //RS脚为零写指令寄存器     RW为低电平 
      virt_port|=0x08;              //使能脚E=1 
      writelcd(virt_port); 
       virt_port&=0xf7;             //使E=0使能脚发生跳变高--低 
      writelcd(virt_port); 
      for(i=1000;i>0;i--);         //3次延时,重要! 
      for(i=8000;i>0;i--);         //用延时代替查询       

     
      virt_port=0;                 //写入20码,设置为4位总线方式,非常重要!!!!! 
      writelcd(virt_port); 
      virt_port|=0x20;             //只写高字节 
      writelcd(virt_port); 
      virt_port|=0x08;           //E=1 
      writelcd(virt_port); 
      for(i=20;i>0;i--);         //使命令执行 
      virt_port&=0xf7;           //E=0 
      writelcd(virt_port); 
      for(i=10;i>0;i--); 
      virt_port=0; 
      writelcd(virt_port); 
      
      

      writecode(0x38);            //设两行显示,4线方式5*10字符显示 
      for(i=50;i>0;i--); 
        writecode(0x06);            //光标右移 
      for(i=50;i>0;i--); 
      
       
      writecode(0x0c);            //开显示指令 
      for(i=50;i>0;i--); 
       
      
      writecode(0x02);            //光标返回指令 
      for(i=50;i>0;i--); 
        
     
      
      writecode(0x01);            //清屏指令 
      for(i=50;i>0;i--); 


void spi_srs  () interrupt 6 

    if(SPIF)         
        { 
      SFRPAGE   = SPI0_PAGE; 
      SPIF=0; 

        SPI_BUSY=0; 
        } 
         

    if(WCOL) 
        { 
       SFRPAGE   = SPI0_PAGE; 
        WCOL=0; 
        } 

}


关键字:c8051F040  单片机  驱动74HC595 引用地址:c8051F040单片机驱动74HC595程序

上一篇:89C2051驱动步进电机的电路和源码
下一篇:c8051f005单片机PWM测试程序

推荐阅读最新更新时间:2024-03-16 15:51

51单片机串口通信的原理实例
一、原理简介 51单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1)
[单片机]
51<font color='red'>单片机</font>串口通信的原理实例
51单片机基础之LCD1602
外观: 原理: LCD1602是一种工业字符型液晶,能够同时显示16x2即32个字符。 LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。 基本接线: 读状态:输入:RS=L,RW=H,E=H ----输出:D0~D7=状态字 写指令:输入:RS=L,RW=L,D0~D7=指令码 ----输出:无 读数据:输入:RS=H,RW=H,E=H ----输出:D0~D7=数据 写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲
[单片机]
51<font color='red'>单片机</font>基础之LCD1602
消息称汽车MCU、MPU后端需求保持强劲
8月19日,据DIGITIMES报道,供应链消息人士称,汽车MCU和MPU的后端需求仍处于高速发展阶段,OSAT和封装材料供应商在今年年底前都能看到清晰的订单。 消息人士表示,包括日月光科技在内的领先OSAT公司已经从国际IDM公司获得了未来两个季度的汽车MCU后端外包订单,帮助支持此类芯片的主流QFP工艺所需引线框架的出货势头。 消息人士称,中国台湾的后端合作伙伴从2022年第三季度开始与美国、日本和欧洲的IDM商谈2023年的订单,发现这些IDM厂商对2023年下半年的业务前景变得谨慎。 消息人士指出,汽车芯片IDM预计将在2023年下半年略微减少外包后端业务的订单,但明年下半年汽车MCU和MPU的需求是否会出现逆
[汽车电子]
Microchip推出两款全新基于PIC32 MCU的开发板
Microchip Technology Inc.(美国微芯科技公司)宣布,推出两款基于低引脚数32位PIC32单片机(MCU)的全新数字音频混合器板。DM320014是一款USB数字音频附件板,采用标准USB 2.0 Mini-B连接。DM320413是一款数字音频混合器板,可提供Apple® 便携设备连接。该两款开发板均采用Microchip的PIC32MX250F128 32位MCU,有助于实现面向广泛应用的音频和语音设备开发。 这两款开发板的设计旨在将数字和模拟音频轻松集成到目标应用中。其主要功能包括通过USB Mini-B或AppleiOS接口的数字音频接口、能够方便连接模拟音频源(如麦克风或乐器拾音器)的线路输
[单片机]
Microchip推出两款全新基于PIC32 <font color='red'>MCU</font>的开发板
MCU 中输入/输出口的使用
简介:   在HT49C30-1/HT49R30A-1 中有8 个双向的输入/输出口(PA 口,8 位),6 个输入口(PB 口);HT49C50-1/HT49R50A-1 中有12 个双向的输入/输出口(PA 口,8 位;PC 口,4 位),8 个输入口(PB 口);HT49C70-1/HT49R70A-1 中有16 个双向的输入/输出口(PA 口,8 位;PC 口,8 位),8 个输入口(PB 口)PA、PB、PC 分别对应RAM 中地址 、 、 。掩膜时可选择PA、PC 口的结构(NMOS 或CMOS),及该口是否具有上拉电阻。   若PA、PC 口结构NMOS 时,在读取数据之前,必须向相关位写“1”以关闭场效应管NM
[工业控制]
嵌入式DS80C320单片机软核设计
1 引言 在如今的快速嵌入式系统设计中,目前比较流行的方案是在FPGA内集成应用软件或是软IP平台,以简化工序、加速产品面市日程。为此,很多公司推出了自己的开发平台以及相关CPU的IP核,常见的为两种:一种是通用型CPU,如xilinx和altera公司的32位以及64位通用CPU核;还有就是专用型的,常见的为51系列单片机的CPU核,但是目前关于单片机的软核基本上都是8051的,其他的品种很少。而且8051的速度不是很快,在有些快速的控制场合(如利用单片机来作为usb2.0的控制部件)显得速度不足,比较著名的actel公司推出的Core8051,运行频率也只在40 MHz左右。本文介绍了一个非常高速DS80C320单片机软核
[单片机]
嵌入式DS80C320<font color='red'>单片机</font>软核设计
国产内核MCU怎样点燃汽车和IoT双擎
IoT生态的逐步成熟和汽车的电子智能化,成为MCU发展的双擎。以这两大应用为核心,结合5G、AI等新技术,MCU正在快速渗透进各种细分领域。 在国内市场,国产MCU更是厚积薄发,在各个战场“攻城略地”。在2020年慕尼黑电子展上,国产MCU代表厂商芯旺微就携8位和32位MCU系列亮相,一展国产自主MCU内核“kungFu”的风采。 作为国内较早自主开发内核的MCU芯片厂商,芯旺微已经形成了完整的MCU布局,成功向应用市场推出了KF8F、KF8L、KF8A、KF8TS、KF8S等多种8位MCU产品和KF32A、KF32F、KF32L、KF32LS等32位MCU产品。 就在几天之前,芯旺微电子刚刚收获2020年度中国IC设计成
[手机便携]
国产内核<font color='red'>MCU</font>怎样点燃汽车和IoT双擎
采用单片机和CPLD器件实现仿人手臂形假肢控制系统的设计
假肢是人体缺损肢体的替代物,用以弥补缺损肢体的形状和功能。本文针对失去整个手臂的情况,设计出一种仿人手臂形假肢的控制系统。使用者可以补偿部分缺失的功能,达到生活自理甚至于可以从事基本劳动,减少身心痛苦,同时也相应地解放了护理工作用。在设计中,采用C8051F020单片机作为主控制器,并通过CPLD(Complex Programmable Logic Device)完成对各个关节控制量的检测以及凌阳61单片机实现语音控制功能。 1、 机器人假肢结构 多自由度机器人型假肢(上肢)拥有6个自由度,其结构原理图如图1所示。 2、 假肢控制系统的硬件设计 2.1 控制器的工作原理 控制系统原理框图如图2所示,主要由控制、驱动、被控
[单片机]
采用<font color='red'>单片机</font>和CPLD器件实现仿人手臂形假肢控制系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved