⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdmain.c

📁 基于F120的应用程序
💻 C
字号:
//=============================================================
//编码器监测C51程序

//自动调节5,12,24V电压,实时显示电压,电流,转速,脉冲数,温度等内容
//兼容增量式,绝对式二进制,格雷码,SSI协议输入
//采用绘图模式实现12*12汉字及8*12字符
//=============================================================
#include<c8051F120.h>
#include<stdio.h>
#include "intrins.h"
#include <ziku.h>     //自己定义的字库
#include <math.h>
//-------------------------------------------------------------------
#define      uchar     unsigned char
#define      uint      unsigned int
#define      ulong     unsigned long

    sbit    MOSI    =   P0^0; // 主出/从入(输出)
    sbit    SCK     =   P0^2; // 串行时钟(输出)
    sbit    NSS     =   P0^3; // 从选择(输出到片选)
	sbit    tt      =   P0^4;
//================================================
    sbit    nRES    =   P5^0;    //reset
    sbit  	hCS_RS  =   P5^1;    //寄存器选择,=H的时候读写数据,=L的时候为泻命令或读取忙标志,输入
    sbit	SID_RW  =   P5^2;    //=H时为数据或者身份读取,=L时为写数据或命令,输入
    sbit	SCLK_E  =   P5^3;    //输入,使能口
    sbit    PSB     =   P5^4;
//================================================
	sbit    sel     =   P4^0;
	sbit    oe      =   P4^1;
	sbit    rst     =   P4^2;
	sbit    ssi_dat =   P4^3;
	sbit    ssi_clk =   P4^4;
//================================================
    sbit    key0    =   P7^4;
	sbit    key1    =   P7^5;
	sbit    key2    =   P7^6;
	sbit    key3    =   P7^7;

bit flag0=0, flag1 = 0, flagss = 0 ,flag_auto=0;
bit flagkey0=0,flagkey1=0,flagkey2=0,flagkey3=0;
uchar count,countkey0,countkey1,countkey2,countkey3,flag_last=0;
uint count1=0,counttime=0;
//================================================
xdata uint m_point;
xdata struct  apple{
               uchar  wendu;          //以度为单位
			   uint   time;           //以分钟为单位
			   uchar  dian;           //V为单位
			   uchar  dianliu;        //mA为单位
			   ulong  shu;            //出现跳变的位置
              } apples[300];

struct apple  *point;

//================================================

void timer0(void) interrupt 1 using 1    //定时以及扫描按键
{
    TR0=0;
    TF0 = 0;        
	TH0 = 0x00;        // Timer 0 High Byte
    TL0 = 0x00;        // Timer 0 Low Byte
    TR0=1;
    if(++count==15)
	{
	  count = 0;
	  count1++;
	  if(count1==100)
	  {
		  count1 = 0;
		  counttime++;
	  }
	}

	SFRPAGE=CONFIG_PAGE;
    if(key0==0)              //flagkey0的清零在主程序里执行
    { 
      if(++countkey0==5)
      {
 	     countkey0=0;
	     if(flagss==1)
		 {
		    flagss = 0;      //为了防止出现计数滞后所以在中断中停止
		 }
		 else
		 flagkey0 = 1;
      }
    }
	else
	countkey0=0;

	if(key1==0)              //flagkey1的清零在主程序里执行
    { 
      if(++countkey1==5)
      { 
       flagkey1 = 1;
	   countkey1 = 0;
      }
    }
	else
	countkey1=0;

	if(key2==0)              //flagkey2的清零在主程序里执行
    { 
      if(++countkey2==5)
      { 
       flagkey2=1;
	   countkey2=0;
      }
    }
	else
	countkey2=0;

	if(key3==0)             //flagkey3的清零在主程序里执行
    { 
      if(++countkey3==5)
      { 
       flagkey3=1;
	   countkey3=0;
      }
    }
	else
	countkey3=0;
}

uchar duibi(uchar number1,uchar number2)     //根据byte1和byte2和自定义的字库对比提取这个汉字的点阵
{
        uchar result;
        switch(number1)
        {
           case 0xb1:  
               result = 5;       //编       
           break;

           case 0xb2:  
               result = 1;       //参      
           break;
           
           case 0xb3: 
 		       if(number2==0xe5)
			   result = 22;      //冲
			   else
               result = 43;      //出         
           break;

		   case 0xb5:  
               result = 3;       //电         
           break;

		   case 0xb6: 
 		       if(number2==0xc8)
			   result = 26;      //度
			   if(number2==0xa8)
			   result = 9;       //定
			   if(number2 == 0xd4)
               result = 41;      //对
  			   if(number2 == 0xfe)
			   result = 46;      //二
           break;

		   case 0xb7:  
               result = 42;       //方  
           break;

		   case 0xb8: 
 		       if(number2==0xf1)
			   result = 49;       //格
			   else
               result = 37;       //复      
           break;

		   case 0xb9:  
               result = 31;       //工         
           break;

		   case 0xbb:  
               result = 29;       //华         
           break;

		   case 0xbc:  
               result = 24;       //间      
           break;
		   		   
		   case 0xbd:  
               result = 47;       //进     
           break;

		   case 0xbe:  
               result = 40;       //绝         
           break; 

		   case 0xbf:  
               result = 30;       //控        
           break;
		   		   
		   case 0xc0:  
		       if(number2==0xd7)
			   result = 50;       //雷
			   else
               result = 10;       //类        
           break;

		   case 0xc1: 
 		       if(number2 == 0xf7)
               result = 39;         //流
         	   if(number2 == 0xbf)
			   result = 34;         //量
           break;

		   case 0xc2: 
		       if(number2 == 0xeb)
			   result = 6;          //码
 		       else
               result = 21;         //脉
         	   
           break;

		   case 0xc6:  
               result = 7;         //器         
           break;

		   case 0xc8:  
               result = 45;        //圈        
           break;

		   case 0xc9:  
               result = 8;         //设    
           break;
		   		   
		   case 0xca:
  		       if(number2 == 0xfd)
               result = 2;            //数
        	   if(number2 == 0xe4)
               result = 28;           //输%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
         	   if(number2 == 0xbd)
			   result = 35;           //式8888888888888888888888888888888
			   if(number2 == 0xb1)
               result = 23;           //时
           break;
		   		   
		   case 0xcb:  
               result = 44;           //速 
           break;

		   case 0xce:  
		       if(number2 == 0xc2)
               result = 25;           //温
        	   if(number2 == 0xbb)
               result = 36;           //位
           break;
		   
		   case 0xcf:  
               result = 12;           //线
           break;
		   		   
		   case 0xd0:  
               result = 11;           //型
           break;

		   case 0xd1: 
 		       if(number2 == 0xa1)
               result = 38;            //选
         	   if(number2 == 0xb9)
			   result = 4;             //压
           break;

		   case 0xd4: 
               result = 33;            //增
           break;
		   		   
		   case 0xd6: 
               result = 48;            //制
           break;

		   case 0xd7:  
		       if(number2 == 0xaa)
			   result = 27;            //转
			   if(number2 == 0xf7)
               result = 32;            //作         
           break;      
        }
		return result;
}

unsigned char getlength(char *hanzi)  //得到汉字长度
{

	char  *p=hanzi;
	while(*p!='\0')
		p++;
	return (p-hanzi);
}
//**********************************************************************/
void delay100us(void)		//实际是20us
{
	uchar  i;
	for(i=0;i<=85;i++)	{	_nop_();_nop_();	}
}
void delay1ms(void)		//delay TIMER1*1 ms for 12MHz
{
	uchar i;
	for(i=0;i<=250;i++)	
	{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
}
void delayxms(int i)		//delay TIMER1*1 ms for 12MHz
{
	for(i=0;i<=250;i++)	{	delay1ms();	}
}

//------------------------------------------------------------------------------------------------
//读写指令和数据  _nop_()//执行一条空指令
//------------------------------------------------------------------------------------------------
void wr_command(uchar wr_data1)					      //读写命令;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -