发新帖本帖赏金 3.10元(功能说明)我要提问
返回列表
打印

【MCU方案】MSP430F149制作无线遥控手柄实例分享,欢迎指导

[复制链接]
3353|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 liuxing4585 于 2015-6-17 22:09 编辑

【MCU方案】MSP430F149制作无线遥控手柄

          在很多设备中,由于现场环境要求或者是提高效率,常常需要遥控手柄进行参数设置修改,设备启停控制等,在这里我来分享一个曾经做过的实例项目,通过MSP430F149实现无线遥控手柄,可以更改不同程序实现不同设备控制,水平有限,欢迎大家指导拍砖。
        
      一.  项目需求:
          1.液晶显示(字体易辨认,显示明了)。
          2.键盘输入(需要考虑输入方便,操作简单)。
          3.电池供电(需要考虑功耗和方便使用)。
          4.无线通讯(需要考虑功耗和方便使用)。
      二.系统框图:

        三.硬件选型:
       1芯片选择:
          由于定位为手持设备,需要电池供电,所以必须考虑功耗问题。MSP430成为首选。简单介绍一下所选的芯片:
          MSP430F149是一种新型的混合信号处理器,采用了美国德州仪器(Texas Instruments)公司最新低功耗技术(工作电流为0.1一400 p A ),它将大量的外围模块整合到片内,特别适合于开发和设计单片系统。
MSP430 F149单片机主要具有如下特点:
        1.低电压、超低功耗。工作电压3.6V~1.8V ,正常工作模式280μA@1MHz,2.2V,待机模式1.6μA,RAM数据保存的掉电模式下0.1μA。 五级节电模式。
       2.快速苏醒,从待机模式下恢复工作,只需要不到6μS时间。
       3.16位精简指令集MCU,命令周期125nS。
       4.12位ADC,具有内部参考电压源,并且具有采样、保持、自动扫描等功能。具有12位的模数转换器可以得到很高的精度,并且省去了使用专门的模数转换器给设计电路板带来的麻烦。
       5.2个16位计数器。具有捕获、门限功能。
       6.具有片内比较器。
       7.支持ISP(在线系统编程),方便开发和项目升级。
       8.支持序列号,熔丝位烧写。方便简单。
       9.双串口
      10.支持超小型封装:64P-QFP、64P-QFN。
      11.拥 有 大容量的存储空间。存储器方面包括多达60 k Flash ROM和2 k RAM,如此数量的存储空间完全可以满足程序及数据的需要。
      12. 硬件乘法器。该乘法器独立于CPU进行乘法运算的操作,在提高乘法运算速度的同时也提升了CPU的利用效率。
      13.串行在系统编程。通过仿真器对程序进行下载,并通过专用软件对程序及单片机的工作状态进行监控,极大地方便了程序的调试。
从以上特点可知,使用MSP430满足要求。
   2:   通讯模块
          采购市场上现有模块,所以只需留出接口即可。
    3:   键盘模块
          采购市场上现有模块,所以只需适配接口即可。
    4:电池
4节AAA充电电池,方便更换充电,适合现场使用。成品图片:









四.系统原理图:

电源电路:实现6v转3.3v

mcu:

JTAG接口

电池电量检测


键盘接口



通讯接口
显示接口




五.源代码:

电池电量检测:
#include <msp430F149.h>
#define   Num_of_Results   32

static uint results[Num_of_Results];    //保存ADC转换结果的数组
void Trans_val(uint Hex_Val);           
void ADC_Init(void);
/***************ADC_Init函数************/
void ADC_Init(void)
{
  P6SEL |= 0x01;                            // 使能ADC通道
  ADC12CTL0 = ADC12ON+SHT0_8+MSC;           // 打开ADC,设置采样时间
  ADC12CTL1 = CSTARTADD_0+SHP+CONSEQ_2;     // 选择存储器地址,使用采样定时器
  ADC12MCTL7 = INCH_0;                      // 选择采样通道7
  ADC12IE = BIT0;                           // 使能ADC中断
  ADC12CTL0 |= ENC;                         // 使能转换
  ADC12CTL0 |= ADC12SC;                     // 开始转换
}
/*******************************************
函数名称:ADC12ISR
功    能:ADC中断服务函数,在这里用多次平均的
          计算P6.7口的模拟电压数值
参    数:无      
返回值  :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
  static uint index = 0;

  results[index++] = ADC12MEM0;               // Move results
  if(index == Num_of_Results)
  {
        uchar i;
        unsigned long sum = 0;

        index = 0;
        for(i = 0; i < Num_of_Results; i++)
        {
            sum += results[i];
        }
        sum >>= 5;                            //除以32
        
        Trans_val(sum);
  }
}

/*******************************************
函数名称:Trans_val
功    能:将16进制ADC转换数据变换成三位10进制
          真实的模拟电压数据,
参    数:Hex_Val--16进制数据
          n--变换时的分母等于2的n次方      
返回值  :无
********************************************/
void Trans_val(uint Hex_Val)
{

    caltmp = Hex_Val;
    caltmp = (caltmp << 5) + Hex_Val;           //caltmp = Hex_Val * 33
    caltmp = (caltmp << 3) + (caltmp << 1);     //caltmp = caltmp * 10
    Curr_Volt = caltmp >> 12;                   //Curr_Volt = caltmp / 2^n
   Curr_Volt+=Curr_Volt<<1;
   
}
主程序:
/*******************************************************************************
**液晶采用ZX12864I-2,带中文字库
**单片机采用的是MSP430F149
                   电路连接图
                _______________
           8   |               |<--
    Data---/---| P2            |   8MHz
               |               |<--
      Rs-------| P3.5          |
      Rw-------| P3.6          |  4
       E-------| P3.7    P4.0-7|--/---KEY
               |_______________|
                  MSP430F149

  
               ___________________________  
               |0x7f/功能FUN 0xfe/开关POWER|  
               |0xbf/清零CLS 0xfd/标定COMP |
               |0xdf/增加UP  0xfb/减少DOWN |
               |0xef/取消ESC 0xf7/确认ENTER|   
               |___________________________|

*******************************************************************************/
#include "define.h"
#include "ADC.h"
#include "flash.h"
#include "lcd12864.h"
#include "uart.h"
#include "menu.h"

//******************************************************************************/
#include <msp430x14x.h>

void main(void)
{  
  init_clk();
  WDTCTL = WDTPW + WDTHOLD;
  FCTL2 = FWKEY + FSSEL_1 + FN1;              //工作频率设为  MCLK/3,333.3KHZ

  _DINT();  
  pc_flash = (unsigned char *) FLASH_ADDRESS;         //为指针初始化
  pc_flash_segment = (unsigned int *) FLASH_ADDRESS;  
  read_array(pc_flash,checkout,4);                    //再读出刚才写的字节
  if(checkout[0]!=0x01)
  {  flash_erase( pc_flash_segment);                     //段擦除
     write_array(pc_flash, write_buff,4);               //写入指定字节数量
    _NOP();
  }
  read_array(pc_flash,checkout,4);                    //再读出刚才写的字节
  bal=checkout[1];
  init_lcdport();
  CCTL0=CCIE;
  CCR0=10;
  TACTL=TASSEL_2+TACLR+MC_1+ID_3;
  LED=1;
  PowerDown=0;
  P5DIR|=BIT0; //输出端口
  P5OUT|=0x01;
    WDTCTL = WDT_ADLY_1000;       // 设置内部看门狗工作在定时器模式,1000ms中断一次
    IE1 |= WDTIE;                 // 使能看门狗中断
     _EINT();
    init_lcd();
    Disp_HZ(0,1,"  系统正在启动  ",8);
    Disp_HZ(0,2,"    请您稍后    ",8);
    jindutiao(3,1); jindutiao(3,1);
    jindutiao(3,1); jindutiao(3,1);
    jindutiao(3,1); jindutiao(3,1);
    jindutiao(3,1); jindutiao(3,1);
    jindutiao(3,1); jindutiao(3,1);
   
    Disp_HZ(0,1,"  系统初始化中  ",8);
    Disp_HZ(0,2,"    请您稍后    ",8);
    jindutiao(3,1); jindutiao(3,1);
    jindutiao(3,1); jindutiao(3,1);
    jindutiao(3,1); jindutiao(3,1);
    jindutiao(3,1); jindutiao(3,1);
    jindutiao(3,1); jindutiao(3,1);
    Uartinit();
    Search();
    menu_disp();
  

  while(1)
  {
    key_process();
    if(key==UP||key==DOWN||key==ENTER||key==ESC)
       {
        switch(key)
         {
        case DOWN :
          userchoose++;
          if(userchoose == maxitems)
          {
            userchoose = 0;
          }
          break;
        case UP :
          userchoose--;
          if(userchoose == 255)
          {
            userchoose = maxitems - 1;
          }
          break;
        case ENTER :
          if(menupoint[userchoose].subs != nullsubs)
          {
            (*menupoint[userchoose].subs)();
          }
          else if(menupoint[userchoose].childrenmenu != Null)
          {
            menupoint = menupoint[userchoose].childrenmenu;
            userchoose = 0;
            displaystart = 0;
          }
          break;
        case ESC :
          if(menupoint[userchoose].parentmenu != Null)
          {
            menupoint = menupoint[userchoose].parentmenu;
            userchoose = 0;
            displaystart = 0;
          }
          break;  
        default : break;  
        }
        key=Null;
        menu_disp();
      
      }
    else if(key==COMP)
         {
           key=Null;
           AdjWeight();
         }
    else if(key==CLS)
    {  
       key=Null;
       ClsWeight();
    }
  }
}
/*******************************************
函数名称:watchdog_timer
功    能:看门狗中断服务函数,控制液晶背光和自动关机
参    数:无
返回值  :无
********************************************/
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
    cnt++;   
    if (cnt>25) LED=0;
    if (cnt>90)PowerOff();
    if(adc==1)  Disp_NUM(4,1,Curr_Volt,1,0);
    if(wait==1) timeout++;
}

//*******************************************
//函数名称:Timer_A
//功    能:定时器A中断服务子函数
//参    数:无
//返回值  :无
//********************************************
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  if(ledtime<100)ledtime++;
  else ledtime=0;
  if (LED==1&&ledtime<bal)
  LCD_LED_L;
else
  LCD_LED_H;
}
void jindutiao(uchar dispy,uchar time)
{ uchar i;
for(i=0;i<7;i++)
  {Disp_HZ(i,dispy,"■",1);
   Delay_Nms(time*300);
  }
Disp_HZ(0,dispy,"               ",8);
}





打赏榜单

hbzjt2011 打赏了 0.10 元 2015-07-01

21ic小喇叭 打赏了 3.00 元 2015-06-15

相关帖子

沙发
liuxing4585|  楼主 | 2015-6-11 08:59 | 只看该作者
菜单:
#include "flash.h"
#include "define.h"
//************************************空函数************************************
//函数名称: nullsubs
//函数说明: 无
//入口参数: 无
//出口参数: 无
//******************************************************************************
void nullsubs(void)
{
}

//******************************************************************************

struct menu{
unsigned char menucount; //当前层节点数
unsigned char *str; //菜单标题
unsigned char pos;
unsigned char length;
void (*subs)(); //节点函数
struct menu *childrenmenu; //子节点
struct menu *parentmenu; //父节点
};

struct menu1{
unsigned char *str1;
unsigned char pos1;
unsigned char length1;
};


//******************************************************************************

//******************************菜单显示内容************************************
//说明: 结构体中放的是菜单的显示内容等参数,完成菜单功能变换,菜单返回
// 菜单指针函数、可以指向下一级菜单,也可以指向某一项选项的功能
// 实际中可以根据具体内容变换。
//******************************************************************************
struct menu1 menu2[2][4] = {
{
{"功┃",0x80,2},
{"能┃",0x90,2},
{"选┃",0x88,2},
{"择┃",0x98,2}
},
{
{"其┃",0x80,2},
{"它┃",0x90,2},
{"功┃",0x88,2},
{"能┃",0x98,2}
}
};

struct menu main_menu[8];
struct menu other_menu[4];

struct menu main_menu[8] = {
{8,"1.目标设定",0x82,5,SetValue,Null,Null},
{8,"2.全部增加",0x92,5,AllAdd,Null,Null},
{8,"3.全部减少",0x8a,5,AllDec,Null,Null},
{8,"4.包机搜索",0x9a,5,Search,Null,Null},
{8,"5.称重清零",0x82,5,ClsWeight,Null,Null},
{8,"6.电池电压",0x92,5,ADC,Null,Null},
{8,"7.背光调整",0x8a,5,BaL,Null,Null},
{8,"8.厂家设置",0x9a,5,PassWords,Null,Null},
};

struct menu other_menu[4] = {
{4,"1.称重标定",0x82,5,AdjWeight,Null,main_menu},
{4,"2.包机站号",0x92,5,SetAddress,Null,main_menu},
{4,"3.包机子站",0x8a,5,SetStation,Null,main_menu},
{4,"4.返回上级",0x9a,5,nullsubs,main_menu,main_menu}
};
//******************************************************************************

//************************************全局变量**********************************
struct menu (*menupoint) = main_menu; //结构体指针,指向结构体后由内部函数指针指向功能函数

//******************************************************************************

void PowerOff(void)
{


clrram();
Disp_HZ(0,1," 正在关机 ",8);
jindutiao(2,1);
jindutiao(2,1);
jindutiao(2,1);
clrram();
_DINT();
LCD_LED_H;

E_0;
P5OUT&=0xfe;
}

void findkey(void)
{

switch(P4IN)
{
case 0xFB :
key = DOWN;
break;
case 0xDF :
key = UP;
break;
case 0xF7 :
key = ENTER;
break;
case 0xEF :
key = ESC;
break;
case 0x7F :
key = FUN;
break;
case 0xBF :
key = CLS;
break;
case 0xFD :
key = COMP;
break;
case 0xFE :
key = POWER;
break;
case 0x7d :
key = FUN_COMP;
break;
default :
key= Null ;
break;
}
}

//***********************************待处理函数*********************************
//函数名称: aa
//函数说明: 实际中要替换为具体函数原型,这里只是举例说明
//入口参数: 无
//出口参数: 无
//******************************************************************************
void aa(void)
{
clrram();
Disp_HZ(1,1,"数据发送中",5);
jindutiao(2,4);
if (wait==0)
{
Disp_HZ(1,1," 发送成功",5);
jindutiao(2,1);
}
else
{ clrram();
Disp_HZ(1,1," 通讯失败",5);
Disp_HZ(1,2," 请重试 ",5);

while(1)
{
key=Null;
key_process();
if(key==ENTER||key==ESC)
{key=Null;
break;
}
}
}
clrram();
}

void init_clk(void)
{
uchar i;
BCSCTL1 &= ~XT2OFF; // XT2 = HF XTAL

do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) != 0); // OSCFault flag still set?

BCSCTL2 |= SELM1; // MCLK = XT2 (safe)
}

//************************************菜单显示**********************************
//函数名称: void menu_disp(uchar n)
//函数说明: 显示主菜单
//入口参数: uint n,要显示的菜单级数号码
//出口参数: 无
//******************************************************************************
void menu_disp(void)
{
uchar i;
clrram();
maxitems = menupoint[0].menucount;
if(userchoose < 4 && maxitems < 5)
{
for(i = 0 ;i < maxitems;i++)
{
wch_disp(menupoint[i].str,menupoint[i].pos,menupoint[i].length);
}
}
else if(userchoose < 4 && maxitems >= 5)
{
for(i = 0;i < 4;i++)
{
wch_disp(menupoint[i].str,menupoint[i].pos,menupoint[i].length);
}
}
else if(userchoose >= 4)
{
clrram();
clrram();
for(i = 0; i < maxitems - 4;i ++)
{
wch_disp(menupoint[i + 4].str,menupoint[i + 4].pos,menupoint[i + 4].length);
}
}
if(menupoint == main_menu)
{
for(i = 0; i < 4;i ++)
{
wch_disp(menu2[0][i].str1,menu2[0][i].pos1,menu2[0][i].length1);
}
}
else if(menupoint == other_menu)
{
for(i = 0; i < 4;i ++)
{
wch_disp(menu2[1][i].str1,menu2[1][i].pos1,menu2[1][i].length1);
}
}
con_wch_disp(menupoint[userchoose].pos,menupoint[userchoose].length);
}
//******************************************************************************

//************************************键盘处理**********************************
//函数名称: key_process
//函数说明: 键盘处理
//入口参数: 无
//出口参数: 无
//******************************************************************************
void key_process(void)
{
if(P4IN!=0xff)
{
LED=1;
cnt=0;
Delay_Nms(KeyDelay);//延时消抖
while(P4IN!=0xff)
{ cnt=0;
findkey();
Presstime++;
if (Presstime > LongPress*2 && (key == DOWN||key == UP||key == FUN_COMP) )//判断长按
{
break;
}
else if (Presstime > LongPress*2 && (key == POWER)) //判断长按
{
PowerOff();
LPM4;
break;
}
}
if((P4IN!=0xff) && (key == DOWN||key == UP)&&Setvalues==1)
{ PresstimeLong++;

if(PresstimeLong>=10&&PresstimeLong<20) key+=10;
if(PresstimeLong>=20) key+=20;
}
}
if(P4IN==0xff)
{
Presstime=0;
PresstimeLong=0;
}
}
void readall(uchar nus)
{ uchar i;
clrram();
Disp_HZ(0,1,"**数据读取中****",8);
Disp_HZ(0,2," 读取 号",5);

if(nus>=1&&nus<=MaxStation[NowMainStation])
{
Disp_NUM(3,2,nus,0,0);
readstation(NowMainStation,nus,0x00,0x00);
jindutiao(3,1);
}
else
{
for(i=1;i<=MaxStation[NowMainStation];i++)
{ Disp_NUM(3,2,i,0,0);
readstation(NowMainStation,i,0x00,0x00);
jindutiao(3,1);
}
}
if(nus>=1&&nus<=MaxStation[NowMainStation])
{
Disp_NUM(3,2,nus,0,0);
readstation(NowMainStation,nus,0x00,0x00);
jindutiao(3,1);
}
else
{
for(i=1;i<=MaxStation[NowMainStation];i++)
{ Disp_NUM(3,2,i,0,0);
readstation(NowMainStation,i,0x00,0x00);
jindutiao(3,1);
}
}

if (wait==1)
{Disp_HZ(1,1," 通讯失败",5);
Disp_HZ(1,2," 请重试 ",5);
while(1)
{
key=Null;
key_process();
if(key==ENTER||key==ESC)
{key=Null;
break;
}
}
}


}

void Search(void)

{
clrram();
Disp_HZ(0,0,"**搜索可用包机**",8);
Disp_HZ(0,1," 搜索 号 ",8);
MainsCounter=0;

for(stations=Num_of_main;stations>=1;stations--)
{ cnt=0;
readstation(stations,0xf0,0x07,0);
Disp_NUM(4,1,stations,0,0);
jindutiao(3,1);
Disp_HZ(0,2," 搜到 个 ",8);
Disp_NUM(4,2,MainsCounter,0,0);
}

if (MainsCounter>0)
{
MaxMainS=MainsCounter-1;
Disp_HZ(0,1," 包机搜索完毕 ",8);
Disp_HZ(0,2," 搜到 个 ",8);
Disp_NUM(4,2,MainsCounter,0,0);
Disp_HZ(0,3," ◆选择 号 ",8);
NowMainStation=MainStation[0];
Disp_NUM(4,3,NowMainStation,0,0);
}
else
{
clrram();
Disp_HZ(0,0,"**搜索包机失败**",8);
Disp_HZ(0,1," 请您重新搜索 ",8);
Disp_HZ(0,2," 按任意键返回 ",8);
}
key=Null;
while(key==Null)
{
key_process();
if(MainsCounter==0)
{
if(key!=Null)
{
key=Null;
break;
}
}
else
{
if(key==ENTER)
{
key=Null;
NowStation=1;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
else if(key==UP)
{
if(MSCounter<MaxMainS)
MSCounter++;
NowMainStation=MainStation[MSCounter];
Disp_NUM(4,3,NowMainStation,0,0);
key=Null;
}
if(key==DOWN)
{
if(MSCounter>0)
MSCounter--;
NowMainStation=MainStation[MSCounter];
Disp_NUM(4,3,NowMainStation,0,0);
key=Null;
}

}
}

}
void numdisp(uchar xx)
{
if (xx<5)
{
Disp_HZ(0,xx-1,shuzi[xx-1],1);
}
else if(xx>4&&xx<9)
{
Disp_HZ(4,xx-5,shuzi[xx-1],1);
}
else
{
Disp_HZ(0,xx-9,shuzi[xx-1],1);
}
}
void valuedisp(uchar xx,uint *num)
{

if (xx<5)
{
Disp_HZ(0,xx-1,shuzi[xx-1],1);
Disp_NUM(1,xx-1,num[xx],1,0);

}
else if(xx>4&&xx<9)
{
Disp_HZ(4,xx-5,shuzi[xx-1],1);
Disp_NUM(5,xx-5,num[xx],1,0);
}
else
{
Disp_HZ(0,xx-9,shuzi[xx-1],1);
Disp_NUM(1,xx-9,num[xx],1,0);
}

}

void dis(uchar xx,uint *num)
{
uchar i;
uchar pos;

clrram();
if(xx<9)
{
if (MaxStation[NowMainStation]<=8)
{
for(i=1;i<=MaxStation[NowMainStation];i++)
valuedisp(i,num);
}
else
{
for(i=1;i<=8;i++)
valuedisp(i,num);
}
}
else
{

if (MaxStation[NowMainStation]>8)
{
for(i=9;i<=MaxStation[NowMainStation];i++)
valuedisp(i,num);
}

}
switch(xx)
{
case 1: pos=0x80;
break;
case 2: pos=0x90;
break;
case 3: pos=0x88;
break;
case 4: pos=0x98;
break;
case 5: pos=0x80+4;
break;
case 6: pos=0x90+4;
break;
case 7: pos=0x88+4;
break;
case 8: pos=0x98+4;
break;
case 9: pos=0x80;
break;
case 10: pos=0x90;
break;
case 11: pos=0x88;
break;
case 12: pos=0x98;
break;
default:
break;
}
con_wch_disp(pos,1);

}
void SetValue(void)
{
readall(0xff);
clrram();
State=0;
key=Null;

dis(NowStation,set1);

while(State==0)
{Setvalues=1;
key_process();
Setvalues=0;
if(key==ESC)
{
State=1;
key=Null;
break;
}
else if(key==ENTER)
{
readstation(NowMainStation,NowStation,0x01,set1[NowStation]);
aa();
readall(NowStation);
clrram();
dis(NowStation,set1);
key=Null;
}
else if(key==FUN)
{
if (NowStation==MaxStation[NowMainStation])
{ NowStation=1;}
else
{ NowStation++;}
dis(NowStation,set1);
key=Null;
}

else if(key==UP)
{
if(set1[NowStation]<6000)
set1[NowStation]++;
dis(NowStation,set1);
key=Null;
}
else if(key==DOWN)
{
if(set1[NowStation]>3000)
set1[NowStation]--;
dis(NowStation,set1);
key=Null;
}
else if(key==UP+10)
{
if(set1[NowStation]<5990)
set1[NowStation]+=10;
dis(NowStation,set1);

key=Null;
}
else if(key==DOWN+10)
{
if(set1[NowStation]>3010)
set1[NowStation]-=10;
dis(NowStation,set1);
key=Null;
}
else if(key==UP+20)
{
if(set1[NowStation]<5900)
set1[NowStation]+=100;
dis(NowStation,set1);

key=Null;
}
else if(key==DOWN+20)
{
if(set1[NowStation]>3100)
set1[NowStation]-=100;
dis(NowStation,set1);
key=Null;
}

}

}

void ClsWeight(void)
{
clrram(); //清除显示
Disp_HZ(0,0,"**称重清零******",8);
Disp_HZ(0,1,"◆喷嘴号:",4);
Disp_NUM(5,1,NowStation,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
key_process();

if(key==ESC)
{
State=1;
key=Null;
break;
}

else if(key==ENTER)
{
readstation(NowMainStation,NowStation,0x08,0x00);
key=Null;
aa();
Disp_HZ(0,0,"**称重清零******",8);
Disp_HZ(0,1,"◆喷嘴号:",4);
Disp_NUM(5,1,NowStation,0,0);
}
else if(key==UP)
{
if (NowStation==MaxStation[NowMainStation])
{ NowStation=1;
Disp_NUM(5,1,NowStation,0,0);
}
else
{ NowStation++;
Disp_NUM(5,1,NowStation,0,0);
}
key=Null;
}
else if(key==DOWN)
{
if(NowStation>1)
{ NowStation--;
Disp_NUM(5,1,NowStation,0,0);
}
else
{ NowStation=MaxStation[NowMainStation];
Disp_NUM(5,1,NowStation,0,0);
}

key=Null;
}

}

}
void AdjWeight(void)
{
clrram(); //清除显示
Disp_HZ(0,0,"**称重标定******",8);
Disp_HZ(0,1,"进入请按组合键!",8);
Disp_HZ(0,2,"退出请按取消键!",8);

while(1)
{ key=Null;
key_process();
if (key == FUN_COMP)
{ key=Null;
clrram(); //清除显示
Disp_HZ(0,0,"**称重标定******",8);
Disp_HZ(0,1,"◆喷嘴号:",4);
Disp_NUM(5,1,NowStation,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
key_process();
if(key==ESC)
{
State=1;
key=Null;
break;
}
else if(key==ENTER)
{
AdjWeight2();
}


else if(key==UP)
{
if (NowStation==MaxStation[NowMainStation])
{ NowStation=1;
Disp_NUM(5,1,NowStation,0,0);
}
else
{ NowStation++;
Disp_NUM(5,1,NowStation,0,0);
}
key=Null;
}
else if(key==DOWN)
{
if(NowStation>1)
{ NowStation--;
Disp_NUM(5,1,NowStation,0,0);
}
else
{ NowStation=MaxStation[NowMainStation];
Disp_NUM(5,1,NowStation,0,0);
}

key=Null;
}
}

}
else if(key==ESC)
{
key=Null;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
}

}

void AdjWeight2(void)
{
uchar ps=0;
key=Null;
clrram(); //清除显示
Disp_HZ(0,0,"**称重标定******",8);
Disp_HZ(0,1,"◆状态:P-",5);
Disp_NUM(5,1,ps,0,0);
State=0;
key=Null;
while(1)
{ key=Null;
key_process();

if(key==ENTER)
{
readstation(NowMainStation,NowStation,0x09,ps);
key=Null;
aa();
Disp_HZ(0,0,"**称重标定******",8);
Disp_HZ(0,1,"◆状态:P-",5);
if(ps==7)
Disp_HZ(5,1,"退出",2);
else
{Disp_HZ(5,1," ",2);
Disp_NUM(5,1,ps,0,0);
}
}
else if(key==UP)
{
if (ps==7)
{ ps=0;
if(ps==7)
Disp_HZ(5,1,"退出",2);
else
{Disp_HZ(5,1," ",2);
Disp_NUM(5,1,ps,0,0);
}
}
else
{ ps++;
if(ps==7)
Disp_HZ(5,1,"退出",2);
else
{Disp_HZ(5,1," ",2);
Disp_NUM(5,1,ps,0,0);
}
}
key=Null;
}
else if(key==DOWN)
{
if(ps>0)
{ ps--;
if(ps==7)
Disp_HZ(5,1,"退出",2);
else
{Disp_HZ(5,1," ",2);
Disp_NUM(5,1,ps,0,0);
}

}
else
{ ps=7;
if(ps==7)
Disp_HZ(5,1,"退出",2);
else
{Disp_HZ(5,1," ",2);
Disp_NUM(5,1,ps,0,0);
}
}

key=Null;
}

else if(key==ESC)
{
key=Null;
clrram(); //清除显示
Disp_HZ(0,0,"**称重标定******",8);
Disp_HZ(0,1,"◆喷嘴号:",4);
Disp_NUM(5,1,NowStation,0,0);
break;
}
}

}


void SetAddress(void)
{
uint i=1;

//start:
clrram(); //清除显示

Disp_HZ(0,0,"**包机站号设置**",8);
Disp_HZ(0,1,"◆包机号:",4);
Disp_NUM(5,1,i,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
key_process();

if(key==ESC)
{
State=1;
key=Null;
break;
}
else if(key==ENTER)
{
readstation(0xff,0xf0,0x05,i);
key=Null;
aa();
Disp_HZ(0,0,"**包机站号设置**",8);
Disp_HZ(0,1,"◆包机号:",4);
Disp_NUM(5,1,i,0,0);
}
else if(key==UP)
{
if(i<Num_of_main)
i++;
else
i=1;
Disp_NUM(5,1,i,0,0);
key=Null;
}
else if(key==DOWN)
{
if(i>1)
i--;
else
i=Num_of_main;
Disp_NUM(5,1,i,0,0);
key=Null;
}

}
}



void SetStation(void)
{
uint i=8;
clrram(); //清除显示
Disp_HZ(0,0,"**喷嘴设置******",8);
Disp_HZ(0,1,"◆喷嘴数:",4);
Disp_NUM(5,1,i,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
key_process();

if(key==ESC)
{
State=1;
key=Null;
break;
}
else if(key==ENTER)
{
readstation(0xff,0xf0,0x06,i);
key=Null;
aa();
Disp_HZ(0,0,"**喷嘴设置******",8);
Disp_HZ(0,1,"◆喷嘴数:",4);
Disp_NUM(5,1,i,0,0);
}
else if(key==UP)
{
if(i<12)
i++;
else
i=1;
Disp_NUM(5,1,i,0,0);
key=Null;
}
else if(key==DOWN)
{
if(i>1)
i--;
else
i=12;
Disp_NUM(5,1,i,0,0);
key=Null;
}
}


}

//************************************密码函数************************************
//函数名称: PassWords
//函数说明: 无
//入口参数: 无
//出口参数: 无
//******************************************************************************
void PassWords(void)
{
uint i=0;
clrram(); //清除显示
Disp_HZ(0,0,"**输入密码******",8);
Disp_HZ(0,1,"◆密码值:",4);
Disp_NUM(5,1,i,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
Delay_Nms(500);
key_process();

if(key==ESC)
{
State=1;
key=Null;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
else if((key==ENTER) && ( i == PassWord ))
{
menupoint =other_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
key=Null;
State=1;
}
else if(key==UP)
{
if(i<99)
i++;
Disp_NUM(5,1,i,0,0);
key=Null;
}
else if(key==DOWN)
{
if(i>0)
i--;
Disp_NUM(5,1,i,0,0);
key=Null;
}



}

}


void BaL(void)
{

clrram(); //清除显示
Disp_HZ(0,0,"**背光调整******",8);
Disp_HZ(0,1,"◆亮度值:",4);
Disp_NUM(5,1,bal,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
Delay_Nms(500);
key_process();

if(key==ESC)
{
State=1;
key=Null;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
else if(key==ENTER)
{
_DINT();
write_buff[1]=bal;
flash_erase( pc_flash_segment); //段擦除

write_array(pc_flash, write_buff,4); //写入指定字节数量
_NOP();
read_array(pc_flash,checkout,4); //再读出刚才写的字节
bal=checkout[1];
key=Null;
_EINT();
State=1;
key=Null;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();

break;
}
else if(key==UP)
{
if(bal<99)
bal++;
Disp_NUM(5,1,bal,0,0);
key=Null;
}
else if(key==DOWN)
{
if(bal>0)
bal--;
Disp_NUM(5,1,bal,0,0);
key=Null;
}



}

}

//************************************电量函数************************************
//函数名称: ADC
//函数说明: 无
//入口参数: 无
//出口参数: 无
//******************************************************************************
void ADC(void)
{
adc=1;
//start:
clrram(); //清除显示
ADC_Init();
Disp_HZ(0,0,"**电池电量******",8);
Disp_HZ(1,1,"电压值:",4);
Disp_HZ(7,1," V",2);
Disp_NUM(4,1,Curr_Volt,1,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
key_process();

switch (State)
{
case 0 :
if(key==ESC)
{P6SEL= 0; // 使能ADC通道
ADC12CTL0 = 0; // 打开ADC,设置采样时间
ADC12IE = 0; // 使能ADC中断
State=1;
adc=0;
key=Null;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
}
}


}

使用特权

评论回复
板凳
liuxing4585|  楼主 | 2015-6-11 09:00 | 只看该作者
/****************************************************************************\
文件名:flash.c
编写者:czhang
描述:用于MSP430F149。
FLASH存储器读写、擦除。时钟源:MCLK 8MHz
版本:1.0        2005-2-19
\****************************************************************************/
#include <msp430x14x.h>
#include "flash.h"

/***************************************************************************
段擦除
adr:要擦除的段内的任一地址
***************************************************************************/
void FlashErase(unsigned int adr) [url=home.php?mod=space&uid=72445]@[/url] "MYSET"
{
unsigned char *p0;

FCTL2=FWKEY+FSSEL_1+FN3+FN4;
FCTL3=FWKEY;
while(FlashBusy()==1)        //等待FLASH存储器完成操作
;
FCTL1=FWKEY+ERASE;
p0=(unsigned char *)adr;
*p0=0;         //向段内地址任意写,启动擦除操作
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK;
while(FlashBusy()==1)        //等待FLASH存储器完成操作
;
}

/**************************************************************************
测试FLASH是否忙
返回值:1:忙 0:不忙
**************************************************************************/
unsigned char FlashBusy() @ "MYSET"
{
if((FCTL3&BUSY)==BUSY)
return 1;
else
return 0;
}

/**************************************************************************
字编程
Adr:要编程的地址,注意:不是指针类型,应当是偶地址
DataW:要编程的字
**************************************************************************/
void FlashWW(unsigned int Adr,unsigned int DataW) @ "MYSET"
{
FCTL1=FWKEY+WRT;
FCTL2=FWKEY+FSSEL_1+FN3+FN4;
FCTL3=FWKEY;
while(FlashBusy()==1)        //等待FLASH存储器完成操作
;
*((unsigned int *)Adr)=DataW;
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK;
while(FlashBusy()==1)        //等待FLASH存储器完成操作
;
}

/**************************************************************************
字节编程
Adr:指向要编程的地址,注意:不是指针类型
DataB:要编程的字节
**************************************************************************/
void FlashWB(unsigned int Adr,unsigned char DataB) @ "MYSET"
{
FCTL1=FWKEY+WRT;
FCTL2=FWKEY+FSSEL_1+FN3+FN4;
FCTL3=FWKEY;
while(FlashBusy()==1)        //等待FLASH存储器完成操作
;
*((unsigned char *)Adr)=DataB;
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK;
while(FlashBusy()==1)        //等待FLASH存储器完成操作
;
}
12864驱动:
//******************************************************************************
//MSP430驱动液晶程序
//文件名 :lcd12864.h
//模块名称:st7920 并行方式驱动12864液晶驱动
//功能概要:st7920显示驱动
//PSB模式选择管脚,直接接高电平,采用并口方式
//RST管脚悬空,采用上电复位模式
//D0-D7与430的P2口连接
//偏置电压选择端悬空
//RS,RW,E分别与P3.012口连接
//******************************************************************************/
#include <msp430x14x.h>


#define x1 0x80
#define x2 0x88
#define y 0x80
#define comm 0
#define dat 1
#define DIROUT P2DIR=0XFF
#define DIRIN P2DIR=0X00
#define LCD_CMDOut P1DIR|=0xe0 //P1口的高三位设置为输出
#define RS_1 P1OUT|=BIT5
#define RS_0 P1OUT&=~BIT5
#define RW_1 P1OUT|=BIT6
#define RW_0 P1OUT&=~BIT6
#define E_1 P1OUT|=BIT7
#define E_0 P1OUT&=~BIT7

#define LCD_PSB_H P3OUT|=BIT0 //P3.0
#define LCD_PSB_L P3OUT&=~BIT0 //P3.0
#define LCD_RST_H P3OUT|=BIT1 //P3.1
#define LCD_RST_L P3OUT&=~BIT1 //P3.1
#define LCD_LED_H P3OUT|=BIT3 //P3.3
#define LCD_LED_L P3OUT&=~BIT3 //P3.3

void wr_lcd (uchar dat_comm,uchar content);
void chk_busy (void);
void delay (uint);
void test(void);
void Delay_1ms(void);
void Delay_Nms(uint n);
void X_Y(uchar X,uchar Y);
void Disp_CHAR(uchar X,uchar Y,const uchar * pt,uchar num);
void Disp_NUM(uchar X,uchar Y,unsigned int pt,uchar num,uchar change);
void X_Y(uchar X,uchar Y)
{
uchar pos;
switch(Y)
{
case 0: pos=0x80+X;
break;
case 1: pos=0x90+X;
break;
case 2: pos=0x88+X;
break;
case 3: pos=0x98+X;
break;
default:
break;
}
wr_lcd(comm,pos);
}

/*******************************************
函数名称:Disp_HZ
功 能:控制液晶显示汉字
参 数:XY--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值 :无
********************************************/
void Disp_HZ(uchar X,uchar Y,const uchar * pt,uchar num)
{
uchar i;
X_Y(X,Y);       

for(i = 0;i < (num*2);i++)
wr_lcd(dat,*(pt++));

}
/*******************************************/
//****************
//**端口初始化
//***************
void init_lcdport(void)
{

P3DIR|=BIT0+BIT1+BIT3; //输出端口
LCD_CMDOut;
LCD_LED_H;
LCD_RST_L; //复位LCD
Delay_Nms(2); //保证复位所需要的时间
LCD_RST_H; //恢复LCD正常工作
_NOP();
LCD_PSB_H; //设置LCD为8位并口通信
LCD_LED_L;

}
/****************************************************************************************
*延时子程序
****************************************************************************************/
void delay(uint n)
{
uint i;
for (i=n; i>0; i--)
{
;
}
}
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void Delay_1ms(void)
{
uchar i;

for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
返回值 :无
********************************************/
void Delay_Nms(uint n)
{
uint i;

for(i = n;i > 0;i--) Delay_1ms();
}
/******************************************************************************************
* 函数名称 :init_lcd
* 功能描述 : LCD初始化子程序
* 返回值 :无
******************************************************************************************/
void init_lcd(void)
{
wr_lcd(comm,0x30); /*30---基本指令动作*/
wr_lcd(comm,0x01); /*清屏,地址指针指向00H*/
wr_lcd(comm,0x06); /*光标的移动方向*/
wr_lcd(comm,0x0c); /*开显示,关游标*/
}

/******************************************************************************************
* 函数名称 :chr_disp
* 功能描述 :显示字符
* 返回值 :无
******************************************************************************************/
void chr_disp(uchar *chn,uint x,uint nbyte)
{
uchar i;
wr_lcd(comm,0x30); //一般功能
wr_lcd(comm,x); //显示起始位置,x坐标是自加的,注意显示地址
for(i=0;i<nbyte;i++)
{
wr_lcd(dat,chn[i]); //写数据
}
}
/******************************************************************************************
* 函数名称 :chn_disp1
* 功能描述 : 上半屏显示汉字或字符,字库汉字与字符
* 返回值 :无
******************************************************************************************/
void chn_disp1(uchar *chn)
{
uchar i,j;
wr_lcd(comm,0x30);
delay(5);
wr_lcd(comm,0x80); //第一行
j=0;
for(i=0;i<16;i++)
{
wr_lcd(dat,chn[j*16+i]);
}
wr_lcd(comm,0x90); //第二行
j=1;
for(i=0;i<16;i++)
{
wr_lcd(dat,chn[j*16+i]); //写数据
}
}

/******************************************************************************************
* 函数名称 :img_disp
* 功能描述 :显示图形
* 返回值 :无
******************************************************************************************/
void img_disp(uchar *img)
{
uchar i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd(comm,0x34); //绘图功能
wr_lcd(comm,y+j);
wr_lcd(comm,x1+i);
wr_lcd(comm,0x30);
wr_lcd(dat,img[j*16+i*2]);
wr_lcd(dat,img[j*16+i*2+1]);
}
}
for(j=32;j<64;j++)
{
for(i=0;i<8;i++)
{
wr_lcd(comm,0x34); //绘图功能
wr_lcd(comm,y+j-32);
wr_lcd(comm,x2+i);
wr_lcd(comm,0x30);
wr_lcd(dat,img[j*16+i*2]);
wr_lcd(dat,img[j*16+i*2+1]);
}
}
wr_lcd (comm,0x36); //绘图显示
}

/******************************************************************************************
* 函数名称 :img_disp1
* 功能描述 :下半屏显示图形8*16
* 返回值 :无
******************************************************************************************/
void img_disp1(uchar *img)
{
uchar i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,y+j);
wr_lcd(comm,x2+i);
wr_lcd(comm,0x30);
wr_lcd(dat,img[j*16+i*2]);
wr_lcd(dat,img[j*16+i*2+1]);
}
}
wr_lcd(comm,0x36);
}

/******************************************************************************************
* 函数名称 :lat_disp
* 功能描述 : 显示点阵
* 返回值 :无
******************************************************************************************/
void lat_disp(uchar data1,uchar data2)
{
uchar i,j,k,x;
x=x1;
for(k=0;k<2;k++)
{
for(j=0;j<16;j++)
{
for(i=0;i<8;i++)
{
wr_lcd(comm,0x34); //绘图功能
wr_lcd(comm,y+j*2); //y坐标
wr_lcd(comm,x+i); //x坐标
wr_lcd(comm,0x30); //一般功能
wr_lcd(dat,data1);
wr_lcd(dat,data1);
}
for(i=0;i<8;i++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,y+j*2+1);
wr_lcd(comm,x+i);
wr_lcd(comm,0x30);
wr_lcd(dat,data2);
wr_lcd(dat,data2);
}
}
x=x2;
}
wr_lcd(comm,0x36); //绘图功能打开
}

/******************************************************************************************
* 函数名称 :con_disp
* 功能描述 : 当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl
* 返回值 :无
******************************************************************************************/
void con_disp(uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
uchar i,j;
for(j=0;j<yl;j++)
{
for(i=0;i<xl;i++)
{
wr_lcd(comm,0x34); //绘图功能
wr_lcd(comm,y0+j); //y坐标
wr_lcd(comm,x0+i); //x坐标
wr_lcd(comm,0x30); //一般功能
wr_lcd(dat,data1);
wr_lcd(dat,data2);
}
}
wr_lcd(comm,0x36); //显示功能
}

/******************************************************************************************
* 函数名称 :clrram
* 功能描述 : 清DDRAM
* 返回值 :无
******************************************************************************************/
void clrram(void)
{
wr_lcd(comm,0x30);
wr_lcd(comm,0x01);
}

/******************************************************************************************
* 函数名称 :wr_lcd
* 功能描述 : 写数据和指令子程序,0时写指令,1写数据
* 返回值 :无
******************************************************************************************/
void wr_lcd(uchar dat_comm,uchar content)
{
chk_busy ();
if(dat_comm)
{
RS_1; //写数据
RW_0;
}
else
{
RS_0; //写指令
RW_0;
}
P2OUT=content; //数据载入
delay(10);
E_1;
_NOP();
E_0; //下降沿作用
}

/*******************************************************************************
* 函数名称 :chk_busy
* 功能描述 : 检查忙信号子程序
* 返回值 :无
*******************************************************************************/
void chk_busy(void)
{
int temp;
DIRIN; //端口设置为输入方式
RS_0;
RW_1;
do
{
E_1; //读端口状态
_NOP();       
temp=P2IN;
E_0; //下降沿读取状态
}while((temp&0X80)!=0); //高位为1为忙信号
DIROUT;
}

/******************************************************************************************
* 函数名称 :wch_disp
* 功能描述 :向指定位置写入汉字和字符,(字库汉字和字符)
* 返回值 :无,x字节数,nbyte写入的汉字和字符个数
******************************************************************************************/
void wch_disp(uchar *chn,uint x,uint nbyte)
{
uchar i;
wr_lcd(comm,0x30); //一般功能
wr_lcd(comm,x); //显示起始位置,x坐标是自加的,注意显示地址
for(i=0;i<(2*nbyte);i++)
{
wr_lcd(dat,chn[i]); //写数据
}
}

/******************************************************************************************
* 函数名称 :line_disp
* 功能描述 :画线功能
* 返回值 :无,x坐标水平,y坐标竖着往下,从80H,到80+31,下半屏也是如此
******************************************************************************************/
void line_disp(uint xstart,uint ytemp,uint xend)
{
uint i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,0x80+j);
wr_lcd(comm,0x80+i);
wr_lcd(comm,0x30);
wr_lcd(dat,0x00);
wr_lcd(dat,0x00);
}
}
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,0x80+j);
wr_lcd(comm,0x88+i);
wr_lcd(comm,0x30);
wr_lcd(dat,0x00);
wr_lcd(dat,0x00);
}
}
for(j=0;j<2;j++)
{
for(i=0;i<=(xend-xstart);i++)
{
wr_lcd(comm,0x34); //绘图功能
wr_lcd(comm,ytemp+j); //y坐标
wr_lcd(comm,xstart+i); //x坐标
wr_lcd(comm,0x30); //一般功能
wr_lcd(dat,0xff);
wr_lcd(dat,0xff);
}
}
/* for(i=0;i<8;i++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,ytemp+1);
wr_lcd(comm,xstart+i);
wr_lcd(comm,0x30);
wr_lcd(dat,0xff);
wr_lcd(dat,0xff);
}*/
wr_lcd(comm,0x36); //绘图功能打开
}

//************************************长延时************************************
//函数名称: long_delay(uint n)
//函数说明: 相对于delay()来说的,延时时间较长
//入口参数: unsigned int n,延时时间常数
//出口参数: 无
//******************************************************************************
void long_delay(uint n)
{
uint i,j;
for(i = n;i > 0;i--)
for(j = 0xff;j > 0;j--) ;
}
//******************************************************************************

//************************************反白显示**********************************
//函数名称: con_wch_disp(uchar *chn,uint x,uint nbyte)
//函数说明: 反白任意位置显示字符
//入口参数: uint x-反白地址,uint nbyte-长度
//出口参数: 无
//******************************************************************************
void con_wch_disp(uint x,uint nbyte)
{
uchar i,j;
//***************************计算地址************************
uchar m,n;
if ((x & 0x08) == 0x08)
{
m = 0x88 + (x & 0x07);
}
else m = 0x80 + (x & 0x07);
if((x & 0x90) == 0x90)
{
n = 0x90;
}
else n = 0x80;
//****************************反白*****************************
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,0x80+j);
wr_lcd(comm,0x80+i);
wr_lcd(comm,0x30);
wr_lcd(dat,0x00);
wr_lcd(dat,0x00);
}
}
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,0x80+j);
wr_lcd(comm,0x88+i);
wr_lcd(comm,0x30);
wr_lcd(dat,0x00);
wr_lcd(dat,0x00);
}
}
for(j=0;j<16;j++)
{
for(i=0;i<nbyte;i++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,n+j);
wr_lcd(comm,m+i);
wr_lcd(comm,0x30);
wr_lcd(dat,0xff);
wr_lcd(dat,0xff);
}
}
wr_lcd (comm,0x36);
}
void Disp_black() //在反白之前先清绘图存储区,将绘图存储区的参数全设为不反白0x00.
{
unsigned char i,j;
wr_lcd(comm,0x36); //图形方式
for(i=0;i<32;i++){
wr_lcd(comm,0x80+i);
wr_lcd(comm,0x80);
for(j=0;j<16;j++)
{
wr_lcd(dat,0x00);
}
}
for(i=0;i<32;i++){
wr_lcd(comm,0x80+i);
wr_lcd(comm,0x88);
for(j=0;j<16;j++) {
wr_lcd(dat,0x00);
}
}
}

/*******************************************
函数名称:Disp_CHAR
功 能:控制液晶显示字符
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值 :无
********************************************/
void Disp_CHAR(uchar X,uchar Y,const uchar * pt,uchar num)
{
uchar i;
X_Y( X, Y);       
for(i = 0;i <num;i++)
wr_lcd(dat,*(pt++));
}
/*******************************************
函数名称:Disp_NUM
功 能:控制液晶显示数字
参 数:addr--显示位置的首地址
pt--数字
num--1.显示浮点数 99.99 ,显示整数 99
返回值 :无
********************************************/
void Disp_NUM(uchar X,uchar Y,unsigned int pt,uchar num,uchar change)
{
unsigned char data[6];
pt=pt%10000;
X_Y( X, Y);
if(num==0)
{
data[0]=0x30+pt%100/10;
data[1]=0x30+pt%10;
Disp_CHAR(X,Y,data,2);
}
else
{
data[0]=0x30+pt/1000;
data[1]=0x30+pt%1000/100;
data[2]=0x2e;
data[3]=0x30+pt%100/10;
data[4]=0x30+pt%10;
data[5]=0x20;
Disp_CHAR(X,Y,data,5);
}

}
//******************************************************************************

//*************************************************************************


使用特权

评论回复
地板
JY-DX-JY| | 2015-6-11 13:43 | 只看该作者
好长的代码,顶一个。。。。。。

使用特权

评论回复
5
liuxing4585|  楼主 | 2015-6-11 16:21 | 只看该作者
JY-DX-JY 发表于 2015-6-11 13:43
好长的代码,顶一个。。。。。。

谢谢啦,

使用特权

评论回复
6
可可球| | 2015-6-11 20:35 | 只看该作者
正想做一个无线键盘呢,刚好你的可以做参考,顶一个

使用特权

评论回复
7
firstblood| | 2015-6-11 21:42 | 只看该作者
这个关键的部分还是在程序的处理上的。

使用特权

评论回复
8
firstblood| | 2015-6-11 21:42 | 只看该作者
楼主分享出来的程序代码的是非常复杂的,,这个也是不容忽视的,需要大量的工作的。

使用特权

评论回复
9
liuxing4585|  楼主 | 2015-6-11 23:00 | 只看该作者
firstblood 发表于 2015-6-11 21:42
这个关键的部分还是在程序的处理上的。

是的。原理很简单

使用特权

评论回复
10
liuxing4585|  楼主 | 2015-6-11 23:01 | 只看该作者
firstblood 发表于 2015-6-11 21:42
楼主分享出来的程序代码的是非常复杂的,,这个也是不容忽视的,需要大量的工作的。 ...

因为是实际项目,所以做的比较细了

使用特权

评论回复
11
liuxing4585|  楼主 | 2015-6-11 23:01 | 只看该作者
可可球 发表于 2015-6-11 20:35
正想做一个无线键盘呢,刚好你的可以做参考,顶一个

欢迎切磋

使用特权

评论回复
12
luchen66| | 2015-6-12 09:26 | 只看该作者
能发个实物图片吗?看看效果啊,呵呵

使用特权

评论回复
13
liuxing4585|  楼主 | 2015-6-12 09:57 | 只看该作者
luchen66 发表于 2015-6-12 09:26
能发个实物图片吗?看看效果啊,呵呵

回家拍一个

使用特权

评论回复
14
yigerenday| | 2015-6-15 11:09 | 只看该作者
源代码发个压缩包附件吧。这完全看不了呀,亲

使用特权

评论回复
15
angerbird| | 2015-6-15 18:55 | 只看该作者
低电压、超低功耗。工作电压3.6V~1.8V ,正常工作模式280μA@1MHz,2.2V,待机模式1.6μA,RAM数据保存的掉电模式下0.1μA。 五级节电模式。

使用特权

评论回复
16
angerbird| | 2015-6-15 18:57 | 只看该作者
该设计的显示部分是采用12864液晶显示的吧。。

使用特权

评论回复
发新帖 本帖赏金 3.10元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

500

帖子

3

粉丝