stc12c5a60s2单片机通用中断方式C语言编程读取按键S1,并记录S1按下的的次数,将该次数通过P2端口输出。

stc12c5a60s2单片机通用中断方式C语言编程读取按键S1,并记录S1按下的的次数,将该次数通过P2端口输出。,第1张

#include<at89x51.h>

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)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12554655.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-26
下一篇2025-08-26

发表评论

登录后才能评论

评论列表(0条)

    保存