完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`#include "STC15F2K60S2.h" #include"intrins.h" #define uchar unsigned char #define uint unsigned int ***it CS=P1^0; ***it SID=P1^1; ***it SCLK=P1^2; uchar num2; uchar jj=0; uchar flag=0; //uchar code table[]={'0','1','2','3','4','5','6,'7','8','9','*','#'}; //显示字符表 uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2a,0x23}; //显示字符表 //uchar code table[]={0xa3b0,0xa3b1,0xa3b2,0xa3b3,0xa3b4,0xa3b5,0xa3b6,0xa3b7,0xa3b8,0xa3b9,0xa3aa,0xa3a3}; //显示字符表 //=====================延时函数========================== void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) //i=xms,即延时约xms毫秒 for(j=110;j>0;j--); } void send_command(uchar command_data) { uchar i; uchar i_data; i_data=0xf8; CS=1; SCLK=1; for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; delayms(1); SCLK=1; i_data=i_data<<1; } i_data=command_data; i_data&=0xf0; for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; delayms(1); SCLK=1; i_data=i_data<<1; } i_data=command_data; i_data<<=4; for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; delayms(1); SCLK=1; i_data=i_data<<1; } CS=0; delayms(10); } void send_data(uchar command_data) { uchar i; uchar i_data; i_data=0xfa; CS=1; SCLK=1; for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; delayms(1); SCLK=1; i_data=i_data<<1; } i_data=command_data; i_data&=0xf0; for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; delayms(1); SCLK=1; i_data=i_data<<1; } i_data=command_data; i_data<<=4; for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; delayms(1); SCLK=1; i_data=i_data<<1; } CS=0; delayms(10); } //=====================按键扫描========================== uchar matrixkeyscan() { uchar temp,key; P1=0xfe; //P1口赋值为 1111,1110即将P1.0置低 temp=P1; //将P1口赋给temp,等待按键按下 temp=temp&0xf0; //判断temp的高四位是否为0,即判断是否有键按下 if(temp!=0xf0) //当有键按下时 { delayms(10); //延时去抖 temp=P1; //重新读一次P1口的数据 temp=temp&0xf0; //判断temp的高四位是否为0,即判断是否有键按下 if(temp!=0xf0) //确实有键按下时 { temp=P1; if(temp==0xee) key=3; if(temp==0xde) key=2; if(temp==0xbe) key=1; flag=1; while(temp!=0xf0) //等待按键被释放 { temp=P1; //不断读取P1口的值。然后赋给temp temp=temp&0xf0; //判断高四位,只要结果不等于0xf0,说明按键没有释放,等待按键释放 delayms(30); } } } P1=0xfd; temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P1; temp=temp&0xf0; if(temp!=0xf0) { temp=P1; if(temp==0xed) key=6; if(temp==0xdd) key=5; if(temp==0xbd) key=4; flag=1; while(temp!=0xf0) { temp=P1; temp=temp&0xf0; delayms(30); } } } P1=0xfb; temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P1; temp=temp&0xf0; if(temp!=0xf0) { temp=P1; if(temp==0xeb) key=9; if(temp==0xdb) key=8; if(temp==0xbb) key=7; flag=1; while(temp!=0xf0) { temp=P1; temp=temp&0xf0; delayms(30); } } } P1=0xf7; temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P1; temp=temp&0xf0; if(temp!=0xf0) { temp=P1; if(temp==0xe7) key=11; if(temp==0xd7) key=0; if(temp==0xb7) key=10; flag=1; while(temp!=0xf0) { temp=P1; temp=temp&0xf0; delayms(30); } } } return key; } //=====================串口初始化========================== void uart_init() { AUXR=0x40; //定时器1速度是传统8051的12倍 TMOD&=0x0f; //设置T1定时器为工作模式0 16位自动装载 TL1=0xe0; //设置波特率为9600 TH1=0xfe; SM0=0; //设置SCON 串口模式1 8位UART SM1=1; TR1=1; //开启T1定时器 REN=1; //允许串行接收 ET1=0; //关闭T1定时器 } //=====================12232初始化========================== void lcd_init() { delayms(100); send_command(0x30); //设置8位数据口,基本指令模式 send_command(0x02); send_command(0x06); //整体显示开,游标关,反白关 send_command(0x0c); //游标及显示右移一位 send_command(0x01); //写入空格清屏指令 send_command(0x80); //设定首次显示位置 } void main() { lcd_init(); //lcd初始化 uart_init(); //串口初始化 while(1) { num2=matrixkeyscan(); if(flag==1) { flag=0; SBUF=num2; while(!ti); TI=0; send_data(table[num2]); } } } 现在矩阵按键肯定没问题了,问题是有时候显示不出来数,或者显示位置不对,比如说我按1 ,有时候在第一个显示,有时候在第二个显示,或者不一定在哪显示了。请大家看看问题出哪了 ` ![]() |
|
相关推荐
11个回答
|
|
按键释放!
|
|
|
|
|
|
|
|
while(temp!=0xf0) { temp=P1; temp=temp&0xf0; delayms(30); } 这个算按键等待释放吗? |
|
|
|
嗯!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!是的 为啥得超过20字????? |
|
|
|
好像是12232的指针出问题了,总乱走了,!! 唉,郁闷死了。。。。。。 |
|
|
|
|
|
|
|
|
|
|
|
void main() { lcd_init(); //lcd初始化 uart_init(); //串口初始化 while(1) { num2=matrixkeyscan(); if(flag==1) { flag=0; SBUF=num2; while(!TI); TI=0; send_command(0x80+jj); send_data(table[num2]); jj++; } } } 主函数改成这样了 |
|
|
|
问题解决了,每次给地址前要把DDRAM清0.谢谢你这么关注我,亲,你要程序,加我好友发给你。 |
|
|
|
|
|
|
|
0-0可以看一下您的这个完整程序么
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
串口发送中断中对发送I/O口定义为GPIO输出,出现发送数据不完整,缺少2个字节,求解答
863 浏览 3 评论
696 浏览 0 评论
【xG24 Matter开发套件试用体验】10-Bluetooth示例1
789 浏览 0 评论
870 浏览 0 评论
【xG24 Matter开发套件试用体验】power specification电源规格参数配置
694 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10851 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-25 07:26 , Processed in 0.607981 second(s), Total 62, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191