历史上的今天
返回首页

历史上的今天

今天是:2025年01月06日(星期一)

正在发生

2018年01月06日 | c8051F040单片机驱动74HC595程序

2018-01-06 来源:eefocus

#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; 
        } 

}


推荐阅读

史海拾趣

Bytesonic Corporation公司的发展小趣事

随着台湾本土市场的逐渐饱和,Bytesonic Corporation开始将目光投向更广阔的大陆市场。1996年7月,公司在中国广东省东莞市石街镇成立了分公司,迈出了进军大陆市场的第一步。这一决策不仅为公司带来了更多的商机,也为其在亚洲乃至全球市场的布局打下了坚实的基础。

岑科(CENKER)公司的发展小趣事

岑科公司成立于2001年,初期主要从事电子元器件的贸易业务。在创始人蔡旌章的带领下,岑科以优质的服务和灵活的运营策略,在国内外市场上赢得了良好的口碑。这一时期,岑科的服务对象主要是海内外的电子元器件需求商,通过精准把握市场需求和优质的产品供应,逐渐在电子元器件贸易领域站稳了脚跟。随着业务的不断拓展,岑科开始思考如何进一步提升自身的竞争力,以实现更长远的发展。

BELDEN公司的发展小趣事

作为一家拥有百年历史的电子企业,BELDEN公司始终保持着持续创新和可持续发展的理念。公司不断投入研发资金,加强技术研发和创新能力,推出了一系列具有自主知识产权的新产品和技术。同时,公司还注重环保和可持续发展,积极采用环保材料和生产工艺,致力于降低生产过程中的能耗和排放。这些举措不仅提升了公司的竞争力和市场份额,还为公司的长期发展奠定了坚实的基础。

这五个故事从不同角度展示了BELDEN公司在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。这些事实性的描述旨在客观呈现BELDEN公司的历史与现状,不含任何褒贬之意。

Amidon Associates Inc公司的发展小趣事

BELDEN公司的故事始于1902年,当Joseph C. Belden在美国芝加哥创立这家公司时,他怀揣着对电线电缆制造的深厚热情与独特见解。初创时期,公司致力于研发和生产高品质的电线电缆产品,很快便在市场中赢得了良好的声誉。经过多次试验,公司成功发明了“Beldenamel”绝缘材料,这种柔韧的珐琅绝缘材料为公司的成功奠定了坚实的基础。随着产品的不断优化和市场的逐步拓展,BELDEN逐渐在电子行业中崭露头角。

Auris公司的发展小趣事

Auris公司的创始人Federic Moll博士,被誉为手术机器人之父。他在2007年创立了Auris Health(原名Auris Surgical Robotics),总部位于美国加利福尼亚州圣卡洛斯。Moll博士此前已经成功创办了多家手术机器人企业,其中最为知名的是上市公司Intuitive Surgical,其达芬奇手术机器人技术已在全球范围内广泛应用。Moll博士的深厚技术背景和丰富的创业经验为Auris的起步奠定了坚实的基础。

DFRobot公司的发展小趣事

为了进一步提升品牌影响力和市场竞争力,DFRobot积极寻求国际合作机会。他们与国际知名的开源硬件品牌建立了合作关系,共同推广开源硬件和机器人技术。同时,DFRobot还积极参加各类国际展览和论坛活动,展示公司的最新产品和技术成果。这些国际合作和交流活动不仅提升了DFRobot的品牌知名度,也促进了公司与国际同行的交流与合作。

问答坊 | AI 解惑

2008黑龙江电子竞赛试题下载

本帖最后由 paulhyde 于 2014-9-15 09:04 编辑 A题 宽带前置放大器电路(本科) B题 运水机器人(本科) C题 无线汉字识别装置(本科) [ 本帖最后由 open82977352 于 2010-2-3 10:46 编辑 ]  …

查看全部问答>

eboot USB下载只能下载NK.NB0文件?

平台上S3C2440的.可以正常的下载用WINCE5.0编译生成的NK.NB0文件,但是在下载NK.BIN文件后,系统却停在EBOOT后不能加载了。哪位大侠有过了解,指点一二,不胜感谢!…

查看全部问答>

关于舵机的编程问题

小弟最近刚学汇编,还是个菜鸟,正在研究舵机,需要用汇编写一点程序驱动舵机转动,到网上找了半天,很少有现成的程序,而且写的很复杂,很难理解,有没有那位大侠帮帮写一点关于驱动舵机的汇编程序示例,顺带稍微的讲解,小弟感激不尽。(我买的舵 ...…

查看全部问答>

make后的问题

在make后,提示出现一个error 请指正错误在哪? 谢谢 [root@localhost qt-serial]# make g++ -c -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -fno-default-inline -DNO_DEBUG -I/working/qt/qt-2.3.7/include -o hello.o hello.cpp I ...…

查看全部问答>

TQ6410有人搞了吗?

怎么样?资料全吗?…

查看全部问答>

STM32F105串口乱码问题

采用的是STM32F105,串口输入始终是乱码 以下是串口的配置信息 void USART1_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure;     USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructur ...…

查看全部问答>

刚学习ARM 不知道买点什么书看

本人现在研究生阶段,想学习下ARM9,不知道买点什么好一点的书籍,ARM的和LINUX的都需要 求助 求助 求助…

查看全部问答>

简介

1.1       简单说明 Figure 1  msp430f149的内部结构图 1.2       地址分布 Msp430f149存储单元采用的是冯·诺依曼体系结构,即ROM和RAM使用同一组地址。Msp430f149是16位 ...…

查看全部问答>

MSP430依次采样

最近在做一个项目,想实现MsP430对Flash的控制,有On和OFF按钮,ON可以控制电路开始采样,OFF控制停止采样,比如第一次按下on后采集到的数据存到了Flash的第一块和第二块的一部分,按下Off停止采集,下一次采集的时候就可以直接存在Flash的第三块上 ...…

查看全部问答>