历史上的今天
返回首页

历史上的今天

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

正在发生

2018年01月06日 | c8051f005键盘测试程序

2018-01-06 来源:eefocus

c8051f005键盘测试程序

//----------------------------------------------------------------------------- 
// Includes 
//-----------------------------------------------------------------------------

#include  
#include  
#include  
//----------------------------------------------------------------------------- 
// Function PROTOTYPES 
//----------------------------------------------------------------------------- 
#define  uchar unsigned char 
#define  uint  unsigned int 
#define BAUDRATE             115200              // Baud rate of UART in bps 
#define SYSCLK               11059200           // SYSCLK Frequency in Hz 
void SYSCLK_Init (void); 
void delaynus(unsigned int q) ;                 //N us延时函数 
void PORT_Init (void); 
void SPI0_Init (void); 
void LCD_Init(void); 
void SenDSPIByte(unsigned char ch); 
void delaynms (unsigned int j); 
void writecom(unsigned char com); 
void writEDAta(unsigned char d); 
void writechar(unsigned char ua); 
void Write_COM(uchar ins); 
void lcden(datad); 
void LCD_set_xy( unsigned char x, unsigned char y ); 
void LCD_write_string(unsigned char n); 
void lcd_key1(void); 
void lcd_key2(void); 
void lcd_key3(void); 
void lcd_key4(void); 
void UART0_Init (void); 
void presskey(void); 
//----------------------------------------------------------------------------- 
// Global CONSTANTS 
//----------------------------------------------------------------------------- 
sbit S3=P1^0; 
sbit S4=P1^1; 
sbit S5=P1^2; 
sbit S6=P1^3; 
sbit lcdcs=P3^0; 
unsigned char datad ,comd,kk,sdf,ppca; 
unsigned char virt_port,v,b,m; 
unsigned char lcd_data_count; 
unsigned char *lcdpoint; 
unsigned char   qqq;  
unsigned char  data8; 
unsigned int   i; 
//----------------------------------------------------------------------------- 
// MAIN Routine 
//----------------------------------------------------------------------------- 
void main(void){ 

        WDTCN = 0xde;                       // dISAble watchdog timer 
        WDTCN = 0xad; 
        SYSCLK_Init (); 
        PORT_Init (); 
        UART0_Init() ;                      // initialize crossbar and GPIO 
        SPI0_Init (); 
        LCD_Init() ; 

        delaynms (20); 
        delaynus (100); 
        LCD_set_xy(0X00,0); 
        delaynus (200); 
        presskey(); 
        delaynus (200); 
        LCD_write_string(16); 
        delaynus (200); 
        while(1) 
        { 
        if(S3==0) 
        { 
        Write_COM(0X01); 
        delaynms (200); 
        LCD_set_xy(0X00,0); 
        delaynus (200); 
        lcd_key1(); 
        delaynus (200); 
        LCD_write_string(6); 
        delaynus (200); 
        } 
        else if(S4==0) 
        { 
        Write_COM(0X01); 
        delaynms (200); 
        LCD_set_xy(0X00,0); 
        delaynus (200); 
        lcd_key2(); 
        delaynus (200); 
        LCD_write_string(6); 
        delaynus (200); 
        } 
        else if(S5==0) 
        { 
        Write_COM(0X01); 
        delaynms (200); 
        LCD_set_xy(0X00,0); 
        delaynus (200); 
        lcd_key3(); 
        delaynus (200); 
        LCD_write_string(6); 
        delaynus (200); 
        } 
        else if(S6==0) 
        { 
        Write_COM(0X01); 
        delaynms (200); 
        LCD_set_xy(0X00,0); 
        delaynus (200); 
        lcd_key4(); 
        delaynus (200); 
        LCD_write_string(6); 
        delaynus (200); 
        } 
        else 
        { 
        } 
        } 


//----------------------------------------------------------------------------- 
// Initialization Subroutines 
//----------------------------------------------------------------------------- 


//----------------------------------------------------------------------------- 
// PORT_Init 
//----------------------------------------------------------------------------- 
void PORT_Init (void) 


        XBR0 = 0x27;                        // XBAR0: Initial Reset Value 
        XBR1 = 0x00;                        // XBAR1: Initial Reset Value 
        XBR2 = 0x5c;                        // XBAR2: Initial Reset Value 
        PRT0CF = 0x14;                      // Output configuration for P0  
          PRT1CF = 0x10; // Output configuration for P3  
           PRT3CF = 0x01; // Output configuration for P3  


//----------------------------------------------------------------------------- 
// SYSCLK_Init 
//----------------------------------------------------------------------------- 
void SYSCLK_Init (void) 

                                   
      OSCXCN = 0x67;                      // start external oscillator with 
      for (i=0; i < 256; i++) ;           // XTLVLD blanking interval (>1ms) 
      while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle 
      OSCICN = 0x88;                      // select external oscillator as SYSCLK                               

//----------------------------------------------------------------------------- 
// SPI0_Init 
//----------------------------------------------------------------------------- 
void SPI0_Init (void) 

      SPI0CFG = 0x07;                        // data sampLED on 1st SCK rising edge 
      SPI0CFG|=0xC0;                         //CKPOL =1; 
      SPI0CN = 0x03;                         // Master mode; SPI enabled; flags 
      SPI0CKR = SYSCLK/2/2000000-1;           // SPI cLOCk <= 8MHz (limited by  
                                              // EEPROM spec.) 

//----------------------------------------------------------------------------- 
// UART0_Init 
//----------------------------------------------------------------------------- 
void UART0_Init (void) 

   SCON    = 0x50;                     // SCON: mode 1, 8-bit UART, enable RX 
   TMOD    = 0x20;                     // TMOD: timer 1, mode 2, 8-bit reload 
   TH1    = -(SYSCLK/BAUDRATE/16);     // set Timer1 reload value for baudrate 
   TR1    = 1;                         // start Timer1 
   CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base 
   PCON  |= 0x80;                      // SMOD = 1 
   TI     = 1;                         // InDICate TX ready 

//----------------------------------------------------------------------------- 
// LCD_Init 
//----------------------------------------------------------------------------- 
void LCD_Init(void) //向LCD送命令 



//      unsigned int xdata   x; 
        delaynms(100); 
        datad=0x00; 
        SendSPIByte(datad); 
        delaynms(10); 
        Write_COM(0x30);                
        delaynms(10);      
        Write_COM(0x30);                
        delaynms(10); 
        Write_COM(0x30);                
        delaynms(10) ;  
        Write_COM(0x28);            
        delaynms(100); 
        virt_port=0; 
        SendSPIByte(virt_port); 
        lcden(virt_port); 
        Write_COM(0x01);  
        delaynms(100);           
        Write_COM(0x06);  
        delaynms(10) ;            
        Write_COM(0x0C);  
        delaynms(500) ;            




//----------------------------------------------------------------------------- 
// SendSPIByte 
//----------------------------------------------------------------------------- 
void SendSPIByte(unsigned char ch) 
{       lcdcs=1; 
        delaynus(100); 
         SPIF = 0; 
        SPI0DAT = ch; 
        while (SPIF == 0); 
        delaynus(100); 
        lcdcs=0; 
        delaynus(100);     
        _nop_();                 // 等待写结束                        

//----------------------------------------------------------------------------- 
// lcden 
//----------------------------------------------------------------------------- 
void lcden(datad) 

          datad|=0x08;             
          SendSPIByte(datad); 
          datad&=0xf7; 
          SendSPIByte(datad); 

//----------------------------------------------------------------------------- 
// delaynms 
//----------------------------------------------------------------------------- 
void delaynms (unsigned int uu) 

   unsigned int oo,ll; 
   for (oo=0;oo   { 
    for(ll=0;ll<1140;ll++); 
     
   } 

//----------------------------------------------------------------------------- 
// writechar 
//----------------------------------------------------------------------------- 
void writechar(unsigned char ua) 
{        
         
        uint  j; 
        uchar t,x; 
        for(j=0;j<500;j++); 
        datad|=0x02; 
        SendSPIByte(datad); 
        datad|=ua&0xf0; 
        SendSPIByte(datad); 
        datad|=0x08;             
        SendSPIByte(datad); 
        for(x=0;x<3;x++); 
        datad&=0xf7; 
        SendSPIByte(datad); 
        for(x=0;x<3;x++); 
        datad&=0x07; 
        delaynus(100);                 
        SendSPIByte(virt_port); 

        t|=ua&0x0f; 
        datad|=t<<4; 
        SendSPIByte(datad); 
        for(x=0;x<3;x++); 
        datad|=0x08;             
        SendSPIByte(datad); 
        for(x=0;x<3;x++); 
        datad&=0xf7; 
        SendSPIByte(datad); 
        for(x=0;x<3;x++); 
       datad=0x00; 
        t=0x00; 
       SendSPIByte(datad); 

//----------------------------------------------------------------------------- 
// Write_COM 
//----------------------------------------------------------------------------- 
void Write_COM(uchar ins) 
     { 
      uchar  t; 
      uint j; 
      
      for(j=0;j<5000;j++);                    //用延时代替查询 
      virt_port|=ins&0xf0; 
      SendSPIByte(virt_port); 
      //LCDE=1; 
      virt_port|=0x08; 
      SendSPIByte(virt_port); 
      for(i=3;i>0;i--); 
      //LCDE=0; 
      virt_port&=~0x08; 
      SendSPIByte(virt_port); 

      virt_port&=0x07; 
      SendSPIByte(virt_port); 
      t=ins<<4;              
      virt_port|=t&0xf0;            
      SendSPIByte(virt_port); 
      //LCDE=1; 
      virt_port|=0x08; 
      SendSPIByte(virt_port); 
      for(i=3;i>0;i--); 
      //LCDE=0; 
      virt_port&=~0x08; 
      SendSPIByte(virt_port); 
      virt_port=0; 
      SendSPIByte(virt_port); 

//----------------------------------------------------------------------------- 
// LCD_set_xy 
//----------------------------------------------------------------------------- 
void LCD_set_xy( unsigned char x, unsigned char y ) 

    unsigned char address; 
    if (y == 0) address = 0x80 + x; 
    else  
    address = 0xc0 + x; 
    Write_COM(address); 

//----------------------------------------------------------------------------- 
// LCD_write_string 
//----------------------------------------------------------------------------- 
void LCD_write_string(unsigned char n) 
{   

    unsigned char data1; 
    for(n;n>0;n--) 
    { 

    data1=*lcdpoint; 
    writechar(data1); 
      delaynms(100); 

    lcdpoint++; 
    delaynus(10); 
    }  


//----------------------------------------------------------------------------- 
// presskey 
//----------------------------------------------------------------------------- 
void presskey(void) 

     unsigned char xdata DDCdata[16]={0x50,0x4c,0x45,0x41,0x53,0x45,0x20,0x50,0x52,0x45,0x53,0x53,0x20,0x4b,0x45,0x59}; 
     lcdpoint=&DDCdata; 

//----------------------------------------------------------------------------- 
// lcd_key1 
//----------------------------------------------------------------------------- 
void lcd_key1(void) 
{    
    unsigned char xdata key1ok[6]={0x53,0x33,0x20,0x4f,0x4b,0x21}; 
    lcdpoint=&key1ok; 

//----------------------------------------------------------------------------- 
// lcd_key2 
//----------------------------------------------------------------------------- 
void lcd_key2(void) 
{    
    unsigned char xdata key2ok[6]={0x53,0x34,0x20,0x4f,0x4b,0x21}; 
    lcdpoint=&key2ok; 

//----------------------------------------------------------------------------- 
// lcd_key3 
//----------------------------------------------------------------------------- 
void lcd_key3(void) 
{    
    unsigned char xdata key3ok[6]={0x53,0x35,0x20,0x4f,0x4b,0x21}; 
    lcdpoint=&key3ok; 

//----------------------------------------------------------------------------- 
// lcd_key4 
//----------------------------------------------------------------------------- 
void lcd_key4(void) 

    unsigned char xdata key4ok[6]={0x53,0x36,0x20,0x4f,0x4b,0x21}; 
    lcdpoint=&key4ok; 

//----------------------------------------------------------------------------- 
// delaynus 
//----------------------------------------------------------------------------- 

void delaynus(unsigned int q)       //N us延时函数 
  { 
   for (i=0;i      { 
      _nop_(); 
      } 
  } 


推荐阅读

史海拾趣

China Semiconductor Corp公司的发展小趣事

随着公司实力的不断增强,CSC开始将目光投向海外市场。公司积极实施国际化战略,在海外设立研发中心和生产基地,拓展国际市场。同时,CSC也加强了与国际同行的交流与合作,吸收借鉴国际先进经验和技术,不断提升自身的国际竞争力。通过国际化布局和全球视野的拓展,CSC逐渐成为了国际半导体产业的重要一员。

这五个故事只是CSC公司发展历程中的一部分缩影,但它们却充分展示了CSC在电子行业中的崛起之路。从初创时期的艰辛与突破,到技术创新的不断突破,再到市场拓展与品牌建设、产业链整合与协同发展以及国际化布局与全球视野的拓展,每一个阶段都凝聚了CSC人的智慧和汗水。正是这些努力和付出,使得CSC在激烈的国际竞争中脱颖而出,成为了中国半导体产业的佼佼者。

Chesivale Electronics公司的发展小趣事

Chesivale Electronics公司深知人才是企业发展的核心动力。因此,公司一直注重人才队伍建设。公司通过校园招聘、社会招聘等多种渠道吸引优秀人才加入,同时建立完善的培训机制和晋升机制,激发员工的积极性和创造力。这些措施使得公司的人才队伍不断壮大,为公司的发展提供了有力的人才保障。

Digitron公司的发展小趣事

Digitron公司成立于XXXX年,由一群热衷于电子技术的工程师和科学家创立。在成立初期,公司专注于开发高精度、高可靠性的温度数据记录器。这些设备在医药、冷链物流等领域得到了广泛应用,为Digitron公司赢得了良好的声誉。随着技术的不断进步,Digitron公司逐渐扩大了产品线,推出了更多适用于不同行业的数据记录器和传感器。

Defense Logistics Agency公司的发展小趣事

Defense Logistics Agency(DLA)于1961年成立,是美国国防部(DOD)的一个独立作战支援机构。在成立初期,DLA就明确了其战略定位:为全球范围内的美军及国防部其他部门提供统一、高效的后勤保障服务。这一战略定位的确立,为DLA的后续发展指明了方向。

Fair Rite公司的发展小趣事

1952年,理查德·帕克与合作伙伴埃德蒙·斯坦威克和杰克·韦伯在纽约的Wallkill共同创立了Fair Rite产品公司。当时,电子行业正处于起步阶段,对新型电子元器件的需求日益增长。Fair Rite凭借对市场敏锐的洞察力,开始专注于铁氧体元件的研发和生产。公司初期面临资金短缺和技术挑战,但通过不断努力和创新,逐渐在市场中树立了良好的口碑。

Federal Custom Cable公司的发展小趣事

Federal Custom Cable非常重视客户服务工作。他们建立了完善的客户服务体系,为客户提供从产品咨询、选型、定制到售后服务的全方位支持。同时,Federal Custom Cable还积极与合作伙伴建立长期稳定的合作关系,共同推动电缆行业的发展。这种以客户需求为导向、以合作伙伴关系为基础的经营模式,为Federal Custom Cable的持续发展提供了有力保障。

问答坊 | AI 解惑

STM32学习笔记之ADC

STM32学习笔记之ADC…

查看全部问答>

各种常用的芯片型号一览!全面实用!

里面有很多芯片型号,寻找方便!…

查看全部问答>

开关电源变压器铁芯磁滞回线测量-part1开关电源原理与设计(连载59)

2-1-1-9.开关电源变压器铁芯磁滞回线测量 现代电子设备对电源的工作效率和体积以及安全要求越来越高,在开关电源中决定工作效率和体积以及安全要求的诸多因素,基本上都与开关变压器有关,而与开关变压器技术性能相关最大的要算是变压器的铁芯材 ...…

查看全部问答>

stc单片机测频率问题

我用STC单片机测量频率(0-26HZ).频率信号由外部中断1—INT1引进,采用下降沿触发方式,由TIMER1测量两个下降沿之间的时间。我写的程序只能测量1—3HZ的,频率再高一点就乱跳 下面是我的代码。主程序应该没什么问题,已经调好久了,就是找不出原因 ...…

查看全部问答>

IIC驱动

请问一下,IIC的流驱动程序的流程是怎样的?最好能够给出代码并且讲解,谢谢??…

查看全部问答>

请问哪里有DHCP CLIENT方面的资料啊

小弟想在VxWorks上开发DHCP客户端 请问哪里有这方面的资料啊 谢谢各位了…

查看全部问答>

网上找到的一个 拆解应急灯

这几天为咱活动 找一些相关的资料参考 准备好好参与下   找到了哥们暴力拆解应急灯的图 呵呵 转载一下     转自数码之家 …

查看全部问答>

ST原装的FlashLoaderv1.2怎么只提供了COM1和COM2选择?

                                 这是很不方便的,有很多用笔记本电脑的没有COM1和COM2,都用USB转出来的串口,一般都在串口4以上,建议ST把可用的 ...…

查看全部问答>

①F2812 XINT1中断后,程序总是跑飞??

问题有两个: 1。 为什么xint1的中断函数中要再次使能group1中断(下面代码中①)和总中断使能(下面代码中②)即使没有关闭中断(DINT)?其它的比如TIMER1,PWM,CAPTURE等中断则不需要在服务程序中再次使能 2。进入XINT1中断后,程序总是跑飞?? ...…

查看全部问答>