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

📄 ch451_b.c

📁 IC卡购电软件实现
💻 C
字号:
/*******************************************************************************
*  标题:  北京蓝海微芯LJD-SY-5200单片机开发系统演示程序                        *
*  文件:  CH451.C                                                              *
*  日期:  2006-8-9                                                             *
*  版本:  1.0                                                                  *
*  作者:  蓝海微芯                                                             *
*  网站: http://www.ljd-2008.com                                              *
********************************************************************************
*  描述:                                                                       *
*           CH451程序模块                                                      *                                           
*                                                                              *
*                                                                              *
********************************************************************************
* 【版权】 Copyright(C)微芯科技 http://www.bluemcu.com    All Rights Reserved  *          
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
*******************************************************************************/
#include<reg51.h>                  /*=== 头文件包含 ===*/
#include<intrins.h>
#include<absacc.h>
#include  <IC_CARD_B.h>

uchar ch451_key;
uchar key_flag;
uint  M;
uchar m0;
uchar m1;
uchar m2;
uchar m3;
bit   flag_enter;
bit   flag_show;
uchar flag_num;
uchar flag_cnt=0;
uchar input_code[4];
uchar pdata ds_num[10]="0123456789";
void  decide_num(void);
void  input_num(void);
/********************************************************************
函 数 名:ch451中断服务程序
功    能:获取键值
说    明:
调    用:
入口参数:
返 回 值:ch451_key
设    计:蓝海微芯           
***********************************************************************/

void ch451_inter() interrupt 2 using 1
{
  unsigned char i;                  /*定义循环变量*/
  unsigned char command,keycode;    /*定义控制字寄存器,和中间变量定时器*/
  command=0x07;                     /*读取键值命令的高4位0111B*/
  EX1 = 0;
  ch451_load=0;                     /*命令开始*/
  for(i=0;i<4;i++)
  {
    ch451_din=command&1;            /*低位在前,高位在后*/
    ch451_clk=0;
    command>>=1;                    /*右移一位*/
    ch451_clk=1;                    /*产生时钟上升沿锁通知CH451输入位数据*/
  }
  ch451_load=1;                     /*产生加载上升沿通知CH451处理命令数据*/
  keycode=0;                        /*清除keycode*/
  for(i=0;i<7;i++)
  {
    keycode<<=1;                    /*数据作移一位,高位在前,低位在后*/
    keycode|=ch451_dout;            /*从高到低读入451的数据*/
    ch451_clk=0;                    /*产生时钟下升沿通知CH451输出下一位*/
    ch451_clk=1;	
  }
  ch451_key=keycode;                /*保存上次的键值*/
  decide_num();
  input_num();
  EX1 = 1;
  IE1=0;                            /*清中断标志*/
}
/********************************************************************

函 数 名:ch451_init()
功    能:对ch451芯片进行初始化
说    明:
调    用:
入口参数:
返 回 值:
设    计:蓝海微芯           
***********************************************************************/
void ch451_init(void)
{
  ch451_din  = 0;           /*先低后高,选择4线输入*/
  ch451_din  = 1;	
  ch451_load = 1;
  ch451_clk  = 1;
  _nop_();	
}
/********************************************************************

函 数 名:ch451_write()
功    能:把12位的指令或数据写入ch451
说    明:12位数据或指令的写入顺序是低位
调    用:
入口参数:command
返 回 值:
设    计:蓝海微芯           
***********************************************************************/
void ch451_write(uint command)
{
  unsigned char i;
   
  EX1=0;                                   /*禁止键盘中断*/	
  ch451_load=0;                 	   /*命令开始*/    
  for(i=0;i<12;i++)
  {                             	   /*送入12位数据,低位在前*/
    ch451_din=command&1;				
    ch451_clk=0;
    command>>=1;
    ch451_clk=1;              	 	   /*上升沿有效*/
  }
  ch451_load=1;                		   /*加载数据*/  
  EX1=1; 
}

/********************************************************************
函 数 名:input_num()
功    能:获取由键盘输入的数值
说    明:将由键盘输入的密码值存入到数组input_code[6]中。
调    用:
入口参数:
返 回 值:
设    计:蓝海微芯           
***********************************************************************/
void input_num(void)
{

  if(flag_cnt==3)
  {
    flag_num=0x0a;
  }
    
  switch(flag_num){
  case 0x00:
  flag_num=0x0a;
  write_GLCD(ds_num[0]);
  input_code[flag_cnt]=0x00;
  break;
 
  case 0x01:
  flag_num=0x0a;
  write_GLCD(ds_num[1]);
  input_code[flag_cnt]=0x01;
  break;

  case 0x02:
  flag_num=0x0a;
  write_GLCD(ds_num[2]);
  input_code[flag_cnt]=0x02;
  break;

  case 0x03:
  flag_num=0x0a;
  write_GLCD(ds_num[3]);
  input_code[flag_cnt]=0x03;
  break;
    
  case 0x04:
  flag_num=0x0a;
  write_GLCD(ds_num[4]);
  input_code[flag_cnt]=0x04;
  break;
    
  case 0x05:
  flag_num=0x0a;
  write_GLCD(ds_num[5]);
  input_code[flag_cnt]=0x05;
  break;

  case 0x06:
  flag_num=0x0a;
  write_GLCD(ds_num[6]);
  input_code[flag_cnt]=0x06;
  break;

  case 0x07:
  flag_num=0x0a;
  write_GLCD(ds_num[7]);
  input_code[flag_cnt]=0x07;
  break;

  case 0x08:
  flag_num=0x0a;
  write_GLCD(ds_num[8]);
  input_code[flag_cnt]=0x08;
  break;

  case 0x09:
  flag_num=0x0a;
  write_GLCD(ds_num[9]);
  input_code[flag_cnt]=0x09;
  break;
  default:
  break;
  }
  if((flag_cnt!=3)&&(flag_enter==0))
  {
    flag_cnt++;
  }
}
/********************************************************************
函 数 名:decide_num()
功    能:将相应的按键识别成对应的数值
说    明:
调    用:
入口参数:
返 回 值:
设    计:蓝海微芯           
***********************************************************************/
void decide_num(void)
{
  switch(ch451_key){
  case 0x40:
  flag_num=0x00;
  break;
  case 0x41:
  flag_num=0x01;
  break;
  case 0x42:
  flag_num=0x02;
  break;
  case 0x43:
  flag_num=0x03;
  break;
  case 0x48:
  flag_num=0x04;
  break;
  case 0x49:
  flag_num=0x05;
  break;
  case 0x4a:
  flag_num=0x06;
  break;
  case 0x4b:
  flag_num=0x07;
  break;
  case 0x50:
  flag_num=0x08;
  break;
  case 0x51:
  flag_num=0x09;
  break;
  case 0x52:
  flag_enter=1;
  break;
  default:
  break;
  }
  ch451_key=0xff;
}
/********************************************************************
函 数 名:decide_num()
功    能:将相应的按键识别成对应的数值
说    明:
调    用:
入口参数:
返 回 值:
设    计:蓝海微芯           
***********************************************************************/
void input_money(void)
{
  if(flag_cnt==3)        /*确认按键按下时意输入了3位数的购电金额*/
  {
    m0=input_code[0];
    m1=input_code[1];
    m2=input_code[2];
    input_code[0]=0x00;
    input_code[1]=0x00;
    input_code[2]=0x00;
    M=m0*100+m1*10+m2;
  }
  if(flag_cnt==2)        /*确认按键按下时意输入了2位数的购电金额*/
  {
    m0=input_code[0];
    m1=input_code[1];
    input_code[0]=0x00;
    input_code[1]=0x00;
    M=m0*10+m1;
  }
  if(flag_cnt==1)        /*确认按键按下时意输入了1位数的购电金额*/
  {
    M=input_code[0];
    input_code[0]=0x00;
  }
  if(flag_cnt==0)        /*确认按键按下时意输入了0位数的购电金额*/
  {
    M=0;
  }
    
}
  

⌨️ 快捷键说明

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