feifeimao 发表于 2013-5-4 14:09:44

avr控制按键在1602显示程序

按键后不对!!!!!!
不按键显示是对的。


不按键显示51.6910hz
按键A显示setsynth
                51.6910    并且光标在5下面   
按下数字按键可以修改各位的数值
按D可以保存修改
按E不保存所做的修改
C光标向左   F光标向右
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
?Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 2012-5-1
Author: NeVaDa
Company : 微软用户
Comments:


Chip type               : ATmega162
Program type            : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega162.h>
#include "LCD1602X.C"

/*
EE DE BE 7E       0123
ED DD BD 7D       4567
EB DB BB 7B       89AB
E7 D7 B7 77       CDEF
A按键:进入设置综合器状态下
C按键:光标向左
D按键:保存修改数值并确认退出
E按键:不保存并确认退出
F按键:光标向右
*/
unsigned char synth="51.6910hz";   
#pragma used+
void SYNTH_PROC(void)      //按键-综合器 的功能函数
    {                     
      unsigned char idx,TMP="51.6910";
      unsigned char EXIT=0x00;
      idx=0;   
      
      CLR_SCREEN();         
      displayROM(0x00,"SET SYNTH");   
      for(idx=0;idx<9;idx++)
            {TMP=synth;}
      displayRAM(0x41,TMP);   
      idx=0;
      lcd_pos(0x41+idx);
      ICON_CTRL(0x0E);//显示光标                     
      while(EXIT!=0xAA)   
            {                                             
                while(!FLAG);    //表示有按键被按下了
                FLAG=0;
                switch (KEYX)   //根据按键的键值执行不同的程序
                  {
                        case 0x0D:         
                            {   
                              TMP-=0x30;
                              TMP-=0x30;
                              TMP-=0x30;
                              TMP-=0x30;
                              TMP='.';
                              TMP-=0x30;
                              TMP-=0x30;
                                                                     
                              ICON_CTRL(0x0C);   //隐藏光标
                              EXIT=0xAA;                                                                  
                              break;
                            }
                        case 0x0E:
                            {
                              EXIT=0xAA;                                                                  
                              break;                                 
                            }
                        case 0x0F:            
                            {                                    
                              idx=idx+1;                                                
                              if(idx==3){idx=4;}      
                              if(idx==8){idx=1;}      
                              lcd_pos(0x41+idx);      
                              break;
                            }
                         case 0x0C:            
                            {                                    
                              idx=idx-1;                                                
                              if(idx==3){idx=2;}      
                              
                              if(idx==0){idx=7;}      
                              lcd_pos(0x41+idx);      
                              break;
                            }                                    
                        default:
                            {
                              if(KEYX<10)
                                    {
                                        TMP=KEYX+0x30;   
                                        displayB(0x41+idx,TMP);
                                        lcd_pos(0x41+idx);                                       
                                    }
                            }                  
                  }                        
            }
      CLR_SCREEN();                     
    }
#pragma used-

main()
{
displayRAM(0x80,synth);
while (1)
      {
         // Place your code here
            
            if(FLAG)
                {
                  FLAG=0;
                  switch(KEYX)
                        {
                        case 0x0A:
                              {
                                    SYNTH_PROC();
                                    break;
                              }                           
                        default:break;
                        }
                }
      };
}

jlhgold 发表于 2013-5-4 15:38:12

{:sweat:}{:sweat:}{:sweat:}看不懂LZ的问题 想举报 可还是算了 省的烦阿莫

feifeimao 发表于 2013-5-4 16:26:14

??????????
有啥看不懂的?

god-father 发表于 2013-5-5 10:17:27

while(!FLAG);    //表示有按键被按下了
这句是死等

feifeimao 发表于 2013-5-6 09:54:17

有兴趣的可以详聊:qq:150216708
页: [1]
查看完整版本: avr控制按键在1602显示程序