OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5162|回复: 5

原子哥,关于按键和LCD的程序,我还是没想到思路

[复制链接]

28

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2013-4-14
在线时间
24 小时
发表于 2013-5-2 21:31:26 | 显示全部楼层 |阅读模式
目前情况是,程序每20ms中断一次,在TIM3的中断服务函数里面扫描是否有按键按下,如果有按键按下,就在LCD上显示出相应的情况:wk_up表示进入或退出(确定)按键
key1表示选择LCD上的一些项目,如TI、TD
key0表示选中的项目+或者— 一定的值

遇到的困惑是:怎么实现假如我选中TI,TI变色,再按下key1则TI变回原来的颜色而TD变色?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-3 00:03:48 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

28

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2013-4-14
在线时间
24 小时
 楼主| 发表于 2013-5-3 22:32:40 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
???能详细一点吗?不太明白?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-3 22:43:48 | 显示全部楼层
你先写代码。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

28

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2013-4-14
在线时间
24 小时
 楼主| 发表于 2013-5-4 15:53:19 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
#include "timer.h"
#include "led.h"
#include "lcd.h"
#include "key.h"


//定时器3中断服务程序  
void TIM3_IRQHandler(void)

if(TIM3->SR&0X0001)  //溢出中断
{
u16 adc8;    //用来保存ADC的通道8的值
u16 adc10;  //用来保存ADC的通道10的值
u16 adc11;  //用来保存ADC的通道11的值
u16 adc12;        //用来保存ADC的通道12的值
u16 adc13;  //用来保存ADC的通道13的值
float temp13,temp12,temp11,temp10,temp8;
u8 table[]={adc13,temp13,adc12,temp12,adc8,temp8,adc11,temp11,adc10,temp10};
 //此数组用来保存按键key0的选择值!!!后续要改
u8 k1=1;  //用来保存按键key1按了多少次
u8 k0=0;  //用来保存按键key0按了多少次


u16 num=1;  //当c=25则进入采集adc数据的程序     
u8 t;       //用来保存键值
u8 able=0;    //用来判断键值
t=KEY_Scan();      //得到键值
u8 lv=0;   //用来标记是否进行Lvbo程序
if(t)
{    
switch(t)
{  
case 1:
if(able=1)  //表示进入''key0按下''数值调节模式
{
k0++;

}
break;
case 2:
if(able=1)  //表示进入''key2按下''选位调节模式
{
k1++;
u8 k1data;
if(k1<=5)
{
k1data=44+8*k1;   //表示位的地址
LCD_ShowNum(k1data,150," ",1,16)
}
if(k1>5)
{
k1data=44+8*(k1-5);   //表示位的地址
LCD_ShowNum(k1data,170," ",1,16)
}

}
break;
case 3:  //设定able以便确定wk-up是否按下
able++;
break;
}
if(able>=2) able=0;
if(k1>10) k1=1;
if(k0>9)  k0=0;
}


if(num==5)
{
lv++;
adc13+=Get_Adc(13); //获得ADC通道13的值并储存在adc13中,准备滤波(下同)
adc12+=Get_Adc(12); //获得ADC通道12的值
adc8+=Get_Adc(8); //获得ADC通道8的值
adc11+=Get_Adc(11); //获得ADC通道11的值
adc10+=Get_Adc(10); //获得ADC通道10的值


if(lv=5)
{
adc13=adc13/5; //取得5次采集的平均数(下同)
temp13=(float)adc13*(3.3/4096);
temp13=(500/3.3)*temp13; //转换成液位高度
adc13=temp13; //将整数部分赋给adc13,因为adc是u8类型
LCD_ShowNum(140,30,adc13,3,16); //显示下水箱水位值(第70行)的整数部分
temp13-=(u8)temp13;     //减掉整数部分
LCD_ShowNum(172,30,temp13*10,1,16); //显示下水箱水位值(第70行)的小数部分

adc12=adc12/5;
temp12=(float)adc13*(500/4096); //直接转换成液位高度
adc12=temp12; //将整数部分赋给adc12
LCD_ShowNum(140,50,adc12,4,16); //显示上水箱水位整数值(第110行)
temp12-=(u8)temp12; //减掉整数部分
    LCD_ShowNum(172,50,temp12*10,1,16); //显示上水箱水位值的小数部分(第70行)

     adc8=adc8/5;
temp8=(float)adc8*(80/4096); //直接转换成压力值
adc8=temp8; //将整数部分赋给adc8
LCD_ShowNum(148,70,adc8,2,16); //显示压力传感器的整数部分值(第150行)
temp8-=(u8)temp8; //减掉整数部分
LCD_ShowNum(172,70,temp8*100,2,16); //显示小数部分(第150行)

adc11=adc11/5;
temp11=(float)adc11*(120/4096); //直接转换成下管道流速值
adc11=temp11; //将整数部分赋给adc11
LCD_ShowNum(124,90,adc11,3,16); //显示下水管流速的整数部分值(第190行)
temp11-=(u8)temp11; //减掉整数部分
LCD_ShowNum(156,90,temp11*10,1,16); //显示下水管流速的小数部分(第190行)
 
adc10=adc10/5;
temp10=(float)adc10*(120/4096); //直接转换成上道流速值
adc10=temp10; //将整数部分赋给adc10
LCD_ShowNum(124,110,adc10,3,16); //显示上水管流速值(第230行)
temp10-=(u8)temp10; //减掉整数部分
LCD_ShowNum(156,110,temp10*10,1,16); //显示下水管流速的小数部分(第230行)

adc8=adc10=adc11=adc12=adc13=0; //将adc的值清零,完成一次数字滤波显示
lv=0;
}
num=0; //将c赋值为0
    }               
}    
TIM3->SR&=~(1<<0); //清除中断标志位      
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能    
  TIM3->ARR=arr;   //设定计数器自动重装值//刚好1ms    
TIM3->SC=psc;   //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0;    //允许更新中断
TIM3->DIER|=1<<6;    //允许触发中断
       
TIM3->CR1|=0x01;       //使能定时器3
   MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2  
}


这是在终端服务函数里面的代码,目前写到这里了,就剩不知道怎么实现变色或者闪烁了
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-5-4 19:08:24 | 显示全部楼层
回复【5楼】布沙尼神甫:
---------------------------------
我也在用按键修改LCD的参数,可是也没修改好,最近比较忙,没时间弄,学习了
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-20 14:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表