历史上的今天
返回首页

历史上的今天

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

正在发生

2018年01月06日 | C8051F040按键程序

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[8]={0x53,0x31,0x53,0x32,0x53,0x33,0x53,0x34}; 


sbit key1=P2^0; 
sbit key2=P2^1; 
sbit key3=P2^2; 
sbit key4=P2^3; 
sbit LCDCs=P2^5; 
void os_init(); 
void port_init(); 
void spi_init(); 
void writecode(uchar ins); 
void writEDAta(uchar d); 
void lcdchar (uchar da); 
void lcdinit(); 
void writelcd(uchar spi_data); 
void delay(uint d); 
void main() 
{   
    WDTCN = 0xDE;                                           // 关闭看门狗 
    WDTCN = 0xAD; 
    os_init(); 
    port_init(); 
    spi_init(); 
      SFRPAGE   = CONFIG_PAGE; 
     EIE1      = 0x01; 
     EA=1; 
   while(1) 
   { 
   if(key1==0) 
   {  
   delay(2000);  
   lcdinit(); 
   lcdchar(6); 
       } 
    if(key2==0) 
    { delay(2000);  
      lcdinit(); 
      lcdchar(4); 
   } 
  if(key3==0) 
    { delay(2000);  
      lcdinit(); 
      lcdchar(2); 
   } 
   if(key4==0) 
    { delay(2000);  
      lcdinit(); 
      lcdchar(0); 
   } 
   
   } 


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; 
    P2MDOUT=0xff; 


void spi_init() 

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




 void delay(uint d) 
 {uint i,j; 
  for(i=0;i    { 
    for(j=10;j>0;j--); 
    } 

 } 
 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 (uchar da) 
     { 
     uint xdata i,j,k; 
     for(j=0;j<5000;j++);                  //数据读、写操作,画面不动 
     for(k=0;k<5000;k++); 
   
     for(i=da;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++); 
      
      } 
                                         
   
      
  
    
    
     } 


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

}


推荐阅读

史海拾趣

Fractus公司的发展小趣事

为了加速技术的商业化进程,Fractus积极寻求与全球领先企业的合作。自2000年以来,公司陆续与多家知名手机厂商、电信运营商以及设备制造商建立了战略合作关系。这些合作不仅为Fractus带来了稳定的收入来源,也促进了其技术的广泛应用和持续改进。同时,Fractus还通过签订全球许可协议和建立战略伙伴关系,进一步拓展了其业务范围和市场影响力。

Advanced Analog公司的发展小趣事

随着技术的不断进步和市场需求的多样化,Advanced Analog的产品逐渐应用于更广泛的领域。从最初的TFT-LCD面板,到后来的数字相机、手持装置、网络通讯装置等领域,Advanced Analog都提供了完整的解决方案和优质的服务。通过与各行业合作伙伴的紧密合作,Advanced Analog的产品助力众多电子设备实现了更高效、更稳定的性能,推动了整个电子行业的发展。

Corex Intervest Inc公司的发展小趣事

Corex Intervest Inc公司在电子行业的发展历程中,始终保持着稳健的步伐和进取的精神。公司不断适应市场变化和技术更新,不断调整战略方向和发展重点。在未来,公司将继续加大研发投入,拓展新的应用领域和市场空间,为电子行业的发展贡献更多的力量。

这五个故事展示了Corex Intervest Inc公司在电子行业中的发展历程和取得的成就。从创立初期的艰难起步到技术创新、市场拓展、战略合作和持续发展的不断推进,Corex Intervest Inc公司始终保持着积极进取的精神和不断创新的态度,在电子行业中取得了显著的成绩。

Fairchild公司的发展小趣事

近年来,Fairchild公司在全球范围内与众多知名企业建立了合作关系。其中,与华为的合作尤为引人注目。华为作为全球领先的通信设备制造商,对供应商的要求极为严格。然而,Fairchild公司凭借其出色的产品质量、客户支持和公司间的成功合作,从众多供应商中脱颖而出,成为华为的核心合作伙伴之一。华为对Fairchild公司的认可不仅体现在订单量的增加上,还体现在对其产品和服务的高度评价上。

Fluke公司的发展小趣事

近年来,Fairchild公司在全球范围内与众多知名企业建立了合作关系。其中,与华为的合作尤为引人注目。华为作为全球领先的通信设备制造商,对供应商的要求极为严格。然而,Fairchild公司凭借其出色的产品质量、客户支持和公司间的成功合作,从众多供应商中脱颖而出,成为华为的核心合作伙伴之一。华为对Fairchild公司的认可不仅体现在订单量的增加上,还体现在对其产品和服务的高度评价上。

ECLIPTEK公司的发展小趣事

面对数字化浪潮的冲击,ECLIPTEK公司积极拥抱数字化转型和智能制造。公司引入大数据、云计算和人工智能等先进技术,推动生产过程的智能化和自动化。通过数字化转型和智能制造,ECLIPTEK不仅提高了生产效率和质量,还降低了生产成本和能源消耗。这一转型为公司未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

现在貌似找工作时都没要求同时得会arm和fpga

如果同时掌握了arm和cpld会不会有所帮助? 来自EEWORLD合作群:arm linux fpga 嵌入0(49900581)群主:wangkj…

查看全部问答>

记录波形

1、  想把一个时间段的波形录制下来再看,或者传到电脑上进一步分析,有没有这样的示波器?或者有这样功能的仪器叫什么,大家有用到的介绍下…

查看全部问答>

求ADC0809资料,电路图或小程序

那位大哥有的话发一个到我邮箱行吗?谢谢! sodik@126.com…

查看全部问答>

sigmatel 9200 HD 声卡没有混音功能怎么办

能够记录机器里面播放的声音,或者使用麦克可以录音,但就是不能同时实现卡拉ok混音功能。怎么办,网上找到的补丁都用过了,就是不能用混音。 高手在哪里?…

查看全部问答>

NDIS的一点疑问?

我的是一个协议层驱动,有个疑问就是 A.使用CreateService,OpenService,QueryServiceStatus及StartService等一系列API安装起来的驱动 B.使用Inf文件及INetCfg的COM接口安装的驱动 问题是 1.这两种方式有什么不同? 2.为什么A安装后\"本地连接\" ...…

查看全部问答>

【招兵买马】响应论坛活动

随着论坛LM811的开发板的活动,先前我也在论坛发过一些关于DIY机器人的意见贴!~ 随着我实习已经快接近尾声了,在论坛活动结束之后,召集申请到得开发板的童鞋,当然没有申请到得童鞋也是可以的啦,一起来DIY机器人,如果我没有申请到我会自己出钱 ...…

查看全部问答>

全国电子设计竞赛A题交流群101126312

本帖最后由 paulhyde 于 2014-9-15 04:03 编辑 全国电子设计竞赛A题交流群101126312  …

查看全部问答>

【TI课程ppt】开关电源组件选择

开关电源组件选择 开关电源组件选择 (Switch-Power-Supply-Component-Selection) 开关电源深入浅出之设计选型篇,作为能量转换的装置-电源,此篇告诉你想了解的储能元器件类型和如何选择,理解并能优化选择电容和电感 课程大纲: 拓扑敏感回路 ...…

查看全部问答>

中秋节,晒福利

如题,晒晒你们公司的中秋福利吧…

查看全部问答>

msp430f5418的DCO最高倍频是多少

msp430f5418的DCO最高倍频多少?能不能倍到40MHz或以上?尝试过没成功…

查看全部问答>