
unsigned char cont//定义按键计数变量
void delayms(unsigned char time)//stc 1t 12MHz 1ms延时
{
键行 稿旦哗 unsigned char a,b,c
迟灶 while(time--)
for(c=1c>0c--)
for(b=222b>0b--)
for(a=12a>0a--)
}
void main(void)
{
P2=cont=0
IT0=1//设置触发方式为下降沿触发
EX0=1//打开外部中断0
EA=1//打开总中断
while(1)
{
if(!P3_5)//检测到S2按下
{
P2=cont=0//清零数值
delayms(200)
}
}
}
void EXinterrupt0(void)interrupt 0//外部中断0
{
EX0=0//关闭中断避免重复触发
IE0=0//清零外部中断0标志位
cont++//按键计数+1
P2=cont//输出到P2显示
delayms(200)//延时段时间
EX0=1//恢复外部中断0
}
用AD转,16个电阻串联在一起,每个节点引出线与按穗键键相连,按键另一端为公共端与P1^n相连。然后AD口采集到的电压也不同,就能判别按的是哪个按键,因此只要写AD采样程序就可以了这是STC12C2052AD的例子
/**********************************************************
AD转换
**********************************************************/
void InitADC()
{
P1=0xff
ADC_CONTR|=0x80
delayNOP(200)
P1M0=0x01//这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引迟清脚 ,按状态组合 *** 码族前作
P1M1=0x01//设置P1.0为开漏状态
delayNOP(200)
}
uint ADC()
{
ADC_DATA = 0//清除结果
ADC_CONTR = 0x60 //转换速度设置 0x60 最快速度
ADC_CONTR = 0xE0 //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位
ADC_CONTR =0xe0
delayNOP(200)//使输入电压达到稳定
ADC_CONTR = 0xe8 //1110,1000 令 ADCS = 1, 启动A/D转换,
while (1) //等待A/D转换结束
{
if (ADC_CONTR &0x10) //0001,0000 测试A/D转换结束否
{ break}
}
ADC_CONTR =0xe0 //1110,0111 清 ADC_FLAG 位, 关闭A/D转换,
delayNOP(400)
return ADC_DATA //返回 A/D 10 位转换结果
}
void ADC_to_key()//ADC数据转换按键信号
{
V=ADC()
。。。
。。。
。。。你自己完成咯
}
不知你的液晶是什么控制器的,这个是st7920的/********************************************************************
* 文件名 : 串行12864显示.c
* 描述: 该程序实现了12864以串行的方式进行通信卜兄。
* 创建人 : 东流,2009年4月10日
* 版本号 : 2.0
***********************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P2^5 //片选信号
sbit SID=P2^6 //数据信号
sbit SCLK=P2^7 //时钟信号
sbit RST=P2^2 //复位信号段亏
sbit CH = P2^4 //并行、串行选择信号
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
* 输入 : t
* 输型燃袭出 : 无
***********************************************************************/
void delay(unsigned int t)
{
unsigned int i,j
for(i=0i<t i++)
for(j=0j<10j++)
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/
void sendbyte(unsigned char zdata)
{
unsigned int i
for(i=0i<8i++)
{
if((zdata <<i) &0x80)
{
SID = 1
}
else
{
SID = 0
}
SCLK = 0
SCLK = 1
}
}
/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_com(unsigned char cmdcode)
{
CS = 1
sendbyte(0xf8)
sendbyte(cmdcode &0xf0)
sendbyte((cmdcode <<4) &0xf0)
delay(2)
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_data(unsigned char Dispdata)
{
CS = 1
sendbyte(0xfa)
sendbyte(Dispdata &0xf0)
sendbyte((Dispdata <<4) &0xf0)
delay(2)
}
/********************************************************************
* 名称 : lcdinit()
* 功能 : 初始化函数
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void lcdinit()
{
RST = 0
delay(100)
RST = 1
delay(20000)
write_com(0x30)
delay(50)
write_com(0x0c)
delay(50)
}
/********************************************************************
* 名称 : hzkdis()
* 功能 : 显示字符串
* 输入 : *s
* 输出 : 无
***********************************************************************/
void hzkdis(unsigned char code *s)
{
while(*s >0)
{
write_data(*s)
s++
delay(50)
}
}
/********************************************************************
* 名称 : Test()
* 功能 : 显示子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Test()
{
write_com(0x03)
delay(50)
write_com(0x81)
hzkdis(" HOT-51")
write_com(0x91)
hzkdis("单片机开发板")
write_com(0x89)
hzkdis(" ")
write_com(0x98)
hzkdis("东流电子")
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
CH = 0
delay(1)
lcdinit()
delay(10)
while(1)
{
Test()
delay(5000)
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)